Skip to content

Surcharge et Slots ​

Le composant <CrudPage> expose de nombreux slots pour une personnalisation complète.

Slots de la Liste et du Tableau ​

Nom du SlotData exposées (v-slot="data")Description
#filters{ config, modelValue, updateModelValue }Surcharge complète de la barre de filtres au-dessus du tableau.
#cell-[key]{ item, value, currentUrl, currentPath }Surcharge le rendu d'une cellule spécifique (ex: #cell-status). Expose currentUrl et currentPath pour la construction de liens (backUrl, router-link).
#actions{ item }Surcharge complète de la colonne des boutons d'actions d'une ligne du tableau.
#empty-Surcharge le visuel affiché lorsque le tableau ne contient aucune donnée.
#inline-form{ column, modelValue, updateModelValue, config }Surcharge le composant de formulaire affiché dans une cellule en édition en ligne.
#action-page-[actionName]{ item, ids }Surcharge le contenu du mode pleine page pour une action avec displayMode: 'page'.

Slots des Vues Détaillées et Fiches (CrudRemoteView) ​

Lorsque vous utilisez une action de type view (qui s'appuie sur <CrudRemoteView>) :

  • #view-section-[actionName]-[sectionKey] : Surcharge une section entière de la vue. Reçoit { section, item, loading, refreshList, invalidateList, refreshPage, ActionButton }.
  • #view-section-header-[actionName]-[sectionKey] : Surcharge uniquement le header/titre d'une section.
  • #view-section-body-[actionName]-[sectionKey] : Surcharge le corps (.card-body) d'une section en conservant le conteneur.
  • #view-prop-[actionName]-[propertyKey] (ou #view-prop-[propertyKey]) : Surcharge l'ensemble d'une propriété (le bloc label + valeur). Reçoit { prop, label, value, item, currentUrl, currentPath, refreshList, invalidateList, refreshPage, ActionButton }.
  • #view-label-[actionName]-[propertyKey] (ou #view-label-[propertyKey]) : Surcharge uniquement le label d'une propriété (ex: ajout d'icône d'aide, tooltip, badge). Reçoit { prop, label, value, item, currentUrl, currentPath, ... }.
  • #view-[actionName]-[propertyKey] (ou #view-[propertyKey]) : Surcharge la valeur d'une propriété spécifique. Reçoit { prop, label, value, item, currentUrl, currentPath, ... }.
  • #view-tab-[actionName]-[tabKey] : Surcharge le contenu d'un onglet.

État de chargement (skeleton) ​

Pendant le chargement initial de l'item (fetchUrlTemplate défini, réponse pas encore reçue — typiquement lors d'un accès direct par URL ?action=view&id=42), <CrudRemoteView> affiche directement la structure de viewConfig (sections, onglets, libellés réels) avec un skeleton à la place des valeurs, sans saut de mise en page à l'arrivée des données. Les rafraîchissements ultérieurs conservent les données affichées (opacité réduite).

  • Les slots de propriété et de valeur (#view-prop-*, #view-label-*, #view-*) ne sont pas rendus pendant cette phase : ils sont remplacés par le libellé + un skeleton.
  • Les slots de section et d'onglet (#view-section-*, #view-section-header-*, #view-section-body-*, #view-tab-*) restent rendus et reçoivent un booléen loading ; l'item ne contient alors que les données du contexte (souvent l'id seul).
  • <CrudViewProp> affiche automatiquement un skeleton à la place de la valeur dans une vue en chargement (ou si sa prop loading est vraie).
  • <CrudSkeleton> (exporté) permet de construire vos propres placeholders ; useViewLoading() donne accès à l'état de chargement dans vos composants.
vue
<template #view-section-body-view-page-0="{ item, loading }">
  <template v-if="loading">
    <CrudSkeleton style="width: 40%;" />
  </template>
  <CrudViewProp v-else label="Nom" :value="item.name" />
</template>

Sections bare : Dans la configuration d'une vue (viewConfig.sections), vous pouvez renseigner "bare": true (ou "card": false) pour qu'une section ne soit pas enveloppée dans un conteneur carte Bootstrap (card / card-body) et n'affiche aucun bandeau d'en-tête.

Boutons d'Action dans les Slots Custom (<CrudActionButton>) ​

Lorsque vous personnalisez un slot de vue, vous pouvez afficher le bouton d'une action configurée grâce au composant <CrudActionButton> (ou via la prop de slot ActionButton / CrudActionButton).

Le composant conserve automatiquement tous les contrôles (visibilité, confirmation, redirection).

Utilisation standard : ​

vue
<template #view-default-rendezvous="{ item }">
  <div v-for="rdv in item.rendezvous" :key="rdv.id" class="d-flex justify-content-between align-items-center mb-2">
    <span>{{ rdv.date }} - {{ rdv.status }}</span>
    
    <!-- Affiche le bouton d'action complet pour ce RDV -->
    <CrudActionButton action="cancel_rdv" :item="rdv" />
  </div>
</template>

Personnalisation via props : ​

vue
<CrudActionButton 
  action="edit_rdv" 
  :item="rdv" 
  customLabel="Modifier" 
  customStyle="outline-secondary" 
  size="sm" 
/>

Surcharge via slot interne optionnel : ​

vue
<CrudActionButton action="delete_rdv" :item="rdv">
  <template #default="{ execute, isVisible, isPending, label, icon }">
    <button v-if="isVisible" @click="execute" class="btn btn-sm btn-link text-danger">
      <i :class="icon"></i> {{ label }}
    </button>
  </template>
</CrudActionButton>

Props de <CrudActionButton> : ​

PropTypeDéfautDescription
actionstring | CrudActionRequisNom de l'action ou objet CrudAction.
itemRecord<string, any>activeItemEntité ciblée pour l'action.
locationstringundefinedContexte d'emplacement pour le filtre show(item, context).
customLabelstringaction.labelSurcharge le texte du bouton.
customIconstringaction.iconSurcharge l'icône FontAwesome du bouton.
customStylestringaction.styleSurcharge la couleur/style Bootstrap (ex: 'danger', 'outline-primary').
size'sm' | 'md' | 'lg''sm'Taille du bouton.
ignoreVisibilitybooleanfalseSi true, ignore tous les contrôles de visibilité.
ignoreAllowedActionsbooleanfalseSi true, ignore le filtre _allowed_actions.
ignoreShowbooleanfalseSi true, ignore la fonction action.show().

Slots des Modales d'Actions (CrudActionModal) ​

Pour les actions ayant displayMode: 'modal', de nombreux slots dynamiques permettent de surcharger chaque partie de la modale. Les propriétés exposées sont généralement { item, actionName, close, submit, success, reload, title }. Vous pouvez cibler toutes les actions (ex: #action-modal-content) ou une action spécifique (ex: #action-modal-content-[actionName]).

Nom du SlotDescription
#action-modal-layoutRemplace l'intégralité de la modale (header, corps, footer). Les styles par défaut de la modale sont ignorés.
#action-modal-headerSurcharge le titre et la croix de fermeture de la modale.
#action-modal-topAjoute du contenu juste au-dessus du composant de l'action.
#action-modal-contentRemplace le composant dynamique par votre propre contenu personnalisé.
#action-modal-bottomAjoute du contenu juste en-dessous du composant de l'action.
#action-modal-footerSurcharge les boutons d'annulation et de validation en bas de la modale.

Astuce : Ajoutez le suffixe -[actionName] à n'importe lequel de ces slots pour cibler une action en particulier, par exemple #action-modal-content-delete-user.

Accessibilité : les slots #action-modal-layout et #action-modal-header reçoivent aussi titleId. Posez-le sur votre titre (<h2 :id="titleId">) : la modale y fait référence via aria-labelledby. Le focus initial cible le premier élément portant data-autofocus, sinon le premier élément focusable (hors bouton de fermeture marqué data-modal-close).

Slots des Formulaires Distants (CrudRemoteForm) ​

Pour les actions de type form, le composant interne chargé de l'affichage est un CrudRemoteForm. Celui-ci expose ses propres slots pour insérer du contenu interactif autour du formulaire.

Nom du SlotData exposées (v-slot="data")Description
#remote-form-top{ formData, formConfig, item, submit }Insère du contenu juste avant le formulaire (utile pour des messages d'avertissement conditionnels).
#remote-form-bottom{ formData, formConfig, item, submit }Insère du contenu juste après le formulaire.

Astuce : Vous pouvez ajouter le suffixe -[actionName] pour cibler une action form en particulier, ex: #remote-form-top-edit-user.