Configuration · Extra attributes
Defines the custom fields a centre can add to stores and proposals: a label, a code, a data type (text, HTML, image, URL, address, audio, activity, form, custom form, gift card, gift-card admin) and the channels it applies to, with a CSV export.
| Area | Configuration |
| Routes | configuration.extra-attributes · configuration.extra-attributes.index · configuration.extra-attributes.new · configuration.extra-attributes.edit |
| Centre modules | extra |
| Staff levels | root · admin · manager |
| Models | commerce-extra · extra · extra-language · language · proposal-extra |
| UI label | title.header.configuration.extra-attributes / menu.navbar.configuration.extra |
| Coverage | 4 use cases · 1 happy · 5 failure |
Known issues (1)
How it works
This is the extensibility mechanism behind the store and proposal editors: linkedModel ∈ all / commerce / proposal decides where the field appears, and extraType decides the input widget. Channel selection is validated conditionally — required only when neither channelWeb nor channelApp is set — and channelWebIsDisabled can lock the web option. Per-language labels come from extra-language. Because the consuming forms build their own "<label> is required" message for required extras, the label chosen here leaks into user-facing error text untranslated.
Use cases
Why someone opens this (4)
- Adding an ‘Opening hours’ HTML field to every store.
- Attaching a centre-specific audio description field to proposals.
- Adding a gift-card field only for Fideliza-enabled centres.
- Exporting the extra-attribute catalogue for documentation.
Path map
flowchart LR F(["Extra attributes"]):::feat F --> H1["Store extra created"]:::ok F -.-> X1["Label or code missing"]:::bad F -.-> X2["Type missing"]:::bad F -.-> X3["Linked model missing"]:::bad F -.-> X4["No channel"]:::bad F -.-> X5["Deleting an extra with data"]:::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
Store extra created
- Admin creates an extra with a label, a code, type
htmland linked modelcommerce.- Channels are selected (or the app/web flags set).
- Per-language labels are filled.
- The field now appears on the store editor’s extra-attributes step.
Failure paths
Label or code missing
Cause — Either blank.
What happens —
error.extra-attributes.label.required/error.extra-attributes.code.required.
Type missing
Cause —
extraTypeblank.What happens —
error.extra-attributes.extra-type.required.
Linked model missing
Cause —
linkedModelblank.What happens —
error.extra-attributes.linked-model.required.
No channel
Cause — Neither channels nor the web/app flags set.
What happens —
error.extra-attributes.channel.required(‘At least one channel must be selected’).
Deleting an extra with data
Cause — Stores or proposals hold values for it.
What happens — API rejection through the generic form error path.
QA checklist
Tick these off while regression-testing this feature. The boxes are plain Markdown, so progress is visible in git diffs.
- ✅ Store extra created
- ⛔ Label or code missing
- ⛔ Type missing
- ⛔ Linked model missing
- ⛔ No channel
- ⛔ Deleting an extra with data
Implementation
app/controllers/configuration/extra-attributes/index.jsapp/controllers/configuration/extra-attributes/new.jsapp/routes/configuration/extra-attributes/*.jsapp/models/extra.jsapp/models/extra-language.jsapp/enums/extra-attribute-extra-types.jsapp/enums/extra-attribute-linked-models.jsapp/abilities/extra.js
Translation keys (22)
Key English title.header.configuration.extra-attributesExtra Attributes menu.navbar.configuration.extraExtra attributes configuration.extra-attributes.general-dataGeneral data configuration.extra-attributes.list.textText configuration.extra-attributes.list.htmlHTML configuration.extra-attributes.list.imageImage configuration.extra-attributes.list.urlURL configuration.extra-attributes.list.addressAddress configuration.extra-attributes.list.audioAudio configuration.extra-attributes.list.activityActivity configuration.extra-attributes.list.formAdvanced form configuration.extra-attributes.list.custom-formCustom forms configuration.extra-attributes.list.gift-card-clientGift card client configuration.extra-attributes.list.gift-card-adminGift card store admin configuration.extra-attributes.list.allAll configuration.extra-attributes.list.commerceStore configuration.extra-attributes.list.proposalProposal error.extra-attributes.label.requiredName is required error.extra-attributes.code.requiredCode is required error.extra-attributes.extra-type.requiredType is required error.extra-attributes.linked-model.requiredLinked model is required error.extra-attributes.channel.requiredAt least one channel must be selected
Related
- Same area — Centre list & export · Centre editor (modules, app config, integrations) · Staff member list, deletion & restore · Staff member editor (levels, scope, API token) · Channels · 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 — Store create & edit · Proposal editor (content, coupon, push, AI images) · Customer create & edit · Activity editor (loyalty mechanics, rules & targeting) · Activity campaigns (programme grouping) · Proposal list & publication workflow · App button manager (MOFs) · Multicentre proposals
Generated from doc/feature-inventory.json · id config-extra-attributes · commit 276788ca6