v0.8.0
-
@lowdefy/modules-mongodb-plugins: ### Minor Changes
-
#79
afa3f13Thanks @Saiby100! - SmartDescriptions: render plain objects and arrays of objects instead of crashing (React error #31).- New generic
objectfield type in the registry (priority 99, after the specific object shapes): renders unknown objects as label/value rows, each value recursing through its own detected field type via arenderNestedcallback now injected into all registry renderers. Reference-style objects (name/label/title) display their label field only. processFieldsnow skips fields withvisible: false, matching Lowdefy block semantics.- Empty state keeps rendering the Descriptions header (title / extra) with a muted "No data to display" item, instead of dropping the title.
- Auto-discovery (data mode) behavior change: single unrecognized objects now render as one row of nested label/value rows instead of flattening into dotted-key rows.
- New generic
-
@lowdefy/modules-mongodb-activities: ### Minor Changes
-
#79
2e9c67cThanks @Saiby100! - Activities: built-in meeting agenda topics, stored as tasks in the actions collection.- New built-in Agenda Topics section on the activity form (meeting only): topic, details, action, person responsible (options from the activity's attendees), and due date, with an info alert explaining that agenda changes create/update tasks. Previously this lived in consumer
fields.attributesconfig writing toattributes.agenda_topics. - Topics are no longer stored on the activity doc.
create-activityandupdate-activityaccept a newagenda_topicspayload array and persist each topic as a task document in the actions collection —kind: task,title= topic,description= details,attributes.action,assignees= [person responsible],due_date, app-keyed{app_name}.message, initial stageaction-required— linked back viaactivity_idsand stamped with the activity'scompany_ids+referencespayload (e.g.deal_ids) so they surface in host-app task lists. update-activitydiffs incoming topics against the activity's existing tasks by_id: new rows insert (upsert), existing rows get field edits only (status untouched), and removed rows get anot-requiredstatus entry pushed — never deleted.delete-activitymarks the activity's open (action-required) tasksnot-required.- No per-task events: the existing
create-activity/update-activity/delete-activityevents carry affected task ids inreferences.action_ids, and task status entries reference that event's id. get_activitygains alookup_agenda_tasksstage (_id→activity_ids, excludingnot-required) feeding a new read-only Agenda Topics section on the view page and the edit form's seeded rows (hidden task_idper row round-trips through the ControlledList).- New
actions-collectionconnection (default collectionactions, write enabled) andlookup_collections.actionsvar (defaultactions) — consumers mapping the actions collection to another name must set both. - Activity docs now also store the create
referencespayload verbatim under areferencesfield, so tasks added later from the edit page inherit the same references.
- New built-in Agenda Topics section on the activity form (meeting only): topic, details, action, person responsible (options from the activity's attendees), and due date, with an info alert explaining that agenda changes create/update tasks. Previously this lived in consumer
-
#79
f2d1386Thanks @Saiby100! - Activities: built-in file upload on the activity form.- The activity form (new page, edit page, and quick-capture modal) now renders an Attachments section with the files module's
file-manager, so users can attach files while logging an activity. Files bind toentity_type: activity,entity_id: activity_id,file_category: activity-attachment— the same keys the detail view's file sidebar reads. - To give uploads a stable id before the activity exists,
activity_idis minted (_uuid) on form open — capture-modalonOpenand new-pageonInit— and reused as the create payload's_idinstead of minting a fresh id at submit. The modal'sonClosereset clears it; the edit page seeds it from the loaded_idso the file-manager resolves identically on new, edit, and capture. This also gives consumer attachment-stylefields.attributesblocks a stable_state: activity_idto bind against. - The form embeds the file-manager unconditionally, so hosts must wire the module's
filesdependency (previously only needed for the optional detail-page file sidebar).
- The activity form (new page, edit page, and quick-capture modal) now renders an Attachments section with the files module's
-
#68
b7f8ca8Thanks @Yianni99! - Activities: add basic/complex type gating, clean up the detail view, and fix runtime + warning issues surfaced by demo testing.Activities
- New
type: basic | complexfield on eachactivity_typesentry. Basic activities (built-in:call,email) are created indefault_stageand have no transition UI; complex activities (built-in:meeting) keep the full Mark done / Reopen / Cancel lifecycle. Existing consumer-defined types without an explicittypedefault tocomplex(full UI). - Type gating enforced at three layers: table action-column cell renderers (em-dash for basic), CallAPI skip conditions (defence in depth for empty-cell clicks), and view-page button visibility. Stage chip on the detail view header is also hidden for basic activities.
- Breaking: linked contacts are now stored as reference objects. Activity docs store a
contactsarray of{ contact_id, name, email, verified }reference objects (written by the contacts module'scontact-selector) instead of the oldcontact_idsplain-id array.create-activity/update-activityaccept acontactspayload in place ofcontact_ids, and theactivities-timelinecomponent'sreference_fieldvar takescontacts(matched internally oncontacts.contact_id) instead ofcontact_ids. Emitted events still flatten the references to plain ids underreferences.contact_ids, so event reverse-lookups are unchanged. Existing data written withcontact_idsneeds a migration to the new shape. - Read pipelines join contact docs into a separate
contacts_enrichedfield (lookup_contactsnow matches oncontacts.contact_id), keeping the stored reference objects intact for the edit form to round-trip back into the selector. The list table's Contacts column, detail-page contact chips, and view pages all read the enriched docs. - New
lookup_collectionsvar configures the real Mongo collection names used by the read-pipeline$lookupstages:lookup_collections.contacts(defaultuser-contacts) andlookup_collections.companies(defaultcompanies). Override when an app points its connections at differently-named collections ($lookupfromtakes a collection name, not a connectionId). - New
components.contact_card_extra_fields/components.company_card_extra_fieldsvars: extra{ label, value }rows rendered under each linked contact's name/email and each linked company's name on the activity-detail chips.valueis a top-level key on the projected doc — extend the lookup stage's$projectto surface nested source fields. - Form rework: the type picker is now a
SegmentedSelector(was a dropdownSelector), and the linked-contacts selector relabels per type — Attendees (meeting), CC (email), Participants (otherwise). The "Additional Details" divider above consumerfields.attributesis removed; attribute fields now render directly after the built-in fields. - View detail page main column: removed the Status History section (duplicates the events timeline in the History card) and the inline Linked Contacts / Linked Companies sections (duplicates the dedicated sidebar cards).
- View detail header: collapsed the separate type-chip / title / description blocks into a single header (title + rich-text description) with refined typography, and moved the type + current-stage pills into the wrapping card's
extraslot. Captured date, duration (call / meeting), and direction (email) now render via a field-drivenSmartDescriptionsblock whosefieldsconfig is the form's meta-row field defs, extracted to the sharedcomponents/activity_meta_fields.yamlso the form and the read-only view stay in sync. - Description rendering reads
description.htmlinstead of the whole TiptapInput value object (fixes[object Object]in the view). Excel export readsdescription.textfor plain output. get_activities.yamlnow runslookup_contacts+lookup_companiesstages so the list table's Contacts/Companies columns populate. DroppedreturnStoredSource: trueso post-write refetches return the live doc immediately instead of waiting on Atlas Search index replication.updated_at/created_atdate formatting moved into the sharedadd_derived_fields.yamlstage — every consumer (detail, list, tile, options) now gets the formatted strings, not just the list page.- New optional
referencespayload oncreate-activityandupdate-activity: any keys passed in this object are_object.assign'd onto both the inserted/updated doc and the emitted event'sreferences:block. Lets consumers link activities to entities the module doesn't know about (e.g.deal_idsfrom a CRM app) without forking the module — existing callers passing onlycontacts/company_idsare unaffected. capture_activitynow forwardsprefill.referencesthroughonOpenstate seeding and into the create payload, and seedscycle_check_self_id/cycle_check_idsso the embedded company-selector'sget_companies_for_selectorrequest doesn'tConfigWarningon hosts that don't otherwise declare those state keys.pages/new.yamlmirrors the samereferencesstate init and payload pass-through.- Fix event display app_name keying. Activities was writing per-event display titles under a hard-coded
display.default.titleinstead ofdisplay.{app_name}.title, so the events module'sdisplay_keycould never read them back (blank timeline titles). The module now declares a requiredapp_namevar and follows the same pattern ascompanies/contacts:defaults/event_display.yamlships bare event-type keys, and the four write APIs wrap them underapp_namevia_build.if_none(override fully replaces — no merge) instead of the old_build.object.assign. Breaking: consumers must now passapp_nameto the activities module entry. get_activities.yamlstage filter targetsstatus.stageinstead ofstatus.0.stage— Atlas Search can't address array elements by position, so the old path never matched and a stage filter returned zero rows.- Edit page fetches the activity in
onInitinstead ofonMount, so block-level mount fetches (e.g. the file-manager's files request) seeactivity_idseeded before they fire. - View page mirrors the loaded activity's
typeinto_state: type(initnullin onInit, set on hydrate). Consumerfields.attributesvisibleconditions are written against_state: type(e.g. meeting-only fields); the key existed on the form pages via the type input block but was never set on the view page, so those conditions always evaluated false onceSmartDescriptionsstarted honoringvisible: false. cycle_check_self_id/cycle_check_idsinitialised in onInit on every activity page that usescompany-selector— silences the build-timeConfigWarningfrom companies' implicit_statereferences inget_companies_for_selector.yaml. Runtime unchanged (request_if_nonedefaults already covered it).
Companies / contacts
cycle_check_self_id/cycle_check_idsinitialised in onInit on the view pages. Any sidebar slot that hosts acompany-selector(e.g. via the activitiestile_activitiesslot-wired from the app) triggers companies'get_companies_for_selectorrequest, which reads those_statekeys. The build's_statevalidator warns when keys are referenced but undeclared on the page; the init silences the warning. Runtime unchanged (_if_nonedefaults take over).
- New
-
#79
a56d14aThanks @Saiby100! - Lock linked-company edits on the activity edit page.- Companies:
company-selectoraccepts a newdisabledvar (defaultfalse) that renders the selector read-only. - Activities: new
disable_company_editvar (defaultfalse). Whentrue, the edit page renders the linked-companies selector disabled, so linked companies stay visible but can't be changed after creation. The new page and quick-capture prefill still set companies; detail-page chips and list-table tags are unaffected.
- Companies:
Patch Changes
-
#79
0f2f9a3Thanks @Saiby100! - Activities: make the linked-company display field configurable instead of hardcodingtrading_name.The
lookup_companiesread stage and thecompany_list_items/table_activitiestemplates hardcodedtrading_name, which matched neither the companies module'sname_fielddefault (name) nor any consumer that left that default in place — linked-company chips and list-table tags rendered blank (table fell back to_id).- New
company_name_fieldvar (defaultname) mirrors the companies module'sname_field. Set both to the same value when an app stores its company display name under a non-default field (e.g.trading_name). lookup_companies.yamlnow projects the configured field under the stable aliasnamevia$getField, socompany_list_itemsandtable_activitiesreadcompany.nameregardless of the source field.
No action needed for consumers on the
namedefault. Apps that store the company display name under another field should setcompany_name_fieldto match their companiesname_field. - New
-
#79
f2d1386Thanks @Saiby100! - Activities: restyle theactivities-timelinerows for scannability.Rows are restructured into a column layout: the activity title leads, with a smaller type-label pill on its right (the pill previously sat left of the title). The activity description renders as muted two-line-clamped text under the title (Tiptap HTML stripped, empty
<p></p>docs hidden). The stage pill is replaced by plain stage-coloured text bottom-left, and the date bottom-right now shows the activity's scheduled date (attributes.date) instead ofupdated.timestamp. Rows get horizontal padding, rounded corners, and a hover background (theme-token based, works in light and dark). -
@lowdefy/modules-mongodb-companies: ### Minor Changes
-
#79
a56d14aThanks @Saiby100! - Lock linked-company edits on the activity edit page.- Companies:
company-selectoraccepts a newdisabledvar (defaultfalse) that renders the selector read-only. - Activities: new
disable_company_editvar (defaultfalse). Whentrue, the edit page renders the linked-companies selector disabled, so linked companies stay visible but can't be changed after creation. The new page and quick-capture prefill still set companies; detail-page chips and list-table tags are unaffected.
- Companies:
Patch Changes
-
#68
b7f8ca8Thanks @Yianni99! - Activities: add basic/complex type gating, clean up the detail view, and fix runtime + warning issues surfaced by demo testing.Activities
- New
type: basic | complexfield on eachactivity_typesentry. Basic activities (built-in:call,email) are created indefault_stageand have no transition UI; complex activities (built-in:meeting) keep the full Mark done / Reopen / Cancel lifecycle. Existing consumer-defined types without an explicittypedefault tocomplex(full UI). - Type gating enforced at three layers: table action-column cell renderers (em-dash for basic), CallAPI skip conditions (defence in depth for empty-cell clicks), and view-page button visibility. Stage chip on the detail view header is also hidden for basic activities.
- Breaking: linked contacts are now stored as reference objects. Activity docs store a
contactsarray of{ contact_id, name, email, verified }reference objects (written by the contacts module'scontact-selector) instead of the oldcontact_idsplain-id array.create-activity/update-activityaccept acontactspayload in place ofcontact_ids, and theactivities-timelinecomponent'sreference_fieldvar takescontacts(matched internally oncontacts.contact_id) instead ofcontact_ids. Emitted events still flatten the references to plain ids underreferences.contact_ids, so event reverse-lookups are unchanged. Existing data written withcontact_idsneeds a migration to the new shape. - Read pipelines join contact docs into a separate
contacts_enrichedfield (lookup_contactsnow matches oncontacts.contact_id), keeping the stored reference objects intact for the edit form to round-trip back into the selector. The list table's Contacts column, detail-page contact chips, and view pages all read the enriched docs. - New
lookup_collectionsvar configures the real Mongo collection names used by the read-pipeline$lookupstages:lookup_collections.contacts(defaultuser-contacts) andlookup_collections.companies(defaultcompanies). Override when an app points its connections at differently-named collections ($lookupfromtakes a collection name, not a connectionId). - New
components.contact_card_extra_fields/components.company_card_extra_fieldsvars: extra{ label, value }rows rendered under each linked contact's name/email and each linked company's name on the activity-detail chips.valueis a top-level key on the projected doc — extend the lookup stage's$projectto surface nested source fields. - Form rework: the type picker is now a
SegmentedSelector(was a dropdownSelector), and the linked-contacts selector relabels per type — Attendees (meeting), CC (email), Participants (otherwise). The "Additional Details" divider above consumerfields.attributesis removed; attribute fields now render directly after the built-in fields. - View detail page main column: removed the Status History section (duplicates the events timeline in the History card) and the inline Linked Contacts / Linked Companies sections (duplicates the dedicated sidebar cards).
- View detail header: collapsed the separate type-chip / title / description blocks into a single header (title + rich-text description) with refined typography, and moved the type + current-stage pills into the wrapping card's
extraslot. Captured date, duration (call / meeting), and direction (email) now render via a field-drivenSmartDescriptionsblock whosefieldsconfig is the form's meta-row field defs, extracted to the sharedcomponents/activity_meta_fields.yamlso the form and the read-only view stay in sync. - Description rendering reads
description.htmlinstead of the whole TiptapInput value object (fixes[object Object]in the view). Excel export readsdescription.textfor plain output. get_activities.yamlnow runslookup_contacts+lookup_companiesstages so the list table's Contacts/Companies columns populate. DroppedreturnStoredSource: trueso post-write refetches return the live doc immediately instead of waiting on Atlas Search index replication.updated_at/created_atdate formatting moved into the sharedadd_derived_fields.yamlstage — every consumer (detail, list, tile, options) now gets the formatted strings, not just the list page.- New optional
referencespayload oncreate-activityandupdate-activity: any keys passed in this object are_object.assign'd onto both the inserted/updated doc and the emitted event'sreferences:block. Lets consumers link activities to entities the module doesn't know about (e.g.deal_idsfrom a CRM app) without forking the module — existing callers passing onlycontacts/company_idsare unaffected. capture_activitynow forwardsprefill.referencesthroughonOpenstate seeding and into the create payload, and seedscycle_check_self_id/cycle_check_idsso the embedded company-selector'sget_companies_for_selectorrequest doesn'tConfigWarningon hosts that don't otherwise declare those state keys.pages/new.yamlmirrors the samereferencesstate init and payload pass-through.- Fix event display app_name keying. Activities was writing per-event display titles under a hard-coded
display.default.titleinstead ofdisplay.{app_name}.title, so the events module'sdisplay_keycould never read them back (blank timeline titles). The module now declares a requiredapp_namevar and follows the same pattern ascompanies/contacts:defaults/event_display.yamlships bare event-type keys, and the four write APIs wrap them underapp_namevia_build.if_none(override fully replaces — no merge) instead of the old_build.object.assign. Breaking: consumers must now passapp_nameto the activities module entry. get_activities.yamlstage filter targetsstatus.stageinstead ofstatus.0.stage— Atlas Search can't address array elements by position, so the old path never matched and a stage filter returned zero rows.- Edit page fetches the activity in
onInitinstead ofonMount, so block-level mount fetches (e.g. the file-manager's files request) seeactivity_idseeded before they fire. - View page mirrors the loaded activity's
typeinto_state: type(initnullin onInit, set on hydrate). Consumerfields.attributesvisibleconditions are written against_state: type(e.g. meeting-only fields); the key existed on the form pages via the type input block but was never set on the view page, so those conditions always evaluated false onceSmartDescriptionsstarted honoringvisible: false. cycle_check_self_id/cycle_check_idsinitialised in onInit on every activity page that usescompany-selector— silences the build-timeConfigWarningfrom companies' implicit_statereferences inget_companies_for_selector.yaml. Runtime unchanged (request_if_nonedefaults already covered it).
Companies / contacts
cycle_check_self_id/cycle_check_idsinitialised in onInit on the view pages. Any sidebar slot that hosts acompany-selector(e.g. via the activitiestile_activitiesslot-wired from the app) triggers companies'get_companies_for_selectorrequest, which reads those_statekeys. The build's_statevalidator warns when keys are referenced but undeclared on the page; the init silences the warning. Runtime unchanged (_if_nonedefaults take over).
- New
-
@lowdefy/modules-mongodb-contacts: ### Patch Changes
-
#68
b7f8ca8Thanks @Yianni99! - Activities: add basic/complex type gating, clean up the detail view, and fix runtime + warning issues surfaced by demo testing.Activities
- New
type: basic | complexfield on eachactivity_typesentry. Basic activities (built-in:call,email) are created indefault_stageand have no transition UI; complex activities (built-in:meeting) keep the full Mark done / Reopen / Cancel lifecycle. Existing consumer-defined types without an explicittypedefault tocomplex(full UI). - Type gating enforced at three layers: table action-column cell renderers (em-dash for basic), CallAPI skip conditions (defence in depth for empty-cell clicks), and view-page button visibility. Stage chip on the detail view header is also hidden for basic activities.
- Breaking: linked contacts are now stored as reference objects. Activity docs store a
contactsarray of{ contact_id, name, email, verified }reference objects (written by the contacts module'scontact-selector) instead of the oldcontact_idsplain-id array.create-activity/update-activityaccept acontactspayload in place ofcontact_ids, and theactivities-timelinecomponent'sreference_fieldvar takescontacts(matched internally oncontacts.contact_id) instead ofcontact_ids. Emitted events still flatten the references to plain ids underreferences.contact_ids, so event reverse-lookups are unchanged. Existing data written withcontact_idsneeds a migration to the new shape. - Read pipelines join contact docs into a separate
contacts_enrichedfield (lookup_contactsnow matches oncontacts.contact_id), keeping the stored reference objects intact for the edit form to round-trip back into the selector. The list table's Contacts column, detail-page contact chips, and view pages all read the enriched docs. - New
lookup_collectionsvar configures the real Mongo collection names used by the read-pipeline$lookupstages:lookup_collections.contacts(defaultuser-contacts) andlookup_collections.companies(defaultcompanies). Override when an app points its connections at differently-named collections ($lookupfromtakes a collection name, not a connectionId). - New
components.contact_card_extra_fields/components.company_card_extra_fieldsvars: extra{ label, value }rows rendered under each linked contact's name/email and each linked company's name on the activity-detail chips.valueis a top-level key on the projected doc — extend the lookup stage's$projectto surface nested source fields. - Form rework: the type picker is now a
SegmentedSelector(was a dropdownSelector), and the linked-contacts selector relabels per type — Attendees (meeting), CC (email), Participants (otherwise). The "Additional Details" divider above consumerfields.attributesis removed; attribute fields now render directly after the built-in fields. - View detail page main column: removed the Status History section (duplicates the events timeline in the History card) and the inline Linked Contacts / Linked Companies sections (duplicates the dedicated sidebar cards).
- View detail header: collapsed the separate type-chip / title / description blocks into a single header (title + rich-text description) with refined typography, and moved the type + current-stage pills into the wrapping card's
extraslot. Captured date, duration (call / meeting), and direction (email) now render via a field-drivenSmartDescriptionsblock whosefieldsconfig is the form's meta-row field defs, extracted to the sharedcomponents/activity_meta_fields.yamlso the form and the read-only view stay in sync. - Description rendering reads
description.htmlinstead of the whole TiptapInput value object (fixes[object Object]in the view). Excel export readsdescription.textfor plain output. get_activities.yamlnow runslookup_contacts+lookup_companiesstages so the list table's Contacts/Companies columns populate. DroppedreturnStoredSource: trueso post-write refetches return the live doc immediately instead of waiting on Atlas Search index replication.updated_at/created_atdate formatting moved into the sharedadd_derived_fields.yamlstage — every consumer (detail, list, tile, options) now gets the formatted strings, not just the list page.- New optional
referencespayload oncreate-activityandupdate-activity: any keys passed in this object are_object.assign'd onto both the inserted/updated doc and the emitted event'sreferences:block. Lets consumers link activities to entities the module doesn't know about (e.g.deal_idsfrom a CRM app) without forking the module — existing callers passing onlycontacts/company_idsare unaffected. capture_activitynow forwardsprefill.referencesthroughonOpenstate seeding and into the create payload, and seedscycle_check_self_id/cycle_check_idsso the embedded company-selector'sget_companies_for_selectorrequest doesn'tConfigWarningon hosts that don't otherwise declare those state keys.pages/new.yamlmirrors the samereferencesstate init and payload pass-through.- Fix event display app_name keying. Activities was writing per-event display titles under a hard-coded
display.default.titleinstead ofdisplay.{app_name}.title, so the events module'sdisplay_keycould never read them back (blank timeline titles). The module now declares a requiredapp_namevar and follows the same pattern ascompanies/contacts:defaults/event_display.yamlships bare event-type keys, and the four write APIs wrap them underapp_namevia_build.if_none(override fully replaces — no merge) instead of the old_build.object.assign. Breaking: consumers must now passapp_nameto the activities module entry. get_activities.yamlstage filter targetsstatus.stageinstead ofstatus.0.stage— Atlas Search can't address array elements by position, so the old path never matched and a stage filter returned zero rows.- Edit page fetches the activity in
onInitinstead ofonMount, so block-level mount fetches (e.g. the file-manager's files request) seeactivity_idseeded before they fire. - View page mirrors the loaded activity's
typeinto_state: type(initnullin onInit, set on hydrate). Consumerfields.attributesvisibleconditions are written against_state: type(e.g. meeting-only fields); the key existed on the form pages via the type input block but was never set on the view page, so those conditions always evaluated false onceSmartDescriptionsstarted honoringvisible: false. cycle_check_self_id/cycle_check_idsinitialised in onInit on every activity page that usescompany-selector— silences the build-timeConfigWarningfrom companies' implicit_statereferences inget_companies_for_selector.yaml. Runtime unchanged (request_if_nonedefaults already covered it).
Companies / contacts
cycle_check_self_id/cycle_check_idsinitialised in onInit on the view pages. Any sidebar slot that hosts acompany-selector(e.g. via the activitiestile_activitiesslot-wired from the app) triggers companies'get_companies_for_selectorrequest, which reads those_statekeys. The build's_statevalidator warns when keys are referenced but undeclared on the page; the init silences the warning. Runtime unchanged (_if_nonedefaults take over).
- New
-
@lowdefy/modules-mongodb-events: ### Minor Changes
-
#79
186049cThanks @Saiby100! - Events: render action cards in the timeline by looking up each event'saction_ids.get-eventsgains a$lookupstage (eventaction_ids→ action_id) that reshapes each action into the shape theEventsTimelineblock expects:{ id, status, message, link }. Status is the first element of the action's status array;messageandlinkare read from the app-keyed display object ({display_key}.message/{display_key}.link), mirroring the per-app display scoping used for event titles. Actions whose current stage isnot-requiredare dropped.- The block now receives
actionStatusConfig(built-inaction_statusenum merged with the newaction_statusvar), so action status badges and card colors render. - Link buttons: actions that store an app-scoped
link(with apageId) render a button; agenda-topic tasks have no link field so they render without one. AnonActionClickhandler is registered on the block — aLinkaction withparams: { _event: true }— so clicking the button navigates to the action'spageId/urlQuery. - New
action_statusvar (default{}) merged over the built-inmodules/shared/enums/action_status.yamlstages (action-required,in-progress,done). - New
lookup_collections.actionsvar (defaultactions) — the real collection name the timeline joins. Consumers mapping the actions collection to another name must set this to match the activities module'sactions-collection.
-
@lowdefy/modules-mongodb-files: ### Patch Changes
-
#79
6936a5cThanks @Saiby100! - Files: read upload metadata from the file event and set the S3Content-Typefield directly.upload-policynow readsfile_name/file_typefrom_event: file.name/_event: file.typeinstead of reconstructing the upload block's state path viablock_id. This decouples the request from the consuming block's id and avoids a brittle_statelookup.- The S3 POST policy now sets
Content-Typeas a fixed field (_payload: file_type) and drops the equivalenteq $Content-Typecondition — the value is asserted by the field rather than gated by a policy condition. file-managermigrates its fetch/refresh Request actions to therequestIdsarray form withholdValue: true, matching the current Request action API.