Skip to content

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 @ 2c22f5a on 2026-07-30, after fast-forwarding 10 commits (HEAD was three weeks stale at f3a1c9a). 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 in CLAUDE.md as a mix of tech-savvy and non-tech-savvy.
  • Widgets (widgets/src/widgets/) — six embeddable member-facing bundles with no router at all; each *.ts entry 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.

#SurfaceFeatureRoutes / EntryPatternsStatus
1WidgetMy events, checkout & paymentEvents.ts → MyEvent, EventDetails, Checkout, SumupPaymentWidget, EventRegistrations, EventTile, WaiverModal, EventNotFounde-commerce/checkout, forms/form-validation, user-feedback/progress-indicator, content-management/modaldrafted
2WidgetMy décharges (minor waivers)Decharges.ts → MyDechargesforms/signature-pad, forms/form-validation, user-feedback/notificationdrafted
3WidgetMy memberships — BCCMembershipsBCC.ts → MyMembershipsBCC, MembershipBCC, ConditionsBCC, Conditioncontent-management/accordion, forms/checkbox, forms/form-validationdrafted
4WidgetMy memberships — B-ActiveMembershipsBActive.ts → MyMembershipsBActive, MembershipBActive, ConditionsBActive, SelectFieldforms/selection-input, content-management/accordion, forms/form-validationdrafted
5WidgetMy camps & objectivesCamps.ts → Objectifs, MyObjectif, Objectif, NoObjectif, Parents, Configurationuser-feedback/progress-indicator, user-feedback/empty-states, forms/form-validationdrafted
6WidgetDonation progressDonsProgress.ts → DonsProgressuser-feedback/progress-indicator, data-display/statisticsdrafted
7WidgetMember-emulation panelcomponents/admin/AdminPanel.vueforms/search-field, user-feedback/notificationdrafted
8AdminAuth callbackcallbackauthentication/login, authentication/social-login, user-feedback/loading-indicatordrafted
9AdminFacturation (invoicing)facturationdata-display/table, forms/currency-input, data-display/filter-paneldrafted
10AdminCotisations (dues)cotisationsdata-display/table, forms/currency-inputdrafted
11AdminTransactionstransactions, transactions-to-categorizedata-display/table, forms/selection-input, data-display/filter-paneldrafted
12AdminImportsimportsforms/file-input, user-feedback/progress-indicator, data-display/tabledrafted
13AdminDemandes (requests)demandesdata-display/table, data-display/filter-panel, user-feedback/empty-statesdrafted
14AdminBCC membershipsbcc-adhesionsdata-display/table, data-display/filter-panel, forms/search-fielddrafted
15AdminB-Active membershipsbactive-adhesionsdata-display/table, data-display/filter-panel, forms/search-fielddrafted
16AdminBCC reminders (relances)bcc-relancesdata-display/table, forms/multi-select-input, user-feedback/notificationdrafted
17AdminB-Active reminders (relances)bactive-relancesdata-display/table, forms/multi-select-input, user-feedback/notificationdrafted
18AdminB-Active dashboardbactive-dashboarddata-display/dashboard, data-display/statistics, data-display/chartdrafted
19AdminHomehomedata-display/dashboard, data-display/statisticsdrafted
20AdminObjectives & group comparisonobjectifs, bactive-groupesdata-display/chart, data-display/comparison-table, user-feedback/progress-indicatordrafted
21AdminEventsevenements, evenements-detaildata-display/table, forms/date-picker, forms/form-validationdrafted
22AdminSponsorssponsors-campaigns, sponsors-list, sponsors-detaildata-display/card-grid, data-display/table, forms/form-validationdrafted
23AdminPMOpmodata-display/table, data-display/filter-paneldrafted
24AdminFamillesadmin-famillesdata-display/tree-view, data-display/tabledrafted
25AdminUsers & rolesadmin-usersdata-display/table, forms/multi-select-input, authentication/user-profiledrafted
26AdminData exploreradmin-datadata-display/table, forms/search-field, data-display/filter-paneldrafted
27AdminCoherence checksadmin-coherencedata-display/table, user-feedback/empty-states, user-feedback/notificationdrafted
28AdminSettingsadmin-settingsauthentication/account-settings, forms/form-validation, forms/toggledrafted
29AdminSuperadminsuperadmindata-display/table, forms/selection-inputdrafted
30AdminRelease notesrelease-notesdata-display/timeline, content-management/expandable-textdrafted
31AdminError statesforbiddenuser-feedback/empty-states, navigation/linkdrafted

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.ts has no /:pathMatch(.*)* record (grep confirms zero hits for pathMatch or NotFound). An unmatched URL renders the Layout shell 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 sets initialized on 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-events ships an EventNotFound.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.
  • superadmin is gated on a different mechanism from every other route — meta.superadmin short-circuits before the capability check (router.ts:100) rather than going through caps.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.