diff --git a/apps/ops/src/api/erp.js b/apps/ops/src/api/erp.js index 44003ea..0b30e76 100644 --- a/apps/ops/src/api/erp.js +++ b/apps/ops/src/api/erp.js @@ -83,13 +83,24 @@ export async function deleteDoc (doctype, name) { return true } -// Count documents +// Count documents. ⚠️ frappe.client.get_count IGNORE or_filters (recherche OR) → il renverrait un compte +// faux (souvent 0) dès qu'on cherche. Quand or_filters est présent, on compte via get_list (fields=name, +// sans limite) — les jeux de recherche sont bornés par le terme tapé. Sinon (chips seuls) : get_count rapide. export async function countDocs (doctype, filters = {}, or_filters) { - const params = new URLSearchParams({ - doctype, - filters: JSON.stringify(filters), - }) - if (or_filters) params.set('or_filters', JSON.stringify(or_filters)) + if (or_filters && or_filters.length) { + const p = new URLSearchParams({ + doctype, + filters: JSON.stringify(filters), + or_filters: JSON.stringify(or_filters), + fields: JSON.stringify(['name']), + limit_page_length: '0', + }) + const r = await authFetch(BASE_URL + '/api/method/frappe.client.get_list?' + p) + if (!r.ok) return 0 + const d = await r.json() + return ((d.message || d.data) || []).length + } + const params = new URLSearchParams({ doctype, filters: JSON.stringify(filters) }) const res = await authFetch(BASE_URL + '/api/method/frappe.client.get_count?' + params) if (!res.ok) return 0 const data = await res.json() diff --git a/apps/ops/src/components/shared/DynamicFilter.vue b/apps/ops/src/components/shared/DynamicFilter.vue new file mode 100644 index 0000000..7d309e8 --- /dev/null +++ b/apps/ops/src/components/shared/DynamicFilter.vue @@ -0,0 +1,98 @@ + + + + + diff --git a/apps/ops/src/pages/ClientsPage.vue b/apps/ops/src/pages/ClientsPage.vue index 9397606..3b6feec 100644 --- a/apps/ops/src/pages/ClientsPage.vue +++ b/apps/ops/src/pages/ClientsPage.vue @@ -1,32 +1,9 @@