feat : add project code and task auto-numbering

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Matthieu
2026-03-13 08:20:31 +01:00
parent 56275a9ebe
commit 517511177c
5 changed files with 98 additions and 1 deletions

View File

@@ -1,6 +1,15 @@
<template>
<AppDrawer v-model="isOpen" :title="isEditing ? 'Modifier un projet' : 'Ajouter un projet'">
<form @submit.prevent="handleSubmit" class="flex flex-col gap-2">
<MalioInputText
v-model="form.code"
label="Code"
input-class="w-full uppercase"
:disabled="isEditing"
:error="touched.code && !form.code.trim() ? 'Le code est requis' : touched.code && !/^[A-Z]{2,10}$/.test(form.code.trim()) ? '2 à 10 lettres majuscules' : ''"
@blur="touched.code = true"
@input="form.code = form.code.toUpperCase().replace(/[^A-Z]/g, '')"
/>
<MalioInputText
v-model="form.name"
label="Titre"
@@ -62,6 +71,7 @@ const isEditing = computed(() => !!props.project)
const isSubmitting = ref(false)
const form = reactive({
code: '',
name: '',
description: '',
color: '#222783',
@@ -69,6 +79,7 @@ const form = reactive({
})
const touched = reactive({
code: false,
name: false,
})
@@ -79,16 +90,19 @@ const clientOptions = computed(() =>
watch(() => props.modelValue, (open) => {
if (open) {
if (props.project) {
form.code = props.project.code ?? ''
form.name = props.project.name ?? ''
form.description = props.project.description ?? ''
form.color = props.project.color ?? '#222783'
form.clientId = props.project.client?.id ?? null
} else {
form.code = ''
form.name = ''
form.description = ''
form.color = '#222783'
form.clientId = null
}
touched.code = false
touched.name = false
}
})
@@ -97,7 +111,9 @@ const { create, update } = useProjectService()
async function handleSubmit() {
touched.name = true
touched.code = true
if (!form.name.trim()) return
if (!isEditing.value && (!form.code.trim() || !/^[A-Z]{2,10}$/.test(form.code.trim()))) return
isSubmitting.value = true
try {
@@ -111,6 +127,7 @@ async function handleSubmit() {
if (isEditing.value && props.project) {
await update(props.project.id, payload)
} else {
payload.code = form.code.trim()
await create(payload)
}