CMS · Multicentre proposals
Authors one piece of content that is published across several centres at once, with per-language fields, app and web images, channels and a store selection that can span centres.
| Area | CMS |
| Routes | cms.multicentre-proposals · cms.multicentre-proposals.index · cms.multicentre-proposals.new · cms.multicentre-proposals.detail |
| Centre modules | multicenter_proposals |
| Staff levels | root · admin · manager |
| Models | category · commerce · language · multicentre-proposal |
| UI label | title.header.multicentre-proposals / menu.navbar.multicentre-proposals.show |
| Coverage | 3 use cases · 1 happy · 6 failure |
Known issues (1)
Missing translations
These keys are used on this screen but do not exist in
translations.json, so users see the raw key:
cms.multicentre-proposal.general-datamulticentreProposal
How it works
Distinguished from ordinary proposals by two things: the store selection can cover multiple centres (with a select-all helper), and translation completeness is enforced up front — _validateProposalTranslationFields(model.languages) checks every language before submit proceeds and blocks with error.all-translation-fields.required. Note the helper’s return value is inverted relative to its name (isValidated is true when a language failed), which works but reads backwards. commerce is only required when no commerces are selected, so either a single store or a multi-store selection satisfies it. Detail is read-only.
Use cases
Why someone opens this (3)
- A retail group publishing the same campaign across all of its shopping centres.
- Keeping brand messaging consistent without re-entering it per centre.
- Reviewing a multicentre proposal’s reach from the detail view.
Path map
flowchart LR F(["Multicentre proposals"]):::feat F --> H1["Group-wide proposal published"]:::ok F -.-> X1["Incomplete translations"]:::bad F -.-> X2["Core content missing"]:::bad F -.-> X3["No stores at all"]:::bad F -.-> X4["Images in the description"]:::bad F -.-> X5["Module disabled"]:::bad F -.-> X6["Raw translation key on screen"]:::bad classDef feat fill:#6a4a8f,stroke:#6a4a8f,color:#ffffff,font-weight:bold classDef ok fill:#e3f1ea,stroke:#0d6b42,color:#0d4a2e classDef bad fill:#f7e6e2,stroke:#9a2d1c,color:#6e1f13
Happy paths
Group-wide proposal published
- User creates a multicentre proposal with name, description, images and channels.
- Every language’s translatable fields are completed.
- Stores across the participating centres are selected (or select-all is used).
submitpasses the translation check and the model validations and the proposal is created for each centre.
Failure paths
Incomplete translations
Cause — Any language missing a translatable field.
What happens —
error.all-translation-fields.required(‘All translatable fields must be translate’) and submit is aborted before validation.
Core content missing
Cause — Name, description, app image, web image or channels blank.
What happens —
error.proposal.name.required,error.proposal.description.required,required+ app/web image,error.proposal.channel.required.
No stores at all
Cause — Neither a single commerce nor any
commerces.What happens — The conditional presence rule on
commercefires.
Images in the description
Cause — Rich text contains an
<img>.What happens —
error.proposal.description.image-not-suported.
Module disabled
Cause —
multicenter_proposalsoff.What happens — Menu entry hidden and the route’s ability check blocks entry.
Raw translation key on screen
Cause — The code references
cms.multicentre-proposal.general-data,multicentreProposalbut the key does not exist in translations.json.What happens — ember-intl renders the missing key (or its missing-message placeholder) instead of text — visible to every user of this screen until the key is added.
QA checklist
Tick these off while regression-testing this feature. The boxes are plain Markdown, so progress is visible in git diffs.
- ✅ Group-wide proposal published
- ⛔ Incomplete translations
- ⛔ Core content missing
- ⛔ No stores at all
- ⛔ Images in the description
- ⛔ Module disabled
- ⛔ Raw translation key on screen
Implementation
app/controllers/cms/multicentre-proposals/index.jsapp/controllers/cms/multicentre-proposals/new.jsapp/routes/cms/multicentre-proposals/*.jsapp/models/multicentre-proposal.jsapp/abilities/multicentre-proposals.js
Translation keys (6)
Key English title.header.multicentre-proposalsMulticentre proposals menu.navbar.multicentre-proposals.showMulticentre proposals cms.new-multicentre-proposalNew multicentre proposal cms.multicentre-proposal.general-data⚠️ missing error.all-translation-fields.requiredAll translatable fields must be translate modules-multicenter-proposalsMulticenter proposals
Related
- Same area — Proposal list & publication workflow · Proposal editor (content, coupon, push, AI images) · Push notification list & publishing · Push notification editor (scheduling, geofencing, deep links) · Content categories · App button manager (MOFs)
- Shares data with — Centre editor (modules, app config, integrations) · Store create & edit · Activity editor (loyalty mechanics, rules & targeting) · Customer receipts tab & ticket-stamp generation · Customer loyalty — coupon exchanges · Receipt verification queue · Store list, filters & exports · Store CSV import
Generated from doc/feature-inventory.json · id cms-multicentre-proposals · commit 276788ca6