Skip to content

Utilisation de <CrudPage> ​

Le composant <CrudPage> est le cœur de la librairie @codifyo/vue-crud. Il orchestre l'affichage du tableau, la pagination asynchrone, les filtres, le sélecteur de colonnes et la gestion complète des actions (pages, modales, édition en ligne, confirmations).


Sommaire ​

Pour la documentation détaillée, consultez :


1. Exemple d'utilisation ​

vue
<template>
  <CrudPage ref="crudRef" :config="config" />
</template>

<script setup lang="ts">
import { ref } from 'vue';
import { CrudPage, defineCrudConfig } from '@codifyo/vue-crud';

interface User {
  id: number;
  name: string;
  email: string;
  role: string;
  status: string;
}

const crudRef = ref<InstanceType<typeof CrudPage> | null>(null);

const config = defineCrudConfig<User>({
  title: 'Gestion des Utilisateurs',
  itemName: 'Utilisateur',
  idKey: 'id',
  enableBulkActions: true,
  
  columns: [
    { key: 'name', label: 'Nom', sortable: true },
    { key: 'email', label: 'Email', type: 'link', sortable: true },
    { key: 'role', label: 'Rôle', type: 'badge' },
    { key: 'status', label: 'Statut', type: 'badge' }
  ],
  
  api: {
    fetchList: async ({ page, limit, sort, dir, filters }) => {
      const query = new URLSearchParams({ page: String(page), limit: String(limit), sort, dir, ...filters });
      const response = await fetch(`/api/users?${query}`);
      const data = await response.json();
      return { data: data.items, total: data.total };
    }
  },

  options: {
    perPage: 15,
    perPageChoices: [10, 15, 25, 50],
    syncUrl: true,
    columnChooserStorageKey: 'crud_users_columns'
  }
});
</script>

2. API de Configuration (CrudConfig) ​

PropriétéTypeRequisDescription
titlestringOuiTitre principal affiché dans l'en-tête de la page.
itemNamestringOuiNom au singulier de l'entité (ex: 'Utilisateur'), utilisé dans les messages et titres par défaut.
idKeystring | keyof TNonNom de la clé identifiant chaque ligne (défaut : 'id').
columnsCrudColumn[]OuiListe de la configuration des colonnes affichées dans le tableau.
apiObjectOuiObjet réseau contenant la méthode obligatoire fetchList et les méthodes optionnelles (create, update, delete).
enableBulkActionsbooleanNonActive les cases à cocher de sélection multiple et la barre d'actions groupées (défaut : false).
filterFormConfigRecord<string, any>NonConfiguration du formulaire de filtre transmise au composant de filtre (ou @codifyo/form-vue).
filterRemoveExtrabooleanNonSi true, nettoie les valeurs vides des filtres avant envoi (défaut : true).
editFormConfigRecord<string, any>NonConfiguration du formulaire d'édition transmis par défaut aux actions de type form.
actions{ global?, item?, bulk? }NonDictionnaire des actions configurées (global, item, bulk).
optionsCrudOptionsNonOptions de personnalisation globale du comportement et de l'interface.

3. Options Globales (options) ​

typescript
export interface CrudOptions {
  perPage?: number;           // Nombre d'éléments par page par défaut (défaut : 15)
  perPageChoices?: number[];  // Choix d'éléments par page (ex: [10, 15, 25, 50, 100])
  defaultSort?: string;       // Clé de la colonne triée par défaut au chargement initial (ex: 'createdAt')
  defaultSortDir?: 'asc' | 'desc'; // Direction du tri par défaut (défaut : 'asc')
  syncUrl?: boolean;          // Synchronise pagination, tris, filtres et actions dans l'URL (défaut : true)
  debounceMs?: number;        // Délai de debounce en ms pour la modification des filtres (défaut : 400ms)
  updateUrl?: (query: Record<string, string>) => void; // Adaptateur manuel pour mettre à jour l'URL (reçoit la query seule, jamais le chemin d'une action à `route`)
  baseRoute?: string;         // Chemin de la liste où revenir à la fermeture d'une action à `route` (défaut : dernier chemin de liste visité, puis '/') ; voir ACTIONS.md, « Actions à Route »
  emptyState?: {
    title?: string;
    subtitle?: string;
    icon?: string;            // Icône FontAwesome pour le tableau vide
  };
  onToast?: (toast: { type: 'success' | 'danger' | 'info' | 'warning'; message: string }) => boolean | void;
  enableColumnChooser?: boolean; // Active le sélecteur de colonnes dans la barre d'outils (défaut : true)
  columnChooserStorageKey?: string; // Clé localStorage pour persister les colonnes masquées (défaut: crud_cols_{itemName})
  allowedActionsKey?: string; // Propriété de l'item listant les noms d'actions autorisées (ex: '_allowed_actions')
}

4. Méthodes Exposées (defineExpose) & Utilitaires ​

Méthodes exposées sur l'instance <CrudPage> (ref) ​

Si vous récupérez une référence sur le composant <CrudPage ref="crudRef"> (fortement typé avec CrudExposedMethods) :

typescript
const crudRef = ref<InstanceType<typeof CrudPage> | null>(null);

// Déclencher une action par son nom ou son objet :
crudRef.value?.triggerAction('print-invoice', item);

// Déclencher une action groupée :
crudRef.value?.triggerAction('bulk-delete', undefined, selectedIds);

// Recharger silencieusement la liste depuis le serveur :
crudRef.value?.fetchList(true);

// Rafraîchir la liste :
crudRef.value?.refreshList();

// Invalider la liste (vide le cache et force un rechargement au prochain affichage) :
crudRef.value?.invalidateList();

// Rafraîchir la page active (composant distant de la vue) :
crudRef.value?.refreshPage();

// Fermer l'action / la modale / la page active :
crudRef.value?.closeAction();

// Boîte de dialogue de confirmation programmatique :
const ok = await crudRef.value?.confirm('Voulez-vous continuer ?');

Utilitaires et Composables exportés par la librairie ​

typescript
import { 
  defineCrudConfig, 
  useCrudConfig,
  useCrudContext,
  isActionVisibleInLocation, 
  interpolateUrl, 
  sanitizeBackUrl, 
  useTheme 
} from '@codifyo/vue-crud';

// 1. DX Helper pour l'autocomplétion TypeScript
const config = defineCrudConfig({ ... });

// 2. Accéder à la configuration CRUD courante depuis un sous-composant / slot :
const currentConfig = useCrudConfig();

// 3. Accéder aux méthodes de contexte CRUD depuis n'importe quel composant enfant :
const { refreshList, invalidateList, refreshPage, triggerAction } = useCrudContext() || {};

// 4. Tester la visibilité d'une action dans un emplacement
const isVisible = isActionVisibleInLocation(action, 'view', item);

// 5. Interpoler des variables dans un modèle d'URL
const url = interpolateUrl('/api/users/{id}/details', { id: 42 }); // => '/api/users/42/details'

// 6. Valider une URL de retour non fiable (query string) : même origine uniquement, sinon ''
const back = sanitizeBackUrl(params.get('backUrl') || ''); // 'javascript:alert(1)' => '', '//evil.com' => ''