Appearance
members — feature queue
Repo: bcc-nancy/members · Path: /Users/Shared/moltis/repos/members Audit branch: develop Stack: Vue 3 + TS + Vite + Pinia, PrimeVue v4 via @bcc-code/component-library-vue, Tailwind v4 (@theme inline, BCC OKLch tokens), TanStack Table + Query, NestJS/Prisma API. UI language is French throughout — no i18n layer.
✅ Inventory built from
develop@2c22f5aon 2026-07-30, after fast-forwarding 10 commits (HEAD was three weeks stale atf3a1c9a). Those commits unified the Demandes views (#75) and added the parent liability waiver (#77), both of which this queue reflects. One untracked file,decharge_template.pdf, was left in place at your direction — it is not source and affects nothing here.
Two user-facing surfaces
This repo is not a single app. The inventory covers both:
- Admin SPA (
admin/src/client/) — staff-facing, route-based (router.ts, 24 auditable routes). Users are BCC Nancy volunteer and paid administrative staff, described inCLAUDE.mdas a mix of tech-savvy and non-tech-savvy. - Widgets (
widgets/src/widgets/) — six embeddable member-facing bundles with no router at all; each*.tsentry mounts a component tree into a host page. These reach actual members rather than staff, so they carry the higher user impact and are ranked accordingly.
Layout-shell routes are excluded: layout, and the three { template: "<RouterView />" } wrappers bcc, bactive and sponsors.
Ordered by user impact: member-facing money and legal paths first, then admin money paths, then operational views, then configuration.
| # | Surface | Feature | Routes / Entry | Patterns | Status |
|---|---|---|---|---|---|
| 1 | Widget | My events, checkout & payment | Events.ts → MyEvent, EventDetails, Checkout, SumupPaymentWidget, EventRegistrations, EventTile, WaiverModal, EventNotFound | e-commerce/checkout, forms/form-validation, user-feedback/progress-indicator, content-management/modal | drafted |
| 2 | Widget | My décharges (minor waivers) | Decharges.ts → MyDecharges | forms/signature-pad, forms/form-validation, user-feedback/notification | drafted |
| 3 | Widget | My memberships — BCC | MembershipsBCC.ts → MyMembershipsBCC, MembershipBCC, ConditionsBCC, Condition | content-management/accordion, forms/checkbox, forms/form-validation | drafted |
| 4 | Widget | My memberships — B-Active | MembershipsBActive.ts → MyMembershipsBActive, MembershipBActive, ConditionsBActive, SelectField | forms/selection-input, content-management/accordion, forms/form-validation | drafted |
| 5 | Widget | My camps & objectives | Camps.ts → Objectifs, MyObjectif, Objectif, NoObjectif, Parents, Configuration | user-feedback/progress-indicator, user-feedback/empty-states, forms/form-validation | drafted |
| 6 | Widget | Donation progress | DonsProgress.ts → DonsProgress | user-feedback/progress-indicator, data-display/statistics | drafted |
| 7 | Widget | Member-emulation panel | components/admin/AdminPanel.vue | forms/search-field, user-feedback/notification | drafted |
| 8 | Admin | Auth callback | callback | authentication/login, authentication/social-login, user-feedback/loading-indicator | drafted |
| 9 | Admin | Facturation (invoicing) | facturation | data-display/table, forms/currency-input, data-display/filter-panel | drafted |
| 10 | Admin | Cotisations (dues) | cotisations | data-display/table, forms/currency-input | drafted |
| 11 | Admin | Transactions | transactions, transactions-to-categorize | data-display/table, forms/selection-input, data-display/filter-panel | drafted |
| 12 | Admin | Imports | imports | forms/file-input, user-feedback/progress-indicator, data-display/table | drafted |
| 13 | Admin | Demandes (requests) | demandes | data-display/table, data-display/filter-panel, user-feedback/empty-states | drafted |
| 14 | Admin | BCC memberships | bcc-adhesions | data-display/table, data-display/filter-panel, forms/search-field | drafted |
| 15 | Admin | B-Active memberships | bactive-adhesions | data-display/table, data-display/filter-panel, forms/search-field | drafted |
| 16 | Admin | BCC reminders (relances) | bcc-relances | data-display/table, forms/multi-select-input, user-feedback/notification | drafted |
| 17 | Admin | B-Active reminders (relances) | bactive-relances | data-display/table, forms/multi-select-input, user-feedback/notification | drafted |
| 18 | Admin | B-Active dashboard | bactive-dashboard | data-display/dashboard, data-display/statistics, data-display/chart | drafted |
| 19 | Admin | Home | home | data-display/dashboard, data-display/statistics | drafted |
| 20 | Admin | Objectives & group comparison | objectifs, bactive-groupes | data-display/chart, data-display/comparison-table, user-feedback/progress-indicator | drafted |
| 21 | Admin | Events | evenements, evenements-detail | data-display/table, forms/date-picker, forms/form-validation | drafted |
| 22 | Admin | Sponsors | sponsors-campaigns, sponsors-list, sponsors-detail | data-display/card-grid, data-display/table, forms/form-validation | drafted |
| 23 | Admin | PMO | pmo | data-display/table, data-display/filter-panel | drafted |
| 24 | Admin | Familles | admin-familles | data-display/tree-view, data-display/table | drafted |
| 25 | Admin | Users & roles | admin-users | data-display/table, forms/multi-select-input, authentication/user-profile | drafted |
| 26 | Admin | Data explorer | admin-data | data-display/table, forms/search-field, data-display/filter-panel | drafted |
| 27 | Admin | Coherence checks | admin-coherence | data-display/table, user-feedback/empty-states, user-feedback/notification | drafted |
| 28 | Admin | Settings | admin-settings | authentication/account-settings, forms/form-validation, forms/toggle | drafted |
| 29 | Admin | Superadmin | superadmin | data-display/table, forms/selection-input | drafted |
| 30 | Admin | Release notes | release-notes | data-display/timeline, content-management/expandable-text | drafted |
| 31 | Admin | Error states | forbidden | user-feedback/empty-states, navigation/link | drafted |
31 features to audit. None started.
Inventory-level observations
Recorded here rather than as findings — each needs a proper audit run to confirm against the baseline. Flagged so the relevant audits look for them.
- No catch-all 404 route.
admin/src/client/router.tshas no/:pathMatch(.*)*record (grep confirms zero hits forpathMatchorNotFound). An unmatched URL renders theLayoutshell with an empty content area and no recovery affordance. Belongs to #31. customer-portal has the identical gap and playout does not — this is shaping up to be a cross-project inconsistency worth an alignment issue. - The route guard busy-waits with no timeout.
router.ts:98—while (!session.initialized) await new Promise(resolve => setTimeout(resolve, 100)). If session initialisation never resolves (failed/me, expired Auth0 session, offline), navigation never completes and the user sits on a blank screen with no error and no retry. Audit under #8 Auth callback; verify what setsinitializedon the failure path before writing it up. - Widgets have no route-level error surface. Being embedded bundles rather than routed pages, a widget that fails to mount degrades inside someone else's host page.
my-eventsships anEventNotFound.vue, but the other five have no equivalent — check per-widget empty and error states rather than assuming a shared shell handles them. - No i18n layer. UI text is French literals in templates, per
CLAUDE.md. Do not raise hardcoded-string findings as i18n violations here — unlike playout (en/fr/no, CI-enforced parity), single-locale French is the documented design. Copy-quality findings are still fair. superadminis gated on a different mechanism from every other route —meta.superadminshort-circuits before the capability check (router.ts:100) rather than going throughcaps.hasAccess. Note it in #29; it is a deliberate cross-org flag, not an oversight.
Suggested next: #1 My events, checkout & payment — the only flow in the programme so far that takes real money from a member (SumUp), it is member-facing rather than staff-facing, and it now carries the waiver modal added in #77. Checkout findings also seed rules directly reusable against customer-portal's marketplace and bids paths.