Redesign ticket details with inline editing
linter / quality (pull_request) Successful in 1m23s
tests / ci (8.4) (pull_request) Successful in 1m49s

This commit is contained in:
2026-07-18 19:50:50 +02:00
parent 5f917e93eb
commit 8c70d094b8
11 changed files with 2712 additions and 1244 deletions
@@ -0,0 +1,28 @@
import type { AcceptanceCriteriaModel } from '@/types/models/acceptance-criteria-model';
export type AcceptanceCriteriaCommitSource =
| 'check'
| 'delete'
| 'indent'
| 'move'
| 'text';
export type AcceptanceCriteriaEditorCommit = {
items: AcceptanceCriteriaModel;
source: AcceptanceCriteriaCommitSource;
};
export type AcceptanceCriteriaSaveState = 'error' | 'idle' | 'saved' | 'saving';
export type AcceptanceCriteriaEditorProps = {
disabled?: boolean;
editable: boolean;
error?: string;
modelValue: AcceptanceCriteriaModel;
saveState?: AcceptanceCriteriaSaveState;
};
export type AcceptanceCriteriaEditorEmits = {
(event: 'commit', value: AcceptanceCriteriaEditorCommit): void;
(event: 'update:modelValue', value: AcceptanceCriteriaModel): void;
};
+2
View File
@@ -1,7 +1,9 @@
export * from './auth';
export * from './acceptance-criteria-editor';
export * from './layout';
export * from './navigation';
export * from './notification-settings';
export * from './page-props';
export * from './project-navigation';
export * from './ticket-inline-edit';
export * from './ui';
+76
View File
@@ -0,0 +1,76 @@
import type { AcceptanceCriteriaModel } from '@/types/models/acceptance-criteria-model';
export type InlineTextEditorValue = number | string | null;
export type InlineTextEditorProps = {
disabled?: boolean;
editable: boolean;
error?: string;
inputType?: 'number' | 'text';
multiline?: boolean;
placeholder: string;
saveState?: 'error' | 'idle' | 'saved' | 'saving';
value: InlineTextEditorValue;
variant?: 'body' | 'property' | 'title';
};
export type InlineTextEditorEmits = {
(event: 'commit'): void;
(event: 'update:value', value: InlineTextEditorValue): void;
};
export type InlineSaveStatusProps = {
error?: string;
state: 'error' | 'idle' | 'saved' | 'saving';
};
export type TicketEditableField =
| 'acceptance_criteria'
| 'assignee_user_id'
| 'author_user_id'
| 'blocked_comment'
| 'description'
| 'is_blocked'
| 'parent_ticket_id'
| 'story_points'
| 'ticket_priority_id'
| 'ticket_type_id'
| 'title'
| `field-${number}`;
export type ProjectTicketFieldValuePayload = {
ticket_field_definition_id: number;
value_number: number | string | null;
value_user_id: number | string | null;
};
export type ProjectTicketUpdatePayload = {
acceptance_criteria: AcceptanceCriteriaModel;
assignee_user_id: number | string | null;
author_user_id: number | string | null;
blocked_comment: string;
description: string;
field_values: ProjectTicketFieldValuePayload[];
is_blocked: boolean;
parent_ticket_id: number | string | null;
story_points: number | string | null;
ticket_priority_id: number | string;
ticket_type_id: number | string;
title: string;
};
export type TicketAutosaveResponse = {
acceptance_criteria: AcceptanceCriteriaModel;
message: string;
updated: boolean;
};
export type TicketAutosaveErrorResponse = {
errors?: Record<string, string[]>;
message?: string;
};
export type QueuedTicketAutosave = {
field: TicketEditableField;
payload: ProjectTicketUpdatePayload;
};