lint fix and formatted
linter / quality (push) Successful in 1m20s
tests / ci (8.4) (push) Successful in 1m20s

This commit is contained in:
2026-04-11 16:37:58 +02:00
parent 23a66852a6
commit e5d11c940b
38 changed files with 339 additions and 261 deletions
+16 -16
View File
@@ -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>
+14 -14
View File
@@ -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>
+9 -6
View File
@@ -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"
+2 -2
View File
@@ -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>
+3 -3
View File
@@ -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
+2 -2
View File
@@ -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>
+86 -72
View File
@@ -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>