Phase 2 : filtrage server-side de /lignes (compte, client, type, signalement, écarts, recherche libre)
Remplace le "charge tout puis filtre côté client" (filteredRows()) par un nouvel endpoint /lignes/api/lignes (LedgerRowsController), qui pousse tous les filtres de la barre d'outils dans une seule requête Entity/Field Query API (pas de SQL brut) -- y compris à travers la relation field_repartition -> field_compte (paragraph -> taxonomie), confirmé fonctionner empiriquement avant d'écrire le contrôleur. `rows` ne contient donc plus que ce qui est à la fois dans la fenêtre de dates ET dans les filtres actifs ; la fenêtre glissante elle-même (loadOlder/loadNewer/ ensureScrollable) est inchangée, seul ce qui la peuple change. Ajouts : - Nouveau filtre "Libellé / Détails" (recherche plein texte sur field_notes ou le titre), débouncé côté client (350ms). - filterYear (l'"Année" dédiée) passe par le même endpoint via son paramètre "annee". - mergeChangedRows() (le merge du polling) tient maintenant compte des filtres actifs : une ligne qui ne correspond plus après un changement est retirée de `rows`, une ligne qui correspond nouvellement est ajoutée -- polling lui-même reste global/non filtré, seul le merge est filter-aware. JSON:API reste utilisé pour ce que l'endroit filtré ne couvre pas : le groupe entrée/sorties liées (fetchLignesByNids) et le polling (fetchChangedSince), tous deux indépendants d'une plage de dates+filtres. Testé en local : chaque filtre individuellement et combiné (compte+q, client+type), widening de fenêtre sous filtre restrictif, restauration combinée depuis le hash au reload, modale d'édition + reloadWindow après fermeture, polling sans erreur.
This commit is contained in:
@@ -1,9 +1,9 @@
|
||||
{#
|
||||
Dashboard shell: Drupal renders the page (nav, auth, permissions).
|
||||
dashboard.js (Vue 3) fetches JSON:API and renders a spreadsheet-like table
|
||||
of every ligne comptable, with filters and month/year grouping, client-side.
|
||||
"Ajouter une ligne" opens the real Drupal node form in a modal
|
||||
(core/drupal.dialog.ajax) -- no form logic duplicated in JS.
|
||||
home.js (Vue 3) renders a spreadsheet-like table of every ligne comptable,
|
||||
with filters and month/year grouping applied server-side (see
|
||||
LedgerRowsController). "Ajouter une ligne" opens the real Drupal node form
|
||||
in a modal (core/drupal.dialog.ajax) -- no form logic duplicated in JS.
|
||||
#}
|
||||
<nav class="figli-page-nav">
|
||||
<a href="{{ path('figli_compta_ledger.home') }}" class="{{ current_route == 'figli_compta_ledger.home' ? 'is-active' : '' }}">Grand livre</a>
|
||||
@@ -44,6 +44,13 @@
|
||||
</span>
|
||||
</label>
|
||||
|
||||
<label>Libellé / Détails
|
||||
<span class="figli-filter-row">
|
||||
<input type="text" v-model="filterQ" placeholder="Rechercher…" autocomplete="off" class="figli-client-input" />
|
||||
<button v-if="filterQ" type="button" class="figli-filter-clear" @click="filterQ = ''" title="Effacer ce filtre">✕</button>
|
||||
</span>
|
||||
</label>
|
||||
|
||||
<label>Type
|
||||
<span class="figli-filter-row">
|
||||
<div class="figli-multiselect">
|
||||
@@ -110,7 +117,7 @@
|
||||
<option v-for="f in allFlagsList" :key="f" :value="f"></option>
|
||||
</datalist>
|
||||
|
||||
<span class="figli-count" v-if="!loading">{{ filteredRows.length }} / {{ rows.length }} lignes chargées{{ errorCount ? ' — ' + errorCount + ' avec écart' : '' }}</span>
|
||||
<span class="figli-count" v-if="!loading">{{ rows.length }} ligne{{ rows.length > 1 ? 's' : '' }} chargée{{ rows.length > 1 ? 's' : '' }}{{ errorCount ? ' — ' + errorCount + ' avec écart' : '' }}</span>
|
||||
</div>
|
||||
|
||||
<p v-if="typeUpdateError" class="figli-error figli-inline-error">Erreur : {{ typeUpdateError }} <button type="button" class="figli-clear-drilldown" @click="typeUpdateError = null">✕</button></p>
|
||||
|
||||
Reference in New Issue
Block a user