Configuration · Centre editor (modules, app config, integrations)
The control panel for a whole tenant: identity and locale (name, languages, default language, timezone, latitude/longitude, email from/to), every feature module and its parameters, mobile-app configuration, themes, integration URLs (Fideliza, Fidcard, cashback, Tally, custom forms, chatbase, form-commerces), shop properties, extra attributes and translation uploads.
| Area | Configuration |
| Routes | configuration.centers.new · configuration.centers.edit |
| Centre modules | always available |
| Staff levels | root · admin · manager · scmanager |
| Models | app-config · category · center · center-language · channel · commerce · country · language · modules · province · shop-property |
| UI label | configuration.center.general-data / menu.navbar.configuration.my-center |
| Coverage | 7 use cases · 2 happy · 9 failure |
How it works
The widest-reaching form in the product — nearly 500 lines of validations on the center model alone — and the reason the inventory treats modules as a first-class dimension. Validation style is unusual: most integration checks are written as presence rules whose if condition is ‘the module is enabled AND the URL fails urlRegexValidator’, so the error reads as ‘required’ even when the real problem is a malformed URL. Each integration has its own message (configuration.center.fideliza-url.error, .fidcard-url.error, .cashback-url.error, .tally-url.error, .custom-forms.url.error, .ai.chatbase-url.error, .form-commerces-url.error). Custom forms additionally validate a start-before-end date and a profile-button name capped at 20 characters. _isValidForm() validates the centre and every shop property and only saves when all pass, collecting messages from both into infoErrors. Other actions: uploadTranslations for bulk locale files, manageAiChecks and handleLocationCheckboxChange (which requires at least one location option — configuration.center.location.enabled-error-message), onChangeEnablePacv/onChangeEnableAppPacv, clearPlaycenterCapacity, toggleMailing, copyUrlTemplate and copyUrlLotteryQr for shareable URL templates, and sovosOrganizationIdIsDisabled gating the Sovos org id.
Use cases
Why someone opens this (7)
- Onboarding a new centre: locale, branding, modules and integration endpoints.
- Switching on a module (e.g. Fideliza or the lottery) for one centre only.
- Configuring the mobile app: home ordering (date vs recommended), channels, themes.
- Wiring an external tool by URL and having the form reject a malformed endpoint before it breaks an embed.
- Uploading a translation file rather than editing strings one by one.
- Defining shop properties used by the Yardi export.
- Setting the play-centre capacity, or clearing it when the module is turned off.
Path map
flowchart LR F(["Centre editor modules, app config, integrations"]):::feat F --> H1["New centre configured"]:::ok F --> H2["Integration enabled safely"]:::ok F -.-> X1["Identity or locale fields missing"]:::bad F -.-> X2["Integration enabled with a bad URL"]:::bad F -.-> X3["Custom-forms dates reversed"]:::bad F -.-> X4["Profile button misconfigured"]:::bad F -.-> X5["No location option selected"]:::bad F -.-> X6["Images in an EXTRA rich-text field"]:::bad F -.-> X7["Invalid shop property"]:::bad F -.-> X8["Save rejected by the API"]:::bad F -.-> X9["Translation upload fails"]:::bad classDef feat fill:#566066,stroke:#566066,color:#ffffff,font-weight:bold classDef ok fill:#e3f1ea,stroke:#0d6b42,color:#0d4a2e classDef bad fill:#f7e6e2,stroke:#9a2d1c,color:#6e1f13
Happy paths
New centre configured
- Admin fills name, app URL, languages and default language, timezone, coordinates and the from/to email addresses.
- Modules are switched on; each enabled integration’s URL passes
urlRegexValidator.- App configuration, themes and channels are set.
- Shop properties are added;
_isValidForm()validates the centre and each property.saveCenterpersists everything andconfiguration.center.center-savedis shown.
Integration enabled safely
- Admin ticks the Fideliza module and pastes its URL plus the gift-card and gift-card-admin URLs.
- Each URL passes the validator, so the save is allowed and the embeds will work.
Failure paths
Identity or locale fields missing
Cause — Name, app URL, default language, languages, timezone, latitude, longitude, from-email or to-email blank.
What happens —
required+ the specific label for each;appUrladditionally has aURL: truerule.
Integration enabled with a bad URL
Cause — Module on and its URL fails the regex.
What happens — The matching message fires —
configuration.center.fideliza-url.error,.fidcard-url.error,.cashback-url.error,.tally-url.error,.custom-forms-url.error,.ai.chatbase-url.error,.form-commerces-url.error. Note these are modelled as presence rules, so the copy (‘It must be a valid URL’) is clearer than the rule type suggests.
Custom-forms dates reversed
Cause — Start date on or after the end date.
What happens —
configuration.center.custom-forms-start-date-before-end-date.
Profile button misconfigured
Cause — Profile button enabled without a name, or a name longer than 20 characters.
What happens —
configuration.center.custom-forms-profile-button-error/configuration.center.custom-forms-profile-button-length-error.
No location option selected
Cause — Location enabled but no sub-option ticked.
What happens —
configuration.center.location.enabled-error-message(‘You should select at least one option’).
Images in an EXTRA rich-text field
Cause — An
<img>pasted into a centre extra.What happens —
error.configuration.center.extra.image-not-suported.
Invalid shop property
Cause — Any shop property fails its own validation.
What happens —
_isValidForm()returns false and the whole save is blocked; messages from all properties are merged intoinfoErrors— so the user may see several unrelated errors at once with no indication of which property each belongs to.
Save rejected by the API
Cause — Server-side validation.
What happens —
infoErrorsis filled fromerrors.map((elem) => elem.detail)anduser-erroris shown as the banner.
Translation upload fails
Cause — Malformed locale file.
What happens — Wrapped in
try/catch (err); there is no dedicated translated message for this path.
QA checklist
Tick these off while regression-testing this feature. The boxes are plain Markdown, so progress is visible in git diffs.
- ✅ New centre configured
- ✅ Integration enabled safely
- ⛔ Identity or locale fields missing
- ⛔ Integration enabled with a bad URL
- ⛔ Custom-forms dates reversed
- ⛔ Profile button misconfigured
- ⛔ No location option selected
- ⛔ Images in an EXTRA rich-text field
- ⛔ Invalid shop property
- ⛔ Save rejected by the API
- ⛔ Translation upload fails
Implementation
app/controllers/configuration/centers/new.jsapp/routes/configuration/centers/new.jsapp/models/center.jsapp/models/app-config.jsapp/models/modules.jsapp/models/shop-property.jsapp/enums/modules.jsapp/enums/timezones.jsapp/enums/currencies.js
Translation keys (25)
Key English configuration.center.general-dataGeneral data configuration.center.modulesModules configuration.center.app-configurationApp configuration configuration.center.extra-attributesExtra attributes configuration.center.center-savedThe center has been saved with success! menu.navbar.configuration.my-centerMy center configuration.center.app-config.proposals-order.dateDate configuration.center.app-config.proposals-order.recommendedRecommended configuration.center.theaters.channel-appChannel app configuration.center.theaters.channel-webChannel web configuration.center.fideliza-url.errorIt must be a valid URL, ex: https://www.google.com configuration.center.fidcard-url.errorIt must be a valid URL, ex: https://www.google.com configuration.center.cashback-url.errorIt must be a valid URL, ex: https://www.google.com configuration.center.tally-url.errorURL required configuration.center.custom-forms-url.errorURL is required. configuration.center.custom-forms.url.errorURL required configuration.center.custom-forms-start-date-before-end-dateThe start date cannot be later than the end date configuration.center.custom-forms-profile-button-errorThe button name is required. configuration.center.custom-forms-profile-button-length-errorThe button name cannot exceed 20 characters. configuration.center.ai.chatbase-url.errorIt must be a valid URL, ex: https://www.google.com configuration.center.form-commerces-url.errorMust be a valid URL, e.g. https://www.google.com configuration.center.location.enabled-error-messageYou should select at least one option error.configuration.center.extra.image-not-suportedThe images in the text field of EXTRA are not supported cms.proposal.copy-url-successURL has been copied! user-errorSomething is wrong. Please check the following errors:
Related
- Same area — Centre list & export · Staff member list, deletion & restore · Staff member editor (levels, scope, API token) · Channels · Extra attributes · Email template preview & test send · Dashboard configuration · Influence zones · Server incidents · Server command runner (CLI) · Accessibility statement · Mobile app configuration · Customer login methods (Google, Facebook) · Third-party integrations & connectors · Social wifi & location services
- Shares data with — Proposal editor (content, coupon, push, AI images) · Multicentre proposals · App button manager (MOFs) · Centre switching & multi-centre scoping · Store create & edit · Activity editor (loyalty mechanics, rules & targeting) · Sales status overview & Yardi export · Content categories
Generated from doc/feature-inventory.json · id config-center-editor · commit 276788ca6