Releases: lowdefy/modules-mongodb
Release list
v0.22.0
-
@lowdefy/modules-mongodb-plugins: ### Minor Changes
-
#138
254289dThanks @Saiby100! - Five selectors in the form-components library —selector,multiple_selector,button_selector,radio_selector,checkbox_selector— now take anenumvar as an alternative tooptions. An enum map (slug → { title, color, icon }) is converted to options for you: the title becomes the label, the slug is the stored value, the colour tints the selected value and the icon shows on amultiple_selectortag.optionswins when both are set, and an operator-valuedenum(_global: enums.x,_module.var: y) still resolves.tree_multiple_selectorstaysoptions-only: a flat enum map cannot express theprimaryKey/parentKeyhierarchy it exists for, and for flat choicesmultiple_selectorrenders enum colours and icons that the tree drops.On read-only surfaces, an enum-driven selector now shows the entry's title. The
DataDescriptionsblock reads the field'senummap off the form config and renders the matching entry'stitle, colour and icon instead of formatting the stored slug — so astatusofin-progresswith title "In progress" no longer displays as "In Progress". Overview action cards carry theenummap through, so they resolve too. Nothing else changes: anoptions-driven selector, an unknown value, and a field with noenumall keep their existing display.Breaking: the
enum_selectorcomponent is removed — it was aSelector-only special case of whatselector+enumnow does. Replacecomponent: enum_selectorwithcomponent: selectorand keep the sameenum:map. Two behaviour differences to expect: the label is no longer hardcoded toalign: right / span: 12(declarelabel_inline/label_spanif you relied on it), and the enum's colour now actually tints the selected value, which the old component's option shape never did.
Patch Changes
-
#138
b8f7213Thanks @Saiby100! - Acheckbox_selectorfield now uses theselectorrenderer on read-only surfaces, like every other selector. It was the one options-taking selector missing from theDataDescriptionscomponent hints, so its stored slugs fell through to the generic string renderer. That path already rendered them as tags, so the visible fix is enum resolution: an enum-backed checkbox list showed "Weekly" (the slug, title-cased) instead of the entry's title "Weekly review", and dropped the entry's colour and icon. -
@lowdefy/modules-mongodb-workflows: ### Minor Changes
-
#138
254289dThanks @Saiby100! - Five selectors in the form-components library —selector,multiple_selector,button_selector,radio_selector,checkbox_selector— now take anenumvar as an alternative tooptions. An enum map (slug → { title, color, icon }) is converted to options for you: the title becomes the label, the slug is the stored value, the colour tints the selected value and the icon shows on amultiple_selectortag.optionswins when both are set, and an operator-valuedenum(_global: enums.x,_module.var: y) still resolves.tree_multiple_selectorstaysoptions-only: a flat enum map cannot express theprimaryKey/parentKeyhierarchy it exists for, and for flat choicesmultiple_selectorrenders enum colours and icons that the tree drops.On read-only surfaces, an enum-driven selector now shows the entry's title. The
DataDescriptionsblock reads the field'senummap off the form config and renders the matching entry'stitle, colour and icon instead of formatting the stored slug — so astatusofin-progresswith title "In progress" no longer displays as "In Progress". Overview action cards carry theenummap through, so they resolve too. Nothing else changes: anoptions-driven selector, an unknown value, and a field with noenumall keep their existing display.Breaking: the
enum_selectorcomponent is removed — it was aSelector-only special case of whatselector+enumnow does. Replacecomponent: enum_selectorwithcomponent: selectorand keep the sameenum:map. Two behaviour differences to expect: the label is no longer hardcoded toalign: right / span: 12(declarelabel_inline/label_spanif you relied on it), and the enum's colour now actually tints the selected value, which the old component's option shape never did.
v0.21.0
-
@lowdefy/modules-mongodb-plugins: ### Minor Changes
-
#133
66d0e4aThanks @Saiby100! - Honourshow_commentonkind: checkactions. The flag chooses whether an action's working surface offers the optional free-text comment box — it has worked on form actions since it shipped, but check actions silently ignored it and always rendered the box. Declaringshow_comment: falseon a check action now removes it, on both the standalone check page and the in-context check modal.Each check action's declaration is honoured independently even though one
{workflow_type}-actionpage serves them all. The flag is resolved from workflow config on every read (likedescriptionanduniversal_fields), so it is never stored on the action document — change it and redeploy, and in-flight actions pick it up with nothing to migrate.Only the optional comment is gated. The two mandatory comment inputs always render, because the engine needs their text: the reviewer's brief in the review-mode Request Changes modal, and the recovery note on an action sitting in the
errorstage. This matches what form actions already did.show_commentis now validated: a non-boolean value fails the build instead of being silently accepted. If an app authored a quotedshow_comment: "false", that build will now error — the quoted string was never honoured asfalse, so update it to a real boolean. The field is also now documented in the authoring grammar reference, where it was previously missing entirely. -
@lowdefy/modules-mongodb-workflows: ### Minor Changes
-
#133
66d0e4aThanks @Saiby100! - Honourshow_commentonkind: checkactions. The flag chooses whether an action's working surface offers the optional free-text comment box — it has worked on form actions since it shipped, but check actions silently ignored it and always rendered the box. Declaringshow_comment: falseon a check action now removes it, on both the standalone check page and the in-context check modal.Each check action's declaration is honoured independently even though one
{workflow_type}-actionpage serves them all. The flag is resolved from workflow config on every read (likedescriptionanduniversal_fields), so it is never stored on the action document — change it and redeploy, and in-flight actions pick it up with nothing to migrate.Only the optional comment is gated. The two mandatory comment inputs always render, because the engine needs their text: the reviewer's brief in the review-mode Request Changes modal, and the recovery note on an action sitting in the
errorstage. This matches what form actions already did.show_commentis now validated: a non-boolean value fails the build instead of being silently accepted. If an app authored a quotedshow_comment: "false", that build will now error — the quoted string was never honoured asfalse, so update it to a real boolean. The field is also now documented in the authoring grammar reference, where it was previously missing entirely. -
#133
98059afThanks @Saiby100! - Thecheckbox_selectorform component takeslabel_inlineandlabel_spanvars, like the other field components. Previously its label was hardcoded tospan: 12 / align: right, so a checkbox group could not sit inline with its siblings or use a different label width.This changes the default rendering: with neither var set, the label no longer gets
span: 12 / align: right, matchingyes_no_selectorand the rest of the library. An action that relied on the old look should declarelabel_inline: trueandlabel_span: 12explicitly.colon: falseis still hardcoded. -
#133
7cc8b51Thanks @Saiby100! -checkbox_selectornow validatesrequired: truethe waymultiple_selectordoes. Its value is an array, and Lowdefy's built-inrequiredtreats an empty array as present — so a required checkbox group would let submit through with nothing ticked. It now appends the same required-non-empty rule the other array-valued fields use (_array.length > 0, message "This field is required.").The component also gains a
validatevar, which it was missing entirely. Caller-supplied rules are concatenated ahead of the generated required rule, matchingmultiple_selector,tree_multiple_selector,controlled_list,date_range_selector, andfile_upload. -
#133
1da82a6Thanks @Saiby100! - Raw blocks in an actionform:now usekey, notid— which is what makes their submitted values round-trip.A raw inline Lowdefy block (a
form:entry with nocomponent:) was documented as carrying its realid, on the reasoning that the id doubles as the state path just like a library component'skey. That is true of the block tree, but it misses the second consumer of the authoredform:array: theform_metaprojection records onlycomponent/key/required/title/validate, andGetWorkflowActionallowlists the storedform_dataslice by those keys. An entry with a bareidand nokeyhas noform_metaentry, so its value saved but was never read back — blank on re-edit, and absent from the overview and review views.Raw entries now share the library's authoring vocabulary:
keybecomes the block id (and theform_metakey), andtitleis the overview/review display label. Both are stripped before the node reaches the page tree, since neither is a valid Lowdefy block property. Writingkeyandidon the same entry is now an error, as is a non-stringkey.This also makes consumer-supplied field components work. An app that needs a field the library doesn't cover, reused across several of its own actions, can now own a component file that emits a form entry and
_refit from the app-side workflow config — the ref resolves in app context, so it is not subject to the constraint that a module ref cannot escape its package root. Those components get full parity with the built-in library: state binding, value round-trip, overview rendering, id-collision checking, andviewOnly.Existing raw blocks authored with
idkeep building and rendering exactly as before — they were already not round-tripping, so nothing regresses. Switch them tokeyto fix prefill and display. Thekey→idmapping applies atform:entry positions only (top-level entries, and theform:of a structural component); inside a raw block's ownblocks:array, keep usingid.
v0.20.0
-
@lowdefy/modules-mongodb-workflows: ### Minor Changes
-
#131
8b25037Thanks @Yianni99! - Thecheckbox_selectorform component takes adirectionvar (horizontal— the existing behaviour — orvertical). Setting it toverticalstacks the checkboxes one per line instead of flowing them across the row, which reads better once an action's option list is long enough that a wrapped row is hard to scan. -
#131
41fef2dThanks @Yianni99! - Workflow and action-group overview pages: each action card now reads at a glance. The card header is tinted with its status colour and the status badge picks up the same pale-fill/outline/saturated-text treatment as the workflow status pill above it, so a long list of collapsed actions can be scanned without opening anything. The action message is emphasised, the link button carries a right-arrow, and a collapsed card is now just its coloured header instead of a header plus an empty white body.Uploaded files inside an action's data now download instead of showing "No files available" — both pages wire the files module's download policy.
The title bar now states which record the workflow belongs to: a new line beneath the title shows the entity's id, linked straight to its record. Expand/collapse-all has moved into the title bar's actions area, freeing the row it used to occupy above the cards, and reads as a button rather than plain text. The group heading's icon is also aligned with its title rather than sitting above it.
v0.19.0
-
@lowdefy/modules-mongodb-plugins: ### Minor Changes
-
#129
339a42bThanks @Saiby100! - Honouruniversal_fieldsonkind: checkactions. The flag chooses which of the two action-level fields (assignees,due_date) an action's UI shows — it has worked on form actions since it shipped, but check actions silently ignored it and always rendered both. Declaringuniversal_fields: [due_date]on a check action now hides the assignees chip and drops the assignees input from the ✎ edit modal, on both the standalone check page and the in-context check modal.Each check action's declaration is honoured independently even though one
{workflow_type}-actionpage serves them all. The presence list is resolved from workflow config on every read (likedescription), so it is never stored on the action document — change it and redeploy, and in-flight actions pick it up with nothing to migrate.This is presence, not permission: hiding a field does not gate who may change it (use
access:for that), and a hidden field is never written or cleared, so narrowing the list on an action that already has assignees stops showing them rather than wiping them.universal_fieldsis now documented in the authoring grammar reference, where it was previously missing entirely. -
@lowdefy/modules-mongodb-workflows: ### Minor Changes
-
#129
339a42bThanks @Saiby100! - Honouruniversal_fieldsonkind: checkactions. The flag chooses which of the two action-level fields (assignees,due_date) an action's UI shows — it has worked on form actions since it shipped, but check actions silently ignored it and always rendered both. Declaringuniversal_fields: [due_date]on a check action now hides the assignees chip and drops the assignees input from the ✎ edit modal, on both the standalone check page and the in-context check modal.Each check action's declaration is honoured independently even though one
{workflow_type}-actionpage serves them all. The presence list is resolved from workflow config on every read (likedescription), so it is never stored on the action document — change it and redeploy, and in-flight actions pick it up with nothing to migrate.This is presence, not permission: hiding a field does not gate who may change it (use
access:for that), and a hidden field is never written or cleared, so narrowing the list on an action that already has assignees stops showing them rather than wiping them.universal_fieldsis now documented in the authoring grammar reference, where it was previously missing entirely.
v0.18.0
-
@lowdefy/modules-mongodb-plugins: ### Patch Changes
-
#126
87c465cThanks @Yianni99! - Removed the redundant status-colored dot from workflow actions: the leading bullet on each action in the WorkflowProgress panel, and the dot beside the status text on action events in the EventsTimeline card. The status colour is already carried by the surrounding button/text, so the dot added visual noise. Timeline node markers, group icons, and the standard ActionSteps step list are unchanged. -
@lowdefy/modules-mongodb-workflows: ### Minor Changes
-
#123
fb72ec0Thanks @Yianni99! - Action-form text fields (text_input) support native max-length capping. A newmax_lengthfield option maps to the TextInputmaxLengthproperty, stopping input at the limit instead of erroring after over-long input;show_countmaps toshowCountfor a live "n/max" counter and defaults to on whenevermax_lengthis set. -
#126
79824a6Thanks @Yianni99! - Workflow action pages support an optional wide layout. Settingpage_layout: wideon a workflow renders all of its action pages — view, edit, review, error, and the per-workflow check page — with the workflow-progress panel on the left, the form expanded to the full width, and the record's Details and History moved into a right-side drawer opened from a header button. Workflows that omitpage_layout(or set it tostandard) keep the existing three-column layout unchanged, and an unrecognized value is rejected at build time. -
#123
fb72ec0Thanks @Yianni99! - Workflow and action-group overview pages: the back arrow now returns to the previous page instead of always jumping to the entity view (the entity stays reachable via the breadcrumb), and each action is individually collapsible with an Expand/Collapse-all toggle, all collapsed by default.Adds two per-action options:
show_comment(defaulttrue) — setfalseto hide the free-form comment box on an action's edit and review pages; andpages.edit.validate_on_draft(defaultfalse) — settrueto validate the form (like Submit) before the edit page's Save Draft saves.
v0.17.0
-
@lowdefy/modules-mongodb-deals: ### Minor Changes
-
#120
5d94b31Thanks @Yianni99! - Deals view surfaces are now host-controllable:- Add a
show_detailsvar (defaulttrue). Set itfalseto hide the read-only "Details" SmartDescriptions section — for hosts that render their domain fields through custom tiles (components.info_grid_slots) instead of the generic section. - Company is no longer a fixed row in the meta strip. Hosts that want it there add a
meta_fieldsentry (the same way Value is added), so a host with a dedicated company tile isn't stuck with a duplicated name. - Info-grid layout regrouped: the read-only Details section is now full-width at the top (with a trailing divider that hides along with it), followed by a uniform tile grid — People, Files, then the host
info_grid_slotstiles. Previously People sat alone above a divider, apart from the tiles.
- Add a
v0.16.0
-
@lowdefy/modules-mongodb-plugins: ### Minor Changes
-
#118
cdd1772Thanks @Saiby100! - Add a checkable-tree multi-select field for workflow action forms. Report types (or any grouping) show as parent nodes and their items as checkable leaves; checking a group selects all its items. The selection now also renders on the read-only view page instead of showing nothing. -
@lowdefy/modules-mongodb-workflows: ### Minor Changes
-
#118
cdd1772Thanks @Saiby100! - Add a checkable-tree multi-select field for workflow action forms. Report types (or any grouping) show as parent nodes and their items as checkable leaves; checking a group selects all its items. The selection now also renders on the read-only view page instead of showing nothing.
v0.15.0
-
@lowdefy/modules-mongodb-activities: ### Minor Changes
-
#111
8923ca1Thanks @Yianni99! - Add the open-tasks component — a compact card list of an entity's open
kind: taskdocs, reading activities' ownactionscollection filtered by
entity_type/entity_id(the shapecreate-task/update-taskwrite) and
an open status (current stage notdone). It's the activities-owned
sibling of theworkflowsmodule'sopen-actionscard, styled to match
it so a host can compose both side by side into one "what's open" row.
Takesentity_type+entity_idvars and an optionalon_clickaction
list for wiring a host'stask-modalinstance. Reads no workflow-engine
data. -
#111
8923ca1Thanks @Yianni99! - Add exported task CRUD —create-task/update-taskAPIs writing
kind: taskdocs into activities'actions-collection, and a paired
task-modalcomponent. Two seams keep this from being a lossy
generalization of deals' original deal-only implementation: an arbitrary
entity link (payloadentity_type/entity_id, not a hardcoded reference,
so a task can hang off a deal, a meeting, or any entity) and a
consumer-supplied emitted event (task-modal'seventsvar supplies the
type+ Nunjucks display template per create/complete/reopen transition,
forwarded through to the events module'snew-event).task-modalalso
takes the assignee-options source as a var (assignee_options+
optionalassignee_search) instead of hardcoding a request. -
@lowdefy/modules-mongodb-deals: ### Minor Changes
-
#111
1ed7317Thanks @Yianni99! - Add the deals module: a workflow-driven deal/opportunity workspace (list,
create, and a master-detail workspace) that orchestrates the workflows, events,
activities, files, companies, and contacts modules. The pipeline is a workflows
workflow selected via theworkflow_typevar; thedealscollection is
host-app-owned and mapped in. Ships pagesall/new/view, a create/update/
task/outcome API surface, adeal-status-chipcomponent, and app-configurable
stages/outcomes/reasons/filters/card-fields plus main/info-grid/sidebar/card slots. -
#111
ab684abThanks @Yianni99! - Align the deals module with the sibling entity modules (companies / contacts /
activities) for consistency: addlabel/label_pluralvars so a host can
relabel the entity (used across the menu, page titles, breadcrumbs, and the
New button); extract the create-form body to aform_dealcomponent and the
list action to abutton_new_dealcomponent; adopt thecontent_widthpage
var, vertical field labels, and the shared Cancel/Create button conventions on
the create page; align the list "New" and filter "Clear" buttons; and
genericize leftover "sales-pipeline" wording now that the module is
workflow-agnostic. -
#111
c772d6fThanks @Yianni99! - Add anentity_connection_idvar (defaultdeals) replacing the hardcoded
dealsliteral everywhere the module matches or passes a workflow doc's
entity.connection_id— the list/detail aggregations (get_selected_deal,
get_active_deals, get_deals_list, get_selected_deal_open_actions), the outcome
modal's get-entity-workflows refetch, the deal view and compact list-item
get-entity-workflows payloads, and theentity_connection_idpassed to the
embeddedactions-on-entitycomponent. Lets a host map its deals collection
under any connection id, as long as it matches the workflow config's
entity.connection_id. -
#111
b9b47bcThanks @Yianni99! - Generalize the deals create/display surface: the module no longer bakes in
domain-specific fields (material/SKU, product, sector, sub-sector,
customer-type, project-type, packaging) or their taxonomy vars. Hosts now
inject their own domain fields through a singlefieldsvar — rendered as
inputs on the create form and read-only on the deal view via
SmartDescriptions, matching howcompanies.fields.attributesworks. The
create-deal API writes a genericattributespassthrough, andproduct
(previously a top-level field with its ownproductsvar and list/header
rendering) becomes a plainattributes.producthost field.Breaking (config): consumers must move their domain fields to the new
fieldsvar and drop the removedproducts/product_hierarchy/sectors/
sub_sectors/customer_typesvars. Existing deals keep their stored
attributes.*— the generic passthrough and read side render whatever is
there.form.nameno longer auto-prefills (the shared company-selector has
no onChange hook); hosts own any prefill via afieldsblockonChange. -
#111
c772d6fThanks @Yianni99! - Stop computingdeal_value/close_datefrom host-specific workflow action
fields in the list/detail aggregations (get_selected_deal, get_active_deals,
get_deals_list) — read them as plain stored fields ($value/$close_date,
each with an$ifNullfallback) the same waydeal.outcomeis already
read back after being stamped on write. Also drops the module's inline
volumes rounding/projection; the module ships no volumes tile of its own —
hosts supply one through the existingcomponents.info_grid_slotsvar. An
unstamped deal now renders0/—for value/close date instead of an
app-specific computed number.
Patch Changes
-
#111
8923ca1Thanks @Yianni99! - Close two reuse gaps in the deal view left over from adopting workflows'
actions-on-entity: it never dropped the sharedcheck-action-modal, so a
check-kind action clicked in the phase view full-page-navigated to its own
action page instead of opening in place; and the deal-outcome modal
hand-rolled its ownget-entity-workflowsrefetch +entity_workflows
reseed after submitting the win/loss outcome action, instead of the exported
entity-workflows-refetchsequence.The deal view (
pages/view.yaml) now dropscheck-action-modalnext to
actions-on-entity, with anon_completethat runsentity-workflows-refetch
plus a re-seed of the open-tasks card (mirroring the existing deal-switch and
task-save refreshes) so both cards and the stepper stay live after a check
action completes.components/detail/deal_outcome_modal.yamlnow calls
entity-workflows-refetchinstead of its own copy of the same two actions. -
#111
8923ca1Thanks @Yianni99! - Replace the single merged open-items card (components/detail/section_actions.yamlcomponents/detail/action_card.yaml.njk) with the two cards it used to
combine, now composed side by side: theworkflowsmodule'sopen-actions
and theactivitiesmodule's newopen-tasks. Deletes the merged card,
its now-deadopen_actions_all/open_actionsseeding (actions/compute_open_actions.yaml
and all its call sites), theget_selected_deal_open_actionsrequest, and
deals' ownactions-collectionconnection (its only remaining reader) —
the workflows engine keeps its own, separate actions collection. Task
creation/edit now refetchesopen-tasks' own request instead.
-
#111
8923ca1Thanks @Yianni99! - Stop shipping a second, deal-only task implementation — delete
components/detail/task_modal.yaml,api/create-task.yaml, and
api/update-task.yaml, and consume activities' new exportedtask-modal
component (with activities'create-task/update-taskAPIs underneath)
instead. The deal view passesentity_type: deal, the deal id, and its
deal-task-created/deal-task-completed/deal-task-reopenedevent
config, so task creation still writes to the sameactionscollection,
links to the deal, and emits the same event display markup as before.
get_task_assignee_optionsstays in deals and is now passed to the shared
modal as its assignee-options source. -
#111
8923ca1Thanks @Yianni99! - Stop shipping a second, deal-only note-capture modal — delete
components/detail/add_note_modal.yamland consume events' new expo...
v0.14.1
-
@lowdefy/modules-mongodb-plugins: ### Patch Changes
-
#115
c75bad2Thanks @Yianni99! - Align the suite to lowdefy 5.5.1 and migrate block stylesheets to CSS Modules.Blocks that shipped a global
style.css—ActionSteps,DataDescriptions,
EventsTimeline,SmartDescriptions,WorkflowProgress— now import a
style.module.csswhose selectors are wrapped in:global(...)inside
@layer components, matching the convention used by the official
@lowdefy/blocks-antdblocks. The Turbopack build in lowdefy 5.5.1 rejects
global-CSS imports from transpiled first-party packages; the rendered class
names are unchanged, so consumers see no visual difference.
v0.14.0
-
@lowdefy/modules-mongodb-plugins: ### Minor Changes
-
#114
f8b6d19Thanks @Saiby100! - Add the WorkflowProgress block and the workflows module'sworkflow-progresscomponent — a presentation variant ofactions-on-entitythat renders an entity's workflows as collapsible sections of grouped, status-colored action buttons, with progress rings, done-fractions, and the shared check-action click handling baked in. -
@lowdefy/modules-mongodb-companies: ### Minor Changes
-
#108
784e63cThanks @Yianni99! - Add optional component vars for consumers that need required/empty-state control:company-selectorgains arequiredvar (defaultfalse) — sets the block
required so a page-levelValidateflags an empty company selection, instead
of the consumer hand-rolling a submit guard.file-listgains anempty_textvar (default"No files") — overrides the
empty-state message.
-
@lowdefy/modules-mongodb-files: ### Minor Changes
-
#108
784e63cThanks @Yianni99! - Add optional component vars for consumers that need required/empty-state control:company-selectorgains arequiredvar (defaultfalse) — sets the block
required so a page-levelValidateflags an empty company selection, instead
of the consumer hand-rolling a submit guard.file-listgains anempty_textvar (default"No files") — overrides the
empty-state message.
-
@lowdefy/modules-mongodb-workflows: ### Minor Changes
-
#114
f8b6d19Thanks @Saiby100! - Add the WorkflowProgress block and the workflows module'sworkflow-progresscomponent — a presentation variant ofactions-on-entitythat renders an entity's workflows as collapsible sections of grouped, status-colored action buttons, with progress rings, done-fractions, and the shared check-action click handling baked in.