feat(catalog) : M6 — écran consultation produit + onglets conditionnés + édition sans redirection
Auto Tag Develop / tag (push) Successful in 37s
Auto Tag Develop / tag (push) Successful in 37s
- Nouvel écran de consultation lecture seule /admin/products/{id} (calque
client/fournisseur) : clic sur une ligne ouvre la consultation (plus l'édition
directe), bouton « Modifier » → édition.
- Règle ERP-193 en consultation : champs vides / checkbox non cochées masqués
(isFilled) ; onglets vides masqués → les coquilles Fournisseurs/Clients
(placeholder, module Contrat inexistant) ne sont pas rendues en consultation.
- Onglets Fournisseurs/Clients : non affichés à l'ajout (avant validation du
formulaire principal) ; visibilité conditionnée par l'état (spec C3, « Aucun »
= OTHER) : Fournisseurs si Achat/Aucun, Clients si Vendu/Aucun.
- Édition : après « Enregistrer » on reste sur l'écran (l'utilisateur garde la
main, calque client/fournisseur) ; réaffichage des valeurs normalisées serveur
(RG-6.07) via re-prefill, plus de redirection.
- i18n consultation + tests (consultation, onglets, no-redirect) ; spec écran 8.bis.
This commit is contained in:
@@ -245,7 +245,9 @@ describe('useProductForm', () => {
|
||||
})
|
||||
|
||||
it('soumet un PATCH /products/{id} apres prefill (RG-6.08)', async () => {
|
||||
mockPatch.mockResolvedValueOnce({ id: 34 })
|
||||
// Le PATCH renvoie le produit normalise : submit re-prefill le form a partir
|
||||
// de la reponse (l'utilisateur reste sur l'ecran, pas de redirection).
|
||||
mockPatch.mockResolvedValueOnce({ ...PRODUCT, code: 'BLE-01', name: 'Blé tendre' })
|
||||
const { prefill, submit } = useProductForm()
|
||||
await prefill(PRODUCT)
|
||||
|
||||
@@ -261,6 +263,21 @@ describe('useProductForm', () => {
|
||||
expect(mockToastSuccess).toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it('re-affiche les valeurs normalisees du serveur apres un PATCH (RG-6.07, pas de redirection)', async () => {
|
||||
// Le back normalise code (trim+UPPER) et name (trim) : le form doit refleter
|
||||
// la reponse serveur, pas la saisie locale.
|
||||
mockPatch.mockResolvedValueOnce({ ...PRODUCT, code: 'BLE-01', name: 'Blé tendre' })
|
||||
const { form, prefill, submit } = useProductForm()
|
||||
await prefill(PRODUCT)
|
||||
form.code = 'ble-01 '
|
||||
form.name = ' Blé tendre '
|
||||
|
||||
await submit()
|
||||
|
||||
expect(form.code).toBe('BLE-01')
|
||||
expect(form.name).toBe('Blé tendre')
|
||||
})
|
||||
|
||||
it('mappe un 409 doublon de code aussi en edition', async () => {
|
||||
mockPatch.mockRejectedValueOnce({ response: { status: 409, _data: {} } })
|
||||
const { errors, prefill, submit } = useProductForm()
|
||||
|
||||
@@ -151,8 +151,12 @@ export function useProductForm() {
|
||||
}
|
||||
const options = { headers: { Accept: 'application/ld+json' }, toast: false }
|
||||
if (editing) {
|
||||
await api.patch(`/products/${productId.value}`, payload, options)
|
||||
const updated = await api.patch<Product>(`/products/${productId.value}`, payload, options)
|
||||
toast.success({ title: t('admin.products.toast.updateSuccess') })
|
||||
// L'utilisateur garde la main (pas de redirection, calque client/
|
||||
// fournisseur) : on reaffiche les valeurs normalisees renvoyees par le
|
||||
// serveur (code trim+UPPER, name trim — RG-6.07) directement dans le form.
|
||||
await prefill(updated)
|
||||
}
|
||||
else {
|
||||
await api.post('/products', payload, options)
|
||||
|
||||
Reference in New Issue
Block a user