lint fix and formatted
This commit is contained in:
@@ -81,10 +81,10 @@ const hasPermission = (
|
||||
<CardContent class="p-0">
|
||||
<div class="overflow-x-auto">
|
||||
<table
|
||||
class="min-w-full divide-y divide-border text-sm"
|
||||
class="divide-border min-w-full divide-y text-sm"
|
||||
>
|
||||
<thead
|
||||
class="bg-muted/40 text-left text-muted-foreground"
|
||||
class="bg-muted/40 text-muted-foreground text-left"
|
||||
>
|
||||
<tr>
|
||||
<th class="px-4 py-3 font-medium">User</th>
|
||||
@@ -99,18 +99,18 @@ const hasPermission = (
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="divide-y divide-border">
|
||||
<tbody class="divide-border divide-y">
|
||||
<tr
|
||||
v-for="user in users"
|
||||
:key="user.id"
|
||||
class="bg-background align-top"
|
||||
>
|
||||
<td
|
||||
class="px-4 py-4 font-medium text-foreground"
|
||||
class="text-foreground px-4 py-4 font-medium"
|
||||
>
|
||||
{{ user.name }}
|
||||
</td>
|
||||
<td class="px-4 py-4 text-muted-foreground">
|
||||
<td class="text-muted-foreground px-4 py-4">
|
||||
{{ user.email }}
|
||||
</td>
|
||||
<td class="px-4 py-4">
|
||||
@@ -126,7 +126,7 @@ const hasPermission = (
|
||||
<label
|
||||
v-for="option in permissionOptions"
|
||||
:key="`${user.id}-${option.value}`"
|
||||
class="inline-flex items-center gap-2 rounded-lg border border-border px-3 py-2 text-sm"
|
||||
class="border-border inline-flex items-center gap-2 rounded-lg border px-3 py-2 text-sm"
|
||||
>
|
||||
<input
|
||||
type="checkbox"
|
||||
@@ -139,7 +139,7 @@ const hasPermission = (
|
||||
option.value,
|
||||
)
|
||||
"
|
||||
class="size-4 rounded border-input text-primary focus:ring-ring"
|
||||
class="border-input text-primary focus:ring-ring size-4 rounded"
|
||||
/>
|
||||
<span>{{ option.label }}</span>
|
||||
</label>
|
||||
@@ -157,7 +157,7 @@ const hasPermission = (
|
||||
</Form>
|
||||
</td>
|
||||
<td
|
||||
class="px-4 py-4 text-right text-muted-foreground"
|
||||
class="text-muted-foreground px-4 py-4 text-right"
|
||||
>
|
||||
Direct
|
||||
</td>
|
||||
@@ -180,7 +180,7 @@ const hasPermission = (
|
||||
<CardContent class="p-0">
|
||||
<div
|
||||
v-if="teams.length === 0"
|
||||
class="p-6 text-sm text-muted-foreground"
|
||||
class="text-muted-foreground p-6 text-sm"
|
||||
>
|
||||
No teams exist yet. Create teams first to assign
|
||||
inherited permissions.
|
||||
@@ -188,10 +188,10 @@ const hasPermission = (
|
||||
|
||||
<div v-else class="overflow-x-auto">
|
||||
<table
|
||||
class="min-w-full divide-y divide-border text-sm"
|
||||
class="divide-border min-w-full divide-y text-sm"
|
||||
>
|
||||
<thead
|
||||
class="bg-muted/40 text-left text-muted-foreground"
|
||||
class="bg-muted/40 text-muted-foreground text-left"
|
||||
>
|
||||
<tr>
|
||||
<th class="px-4 py-3 font-medium">Team</th>
|
||||
@@ -208,14 +208,14 @@ const hasPermission = (
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="divide-y divide-border">
|
||||
<tbody class="divide-border divide-y">
|
||||
<tr
|
||||
v-for="team in teams"
|
||||
:key="team.id"
|
||||
class="bg-background align-top"
|
||||
>
|
||||
<td
|
||||
class="px-4 py-4 font-medium text-foreground"
|
||||
class="text-foreground px-4 py-4 font-medium"
|
||||
>
|
||||
{{ team.name }}
|
||||
</td>
|
||||
@@ -249,7 +249,7 @@ const hasPermission = (
|
||||
<label
|
||||
v-for="option in permissionOptions"
|
||||
:key="`${team.id}-${option.value}`"
|
||||
class="inline-flex items-center gap-2 rounded-lg border border-border px-3 py-2 text-sm"
|
||||
class="border-border inline-flex items-center gap-2 rounded-lg border px-3 py-2 text-sm"
|
||||
>
|
||||
<input
|
||||
type="checkbox"
|
||||
@@ -262,7 +262,7 @@ const hasPermission = (
|
||||
option.value,
|
||||
)
|
||||
"
|
||||
class="size-4 rounded border-input text-primary focus:ring-ring"
|
||||
class="border-input text-primary focus:ring-ring size-4 rounded"
|
||||
/>
|
||||
<span>{{ option.label }}</span>
|
||||
</label>
|
||||
@@ -280,7 +280,7 @@ const hasPermission = (
|
||||
</Form>
|
||||
</td>
|
||||
<td
|
||||
class="px-4 py-4 text-right text-muted-foreground"
|
||||
class="text-muted-foreground px-4 py-4 text-right"
|
||||
>
|
||||
Inherited
|
||||
</td>
|
||||
|
||||
@@ -113,7 +113,7 @@ const hasTicketMetadata =
|
||||
<select
|
||||
id="ticket_type_id"
|
||||
name="ticket_type_id"
|
||||
class="rounded-md border border-input bg-background px-3 py-2 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50"
|
||||
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]"
|
||||
>
|
||||
<option
|
||||
v-for="ticketType in ticketTypes"
|
||||
@@ -133,7 +133,7 @@ const hasTicketMetadata =
|
||||
<select
|
||||
id="ticket_priority_id"
|
||||
name="ticket_priority_id"
|
||||
class="rounded-md border border-input bg-background px-3 py-2 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50"
|
||||
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]"
|
||||
>
|
||||
<option
|
||||
v-for="ticketPriority in ticketPriorities"
|
||||
@@ -155,7 +155,7 @@ const hasTicketMetadata =
|
||||
id="description"
|
||||
name="description"
|
||||
rows="4"
|
||||
class="rounded-md border border-input bg-background px-3 py-2 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50"
|
||||
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]"
|
||||
placeholder="Describe the expected behavior and relevant context."
|
||||
/>
|
||||
<InputError :message="errors.description" />
|
||||
@@ -169,7 +169,7 @@ const hasTicketMetadata =
|
||||
id="acceptance_criteria"
|
||||
name="acceptance_criteria"
|
||||
rows="4"
|
||||
class="rounded-md border border-input bg-background px-3 py-2 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50"
|
||||
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]"
|
||||
placeholder="List the conditions that must be true before this ticket is done."
|
||||
/>
|
||||
<InputError :message="errors.acceptance_criteria" />
|
||||
@@ -212,17 +212,17 @@ const hasTicketMetadata =
|
||||
<CardContent class="p-0">
|
||||
<div
|
||||
v-if="tickets.length === 0"
|
||||
class="p-6 text-sm text-muted-foreground"
|
||||
class="text-muted-foreground p-6 text-sm"
|
||||
>
|
||||
No backlog tickets exist yet.
|
||||
</div>
|
||||
|
||||
<div v-else class="overflow-x-auto">
|
||||
<table
|
||||
class="min-w-full divide-y divide-border text-sm"
|
||||
class="divide-border min-w-full divide-y text-sm"
|
||||
>
|
||||
<thead
|
||||
class="bg-muted/40 text-left text-muted-foreground"
|
||||
class="bg-muted/40 text-muted-foreground text-left"
|
||||
>
|
||||
<tr>
|
||||
<th class="px-4 py-3 font-medium">Key</th>
|
||||
@@ -239,7 +239,7 @@ const hasTicketMetadata =
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="divide-y divide-border">
|
||||
<tbody class="divide-border divide-y">
|
||||
<tr
|
||||
v-for="ticket in tickets"
|
||||
:key="ticket.id"
|
||||
@@ -267,21 +267,21 @@ const hasTicketMetadata =
|
||||
ticket: ticket.id,
|
||||
})
|
||||
"
|
||||
class="font-medium text-foreground transition hover:text-primary"
|
||||
class="text-foreground hover:text-primary font-medium transition"
|
||||
>
|
||||
{{ ticket.title }}
|
||||
</Link>
|
||||
<div
|
||||
v-if="ticket.description"
|
||||
class="mt-1 line-clamp-2 text-muted-foreground"
|
||||
class="text-muted-foreground mt-1 line-clamp-2"
|
||||
>
|
||||
{{ ticket.description }}
|
||||
</div>
|
||||
</td>
|
||||
<td class="px-4 py-4 text-muted-foreground">
|
||||
<td class="text-muted-foreground px-4 py-4">
|
||||
{{ ticket.ticket_type.name }}
|
||||
</td>
|
||||
<td class="px-4 py-4 text-muted-foreground">
|
||||
<td class="text-muted-foreground px-4 py-4">
|
||||
{{ ticket.ticket_priority.name }}
|
||||
</td>
|
||||
<td v-if="canEditTickets" class="px-4 py-4">
|
||||
@@ -305,7 +305,7 @@ const hasTicketMetadata =
|
||||
/>
|
||||
<select
|
||||
name="board_column_id"
|
||||
class="min-w-44 rounded-md border border-input bg-background px-3 py-2 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50"
|
||||
class="border-input bg-background shadow-xs focus-visible:border-ring focus-visible:ring-ring/50 min-w-44 rounded-md border px-3 py-2 text-sm outline-none transition-[color,box-shadow] focus-visible:ring-[3px]"
|
||||
>
|
||||
<option
|
||||
v-for="boardColumn in boardColumns"
|
||||
@@ -326,7 +326,7 @@ const hasTicketMetadata =
|
||||
|
||||
<span
|
||||
v-else
|
||||
class="text-sm text-muted-foreground"
|
||||
class="text-muted-foreground text-sm"
|
||||
>
|
||||
Add board columns first.
|
||||
</span>
|
||||
|
||||
@@ -108,7 +108,7 @@ const statusOptions = [
|
||||
:key="boardColumn.id"
|
||||
class="flex h-full flex-col gap-0 overflow-hidden"
|
||||
>
|
||||
<CardHeader class="border-b bg-muted/20">
|
||||
<CardHeader class="bg-muted/20 border-b">
|
||||
<div class="flex items-start justify-between gap-3">
|
||||
<div>
|
||||
<CardTitle>{{ boardColumn.name }}</CardTitle>
|
||||
@@ -127,7 +127,7 @@ const statusOptions = [
|
||||
<CardContent class="flex flex-1 flex-col gap-4 p-4">
|
||||
<div
|
||||
v-if="(boardColumn.tickets?.length ?? 0) === 0"
|
||||
class="rounded-xl border border-dashed border-border px-4 py-6 text-sm text-muted-foreground"
|
||||
class="border-border text-muted-foreground rounded-xl border border-dashed px-4 py-6 text-sm"
|
||||
>
|
||||
No tickets are currently in this column.
|
||||
</div>
|
||||
@@ -169,7 +169,7 @@ const statusOptions = [
|
||||
ticket: ticket.id,
|
||||
})
|
||||
"
|
||||
class="transition hover:text-primary"
|
||||
class="hover:text-primary transition"
|
||||
>
|
||||
{{ ticket.title }}
|
||||
</Link>
|
||||
@@ -181,7 +181,10 @@ const statusOptions = [
|
||||
{{ ticket.description }}
|
||||
</CardDescription>
|
||||
<CardDescription
|
||||
v-if="ticket.is_blocked && ticket.blocked_comment"
|
||||
v-if="
|
||||
ticket.is_blocked &&
|
||||
ticket.blocked_comment
|
||||
"
|
||||
class="mt-2 text-amber-900 dark:text-amber-200"
|
||||
>
|
||||
{{ ticket.blocked_comment }}
|
||||
@@ -206,7 +209,7 @@ const statusOptions = [
|
||||
/>
|
||||
<label
|
||||
:for="`ticket-status-${ticket.id}`"
|
||||
class="text-xs font-medium tracking-wide text-muted-foreground uppercase"
|
||||
class="text-muted-foreground text-xs font-medium uppercase tracking-wide"
|
||||
>
|
||||
Move ticket
|
||||
</label>
|
||||
@@ -219,7 +222,7 @@ const statusOptions = [
|
||||
:value="
|
||||
ticket.board_column_id ?? ''
|
||||
"
|
||||
class="min-w-44 rounded-md border border-input bg-background px-3 py-2 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50"
|
||||
class="border-input bg-background shadow-xs focus-visible:border-ring focus-visible:ring-ring/50 min-w-44 rounded-md border px-3 py-2 text-sm outline-none transition-[color,box-shadow] focus-visible:ring-[3px]"
|
||||
>
|
||||
<option
|
||||
v-for="statusOption in statusOptions"
|
||||
|
||||
@@ -76,9 +76,9 @@ const breadcrumbs: BreadcrumbItem[] = [
|
||||
placeholder="CORE"
|
||||
class="uppercase"
|
||||
/>
|
||||
<p class="text-sm text-muted-foreground">
|
||||
<p class="text-muted-foreground text-sm">
|
||||
Example ticket keys will look like
|
||||
<span class="font-medium text-foreground"
|
||||
<span class="text-foreground font-medium"
|
||||
>CORE-1</span
|
||||
>.
|
||||
</p>
|
||||
|
||||
@@ -48,7 +48,7 @@ const breadcrumbs: BreadcrumbItem[] = [
|
||||
|
||||
<div
|
||||
v-if="projects.length === 0"
|
||||
class="rounded-xl border border-dashed px-6 py-10 text-center text-sm text-muted-foreground"
|
||||
class="text-muted-foreground rounded-xl border border-dashed px-6 py-10 text-center text-sm"
|
||||
>
|
||||
No projects exist yet. Create the first one to start building
|
||||
out board, backlog, and settings areas.
|
||||
@@ -62,7 +62,7 @@ const breadcrumbs: BreadcrumbItem[] = [
|
||||
class="group block"
|
||||
>
|
||||
<Card
|
||||
class="h-full border-border/80 transition-colors group-hover:border-primary/40"
|
||||
class="border-border/80 group-hover:border-primary/40 h-full transition-colors"
|
||||
>
|
||||
<CardHeader class="gap-3">
|
||||
<div class="flex items-start justify-between gap-3">
|
||||
@@ -80,7 +80,7 @@ const breadcrumbs: BreadcrumbItem[] = [
|
||||
</CardHeader>
|
||||
|
||||
<CardContent
|
||||
class="flex items-center gap-2 text-sm text-muted-foreground"
|
||||
class="text-muted-foreground flex items-center gap-2 text-sm"
|
||||
>
|
||||
<Folder class="size-4" />
|
||||
Open board, backlog, and settings hub
|
||||
|
||||
@@ -130,7 +130,7 @@ const projectAreas = [
|
||||
>
|
||||
<CardHeader>
|
||||
<div
|
||||
class="mb-3 flex size-10 items-center justify-center rounded-full bg-muted text-foreground"
|
||||
class="bg-muted text-foreground mb-3 flex size-10 items-center justify-center rounded-full"
|
||||
>
|
||||
<component :is="area.icon" class="size-5" />
|
||||
</div>
|
||||
@@ -139,7 +139,7 @@ const projectAreas = [
|
||||
area.description
|
||||
}}</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent class="text-sm text-muted-foreground">
|
||||
<CardContent class="text-muted-foreground text-sm">
|
||||
Use the project shortcuts above to open this area.
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
@@ -141,7 +141,8 @@ const selectedBranchRepositoryConnection = computed(
|
||||
);
|
||||
|
||||
const selectedBranchRepositoryHasPersonalAccess = computed(
|
||||
() => selectedBranchRepositoryConnection.value?.has_personal_access ?? false,
|
||||
() =>
|
||||
selectedBranchRepositoryConnection.value?.has_personal_access ?? false,
|
||||
);
|
||||
|
||||
const initializeBranchCreationForm = (): void => {
|
||||
@@ -174,7 +175,11 @@ watch(
|
||||
() => branchCreationForm.repository_connection_id,
|
||||
() => branchCreationForm.branch_name,
|
||||
],
|
||||
([isOpen, repositoryConnectionId, branchName], _previousValues, onCleanup) => {
|
||||
(
|
||||
[isOpen, repositoryConnectionId, branchName],
|
||||
_previousValues,
|
||||
onCleanup,
|
||||
) => {
|
||||
if (!isOpen) {
|
||||
return;
|
||||
}
|
||||
@@ -412,7 +417,7 @@ const formatDateTime = (value: string): string => {
|
||||
:disabled="
|
||||
!canEditTicket || form.processing
|
||||
"
|
||||
class="rounded-md border border-input bg-background px-3 py-2 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-60"
|
||||
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] disabled:cursor-not-allowed disabled:opacity-60"
|
||||
>
|
||||
<option
|
||||
v-for="ticketType in ticketTypes"
|
||||
@@ -437,7 +442,7 @@ const formatDateTime = (value: string): string => {
|
||||
:disabled="
|
||||
!canEditTicket || form.processing
|
||||
"
|
||||
class="rounded-md border border-input bg-background px-3 py-2 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-60"
|
||||
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] disabled:cursor-not-allowed disabled:opacity-60"
|
||||
>
|
||||
<option
|
||||
v-for="ticketPriority in ticketPriorities"
|
||||
@@ -465,7 +470,7 @@ const formatDateTime = (value: string): string => {
|
||||
:disabled="
|
||||
!canEditTicket || form.processing
|
||||
"
|
||||
class="rounded-md border border-input bg-background px-3 py-2 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-60"
|
||||
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] disabled:cursor-not-allowed disabled:opacity-60"
|
||||
>
|
||||
<option value="">No parent ticket</option>
|
||||
<option
|
||||
@@ -492,7 +497,7 @@ const formatDateTime = (value: string): string => {
|
||||
:disabled="
|
||||
!canEditTicket || form.processing
|
||||
"
|
||||
class="rounded-md border border-input bg-background px-3 py-2 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-60"
|
||||
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] disabled:cursor-not-allowed disabled:opacity-60"
|
||||
/>
|
||||
<InputError
|
||||
:message="form.errors.description"
|
||||
@@ -510,14 +515,16 @@ const formatDateTime = (value: string): string => {
|
||||
:disabled="
|
||||
!canEditTicket || form.processing
|
||||
"
|
||||
class="rounded-md border border-input bg-background px-3 py-2 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-60"
|
||||
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] disabled:cursor-not-allowed disabled:opacity-60"
|
||||
/>
|
||||
<InputError
|
||||
:message="form.errors.acceptance_criteria"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="grid gap-3 rounded-xl border border-border p-4">
|
||||
<div
|
||||
class="border-border grid gap-3 rounded-xl border p-4"
|
||||
>
|
||||
<div class="flex items-center gap-3">
|
||||
<input
|
||||
id="is_blocked"
|
||||
@@ -526,7 +533,7 @@ const formatDateTime = (value: string): string => {
|
||||
:disabled="
|
||||
!canEditTicket || form.processing
|
||||
"
|
||||
class="size-4 rounded border-input text-primary focus:ring-ring"
|
||||
class="border-input text-primary focus:ring-ring size-4 rounded"
|
||||
/>
|
||||
<Label for="is_blocked">
|
||||
Mark ticket as blocked
|
||||
@@ -544,7 +551,7 @@ const formatDateTime = (value: string): string => {
|
||||
:disabled="
|
||||
!canEditTicket || form.processing
|
||||
"
|
||||
class="rounded-md border border-input bg-background px-3 py-2 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-60"
|
||||
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] disabled:cursor-not-allowed disabled:opacity-60"
|
||||
placeholder="Describe what currently blocks progress on this ticket."
|
||||
/>
|
||||
<InputError
|
||||
@@ -558,7 +565,7 @@ const formatDateTime = (value: string): string => {
|
||||
<h3 class="text-sm font-semibold">
|
||||
Custom fields
|
||||
</h3>
|
||||
<p class="text-sm text-muted-foreground">
|
||||
<p class="text-muted-foreground text-sm">
|
||||
Project-configured fields can be tracked
|
||||
directly on the ticket.
|
||||
</p>
|
||||
@@ -566,7 +573,7 @@ const formatDateTime = (value: string): string => {
|
||||
|
||||
<div
|
||||
v-if="ticketFieldDefinitions.length === 0"
|
||||
class="rounded-xl border border-dashed border-border px-4 py-6 text-sm text-muted-foreground"
|
||||
class="border-border text-muted-foreground rounded-xl border border-dashed px-4 py-6 text-sm"
|
||||
>
|
||||
No custom fields are configured for this
|
||||
project yet.
|
||||
@@ -600,7 +607,7 @@ const formatDateTime = (value: string): string => {
|
||||
!canEditTicket ||
|
||||
form.processing
|
||||
"
|
||||
class="rounded-md border border-input bg-background px-3 py-2 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-60"
|
||||
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] disabled:cursor-not-allowed disabled:opacity-60"
|
||||
>
|
||||
<option value="">Unassigned</option>
|
||||
<option
|
||||
@@ -664,9 +671,9 @@ const formatDateTime = (value: string): string => {
|
||||
<div class="space-y-1.5">
|
||||
<CardTitle>Branches</CardTitle>
|
||||
<CardDescription>
|
||||
Matching branches are discovered from
|
||||
linked repositories when the branch name
|
||||
starts with this ticket key.
|
||||
Matching branches are discovered from linked
|
||||
repositories when the branch name starts
|
||||
with this ticket key.
|
||||
</CardDescription>
|
||||
</div>
|
||||
|
||||
@@ -699,7 +706,9 @@ const formatDateTime = (value: string): string => {
|
||||
@submit.prevent="submitBranchCreation"
|
||||
>
|
||||
<div class="grid gap-2">
|
||||
<Label for="repository_connection_id">
|
||||
<Label
|
||||
for="repository_connection_id"
|
||||
>
|
||||
Repository
|
||||
</Label>
|
||||
<select
|
||||
@@ -710,11 +719,13 @@ const formatDateTime = (value: string): string => {
|
||||
:disabled="
|
||||
branchCreationForm.processing
|
||||
"
|
||||
class="rounded-md border border-input bg-background px-3 py-2 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-60"
|
||||
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] disabled:cursor-not-allowed disabled:opacity-60"
|
||||
>
|
||||
<option
|
||||
v-for="repositoryConnection in linkedRepositoryConnections"
|
||||
:key="repositoryConnection.id"
|
||||
:key="
|
||||
repositoryConnection.id
|
||||
"
|
||||
:value="
|
||||
String(
|
||||
repositoryConnection.id,
|
||||
@@ -764,9 +775,7 @@ const formatDateTime = (value: string): string => {
|
||||
: 'border-amber-200 bg-amber-50 text-amber-900 dark:border-amber-900/70 dark:bg-amber-950/40 dark:text-amber-100'
|
||||
"
|
||||
>
|
||||
<div
|
||||
class="flex items-start gap-3"
|
||||
>
|
||||
<div class="flex items-start gap-3">
|
||||
<CheckCircle2
|
||||
v-if="
|
||||
branchNameValidation?.is_valid
|
||||
@@ -784,8 +793,8 @@ const formatDateTime = (value: string): string => {
|
||||
{{
|
||||
isCheckingBranchName
|
||||
? 'Checking whether this branch name is valid and still available...'
|
||||
: branchNameValidation?.message ??
|
||||
'Select a linked repository to validate the branch name.'
|
||||
: (branchNameValidation?.message ??
|
||||
'Select a linked repository to validate the branch name.')
|
||||
}}
|
||||
</p>
|
||||
</div>
|
||||
@@ -797,10 +806,10 @@ const formatDateTime = (value: string): string => {
|
||||
selectedBranchRepositoryConnection !==
|
||||
null
|
||||
"
|
||||
class="rounded-xl border border-dashed border-border px-4 py-4"
|
||||
class="border-border rounded-xl border border-dashed px-4 py-4"
|
||||
>
|
||||
<p
|
||||
class="text-sm text-muted-foreground"
|
||||
class="text-muted-foreground text-sm"
|
||||
>
|
||||
You can only create branches in
|
||||
repositories that match one of
|
||||
@@ -814,9 +823,7 @@ const formatDateTime = (value: string): string => {
|
||||
class="mt-3"
|
||||
>
|
||||
<Link
|
||||
:href="
|
||||
editGitConnections()
|
||||
"
|
||||
:href="editGitConnections()"
|
||||
>
|
||||
Open Git connections
|
||||
</Link>
|
||||
@@ -828,8 +835,7 @@ const formatDateTime = (value: string): string => {
|
||||
type="button"
|
||||
variant="secondary"
|
||||
@click="
|
||||
isCreateBranchDialogOpen =
|
||||
false
|
||||
isCreateBranchDialogOpen = false
|
||||
"
|
||||
>
|
||||
Cancel
|
||||
@@ -855,7 +861,7 @@ const formatDateTime = (value: string): string => {
|
||||
<CardContent class="space-y-4">
|
||||
<div
|
||||
v-if="visibleRepositoryBranches.length === 0"
|
||||
class="rounded-xl border border-dashed border-border px-4 py-6 text-sm text-muted-foreground"
|
||||
class="border-border text-muted-foreground rounded-xl border border-dashed px-4 py-6 text-sm"
|
||||
>
|
||||
No matching branches were found across the
|
||||
linked repositories you can access.
|
||||
@@ -865,9 +871,10 @@ const formatDateTime = (value: string): string => {
|
||||
<div
|
||||
v-for="repositoryBranch in visibleRepositoryBranches"
|
||||
:key="
|
||||
repositoryBranch.repository_connection.id
|
||||
repositoryBranch.repository_connection
|
||||
.id
|
||||
"
|
||||
class="rounded-xl border border-border px-4 py-4"
|
||||
class="border-border rounded-xl border px-4 py-4"
|
||||
>
|
||||
<div
|
||||
class="flex flex-wrap items-center gap-2"
|
||||
@@ -889,7 +896,7 @@ const formatDateTime = (value: string): string => {
|
||||
</div>
|
||||
|
||||
<p
|
||||
class="mt-2 text-sm text-muted-foreground"
|
||||
class="text-muted-foreground mt-2 text-sm"
|
||||
>
|
||||
{{
|
||||
repositoryBranch
|
||||
@@ -906,14 +913,18 @@ const formatDateTime = (value: string): string => {
|
||||
class="mt-3 space-y-3"
|
||||
>
|
||||
<p
|
||||
class="text-sm text-muted-foreground"
|
||||
class="text-muted-foreground text-sm"
|
||||
>
|
||||
Connect a matching Git account in
|
||||
your user settings to inspect
|
||||
branches for this repository.
|
||||
</p>
|
||||
|
||||
<Button as-child variant="outline" size="sm">
|
||||
<Button
|
||||
as-child
|
||||
variant="outline"
|
||||
size="sm"
|
||||
>
|
||||
<Link :href="editGitConnections()">
|
||||
Open Git connections
|
||||
</Link>
|
||||
@@ -927,7 +938,10 @@ const formatDateTime = (value: string): string => {
|
||||
{{ repositoryBranch.error }}
|
||||
</div>
|
||||
|
||||
<div v-else class="mt-3 flex flex-wrap gap-2">
|
||||
<div
|
||||
v-else
|
||||
class="mt-3 flex flex-wrap gap-2"
|
||||
>
|
||||
<Badge
|
||||
v-for="branch in repositoryBranch.branches"
|
||||
:key="branch.name"
|
||||
@@ -964,7 +978,7 @@ const formatDateTime = (value: string): string => {
|
||||
ticket: ticket.id,
|
||||
})
|
||||
"
|
||||
class="grid gap-4 rounded-xl border border-dashed border-border p-4"
|
||||
class="border-border grid gap-4 rounded-xl border border-dashed p-4"
|
||||
v-slot="{ errors, processing }"
|
||||
>
|
||||
<div class="grid gap-2">
|
||||
@@ -974,7 +988,7 @@ const formatDateTime = (value: string): string => {
|
||||
<select
|
||||
id="ticket_link_type_id"
|
||||
name="ticket_link_type_id"
|
||||
class="rounded-md border border-input bg-background px-3 py-2 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50"
|
||||
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]"
|
||||
>
|
||||
<option
|
||||
v-for="ticketLinkType in ticketLinkTypes"
|
||||
@@ -996,7 +1010,7 @@ const formatDateTime = (value: string): string => {
|
||||
<select
|
||||
id="linked_ticket_id"
|
||||
name="linked_ticket_id"
|
||||
class="rounded-md border border-input bg-background px-3 py-2 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50"
|
||||
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]"
|
||||
>
|
||||
<option
|
||||
v-for="ticketLinkOption in ticketLinkOptions"
|
||||
@@ -1013,17 +1027,14 @@ const formatDateTime = (value: string): string => {
|
||||
/>
|
||||
</div>
|
||||
|
||||
<Button
|
||||
type="submit"
|
||||
:disabled="processing"
|
||||
>
|
||||
<Button type="submit" :disabled="processing">
|
||||
Save link
|
||||
</Button>
|
||||
</Form>
|
||||
|
||||
<div
|
||||
v-if="linkedTickets.length === 0"
|
||||
class="rounded-xl border border-dashed border-border px-4 py-6 text-sm text-muted-foreground"
|
||||
class="border-border text-muted-foreground rounded-xl border border-dashed px-4 py-6 text-sm"
|
||||
>
|
||||
No ticket links are configured for this ticket
|
||||
yet.
|
||||
@@ -1033,9 +1044,11 @@ const formatDateTime = (value: string): string => {
|
||||
<div
|
||||
v-for="linkedTicket in linkedTickets"
|
||||
:key="linkedTicket.id"
|
||||
class="rounded-xl border border-border px-4 py-4"
|
||||
class="border-border rounded-xl border px-4 py-4"
|
||||
>
|
||||
<div class="flex flex-wrap items-center gap-2">
|
||||
<div
|
||||
class="flex flex-wrap items-center gap-2"
|
||||
>
|
||||
<Badge variant="secondary">
|
||||
{{
|
||||
linkedTicket.ticket_link_type
|
||||
@@ -1050,7 +1063,7 @@ const formatDateTime = (value: string): string => {
|
||||
.linked_ticket.id,
|
||||
})
|
||||
"
|
||||
class="font-medium text-foreground transition hover:text-primary"
|
||||
class="text-foreground hover:text-primary font-medium transition"
|
||||
>
|
||||
{{
|
||||
linkedTicket.linked_ticket
|
||||
@@ -1058,7 +1071,9 @@ const formatDateTime = (value: string): string => {
|
||||
}}
|
||||
</Link>
|
||||
</div>
|
||||
<p class="mt-2 text-sm text-muted-foreground">
|
||||
<p
|
||||
class="text-muted-foreground mt-2 text-sm"
|
||||
>
|
||||
{{ linkedTicket.linked_ticket.title }}
|
||||
</p>
|
||||
|
||||
@@ -1069,8 +1084,7 @@ const formatDateTime = (value: string): string => {
|
||||
{
|
||||
project: project.id,
|
||||
ticket: ticket.id,
|
||||
ticketLink:
|
||||
linkedTicket.id,
|
||||
ticketLink: linkedTicket.id,
|
||||
},
|
||||
)
|
||||
"
|
||||
@@ -1106,7 +1120,7 @@ const formatDateTime = (value: string): string => {
|
||||
v-if="
|
||||
visibleRepositoryPullRequests.length === 0
|
||||
"
|
||||
class="rounded-xl border border-dashed border-border px-4 py-6 text-sm text-muted-foreground"
|
||||
class="border-border text-muted-foreground rounded-xl border border-dashed px-4 py-6 text-sm"
|
||||
>
|
||||
No matching pull requests were found across the
|
||||
linked repositories you can access.
|
||||
@@ -1119,7 +1133,7 @@ const formatDateTime = (value: string): string => {
|
||||
repositoryPullRequest
|
||||
.repository_connection.id
|
||||
"
|
||||
class="rounded-xl border border-border px-4 py-4"
|
||||
class="border-border rounded-xl border px-4 py-4"
|
||||
>
|
||||
<div
|
||||
class="flex flex-wrap items-center gap-2"
|
||||
@@ -1141,7 +1155,7 @@ const formatDateTime = (value: string): string => {
|
||||
</div>
|
||||
|
||||
<p
|
||||
class="mt-2 text-sm text-muted-foreground"
|
||||
class="text-muted-foreground mt-2 text-sm"
|
||||
>
|
||||
{{
|
||||
repositoryPullRequest
|
||||
@@ -1158,14 +1172,18 @@ const formatDateTime = (value: string): string => {
|
||||
class="mt-3 space-y-3"
|
||||
>
|
||||
<p
|
||||
class="text-sm text-muted-foreground"
|
||||
class="text-muted-foreground text-sm"
|
||||
>
|
||||
Connect a matching Git account in
|
||||
your user settings to inspect pull
|
||||
requests for this repository.
|
||||
</p>
|
||||
|
||||
<Button as-child variant="outline" size="sm">
|
||||
<Button
|
||||
as-child
|
||||
variant="outline"
|
||||
size="sm"
|
||||
>
|
||||
<Link :href="editGitConnections()">
|
||||
Open Git connections
|
||||
</Link>
|
||||
@@ -1183,7 +1201,7 @@ const formatDateTime = (value: string): string => {
|
||||
<div
|
||||
v-for="pullRequest in repositoryPullRequest.pull_requests"
|
||||
:key="pullRequest.html_url"
|
||||
class="rounded-xl border border-border/70 px-4 py-3"
|
||||
class="border-border/70 rounded-xl border px-4 py-3"
|
||||
>
|
||||
<div
|
||||
class="flex flex-wrap items-center gap-2"
|
||||
@@ -1192,26 +1210,22 @@ const formatDateTime = (value: string): string => {
|
||||
#{{ pullRequest.number }}
|
||||
</Badge>
|
||||
<Badge variant="secondary">
|
||||
{{
|
||||
pullRequest.status
|
||||
}}
|
||||
{{ pullRequest.status }}
|
||||
</Badge>
|
||||
<a
|
||||
:href="pullRequest.html_url"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
class="font-medium text-foreground transition hover:text-primary"
|
||||
class="text-foreground hover:text-primary font-medium transition"
|
||||
>
|
||||
{{ pullRequest.title }}
|
||||
</a>
|
||||
</div>
|
||||
<p
|
||||
class="mt-2 text-sm text-muted-foreground"
|
||||
class="text-muted-foreground mt-2 text-sm"
|
||||
>
|
||||
Source branch:
|
||||
{{
|
||||
pullRequest.source_branch
|
||||
}}
|
||||
{{ pullRequest.source_branch }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1232,7 +1246,7 @@ const formatDateTime = (value: string): string => {
|
||||
<CardContent>
|
||||
<div
|
||||
v-if="childTicketTree.length === 0"
|
||||
class="rounded-xl border border-dashed border-border px-4 py-6 text-sm text-muted-foreground"
|
||||
class="border-border text-muted-foreground rounded-xl border border-dashed px-4 py-6 text-sm"
|
||||
>
|
||||
No child tickets are assigned to this ticket
|
||||
yet.
|
||||
@@ -1260,7 +1274,7 @@ const formatDateTime = (value: string): string => {
|
||||
v-if="
|
||||
(ticket.worklog_entries?.length ?? 0) === 0
|
||||
"
|
||||
class="rounded-xl border border-dashed border-border px-4 py-6 text-sm text-muted-foreground"
|
||||
class="border-border text-muted-foreground rounded-xl border border-dashed px-4 py-6 text-sm"
|
||||
>
|
||||
No worklog entries exist for this ticket yet.
|
||||
</div>
|
||||
@@ -1269,7 +1283,7 @@ const formatDateTime = (value: string): string => {
|
||||
<div
|
||||
v-for="worklogEntry in ticket.worklog_entries"
|
||||
:key="worklogEntry.id"
|
||||
class="rounded-xl border border-border px-4 py-4"
|
||||
class="border-border rounded-xl border px-4 py-4"
|
||||
>
|
||||
<div
|
||||
class="flex flex-wrap items-center gap-2"
|
||||
@@ -1278,7 +1292,7 @@ const formatDateTime = (value: string): string => {
|
||||
{{ worklogEntry.entry_type }}
|
||||
</Badge>
|
||||
<span
|
||||
class="text-sm font-medium text-foreground"
|
||||
class="text-foreground text-sm font-medium"
|
||||
>
|
||||
{{
|
||||
worklogEntry.actor?.name ??
|
||||
@@ -1286,11 +1300,11 @@ const formatDateTime = (value: string): string => {
|
||||
}}
|
||||
</span>
|
||||
</div>
|
||||
<p class="mt-3 text-sm text-foreground">
|
||||
<p class="text-foreground mt-3 text-sm">
|
||||
{{ worklogEntry.summary }}
|
||||
</p>
|
||||
<p
|
||||
class="mt-2 text-xs text-muted-foreground"
|
||||
class="text-muted-foreground mt-2 text-xs"
|
||||
>
|
||||
{{
|
||||
formatDateTime(
|
||||
|
||||
@@ -89,7 +89,7 @@ const breadcrumbs: BreadcrumbItem[] = [
|
||||
|
||||
<CardContent class="flex flex-wrap gap-3">
|
||||
<Badge class="px-3 py-1">Backlog</Badge>
|
||||
<p class="text-sm text-muted-foreground">
|
||||
<p class="text-muted-foreground text-sm">
|
||||
Tickets will later be valid only in backlog or in one of
|
||||
the ordered columns below.
|
||||
</p>
|
||||
@@ -148,7 +148,7 @@ const breadcrumbs: BreadcrumbItem[] = [
|
||||
<CardContent class="space-y-4 p-6">
|
||||
<div
|
||||
v-if="boardColumns.length === 0"
|
||||
class="text-sm text-muted-foreground"
|
||||
class="text-muted-foreground text-sm"
|
||||
>
|
||||
No board columns exist yet.
|
||||
</div>
|
||||
@@ -156,7 +156,7 @@ const breadcrumbs: BreadcrumbItem[] = [
|
||||
<div
|
||||
v-for="column in boardColumns"
|
||||
:key="column.id"
|
||||
class="rounded-xl border border-border p-4"
|
||||
class="border-border rounded-xl border p-4"
|
||||
>
|
||||
<Form
|
||||
v-bind="
|
||||
|
||||
@@ -105,7 +105,7 @@ const breadcrumbs: BreadcrumbItem[] = [
|
||||
project.id,
|
||||
)
|
||||
"
|
||||
class="space-y-4 rounded-xl border border-dashed border-border p-4"
|
||||
class="border-border space-y-4 rounded-xl border border-dashed p-4"
|
||||
v-slot="{ errors, processing }"
|
||||
>
|
||||
<div class="grid gap-2">
|
||||
@@ -127,7 +127,7 @@ const breadcrumbs: BreadcrumbItem[] = [
|
||||
<div
|
||||
v-for="ticketType in ticketTypes"
|
||||
:key="ticketType.id"
|
||||
class="rounded-xl border border-border p-4"
|
||||
class="border-border rounded-xl border p-4"
|
||||
>
|
||||
<Form
|
||||
v-bind="
|
||||
@@ -155,7 +155,7 @@ const breadcrumbs: BreadcrumbItem[] = [
|
||||
}}
|
||||
</Badge>
|
||||
<p
|
||||
class="text-xs tracking-wide text-muted-foreground uppercase"
|
||||
class="text-muted-foreground text-xs uppercase tracking-wide"
|
||||
>
|
||||
Position {{ ticketType.position }}
|
||||
</p>
|
||||
@@ -243,7 +243,7 @@ const breadcrumbs: BreadcrumbItem[] = [
|
||||
project.id,
|
||||
)
|
||||
"
|
||||
class="space-y-4 rounded-xl border border-dashed border-border p-4"
|
||||
class="border-border space-y-4 rounded-xl border border-dashed p-4"
|
||||
v-slot="{ errors, processing }"
|
||||
>
|
||||
<div class="grid gap-2">
|
||||
@@ -267,7 +267,7 @@ const breadcrumbs: BreadcrumbItem[] = [
|
||||
<div
|
||||
v-for="ticketPriority in ticketPriorities"
|
||||
:key="ticketPriority.id"
|
||||
class="rounded-xl border border-border p-4"
|
||||
class="border-border rounded-xl border p-4"
|
||||
>
|
||||
<Form
|
||||
v-bind="
|
||||
@@ -361,7 +361,7 @@ const breadcrumbs: BreadcrumbItem[] = [
|
||||
project.id,
|
||||
)
|
||||
"
|
||||
class="space-y-4 rounded-xl border border-dashed border-border p-4"
|
||||
class="border-border space-y-4 rounded-xl border border-dashed p-4"
|
||||
v-slot="{ errors, processing }"
|
||||
>
|
||||
<div class="grid gap-2">
|
||||
@@ -380,7 +380,7 @@ const breadcrumbs: BreadcrumbItem[] = [
|
||||
<select
|
||||
id="field-type"
|
||||
name="field_type"
|
||||
class="rounded-md border border-input bg-background px-3 py-2 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50"
|
||||
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]"
|
||||
>
|
||||
<option
|
||||
v-for="option in fieldTypeOptions"
|
||||
@@ -401,7 +401,7 @@ const breadcrumbs: BreadcrumbItem[] = [
|
||||
<div
|
||||
v-for="fieldDefinition in ticketFieldDefinitions"
|
||||
:key="fieldDefinition.id"
|
||||
class="rounded-xl border border-border p-4"
|
||||
class="border-border rounded-xl border p-4"
|
||||
>
|
||||
<Form
|
||||
v-bind="
|
||||
@@ -436,7 +436,7 @@ const breadcrumbs: BreadcrumbItem[] = [
|
||||
<select
|
||||
:id="`field-type-${fieldDefinition.id}`"
|
||||
name="field_type"
|
||||
class="rounded-md border border-input bg-background px-3 py-2 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50"
|
||||
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]"
|
||||
>
|
||||
<option
|
||||
v-for="option in fieldTypeOptions"
|
||||
@@ -465,7 +465,9 @@ const breadcrumbs: BreadcrumbItem[] = [
|
||||
type="number"
|
||||
min="1"
|
||||
:max="ticketFieldDefinitions.length"
|
||||
:default-value="fieldDefinition.position"
|
||||
:default-value="
|
||||
fieldDefinition.position
|
||||
"
|
||||
required
|
||||
/>
|
||||
<InputError :message="errors.position" />
|
||||
@@ -521,7 +523,7 @@ const breadcrumbs: BreadcrumbItem[] = [
|
||||
project.id,
|
||||
)
|
||||
"
|
||||
class="space-y-4 rounded-xl border border-dashed border-border p-4"
|
||||
class="border-border space-y-4 rounded-xl border border-dashed p-4"
|
||||
v-slot="{ errors, processing }"
|
||||
>
|
||||
<div class="grid gap-2">
|
||||
@@ -545,7 +547,7 @@ const breadcrumbs: BreadcrumbItem[] = [
|
||||
<div
|
||||
v-for="ticketLinkType in ticketLinkTypes"
|
||||
:key="ticketLinkType.id"
|
||||
class="rounded-xl border border-border p-4"
|
||||
class="border-border rounded-xl border p-4"
|
||||
>
|
||||
<Form
|
||||
v-bind="
|
||||
|
||||
@@ -47,7 +47,9 @@ const breadcrumbs: BreadcrumbItem[] = [
|
||||
];
|
||||
|
||||
const selectableRepositorySources = computed(() =>
|
||||
props.availableRepositorySources.filter((source) => source.repositories.length > 0),
|
||||
props.availableRepositorySources.filter(
|
||||
(source) => source.repositories.length > 0,
|
||||
),
|
||||
);
|
||||
|
||||
const repositoryConnectionById = computed(
|
||||
@@ -271,7 +273,7 @@ const submitUpdate = (): void => {
|
||||
Open Git connections
|
||||
</Link>
|
||||
</Button>
|
||||
<p class="text-sm text-muted-foreground">
|
||||
<p class="text-muted-foreground text-sm">
|
||||
Without a matching personal connection, KanbanGit only
|
||||
shows the repository name and links you to your user
|
||||
settings.
|
||||
@@ -293,7 +295,7 @@ const submitUpdate = (): void => {
|
||||
<CardContent>
|
||||
<div
|
||||
v-if="selectableRepositorySources.length === 0"
|
||||
class="rounded-xl border border-dashed border-border px-4 py-6 text-sm text-muted-foreground"
|
||||
class="border-border text-muted-foreground rounded-xl border border-dashed px-4 py-6 text-sm"
|
||||
>
|
||||
Add a personal Git connection first, or fix an
|
||||
existing connection that currently cannot load
|
||||
@@ -311,13 +313,17 @@ const submitUpdate = (): void => {
|
||||
</Label>
|
||||
<select
|
||||
id="create-user-git-connection"
|
||||
v-model="createForm.user_git_connection_id"
|
||||
class="rounded-md border border-input bg-background px-3 py-2 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50"
|
||||
v-model="
|
||||
createForm.user_git_connection_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]"
|
||||
>
|
||||
<option
|
||||
v-for="source in selectableRepositorySources"
|
||||
:key="source.user_git_connection_id"
|
||||
:value="source.user_git_connection_id"
|
||||
:value="
|
||||
source.user_git_connection_id
|
||||
"
|
||||
>
|
||||
{{
|
||||
`${source.provider_label} · ${source.account_login} @ ${source.base_url}`
|
||||
@@ -326,7 +332,8 @@ const submitUpdate = (): void => {
|
||||
</select>
|
||||
<InputError
|
||||
:message="
|
||||
createForm.errors.user_git_connection_id
|
||||
createForm.errors
|
||||
.user_git_connection_id
|
||||
"
|
||||
/>
|
||||
</div>
|
||||
@@ -340,7 +347,7 @@ const submitUpdate = (): void => {
|
||||
v-model="
|
||||
createForm.provider_repository_id
|
||||
"
|
||||
class="rounded-md border border-input bg-background px-3 py-2 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50"
|
||||
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]"
|
||||
>
|
||||
<option
|
||||
v-for="repository in createRepositories"
|
||||
@@ -358,7 +365,8 @@ const submitUpdate = (): void => {
|
||||
</select>
|
||||
<InputError
|
||||
:message="
|
||||
createForm.errors.provider_repository_id
|
||||
createForm.errors
|
||||
.provider_repository_id
|
||||
"
|
||||
/>
|
||||
</div>
|
||||
@@ -382,9 +390,9 @@ const submitUpdate = (): void => {
|
||||
<CardHeader>
|
||||
<CardTitle>Relink repository</CardTitle>
|
||||
<CardDescription>
|
||||
Update an existing project repository
|
||||
connection by choosing a different repository
|
||||
from one of your personal Git connections.
|
||||
Update an existing project repository connection
|
||||
by choosing a different repository from one of
|
||||
your personal Git connections.
|
||||
</CardDescription>
|
||||
</CardHeader>
|
||||
|
||||
@@ -402,7 +410,7 @@ const submitUpdate = (): void => {
|
||||
v-model="
|
||||
updateForm.repository_connection_id
|
||||
"
|
||||
class="rounded-md border border-input bg-background px-3 py-2 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50"
|
||||
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]"
|
||||
>
|
||||
<option
|
||||
v-for="repositoryConnection in repositoryConnections"
|
||||
@@ -422,13 +430,17 @@ const submitUpdate = (): void => {
|
||||
</Label>
|
||||
<select
|
||||
id="update-user-git-connection"
|
||||
v-model="updateForm.user_git_connection_id"
|
||||
class="rounded-md border border-input bg-background px-3 py-2 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50"
|
||||
v-model="
|
||||
updateForm.user_git_connection_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]"
|
||||
>
|
||||
<option
|
||||
v-for="source in selectableRepositorySources"
|
||||
:key="source.user_git_connection_id"
|
||||
:value="source.user_git_connection_id"
|
||||
:value="
|
||||
source.user_git_connection_id
|
||||
"
|
||||
>
|
||||
{{
|
||||
`${source.provider_label} · ${source.account_login} @ ${source.base_url}`
|
||||
@@ -437,7 +449,8 @@ const submitUpdate = (): void => {
|
||||
</select>
|
||||
<InputError
|
||||
:message="
|
||||
updateForm.errors.user_git_connection_id
|
||||
updateForm.errors
|
||||
.user_git_connection_id
|
||||
"
|
||||
/>
|
||||
</div>
|
||||
@@ -451,7 +464,7 @@ const submitUpdate = (): void => {
|
||||
v-model="
|
||||
updateForm.provider_repository_id
|
||||
"
|
||||
class="rounded-md border border-input bg-background px-3 py-2 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50"
|
||||
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]"
|
||||
>
|
||||
<option
|
||||
v-for="repository in updateRepositories"
|
||||
@@ -469,7 +482,8 @@ const submitUpdate = (): void => {
|
||||
</select>
|
||||
<InputError
|
||||
:message="
|
||||
updateForm.errors.provider_repository_id
|
||||
updateForm.errors
|
||||
.provider_repository_id
|
||||
"
|
||||
/>
|
||||
</div>
|
||||
@@ -500,7 +514,7 @@ const submitUpdate = (): void => {
|
||||
<CardContent class="space-y-4 p-6">
|
||||
<div
|
||||
v-if="repositoryConnections.length === 0"
|
||||
class="rounded-xl border border-dashed border-border px-4 py-6 text-sm text-muted-foreground"
|
||||
class="border-border text-muted-foreground rounded-xl border border-dashed px-4 py-6 text-sm"
|
||||
>
|
||||
No repositories are linked to this project yet.
|
||||
</div>
|
||||
@@ -508,20 +522,24 @@ const submitUpdate = (): void => {
|
||||
<div
|
||||
v-for="repositoryConnection in repositoryConnections"
|
||||
:key="repositoryConnection.id"
|
||||
class="rounded-xl border border-border p-4"
|
||||
class="border-border rounded-xl border p-4"
|
||||
>
|
||||
<div
|
||||
class="flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between"
|
||||
>
|
||||
<div class="space-y-2">
|
||||
<div class="flex flex-wrap items-center gap-2">
|
||||
<div
|
||||
class="flex flex-wrap items-center gap-2"
|
||||
>
|
||||
<Badge>
|
||||
{{
|
||||
repositoryConnection.provider_label
|
||||
}}
|
||||
</Badge>
|
||||
<Badge variant="secondary">
|
||||
{{ repositoryConnection.base_url }}
|
||||
{{
|
||||
repositoryConnection.base_url
|
||||
}}
|
||||
</Badge>
|
||||
</div>
|
||||
<div>
|
||||
@@ -530,7 +548,9 @@ const submitUpdate = (): void => {
|
||||
repositoryConnection.repository_full_name
|
||||
}}
|
||||
</p>
|
||||
<p class="text-sm text-muted-foreground">
|
||||
<p
|
||||
class="text-muted-foreground text-sm"
|
||||
>
|
||||
{{
|
||||
repositoryConnection.repository_name
|
||||
}}
|
||||
@@ -574,8 +594,10 @@ const submitUpdate = (): void => {
|
||||
</div>
|
||||
|
||||
<p
|
||||
v-if="!repositoryConnection.has_personal_access"
|
||||
class="mt-3 text-sm text-muted-foreground"
|
||||
v-if="
|
||||
!repositoryConnection.has_personal_access
|
||||
"
|
||||
class="text-muted-foreground mt-3 text-sm"
|
||||
>
|
||||
This project link is visible, but you need a
|
||||
matching Git connection in your user
|
||||
@@ -625,14 +647,14 @@ const submitUpdate = (): void => {
|
||||
<div
|
||||
v-for="source in availableRepositorySources"
|
||||
:key="source.user_git_connection_id"
|
||||
class="rounded-xl border border-border p-4"
|
||||
class="border-border rounded-xl border p-4"
|
||||
>
|
||||
<div class="flex flex-wrap items-center gap-2">
|
||||
<Badge>{{ source.provider_label }}</Badge>
|
||||
<span class="text-sm font-medium">
|
||||
{{ source.account_login }}
|
||||
</span>
|
||||
<span class="text-xs text-muted-foreground">
|
||||
<span class="text-muted-foreground text-xs">
|
||||
{{ source.base_url }}
|
||||
</span>
|
||||
</div>
|
||||
@@ -646,10 +668,11 @@ const submitUpdate = (): void => {
|
||||
|
||||
<p
|
||||
v-else
|
||||
class="mt-3 text-sm text-muted-foreground"
|
||||
class="text-muted-foreground mt-3 text-sm"
|
||||
>
|
||||
{{ source.repositories.length }} repositories
|
||||
available through this connection.
|
||||
{{ source.repositories.length }}
|
||||
repositories available through this
|
||||
connection.
|
||||
</p>
|
||||
</div>
|
||||
</CardContent>
|
||||
|
||||
Reference in New Issue
Block a user