Réalisation d'une Interface de Filtrage Dynamique Utilisant react-awesome-query-builder

Introduction à l'intégration de la bibliothèque

L'outil React-Awesome-Query-Builder offre une méthode efficace pour implémenter des systèmes de recherche avancée au sein des applications web modernes. Il permet aux développeurs de générer automatiquement des interfaces graphiques pour assembler des conditions complexes, évitant ainsi la codification manuelle de chaque règle logique. La bibliothèque est conçue pour s'intégrer harmonieusement avec diverses bibliothèques de composants UI.

Conditions préalables et installation

Avant de procéder à l'implémentation, assurez-vous que votre environnement de développement répond aux spécifications suivantes :

  • Environnement React版本 : Version 16.x minimum recommandée
  • Gestionnaire de paquets : npm ou yarn configuré
  • Runtime : Node.js version 14 ou supérieure

Pour ajouter le module à votre projet actuel, exécutez la commande suivante dans le terminal :

npm install react-awesome-query-builder --save-dev

Ou si vous préférez Yarn :

yarn add react-awesome-query-builder -D

Une fois installé, importez le composant principal et son fichier de styles global dans le fichier racine de votre application (ex: Main.tsx) :

import { QueryBuilder } from 'react-awesome-query-builder';
import 'react-awesome-query-builder/lib/css/styles.css';

Adaptation visuelle via les thèmes

Ce moteur de requête supporte nativement plusieurs designs afin de respecter la charte graphique existante. Les packages disponibles incluent :

  • Bootstrap : Pour les projets basés sur le grid classique
  • Material UI : Style Google Materail Design
  • Ant Design : Interface utilisateur cohérente et réactive
  • Fluent UI : Standards Microsoft

Pour utiliser l'interface Ant Design, remplacez l'import par chemin spécifique :

import { QueryBuilder } from 'react-awesome-query-builder/antd';
import 'react-awesome-query-builder/antd/css/styles.css';

Définition de la structure des données

Le comportement du filtre dépend entièrement de la définition des champs autorisés. Créez un objet schématique décrivant chaque colonne disponible, son type de donnée et les opérateurs applicables.

const schemaFiltres = {
  categorie: {
    label: 'Catégorie Produit',
    type: 'select',
    values: ['Electronique', 'Vêtements', 'Livre'],
    operators: ['equal', 'not_equal']
  },
  prix: {
    label: 'Montant en Euros',
    type: 'number',
    operators: ['between', 'greater_than', 'less_than']
  },
  status: {
    label: 'Statut Commande',
    type: 'boolean',
    operators: ['equal', 'not_equal']
  }
};

Implémentation du composant React

L'instance principale se rend comme n'importe quel autre composant React. Gèrez l'état local pour stocker la configuration actuelle du requêteur.

function InterfaceRecherche() {
  const [etatReq, setEtatReq] = useState({});

  const processeurChangement = (nouvelleRequete) => {
    // Conversion si nécessaire vers JS plain
    setEtatReq(() => nouvelleRequete?.toJS ? nouvelleRequete.toJS() : nouvelleRequete);
  };

  return (
    <div classname="conteneur-filtres">
      <querybuilder depthlimit:="" fields="{schemaFiltres}" onchange="{processeurChangement}" query="{etatReq}" settings="{{" showerrormessage:="" true=""></querybuilder>
    </div>
  );
}

Extraction des résultats pour le Backend

La librairie inclut des fonctions utilitaires pour transformer la configuration visuelle en formats exploitables par l'API serveur.

Exportation vers JSON Standard

import { serializeQuery } from 'react-awesome-query-builder';

const payloadJson = serializeQuery(etatReq, { format: 'json' });

Conversion en requête SQL brute

Utile pour les environnements utilisant directement des bases de données relationnelles.

const conditionSql = serializeQuery(etatReq, { format: 'sql' });
// Résultat attendu : "status = 1 AND prix BETWEEN 10 AND 50"

Intégration ElasticSearch

Pour les moteurs de recherche full-text.

const reqElastic = serializeQuery(etatReq, { format: 'elastic' });

Personnnalisation avancée

Vérification manuelle des entrées

Il est possible d'inclure une fonction de validation propre pour s'assurer que les valeurs saisies respectent des contraintes spécifiques avant soumission.

schemaFiltres.telephone = {
  label: 'Numéro',
  type: 'text',
  validateValue: (val) => val.length === 10 ? null : 'Le numéro doit faire 10 chiffres'
};

Ajout d'opérateurs personnalisés

Pour gérer des logiques métier absentes de la base, ajoutez vos propres définitions dans les configurations globales.

const optionGlobal = {
  op_custom: {
    name: 'Débutant par',
    valueName: 'prefix',
    widget: 'text'
  }
};

Recommandations techniques

  • Gestion du Layout : Entourez toujours le composant d'une div parent avec une largeur définie pour supporter le système de redimensionnement interne.
  • Composants Formulaires : Si le filtre est intégré dans un formulaire, interceptez l'événement submit natif via e.preventDefault() sur les boutons d'action pour éviter les rechargements inattendus.
  • Mobile First : Appliquez des media queries CSS pour réduire la taille de la police et l'espacement interne lorsque l'écran est inférieur à 768px.

Étiquettes: React ui-libraries data-filtering business-logic dynamic-interfaces

Publié le 3 août à 23h53