diff --git a/app/Models/BoardColumn.php b/app/Models/BoardColumn.php index c1fb63b..3c8081f 100644 --- a/app/Models/BoardColumn.php +++ b/app/Models/BoardColumn.php @@ -16,6 +16,7 @@ class BoardColumn extends Model { /** @use HasFactory */ use HasFactory; + use SyncsProjectTemplateOwnership; protected static function booted(): void diff --git a/app/Models/NotificationAction.php b/app/Models/NotificationAction.php index d2217c9..70bbd92 100644 --- a/app/Models/NotificationAction.php +++ b/app/Models/NotificationAction.php @@ -31,6 +31,7 @@ class NotificationAction extends Model { /** @use HasFactory */ use HasFactory; + use SyncsProjectTemplateOwnership; /** diff --git a/app/Models/RepositoryConnection.php b/app/Models/RepositoryConnection.php index 9095d6d..81725c1 100644 --- a/app/Models/RepositoryConnection.php +++ b/app/Models/RepositoryConnection.php @@ -26,6 +26,7 @@ class RepositoryConnection extends Model { /** @use HasFactory */ use HasFactory; + use SyncsProjectTemplateOwnership; /** diff --git a/app/Models/TicketFieldDefinition.php b/app/Models/TicketFieldDefinition.php index b5aaf27..2f7afe4 100644 --- a/app/Models/TicketFieldDefinition.php +++ b/app/Models/TicketFieldDefinition.php @@ -23,6 +23,7 @@ class TicketFieldDefinition extends Model /** @use HasFactory */ use HasFactory; + use SyncsProjectTemplateOwnership; protected static function booted(): void diff --git a/app/Models/TicketLinkType.php b/app/Models/TicketLinkType.php index d34c2f6..e42e97a 100644 --- a/app/Models/TicketLinkType.php +++ b/app/Models/TicketLinkType.php @@ -15,6 +15,7 @@ class TicketLinkType extends Model { /** @use HasFactory */ use HasFactory; + use SyncsProjectTemplateOwnership; protected static function booted(): void diff --git a/app/Models/TicketStatus.php b/app/Models/TicketStatus.php index 0bfe7fe..6aaa879 100644 --- a/app/Models/TicketStatus.php +++ b/app/Models/TicketStatus.php @@ -17,6 +17,7 @@ class TicketStatus extends Model { /** @use HasFactory */ use HasFactory; + use SyncsProjectTemplateOwnership; protected static function booted(): void diff --git a/app/Models/TicketType.php b/app/Models/TicketType.php index 0a38385..9675876 100644 --- a/app/Models/TicketType.php +++ b/app/Models/TicketType.php @@ -15,6 +15,7 @@ class TicketType extends Model { /** @use HasFactory */ use HasFactory; + use SyncsProjectTemplateOwnership; protected static function booted(): void diff --git a/package-lock.json b/package-lock.json index 8bc6bb4..342701d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,7 +4,6 @@ "requires": true, "packages": { "": { - "name": "KanbanGit", "dependencies": { "@inertiajs/vue3": "^2.3.7", "@vueuse/core": "^12.8.2", @@ -1303,7 +1302,6 @@ "integrity": "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -1320,7 +1318,6 @@ "integrity": "sha512-eSkwoemjo76bdXl2MYqtxg51HNwUSkWfODUOQ3PaTLZGh9uIWWFZIjyjaJnex7wXDu+TRx+ATsnSxdN9YWfRTQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.58.1", @@ -1360,7 +1357,6 @@ "integrity": "sha512-gGkiNMPqerb2cJSVcruigx9eHBlLG14fSdPdqMoOcBfh+vvn4iCq2C8MzUB89PrxOXk0y3GZ1yIWb9aOzL93bw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.58.1", "@typescript-eslint/types": "8.58.1", @@ -2111,7 +2107,6 @@ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3020,7 +3015,6 @@ "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -3081,7 +3075,6 @@ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", - "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -3208,7 +3201,6 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -3351,7 +3343,6 @@ "integrity": "sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "globals": "^13.24.0", @@ -5483,7 +5474,6 @@ "integrity": "sha512-8c3mgTe0ASwWAJK+78dpviD+A8EqhndQPUBpNUIPt6+xWlIigCwfN01lWr9MAede4uqXGTEKeQWTvzb3vjia0Q==", "dev": true, "license": "MIT", - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -6525,7 +6515,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -6591,7 +6580,6 @@ "dev": true, "hasInstallScript": true, "license": "MIT", - "peer": true, "dependencies": { "napi-postinstall": "^0.3.0" }, @@ -6642,7 +6630,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", "license": "MIT", - "peer": true, "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.5", @@ -6998,7 +6985,6 @@ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.30.tgz", "integrity": "sha512-hTHLc6VNZyzzEH/l7PFGjpcTvUgiaPK5mdLkbjrTeWSRcEfxFrv56g/XckIYlE9ckuobsdwqd5mk2g1sBkMewg==", "license": "MIT", - "peer": true, "dependencies": { "@vue/compiler-dom": "3.5.30", "@vue/compiler-sfc": "3.5.30", diff --git a/resources/js/lib/acceptance-criteria.ts b/resources/js/lib/acceptance-criteria.ts index 3224291..79cf7d3 100644 --- a/resources/js/lib/acceptance-criteria.ts +++ b/resources/js/lib/acceptance-criteria.ts @@ -121,9 +121,7 @@ const parseChecklistLine = ( return null; } - const indentLevel = clampIndent( - Math.floor(match.groups.indent.length / 2), - ); + const indentLevel = clampIndent(Math.floor(match.groups.indent.length / 2)); let content = match.groups.content.trim(); let checked = false; diff --git a/resources/js/pages/admin/users/Create.vue b/resources/js/pages/admin/users/Create.vue index 59a28bb..c21acf0 100644 --- a/resources/js/pages/admin/users/Create.vue +++ b/resources/js/pages/admin/users/Create.vue @@ -52,12 +52,16 @@ const breadcrumbs: BreadcrumbItem[] = [
@@ -128,13 +132,19 @@ const breadcrumbs: BreadcrumbItem[] = [ Must change password on next login - - Redirect the user to the security settings page until they save a new password. + + Redirect the user to the security + settings page until they save a new + password. diff --git a/resources/js/pages/project-templates/Create.vue b/resources/js/pages/project-templates/Create.vue index 4a7f98a..3df553c 100644 --- a/resources/js/pages/project-templates/Create.vue +++ b/resources/js/pages/project-templates/Create.vue @@ -15,7 +15,10 @@ import { import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import AppLayout from '@/layouts/AppLayout.vue'; -import { index as projectsIndex, show as projectShow } from '@/routes/projects/index'; +import { + index as projectsIndex, + show as projectShow, +} from '@/routes/projects/index'; import { create as projectTemplateCreate, store as projectTemplateStore, @@ -40,7 +43,9 @@ const breadcrumbs: BreadcrumbItem[] = [ ]; const form = useForm({ - copy_areas: props.copyAreaOptions.map((copyAreaOption) => copyAreaOption.value), + copy_areas: props.copyAreaOptions.map( + (copyAreaOption) => copyAreaOption.value, + ), name: `${props.project.name} template`, slug: `${props.project.key.toLowerCase()}-template`, }); @@ -48,7 +53,9 @@ const form = useForm({ const copyAreasError = computed(() => { return ( form.errors.copy_areas ?? - Object.entries(form.errors).find(([key]) => key.startsWith('copy_areas.'))?.[1] ?? + Object.entries(form.errors).find(([key]) => + key.startsWith('copy_areas.'), + )?.[1] ?? '' ); }); @@ -66,7 +73,9 @@ const submit = (): void => {
- {{ project.key }} + {{ + project.key + }} { Template details - Pick the configuration groups that should be reusable in future projects. + Pick the configuration groups that should be reusable in + future projects. @@ -85,15 +95,26 @@ const submit = (): void => {
- +
- +

- Slugs are normalized automatically and used to identify reusable templates. + Slugs are normalized automatically and used to + identify reusable templates.

@@ -102,7 +123,8 @@ const submit = (): void => {

- Only the selected groups will be stored in the template. + Only the selected groups will be stored in + the template.

@@ -119,8 +141,12 @@ const submit = (): void => { class="mt-1" />
-
{{ copyAreaOption.label }}
-

+

+ {{ copyAreaOption.label }} +
+

{{ copyAreaOption.description }}

@@ -135,7 +161,9 @@ const submit = (): void => {
diff --git a/resources/js/pages/project-templates/Edit.vue b/resources/js/pages/project-templates/Edit.vue index fccbf70..8da0ed7 100644 --- a/resources/js/pages/project-templates/Edit.vue +++ b/resources/js/pages/project-templates/Edit.vue @@ -44,12 +44,16 @@ const form = useForm({ const copyAreasError = computed(() => { return ( form.errors.copy_areas ?? - Object.entries(form.errors).find(([key]) => key.startsWith('copy_areas.'))?.[1] ?? + Object.entries(form.errors).find(([key]) => + key.startsWith('copy_areas.'), + )?.[1] ?? '' ); }); -const linkedProjectCount = computed(() => props.template.linked_project_count ?? 0); +const linkedProjectCount = computed( + () => props.template.linked_project_count ?? 0, +); const submit = (): void => { form.patch(projectTemplatesUpdate.url(props.template.id), { @@ -65,9 +69,12 @@ const submit = (): void => {
- {{ template.slug }} + {{ + template.slug + }} - {{ linkedProjectCount }} linked {{ linkedProjectCount === 1 ? 'project' : 'projects' }} + {{ linkedProjectCount }} linked + {{ linkedProjectCount === 1 ? 'project' : 'projects' }}
{ Template details @@ -93,15 +104,25 @@ const submit = (): void => {
- +
- +

- The slug stays locked so existing template references remain stable. + The slug stays locked so existing template + references remain stable.

@@ -109,7 +130,8 @@ const submit = (): void => {

- Saving rebuilds the selected groups from the current source-project configuration. + Saving rebuilds the selected groups from the + current source-project configuration.

@@ -126,8 +148,12 @@ const submit = (): void => { class="mt-1" />
-
{{ copyAreaOption.label }}
-

+

+ {{ copyAreaOption.label }} +
+

{{ copyAreaOption.description }}

@@ -143,19 +169,39 @@ const submit = (): void => {
Warning

- Saving this template updates the baseline for {{ linkedProjectCount }} linked {{ linkedProjectCount === 1 ? 'project' : 'projects' }}. - Inherited areas will follow the new template version, while existing overrides stay untouched. + Saving this template updates the baseline + for {{ linkedProjectCount }} linked + {{ + linkedProjectCount === 1 + ? 'project' + : 'projects' + }}. Inherited areas will follow the new + template version, while existing overrides + stay untouched.

-
@@ -164,7 +210,9 @@ const submit = (): void => {
diff --git a/resources/js/pages/project-templates/Index.vue b/resources/js/pages/project-templates/Index.vue index 2f5bf61..c3fbc53 100644 --- a/resources/js/pages/project-templates/Index.vue +++ b/resources/js/pages/project-templates/Index.vue @@ -16,7 +16,10 @@ import { edit as projectTemplatesEdit, index as projectTemplatesIndex, } from '@/routes/project-templates'; -import { create as projectsCreate, index as projectsIndex } from '@/routes/projects/index'; +import { + create as projectsCreate, + index as projectsIndex, +} from '@/routes/projects/index'; import type { BreadcrumbItem, ProjectTemplatesIndexPageProps } from '@/types'; const props = defineProps(); @@ -40,7 +43,9 @@ const removeTemplate = (templateId: number): void => {
-
+
{ {{ status }}
-
+
No published project templates have been saved yet.
- +
{{ template.name }} - {{ template.slug }} - - {{ template.linked_project_count }} linked {{ template.linked_project_count === 1 ? 'project' : 'projects' }} + {{ + template.slug + }} + + {{ template.linked_project_count }} linked + {{ + template.linked_project_count === 1 + ? 'project' + : 'projects' + }}