v0.3.0
-
@lowdefy/modules-mongodb-plugins: ### Minor Changes
-
#34
cbe3d6dThanks @JohannMoller! - Restructure thecompaniesmodule's data shape so registration / contact / address / attribute fields move into opt-in section sub-objects instead of being hardcoded at the document root. Consumers wire any combination of shipped field-presets — or their own block arrays — through newfields.{registration,contact,address,attributes}slot vars.Companies module — breaking shape changes:
- Document root:
trading_name/registered_name/registration_number/vat_number/websiteremoved from the document root. Display name is nowname; the registration trio plus website / phone / email move underregistration.*/address.*/contact.*sub-objects. name_fielddefault: flipped fromtrading_nametoname. All read-side requests builddisplay_namevia$getFieldso the rename propagates without per-request edits. Apps whose collections genuinely use a different display field must setname_fieldexplicitly.- New
fields.Xvars:fields.contact,fields.address,fields.registration(alongside existingfields.attributes). Each defaults to[]— apps that don't opt in render an empty section. Block ids inside each array must be prefixed with the section name (contact.,address., etc.) so they bind to the matching state subtree. - Field-preset library:
field-presets/{contact-default,address-text,address-places,registration-sa}.yamlship under the module.address-places.yamldepends on a customPlacesAutocompleteplugin that does not yet exist in this monorepo; consumers wiring it must supply the plugin themselves. - Excel export: fixed columns trimmed to the universal core (
id,name,description,updated_at,created_at). Section columns move through the existingcomponents.download_columnsslot.
Migration (data):
trading_name → name registered_name → registration.registered_name registration_number → registration.registration_number vat_number → registration.vat_number website → contact.website contact.primary_email → contact.primary_email (unchanged) contact.primary_phone → contact.primary_phone (unchanged) address.* (already nested)→ address.* (unchanged)Run a one-off migration on the
companiescollection;update-company's$setdoes not unset the legacy keys, so old fields will coexist with the new shape until explicitly removed.Migration (apps wiring the module):
Add
fields.{contact,address,registration}to your module-entryvarsto opt into the sections. Either_refthe shipped presets or supply your own block arrays:fields: contact: _ref: ../../modules/companies/field-presets/contact-default.yaml address: _ref: ../../modules/companies/field-presets/address-text.yaml registration: _ref: ../../modules/companies/field-presets/registration-sa.yaml
_refpaths resolve from the consuming app's config root.Contacts module:
get_contact_companiesnow projectsname+company_idinstead of the legacytrading_name. The contact view's linked-companies tile renders the new shape. Apps that rely on the old projection must update any custom consumers reading from this request.Plugins (SmartDescriptions):
The
companyfield-type detector signature changes from"trading_name" in valueto("name" in value && "company_id" in value), and the renderer readsvalue.nameinstead ofvalue.trading_name. Any custom value shape that used to match ontrading_namealone will now fall through to default rendering — passcompany_id(or use the updatedget_contact_companiesprojection) to keep the company link + icon. - Document root:
-
@lowdefy/modules-mongodb-companies: ### Minor Changes
-
#34
cbe3d6dThanks @JohannMoller! - Restructure thecompaniesmodule's data shape so registration / contact / address / attribute fields move into opt-in section sub-objects instead of being hardcoded at the document root. Consumers wire any combination of shipped field-presets — or their own block arrays — through newfields.{registration,contact,address,attributes}slot vars.Companies module — breaking shape changes:
- Document root:
trading_name/registered_name/registration_number/vat_number/websiteremoved from the document root. Display name is nowname; the registration trio plus website / phone / email move underregistration.*/address.*/contact.*sub-objects. name_fielddefault: flipped fromtrading_nametoname. All read-side requests builddisplay_namevia$getFieldso the rename propagates without per-request edits. Apps whose collections genuinely use a different display field must setname_fieldexplicitly.- New
fields.Xvars:fields.contact,fields.address,fields.registration(alongside existingfields.attributes). Each defaults to[]— apps that don't opt in render an empty section. Block ids inside each array must be prefixed with the section name (contact.,address., etc.) so they bind to the matching state subtree. - Field-preset library:
field-presets/{contact-default,address-text,address-places,registration-sa}.yamlship under the module.address-places.yamldepends on a customPlacesAutocompleteplugin that does not yet exist in this monorepo; consumers wiring it must supply the plugin themselves. - Excel export: fixed columns trimmed to the universal core (
id,name,description,updated_at,created_at). Section columns move through the existingcomponents.download_columnsslot.
Migration (data):
trading_name → name registered_name → registration.registered_name registration_number → registration.registration_number vat_number → registration.vat_number website → contact.website contact.primary_email → contact.primary_email (unchanged) contact.primary_phone → contact.primary_phone (unchanged) address.* (already nested)→ address.* (unchanged)Run a one-off migration on the
companiescollection;update-company's$setdoes not unset the legacy keys, so old fields will coexist with the new shape until explicitly removed.Migration (apps wiring the module):
Add
fields.{contact,address,registration}to your module-entryvarsto opt into the sections. Either_refthe shipped presets or supply your own block arrays:fields: contact: _ref: ../../modules/companies/field-presets/contact-default.yaml address: _ref: ../../modules/companies/field-presets/address-text.yaml registration: _ref: ../../modules/companies/field-presets/registration-sa.yaml
_refpaths resolve from the consuming app's config root.Contacts module:
get_contact_companiesnow projectsname+company_idinstead of the legacytrading_name. The contact view's linked-companies tile renders the new shape. Apps that rely on the old projection must update any custom consumers reading from this request.Plugins (SmartDescriptions):
The
companyfield-type detector signature changes from"trading_name" in valueto("name" in value && "company_id" in value), and the renderer readsvalue.nameinstead ofvalue.trading_name. Any custom value shape that used to match ontrading_namealone will now fall through to default rendering — passcompany_id(or use the updatedget_contact_companiesprojection) to keep the company link + icon. - Document root:
-
@lowdefy/modules-mongodb-contacts: ### Minor Changes
-
#34
cbe3d6dThanks @JohannMoller! - Restructure thecompaniesmodule's data shape so registration / contact / address / attribute fields move into opt-in section sub-objects instead of being hardcoded at the document root. Consumers wire any combination of shipped field-presets — or their own block arrays — through newfields.{registration,contact,address,attributes}slot vars.Companies module — breaking shape changes:
- Document root:
trading_name/registered_name/registration_number/vat_number/websiteremoved from the document root. Display name is nowname; the registration trio plus website / phone / email move underregistration.*/address.*/contact.*sub-objects. name_fielddefault: flipped fromtrading_nametoname. All read-side requests builddisplay_namevia$getFieldso the rename propagates without per-request edits. Apps whose collections genuinely use a different display field must setname_fieldexplicitly.- New
fields.Xvars:fields.contact,fields.address,fields.registration(alongside existingfields.attributes). Each defaults to[]— apps that don't opt in render an empty section. Block ids inside each array must be prefixed with the section name (contact.,address., etc.) so they bind to the matching state subtree. - Field-preset library:
field-presets/{contact-default,address-text,address-places,registration-sa}.yamlship under the module.address-places.yamldepends on a customPlacesAutocompleteplugin that does not yet exist in this monorepo; consumers wiring it must supply the plugin themselves. - Excel export: fixed columns trimmed to the universal core (
id,name,description,updated_at,created_at). Section columns move through the existingcomponents.download_columnsslot.
Migration (data):
trading_name → name registered_name → registration.registered_name registration_number → registration.registration_number vat_number → registration.vat_number website → contact.website contact.primary_email → contact.primary_email (unchanged) contact.primary_phone → contact.primary_phone (unchanged) address.* (already nested)→ address.* (unchanged)Run a one-off migration on the
companiescollection;update-company's$setdoes not unset the legacy keys, so old fields will coexist with the new shape until explicitly removed.Migration (apps wiring the module):
Add
fields.{contact,address,registration}to your module-entryvarsto opt into the sections. Either_refthe shipped presets or supply your own block arrays:fields: contact: _ref: ../../modules/companies/field-presets/contact-default.yaml address: _ref: ../../modules/companies/field-presets/address-text.yaml registration: _ref: ../../modules/companies/field-presets/registration-sa.yaml
_refpaths resolve from the consuming app's config root.Contacts module:
get_contact_companiesnow projectsname+company_idinstead of the legacytrading_name. The contact view's linked-companies tile renders the new shape. Apps that rely on the old projection must update any custom consumers reading from this request.Plugins (SmartDescriptions):
The
companyfield-type detector signature changes from"trading_name" in valueto("name" in value && "company_id" in value), and the renderer readsvalue.nameinstead ofvalue.trading_name. Any custom value shape that used to match ontrading_namealone will now fall through to default rendering — passcompany_id(or use the updatedget_contact_companiesprojection) to keep the company link + icon. - Document root:
-
@lowdefy/modules-mongodb-layout: ### Minor Changes
-
#41
5d50cadThanks @JohannMoller! - Layout module fixes — let the page block own logo and chrome styling instead of overriding it from this module.Logo: read from
public/folder by convention. Stop forcingproperties.logo.srcfrom_module.var: logo.primary_lightinpage.yaml; with nologo.srcset, the page block falls back to${basePath}/logo-{light,dark}-theme.png(andlogo-square-{light,dark}-theme.pngfor mobile) and auto-swaps with dark mode at runtime viagetDarkMode(). The previous wiring silently bypassed that swap whenever a consumer set the var.Header / sider style overrides removed. The
.headerdivider is now owned by the page block via lowdefy/lowdefy#2158;.siderwas already shipped as a default byPageSiderMenuandPageSidebarLayout. Consumers must be on a Lowdefy version that includes the upstream.headerstyling fix to get a header divider — older Lowdefy versions will render no header divider after this module bump (the previous override was visually broken on those versions anyway, drawing a partial line under the menu only).Bug fix as a side effect:
logo.stylenow actually applies. The previous wiring went throughproperties.logo.style, which the v5 page-block schema rejects (logohasadditionalProperties: falseand nostyleproperty). Routing the override through the.logocssKey makes the var functional on v5 for the first time.Removed vars (breaking for apps that set them):
logo.primary_light— page-header logo on light theme.logo.icon— square mobile-header logo.
Lowdefy's manifest validation does not reject unknown vars, so apps still passing these values won't error — but the values will be silently ignored and the public-folder logos will render instead.
Migration:
- Drop
logo.primary_lightandlogo.iconfrom your layout module-entryvars. - Place the corresponding image files under the app's
public/folder using the conventional names:public/logo-light-theme.png— desktop logo on light theme.public/logo-dark-theme.png— desktop logo on dark theme.public/logo-square-light-theme.png— mobile (square) logo on light theme.public/logo-square-dark-theme.png— mobile (square) logo on dark theme.
logo.primary_dark(auth-page cover) andlogo.primary(auth-page brand panel / mobile auth view) are unchanged.logo.styleis unchanged but is now wired through the page block's.logocssKey instead ofproperties.logo.style, matching the v5 styling API.