CRM · Customer list & filtering
Paginated, sortable, filterable list of the centre’s registered customers showing code, name, surname, email, VAT number and phone, with row actions for children, edit and delete.
| Area | CRM |
| Routes | crm.users · crm.users.index |
| Centre modules | crm |
| Staff levels | root · admin · manager · crmmanager · crmoperator · weboperator · content_creator |
| Models | building · channel · segment · user |
| UI label | title.header.crm.users / menu.navbar.customer.show |
| Coverage | 4 use cases · 2 happy · 4 failure |
How it works
Built on ListMixin + SegmentFilterMixin. The centre is pinned as a fixed filter (fixedFilters.center_id) in init, default sort is -updated-at, and the query forwards a meta.page.token when the API returns one — a cursor-style pagination for large datasets. The available filters come from enums/user-filters run through beautifyFilters(center) and groupFilterByModule, so the filter palette itself changes with the centre’s enabled modules. A side panel can list the segments a filtered set belongs to (fetchSegments, independently paginated at 16 per page). resetFilters clears the pagination token as well as the filters.
Use cases
Why someone opens this (4)
- Finding one customer by email or VAT number to resolve a support query.
- Building an ad-hoc audience (e.g. women 25-34 in a postal code with marketing consent) before saving it as a segment.
- Checking which segments a given filtered population already belongs to.
- Jumping from a customer to their registered children for the play centre.
Path map
flowchart LR F(["Customer list and filtering"]):::feat F --> H1["Filter and page through customers"]:::ok F --> H2["Inspect segments of a filtered set"]:::ok F -.-> X1["Filter left with an empty value"]:::bad F -.-> X2["Required filter missing"]:::bad F -.-> X3["Row action invoked without a record"]:::bad F -.-> X4["Deep pagination drift"]:::bad classDef feat fill:#157068,stroke:#157068,color:#ffffff,font-weight:bold classDef ok fill:#e3f1ea,stroke:#0d6b42,color:#0d4a2e classDef bad fill:#f7e6e2,stroke:#9a2d1c,color:#6e1f13
Happy paths
Filter and page through customers
- User opens CRM → Customer list; the first page loads scoped to the active centre, newest first.
- User adds one or more filters from the grouped filter palette and applies them.
- The query is rebuilt with
filter,pageandsort; results refresh.- User pages forward; the API’s
page.tokenis forwarded so deep pages stay consistent.
Inspect segments of a filtered set
- With filters applied, the user opens the segments panel.
fetchSegmentsqueries segments with the same fixed filters and fills a separate paginated table.
Failure paths
Filter left with an empty value
Cause — A filter row is added but no value is chosen.
What happens —
segment-filters#applyFiltersdetects the void value, setsshowFilterWarningand refuses to apply — no request is sent.
Required filter missing
Cause — The filter palette marks some options
requiredand none of them is present.What happens —
hasValidFiltersis false, blocking apply/save.
Row action invoked without a record
Cause —
showChildren/deletecalled with a missing model or id.What happens — Throws
TypeError('\model` is not a valid user’)` — a programming guard rather than user-facing copy.
Deep pagination drift
Cause — Records change between page requests while a token is in use.
What happens — The token is passed through unchanged; stale tokens surface as an API error with no dedicated message.
QA checklist
Tick these off while regression-testing this feature. The boxes are plain Markdown, so progress is visible in git diffs.
- ✅ Filter and page through customers
- ✅ Inspect segments of a filtered set
- ⛔ Filter left with an empty value
- ⛔ Required filter missing
- ⛔ Row action invoked without a record
- ⛔ Deep pagination drift
Implementation
app/controllers/crm/users/index.jsapp/routes/crm/users/index.jsapp/enums/user-filters.jsapp/enums/user-group-filters.jsapp/mixins/list-mixin.jsapp/mixins/segment-filter-mixin.js
Translation keys (9)
Key English title.header.crm.usersCustomers menu.navbar.customer.showCustomer list crm.users.codeCode crm.users.nameName crm.users.last_nameLast name crm.users.emailcrm.users.vat-numberVAT number crm.users.phonePhone show-childrenShow children
Related
- Same area — Customer create & edit · Customer deletion with unsubscribe notice · Customer CSV export with column picker · Customer CSV import · Children CSV import · AI natural-language customer filter · Save current filters as a segment · Segment list, refresh & export · Segment builder with automatic tag actions · Segment categories · User tags (user types) · Customer receipts tab & ticket-stamp generation · Customer loyalty — raffle tickets · Customer loyalty — cards & stamps · Customer loyalty — rewards · Customer loyalty — coupon exchanges · Customer children (dependants) · Receipt verification queue · Store list, filters & exports · Store create & edit · Store CSV import · Store labels (store types) · Customer action log (dormant)
- Shares data with — Staff member editor (levels, scope, API token) · Centre editor (modules, app config, integrations) · Channels · Activity editor (loyalty mechanics, rules & targeting) · Email campaign list, duplication & stop · Email campaign builder (wizard, A-B test, scheduling) · Proposal editor (content, coupon, push, AI images) · Push notification editor (scheduling, geofencing, deep links)
Generated from doc/feature-inventory.json · id crm-customer-list · commit 276788ca6