feat(transport) : datatable Qualimat vide par défaut, n'affiche que les résultats de recherche (ERP-166)
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m30s
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Failing after 42s

This commit is contained in:
2026-06-17 08:14:57 +02:00
parent cf645493c1
commit 0733a239a8
2 changed files with 31 additions and 16 deletions
+1
View File
@@ -558,6 +558,7 @@
}, },
"qualimat": { "qualimat": {
"empty": "Aucun transporteur QUALIMAT trouvé.", "empty": "Aucun transporteur QUALIMAT trouvé.",
"searchHint": "Saisissez le nom du transporteur pour lancer la recherche.",
"columns": { "columns": {
"name": "Nom", "name": "Nom",
"address": "Adresse", "address": "Adresse",
@@ -138,12 +138,12 @@
<MalioDataTable <MalioDataTable
:columns="qualimatColumns" :columns="qualimatColumns"
:items="qualimatRows" :items="qualimatRows"
:total-items="qualimatTotal" :total-items="qualimatTotalDisplay"
:page="qualimatPage" :page="qualimatPage"
:per-page="qualimatPerPage" :per-page="qualimatPerPage"
:per-page-options="qualimatPerPageOptions" :per-page-options="qualimatPerPageOptions"
row-clickable row-clickable
:empty-message="t('transport.carriers.form.qualimat.empty')" :empty-message="qualimatEmptyMessage"
@row-click="onQualimatRowClick" @row-click="onQualimatRowClick"
@update:page="qualimatGoToPage" @update:page="qualimatGoToPage"
@update:per-page="qualimatSetPerPage" @update:per-page="qualimatSetPerPage"
@@ -207,7 +207,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { computed, onMounted, ref, watch } from 'vue' import { computed, ref, watch } from 'vue'
import { debounce } from '~/shared/utils/debounce' import { debounce } from '~/shared/utils/debounce'
import { useCarrierForm } from '~/modules/transport/composables/useCarrierForm' import { useCarrierForm } from '~/modules/transport/composables/useCarrierForm'
import { useQualimatSearch, type QualimatCarrierRow } from '~/modules/transport/composables/useQualimatSearch' import { useQualimatSearch, type QualimatCarrierRow } from '~/modules/transport/composables/useQualimatSearch'
@@ -283,15 +283,30 @@ const qualimatColumns = [
{ key: 'validityDate', label: t('transport.carriers.form.qualimat.columns.validityDate') }, { key: 'validityDate', label: t('transport.carriers.form.qualimat.columns.validityDate') },
] ]
// Le datatable n'affiche QUE des résultats de recherche : vide tant que le Nom n'est
// pas saisi (pas de liste complète par défaut). `main.name` pilote l'affichage.
const hasQualimatSearch = computed(() => main.name.trim() !== '')
// Lignes « plates » pour MalioDataTable (l'IRI sert au radio + à retrouver la ligne // Lignes « plates » pour MalioDataTable (l'IRI sert au radio + à retrouver la ligne
// source au clic). Le détail QUALIMAT complet reste dans `qualimatItems`. // source au clic). Le détail QUALIMAT complet reste dans `qualimatItems`.
const qualimatRows = computed(() => qualimatItems.value.map(row => ({ const qualimatRows = computed(() => {
id: row.id, if (!hasQualimatSearch.value) {
iri: row['@id'], return []
name: row.name, }
address: formatQualimatAddress(row), return qualimatItems.value.map(row => ({
validityDate: row.validityDate, id: row.id,
}))) iri: row['@id'],
name: row.name,
address: formatQualimatAddress(row),
validityDate: row.validityDate,
}))
})
// Total / message vide alignés sur « tableau vide tant qu'on n'a pas recherché ».
const qualimatTotalDisplay = computed(() => (hasQualimatSearch.value ? qualimatTotal.value : 0))
const qualimatEmptyMessage = computed(() => hasQualimatSearch.value
? t('transport.carriers.form.qualimat.empty')
: t('transport.carriers.form.qualimat.searchHint'))
// Contenant (RG-4.03) : Benne / Fond mouvant — select simple. // Contenant (RG-4.03) : Benne / Fond mouvant — select simple.
const CONTAINER_TYPES = ['BENNE', 'FOND_MOUVANT'] as const const CONTAINER_TYPES = ['BENNE', 'FOND_MOUVANT'] as const
@@ -328,18 +343,17 @@ const confirmOpen = ref(false)
const pendingRow = ref<QualimatCarrierRow | null>(null) const pendingRow = ref<QualimatCarrierRow | null>(null)
// Le datatable QUALIMAT est filtré par le NOM saisi dans le formulaire principal // Le datatable QUALIMAT est filtré par le NOM saisi dans le formulaire principal
// (RG-4.01) — pas de champ de recherche dédié. Re-filtrage debouncé à chaque frappe, // (RG-4.01) — pas de champ de recherche dédié. Aucune recherche tant que le Nom est
// plus un chargement initial au montage (liste active complète si le nom est vide). // vide (tableau vide par défaut) ; sinon re-filtrage debouncé à chaque frappe.
const filterQualimatByName = debounce((term: string) => { const filterQualimatByName = debounce((term: string) => {
if (term.trim() === '') {
return
}
void qualimatSetFilters({ search: term }) void qualimatSetFilters({ search: term })
}, 300) }, 300)
watch(() => main.name, term => filterQualimatByName(term)) watch(() => main.name, term => filterQualimatByName(term))
onMounted(() => {
void qualimatSetFilters({ search: main.name })
})
/** Adresse QUALIMAT condensee pour la colonne « Adresse » (voie · CP · ville). */ /** Adresse QUALIMAT condensee pour la colonne « Adresse » (voie · CP · ville). */
function formatQualimatAddress(row: QualimatCarrierRow): string { function formatQualimatAddress(row: QualimatCarrierRow): string {
return [row.address, row.postalCode, row.city].filter(Boolean).join(' · ') return [row.address, row.postalCode, row.city].filter(Boolean).join(' · ')