-
-
-
-
-
-
-
-
-
-
-
-
-
-
{{ total.toLocaleString() }} clients
+
+
+
@@ -83,11 +60,17 @@ import { useRoute } from 'vue-router'
import { listDocs, countDocs } from 'src/api/erp'
import InlineField from 'src/components/shared/InlineField.vue'
import DataTable from 'src/components/shared/DataTable.vue'
+import DynamicFilter from 'src/components/shared/DynamicFilter.vue'
+import { territoryOptions } from 'src/config/nav'
const route = useRoute()
const customerGroups = ['Commercial', 'Individual', 'Government', 'Non Profit']
-const search = ref(route.query.q || '')
-const statusFilter = ref('all') // défaut = Tous ; Actifs/Inactifs = filtres optionnels pour affiner
+const filterState = ref({ search: route.query.q || '', chips: {} }) // recherche + chips (statut/groupe/territoire) → pilote la requête serveur
+const chipGroups = [
+ { key: 'statut', label: 'Statut', icon: 'toggle_on', options: [{ value: 'active', label: 'Actifs' }, { value: 'disabled', label: 'Inactifs' }] },
+ { key: 'group', label: 'Groupe', icon: 'category', options: customerGroups.map(g => ({ value: g, label: g })) },
+ { key: 'territory', label: 'Territoire', icon: 'place', options: territoryOptions.map(t => ({ value: t.value, label: t.label })) },
+]
const clients = ref([])
const loading = ref(false)
const total = ref(0)
@@ -103,28 +86,29 @@ const columns = [
{ name: 'status', label: 'Statut', align: 'center', field: row => (row.disabled ? 'Inactif' : 'Actif') },
]
-function onSearchInput () {
+// DynamicFilter a émis un nouvel état → recharge (débounce léger pour la frappe ; les chips passent aussi par ici).
+function onFilterChange () {
clearTimeout(searchTimer)
- searchTimer = setTimeout(() => {
- pagination.value.page = 1
- doSearch()
- }, 300)
+ searchTimer = setTimeout(() => { pagination.value.page = 1; doSearch() }, 300)
}
async function doSearch () {
loading.value = true
const filters = {}
let or_filters
+ const c = filterState.value.chips || {}
+ if (c.statut === 'active') filters.disabled = 0
+ else if (c.statut === 'disabled') filters.disabled = 1
+ if (c.group) filters.customer_group = c.group
+ if (c.territory) filters.territory = c.territory
- if (statusFilter.value === 'active') filters.disabled = 0
- else if (statusFilter.value === 'disabled') filters.disabled = 1
-
- if (search.value.trim()) {
- const q = '%' + search.value.trim() + '%'
+ const q = (filterState.value.search || '').trim()
+ if (q) {
+ const like = '%' + q + '%'
or_filters = [
- ['customer_name', 'like', q],
- ['name', 'like', q],
- ['legacy_customer_id', 'like', q],
+ ['customer_name', 'like', like],
+ ['name', 'like', like],
+ ['legacy_customer_id', 'like', like],
]
}
@@ -157,5 +141,5 @@ function onRequest (props) {
}
onMounted(() => doSearch())
-watch(() => route.query.q, (q) => { if (q) { search.value = q; doSearch() } })
+watch(() => route.query.q, (q) => { if (q) { filterState.value = { ...filterState.value, search: q }; doSearch() } })