codex ticket rework

This commit is contained in:
2026-04-13 01:04:06 +02:00
parent b3f2cc3afd
commit 182ed018d1
45 changed files with 1208 additions and 420 deletions
@@ -44,6 +44,9 @@ const breadcrumbs: BreadcrumbItem[] = [
href: metadataSettings(props.project.id),
},
];
const replacementTicketTypes = (ticketTypeId: number) =>
props.ticketTypes.filter((ticketType) => ticketType.id !== ticketTypeId);
</script>
<template>
@@ -133,6 +136,18 @@ const breadcrumbs: BreadcrumbItem[] = [
<InputError :message="errors.show_story_points" />
<Label for="enable-author">
<Checkbox
id="enable-author"
name="show_author"
:default-value="project.show_author"
value="1"
/>
Show author on ticket details
</Label>
<InputError :message="errors.show_author" />
<Button type="submit" :disabled="processing">
Save
</Button>
@@ -171,7 +186,7 @@ const breadcrumbs: BreadcrumbItem[] = [
name="is_parent"
value="1"
/>
Ticket type is can be a parent
Ticket type can act as a parent
</Label>
<InputError :message="errors.is_parent" />
</div>
@@ -196,6 +211,20 @@ const breadcrumbs: BreadcrumbItem[] = [
v-slot="{ errors, processing }"
>
<div class="grid gap-2">
<div
v-if="ticketType.is_parent"
class="flex flex-wrap items-center gap-2"
>
<Badge variant="secondary">
Parent type
</Badge>
<span
class="text-muted-foreground text-xs"
>
This flag is fixed after creation.
</span>
</div>
<Label :for="`type-name-${ticketType.id}`">
Name
</Label>
@@ -206,21 +235,6 @@ const breadcrumbs: BreadcrumbItem[] = [
required
/>
<InputError :message="errors.name" />
<Label
:for="`type-is-parent-${ticketType.id}}`"
>
<Checkbox
:id="`type-is-parent-${ticketType.id}}`"
name="is_parent"
:default-value="
ticketType.is_parent
"
value="1"
/>
Ticket type is can be a parent
</Label>
<InputError :message="errors.is_parent" />
</div>
<div class="grid gap-2">
@@ -260,16 +274,71 @@ const breadcrumbs: BreadcrumbItem[] = [
[project.id, ticketType.id],
)
"
class="mt-3 flex justify-end"
v-slot="{ processing: deleting }"
class="mt-3 grid gap-3"
v-slot="{ errors, processing: deleting }"
>
<Button
type="submit"
variant="destructive"
:disabled="deleting"
<div
v-if="
(ticketType.tickets_count ?? 0) > 0 &&
ticketTypes.length > 1
"
class="grid gap-2"
>
Delete
</Button>
<Label
:for="`replacement-type-${ticketType.id}`"
>
Replacement type for
{{ ticketType.tickets_count }} assigned
ticket{{
ticketType.tickets_count === 1
? ''
: 's'
}}
</Label>
<select
:id="`replacement-type-${ticketType.id}`"
name="replacement_ticket_type_id"
class="border-input bg-background shadow-xs focus-visible:border-ring focus-visible:ring-ring/50 rounded-md border px-3 py-2 text-sm outline-none transition-[color,box-shadow] focus-visible:ring-[3px]"
required
>
<option value="">Choose type</option>
<option
v-for="replacementTicketType in replacementTicketTypes(
ticketType.id,
)"
:key="replacementTicketType.id"
:value="replacementTicketType.id"
>
{{ replacementTicketType.name }}
</option>
</select>
<InputError
:message="
errors.replacement_ticket_type_id
"
/>
</div>
<div
class="flex flex-wrap items-center justify-between gap-3"
>
<p
v-if="
(ticketType.tickets_count ?? 0) > 0
"
class="text-muted-foreground text-sm"
>
Assigned tickets will be moved before
this type is deleted.
</p>
<Button
type="submit"
variant="destructive"
:disabled="deleting"
>
Delete
</Button>
</div>
</Form>
</div>
</CardContent>