feat(transport) : upload décharge (useUpload) + câblage MalioInputUpload + i18n erreur (ERP-171)

This commit is contained in:
2026-06-17 15:14:31 +02:00
parent b6b5bb06e8
commit 1d5110d000
6 changed files with 179 additions and 7 deletions
@@ -45,12 +45,16 @@
/>
<MalioInputUpload
v-if="showDischarge"
:model-value="dischargeFileName"
:label="t('transport.carriers.form.main.discharge')"
accept="application/pdf,image/*"
:required="true"
:readonly="dischargeUploading"
:clearable="true"
:error="mainErrors.errors.dischargeDocument"
@clear="main.dischargeDocumentIri = null"
@update:model-value="(v: string) => dischargeFileName = v"
@file-selected="uploadDischarge"
@clear="onClearDischarge"
/>
<div v-else class="hidden xl:block"></div>
<div class="flex h-12 items-center">
@@ -231,6 +235,8 @@ const {
mainSubmitting,
tabSubmitting,
mainErrors,
dischargeUploading,
uploadDischarge,
isLiot,
certificationReadonly,
showCharteredFields,
@@ -307,6 +313,12 @@ onMounted(async () => {
await load()
if (carrier.value) {
prefillFrom(carrier.value)
// Pré-affiche le nom du fichier de décharge déjà rattaché (s'il existe).
const doc = carrier.value.dischargeDocument
if (doc && typeof doc !== 'string') {
const meta = doc as Record<string, unknown>
dischargeFileName.value = String(meta.originalFilename ?? meta.name ?? '')
}
}
loadCountries().catch(() => {})
void loadOptions('/clients', clientOptions, m => String(m.companyName ?? m['@id']))
@@ -319,6 +331,16 @@ function apiErrorMessage(err: unknown): string {
return extractApiErrorMessage(data) || t('transport.carriers.toast.error')
}
// Nom de fichier affiché dans le champ Décharge (alimenté à la sélection ou au
// chargement d'un transporteur ayant déjà une décharge).
const dischargeFileName = ref('')
/** Vidage du champ Décharge : retire l'IRI et le nom affiché. */
function onClearDischarge(): void {
main.dischargeDocumentIri = null
dischargeFileName.value = ''
}
// Indexation plafonnée à 100 % : la clé force le ré-affichage du MalioInputAmount
// (contrôlé) quand le plafonnement laisse le modelValue inchangé.
const indexationKey = ref(0)
@@ -53,18 +53,20 @@
<!-- Colonne 3 RÉSERVÉE à la Décharge (RG-4.02 : visible et obligatoire
si certification AUTRE). Si elle n'apparaît pas, on garde la colonne
vide (xl) pour qu'« Affréter » reste en colonne 4 de la ligne 1.
L'upload reel (File → IRI via useUpload) arrive a ERP-171. -->
<!-- TODO ERP-171 : brancher useUpload pour resoudre le File en IRI
(main.dischargeDocumentIri). Le champ est deja visible/obligatoire. -->
L'upload réel (File → IRI via useUpload, ERP-171) résout le
fichier en IRI posé sur main.dischargeDocumentIri. -->
<MalioInputUpload
v-if="showDischarge"
:model-value="dischargeFileName"
:label="t('transport.carriers.form.main.discharge')"
accept="application/pdf,image/*"
:required="true"
:readonly="mainLocked"
:readonly="mainLocked || dischargeUploading"
:clearable="true"
:error="mainErrors.errors.dischargeDocument"
@clear="main.dischargeDocumentIri = null"
@update:model-value="(v: string) => dischargeFileName = v"
@file-selected="uploadDischarge"
@clear="onClearDischarge"
/>
<div v-else class="hidden xl:block"></div>
@@ -398,6 +400,8 @@ const {
mainSubmitting,
tabSubmitting,
mainErrors,
dischargeUploading,
uploadDischarge,
isLiot,
isQualimat,
certificationReadonly,
@@ -429,6 +433,15 @@ const {
applyQualimatSelection,
} = useCarrierForm()
// Nom de fichier affiché dans le champ Décharge (alimenté à la sélection).
const dischargeFileName = ref('')
/** Vidage du champ Décharge : retire l'IRI et le nom affiché. */
function onClearDischarge(): void {
main.dischargeDocumentIri = null
dischargeFileName.value = ''
}
const {
items: qualimatItems,
totalItems: qualimatTotal,