v0.10.0
-
@lowdefy/modules-mongodb-activities: ### Minor Changes
-
#93
ce955c2Thanks @JohannMoller! - Six backwards-compatible extension points in the activities module:- Type behavior flags — the meeting-specific form behavior is no longer keyed to the literal
meetingtype id. Activity-type enum entries (built-in or registered via theactivity_typesvar) now carry optional flags:agenda: truerenders the Agenda Topics section,duration: true/direction: trueshow those meta fields in the form and view, andcontact_labeltitles the linked-contacts selector (default "Participants"). The built-ins keep their previous behavior as defaults (call: duration;email: direction + CC;meeting: agenda + duration + Attendees), so a consumer type can now be fully meeting-like. - Per-type attribute fields — new
fields.attributes_by_type.<type_id>var. A type with an entry renders that block list (form and detail view) instead of the globalfields.attributesarray; types without an entry fall back to the global array. - Attachment slots — the attachments UI is now a pair of overridable block-array slots:
components.form_attachments(defaults to the files module's file-manager at the bottom of the form) andcomponents.view_attachments(defaults to the files file-card sidebar tile on the detail page). Apps that don't wire the files module can supply their own blocks or[]. - Post-create hook — new
hooks.on_createdvar: actions run after every successful create (new page andcapture_activitymodal) with the new activity's id atstate.activity_idand the captured fields still in state. On the new page, settingstate.on_created_handled: truein the hook skips the built-in reset + navigate-to-view tail so the hook can route elsewhere. - Agenda origin marker — task docs created from activity agenda topics are stamped
metadata.task_type: agenda(create flow, and backfilled by the edit flow's upsert), so host apps can distinguish them from adhoc tasks without relying on theactivity_idsback-link. - Form option requests — new
form_requestsvar: request configs spliced into the new/edit page request lists and fired on page init, so request-backed consumerfields.*blocks (e.g. a selector whose options come from an app collection) have their option sources available. The pages set astate.activity_form_contextmarker (pageon new/edit,viewon the detail page,modalin thecapture_activitymodal) so such fields can gate themselves to the full-page form and stay out of the modal, where page requests aren't available.
- Type behavior flags — the meeting-specific form behavior is no longer keyed to the literal
-
@lowdefy/modules-mongodb-companies: ### Patch Changes
-
#93
cd5373fThanks @JohannMoller! - Company selector now consumesrequest_stages.selector. The stages are injected into the company-selector aggregation after the base active-company$matchand before the label projection, so consumer stages can filter or derive on raw document fields — e.g. excluding app-specific soft-delete markers from pickers. Previously the var was documented in the manifest but never applied. -
#96
5742843Thanks @JohannMoller! - Standardise soft-delete reads on thedeletedchange-stamp shape.The regular-MongoDB requests (
get_company,get_company_children,get_descendant_company_ids,get_companies_for_selector) matched live companies withdeleted: { $ne: true }, which only excludes a booleandeleted: trueand would let soft-deleted docs through oncedeletedis a change-stamp object. They now usedeleted.timestamp: { $exists: false }, matching the Atlas Search reads and the rest of the repo. See the soft-delete convention.Migration is only needed if a host app previously wrote a boolean
deleted: true; promote those to a change stamp:db.companies.updateMany({ deleted: true }, [ { $set: { deleted: { timestamp: "$updated.timestamp", user: "$updated.user" }, }, }, ]);
-
@lowdefy/modules-mongodb-contacts: ### Patch Changes
-
#94
f1d8f6cThanks @Yianni99! - Add a role-filtered simple contact selectorNew
role-contact-selectorcontacts component: a Selector (or MultipleSelector
viamode) of active contacts scoped to one or more roles (matched against
apps.<app_name>.roles), storing a denormalized{ contact_id, name, email }
value — object in single mode, array in multiple — so read-only views render it
as a contact (name + link). Newrole_contactandrole_contact_multiple
workflows form fields wrap the single- and multiple-select cases. A lighter
alternative to the rich contact picker (contact) when a form only needs to pick
existing contacts in a given role. -
#96
5742843Thanks @JohannMoller! - Standardise the soft-delete read on thedeletedchange-stamp shape.get_contact_companiesfiltered the companies lookup withdeleted: { $ne: true }, which would let soft-deleted companies through oncedeletedis a change-stamp object. It now usesdeleted.timestamp: { $exists: false }, matching the soft-delete convention. -
@lowdefy/modules-mongodb-files: ### Minor Changes
-
#96
5742843Thanks @JohannMoller! - Soft-delete now uses adeletedchange stamp instead of aremovedboolean (breaking).The soft-delete marker on file docs is renamed
removed→deletedand changed from a boolean to a change stamp object, matching the convention used byactivitiesand the rest of the repo.delete-filesetsdeletedto a change stamp (capturing who/when),save-fileinitialisesdeleted: null, andget-entity-filesreads live files withdeleted.timestamp: { $exists: false }.Existing data needs a migration. Deleted docs already recorded who/when on their
updatedstamp, so promote it intodeleted. Run it as a single per-document pipeline (a separate{ removed: { $ne: true } }pass would match already-migrated docs —$nematches missing fields — and clobber the new stamps):db.files.updateMany({ removed: { $exists: true } }, [ { $set: { deleted: { $cond: [{ $eq: ["$removed", true] }, "$updated", null] }, }, }, { $unset: "removed" }, ]);
-
@lowdefy/modules-mongodb-user-admin: ### Patch Changes
-
#96
5742843Thanks @JohannMoller! - Standardise the soft-delete read on thedeletedchange-stamp shape.get_all_usersandget_user_excel_datamatched live users withdeleted: null. They now usedeleted.timestamp: { $exists: false }so every module reads soft-delete identically (see the soft-delete convention). Behaviour is unchanged — both predicates treatnull/absent as live and exclude a real delete stamp. -
@lowdefy/modules-mongodb-workflows: ### Patch Changes
-
#94
18d8876Thanks @Yianni99! - Make action edit-page button titles configurableThe edit page's progress ("Save Draft") and submit ("Submit") button titles can
now be overridden per action viapage_config.buttons.progress.title/
page_config.buttons.submit.title(defaults unchanged). This lets an app relabel
e.g. a perpetual-log action's "Save Draft" button to "Save". -
#94
466e976Thanks @Yianni99! - Addon_changeevent support to workflow form field componentsThe
button_selector,number,radio_selector,checkbox_selector,
checkbox_switch,text_input,text_area,enum_selector,date_selector,
date_range_selector, andtiptap_inputfield components now accept an
on_changevar (mirroringselector/yes_no_selector) that wires to the
block'sevents.onChange. Previously these fields silently dropped any authored
field-level change handler, so form logic like "clear dependent field when this
one changes" only worked on a handful of field types. -
#94
f1d8f6cThanks @Yianni99! - Add a role-filtered simple contact selectorNew
role-contact-selectorcontacts component: a Selector (or MultipleSelector
viamode) of active contacts scoped to one or more roles (matched against
apps.<app_name>.roles), storing a denormalized{ contact_id, name, email }
value — object in single mode, array in multiple — so read-only views render it
as a contact (name + link). Newrole_contactandrole_contact_multiple
workflows form fields wrap the single- and multiple-select cases. A lighter
alternative to the rich contact picker (contact) when a form only needs to pick
existing contacts in a given role. -
#94
c93ad39Thanks @Yianni99! - Edit-page Save Draft now sends thecomment/comment_visibilityinputs with the progress call and clears them after a successful save, matching the check page's progress reseed — so a draft comment is no longer folded into a later event on the next Save Draft.