feat: overhaul project workspace navigation
linter / quality (pull_request) Successful in 1m28s
tests / ci (8.4) (pull_request) Successful in 1m47s

This commit is contained in:
2026-07-18 17:52:25 +02:00
parent a46695c2eb
commit ff796aa10a
45 changed files with 1790 additions and 995 deletions
+18
View File
@@ -0,0 +1,18 @@
import type { TicketModel } from '@/types/models/ticket-model';
export type BoardDragTicket = {
originColumnId: number;
ticket: TicketModel;
};
export type BoardDragPointer = {
pointerId: number;
pointerType: string;
startX: number;
startY: number;
};
export type BoardDropTarget = {
boardColumnId: number;
ticketStatusId: number;
};
+2
View File
@@ -1,5 +1,7 @@
export * from './auth';
export * from './layout';
export * from './navigation';
export * from './notification-settings';
export * from './page-props';
export * from './project-navigation';
export * from './ui';
@@ -0,0 +1,12 @@
export type NotificationFilterFormState = {
attribute: string;
id: string;
operator: string;
value: string;
};
export type NotificationFilterPayload = {
attribute: string;
operator: string;
value: string | string[] | null;
};
+30 -6
View File
@@ -21,6 +21,7 @@ import type { TicketTypeModel } from '@/types/models/ticket-type-model';
import type { UserApplicationModel } from '@/types/models/user-application-model';
import type { UserGitConnectionModel } from '@/types/models/user-git-connection-model';
import type { UserModel } from '@/types/models/user-model';
import type { ProjectSettingsSection } from '@/types/project-navigation';
export type AdminUsersPageProps = {
directPermissions: Record<string, string[]>;
@@ -84,12 +85,6 @@ export type ProjectTemplateState = {
templateSlug: string;
};
export type ProjectShowPageProps = {
canManageAccess: boolean;
project: ProjectModel;
templateState?: ProjectTemplateState | null;
};
export type PermissionOption = {
label: string;
value: string;
@@ -103,6 +98,7 @@ export type ProjectAccessPageProps = {
teamPermissions: Record<string, string[]>;
teams: TeamModel[];
users: UserModel[];
embedded?: boolean;
};
export type TeamsIndexPageProps = {
@@ -121,6 +117,7 @@ export type ProjectBoardSettingsPageProps = {
status?: string | null;
templateState?: ProjectTemplateState | null;
ticketStatuses: TicketStatusModel[];
embedded?: boolean;
};
export type ProjectGeneralSettingsPageProps = {
@@ -128,12 +125,14 @@ export type ProjectGeneralSettingsPageProps = {
sourceTemplates: ProjectTemplateModel[];
status?: string | null;
templateState?: ProjectTemplateState | null;
embedded?: boolean;
};
export type ProjectBoardPageProps = {
boardColumns: BoardColumnModel[];
canCreateTickets: boolean;
canEditTickets: boolean;
canManageProject: boolean;
project: ProjectModel;
status?: string | null;
};
@@ -153,6 +152,7 @@ export type ProjectTicketMetadataSettingsPageProps = {
ticketLinkTypes: TicketLinkTypeModel[];
ticketPriorities: TicketPriorityModel[];
ticketTypes: TicketTypeModel[];
embedded?: boolean;
};
export type ProjectRepositorySettingsPageProps = {
@@ -161,6 +161,7 @@ export type ProjectRepositorySettingsPageProps = {
repositoryConnections: RepositoryConnectionModel[];
status?: string | null;
templateState?: ProjectTemplateState | null;
embedded?: boolean;
};
export type ProjectNotificationSettingsPageProps = {
@@ -174,12 +175,14 @@ export type ProjectNotificationSettingsPageProps = {
status?: string | null;
templateState?: ProjectTemplateState | null;
templateVariables: NotificationActionTemplateVariableModel[];
embedded?: boolean;
};
export type ProjectBacklogPageProps = {
backlogTicketStatuses: TicketStatusModel[];
canCreateTickets: boolean;
canEditTickets: boolean;
canManageProject: boolean;
project: ProjectModel;
status?: string | null;
ticketPriorities: TicketPriorityModel[];
@@ -190,6 +193,7 @@ export type ProjectBacklogPageProps = {
};
export type ProjectTicketCreatePageProps = {
canManageProject: boolean;
defaultTicketStatusId: number | null;
parentTicketOptions: TicketReferenceModel[];
project: ProjectModel;
@@ -201,6 +205,26 @@ export type ProjectTicketCreatePageProps = {
users: UserModel[];
};
export type ProjectSettingsSectionData = Partial<
Omit<
ProjectAccessPageProps &
ProjectBoardSettingsPageProps &
ProjectGeneralSettingsPageProps &
ProjectNotificationSettingsPageProps &
ProjectRepositorySettingsPageProps &
ProjectTicketMetadataSettingsPageProps,
'embedded' | 'project' | 'status'
>
>;
export type ProjectSettingsPageProps = {
activeSection: ProjectSettingsSection;
error?: boolean;
project: ProjectModel;
sectionData: ProjectSettingsSectionData;
status?: string | null;
};
export type ProjectTicketPageProps = {
canEditTicket: boolean;
canManageProject: boolean;
+22
View File
@@ -0,0 +1,22 @@
import type { ProjectModel } from '@/types/models/project-model';
export type ProjectPrimarySection = 'backlog' | 'board' | 'settings';
export type ProjectSettingsSection =
| 'access'
| 'board'
| 'general'
| 'metadata'
| 'notifications'
| 'repositories';
export type ProjectTabsProps = {
active?: ProjectPrimarySection | null;
canManageProject: boolean;
project: ProjectModel;
};
export type EmbeddedProjectSettingsSectionProps<T> = Omit<
T,
'embedded' | 'project' | 'status'
>;