@conduction/nextcloud-vue 2.145.0 → 2.147.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/components/CnAiCompanion/CnAiChatPanel.vue2.js.map +1 -1
- package/dist/esm/components/CnAiCompanion/CnAiChatPanel.vue3.js.map +1 -1
- package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue.js +1 -1
- package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +12 -2
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +42 -30
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +22 -0
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +2 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue.js +1 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue3.js.map +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +112 -15
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js +40 -16
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnNotesCard/CnNotesCard.vue.js +1 -1
- package/dist/esm/components/CnNotesCard/CnNotesCard.vue2.js.map +1 -1
- package/dist/esm/components/CnNotesCard/CnNotesCard.vue3.js +1 -0
- package/dist/esm/components/CnNotesCard/CnNotesCard.vue3.js.map +1 -1
- package/dist/esm/components/CnNotificationMatrix/CnNotificationMatrix.vue.js +1 -1
- package/dist/esm/components/CnNotificationMatrix/CnNotificationMatrix.vue2.js +21 -2
- package/dist/esm/components/CnNotificationMatrix/CnNotificationMatrix.vue2.js.map +1 -1
- package/dist/esm/components/CnNotificationMatrix/CnNotificationMatrix.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectPartiesWidget/CnObjectPartiesWidget.vue.js +1 -1
- package/dist/esm/components/CnObjectPartiesWidget/CnObjectPartiesWidget.vue2.js +2 -2
- package/dist/esm/components/CnObjectPartiesWidget/CnObjectPartiesWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectPartiesWidget/CnObjectPartiesWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnRetentionWidget/CnRetentionWidget.vue.js +1 -1
- package/dist/esm/components/CnRetentionWidget/CnRetentionWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnRetentionWidget/CnRetentionWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue.js +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
- package/dist/esm/library-style.js +1 -1
- package/dist/esm/nextcloud-vue.css +634 -301
- package/dist/esm/utils/detailObjectContext.js +7 -2
- package/dist/esm/utils/detailObjectContext.js.map +1 -1
- package/dist/esm/utils/objectParties.js +30 -1
- package/dist/esm/utils/objectParties.js.map +1 -1
- package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
- package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
- package/dist/esm/utils/visibleWhen.js +6 -0
- package/dist/esm/utils/visibleWhen.js.map +1 -1
- package/dist/nextcloud-vue.cjs.js +362 -138
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +634 -301
- package/package.json +1 -1
- package/src/components/CnAiCompanion/CnAiChatPanel.vue +3 -0
- package/src/components/CnChecklistRunWidget/CnChecklistRunWidget.vue +4 -2
- package/src/components/CnDataTable/CnDataTable.vue +19 -2
- package/src/components/CnDetailPage/CnDetailPage.md +1 -0
- package/src/components/CnDetailPage/CnDetailPage.vue +23 -0
- package/src/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue +1 -0
- package/src/components/CnFactsWidget/CnFactsWidget.vue +168 -16
- package/src/components/CnNotesCard/CnNotesCard.vue +7 -2
- package/src/components/CnNotificationMatrix/CnNotificationMatrix.vue +21 -2
- package/src/components/CnObjectPartiesWidget/CnObjectPartiesWidget.vue +2 -1
- package/src/components/CnRecordListWidget/CnRecordListWidget.vue +1 -0
- package/src/components/CnRetentionWidget/CnRetentionWidget.vue +2 -0
- package/src/components/CnTabsWidget/CnTabsWidget.vue +6 -1
- package/src/css/dialog.css +7 -0
- package/src/css/look-board-detail.css +152 -8
- package/src/css/look-board-index.css +78 -0
- package/src/css/look-board.css +33 -3
- package/src/css/table.css +9 -0
- package/src/schemas/app-manifest-v2.schema.json +2 -2
- package/src/utils/detailObjectContext.js +7 -2
- package/src/utils/objectParties.js +29 -0
- package/src/utils/validateManifestV2.compiled.js +2 -2
- package/src/utils/visibleWhen.js +6 -0
|
@@ -250,6 +250,12 @@ async function readVisibleWhenValue(cond, ctx, sink) {
|
|
|
250
250
|
}
|
|
251
251
|
return readVisibleWhenPath(first, cond.field)
|
|
252
252
|
}
|
|
253
|
+
// `@context.<name>.<path>` reads the records the page's conditions name
|
|
254
|
+
// (a detail page's case type), which the object context carries apart
|
|
255
|
+
// from the record.
|
|
256
|
+
if (cond.field && String(cond.field).startsWith('@context.') && ctx && ctx.context && typeof ctx.context === 'object') {
|
|
257
|
+
return readVisibleWhenPath({ '@context': ctx.context }, cond.field)
|
|
258
|
+
}
|
|
253
259
|
// Local mode (Wave 3): evaluate against the caller's object context.
|
|
254
260
|
if (cond.field && ctx && ctx.object && typeof ctx.object === 'object') {
|
|
255
261
|
return readVisibleWhenPath(ctx.object, cond.field)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"visibleWhen.js","sources":["../../../src/utils/visibleWhen.js"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2026 Conduction B.V.\n * SPDX-License-Identifier: EUPL-1.2\n *\n * visibleWhen — the shared declarative visibility predicate (Wave 1 banner\n * shape, generalised in Wave 3 of nextcloud-vue#91 for manifest actions).\n *\n * A `visibleWhen` condition is\n * `{ appInstalled?, endpoint?, source?, field?, op?, value }`.\n *\n * `appInstalled` is a precondition rather than a mode: it names the Nextcloud\n * app that backs the guarded element, and it is checked before anything else.\n * On its own it IS the whole condition; combined with one of the modes below\n * it gates that mode. It exists because the menu's `visibleIf` already spoke\n * this word and `visibleWhen` did not, so the same manifest vocabulary meant\n * two different things in two places.\n *\n * The value itself comes from one of THREE evaluation modes (first match wins):\n *\n * 1. `endpoint` — GET a same-origin JSON endpoint; `field` is a dot-path\n * into the response body. `@objectId` and `@object.<field>` in the\n * endpoint resolve against the caller's record.\n * 2. `source` — `{ register, schema, filter? }`, an OpenRegister object\n * query (`filter` supports the shared @-token grammar). `field` is a\n * dot-path into the FIRST result; omit it — or use `@total` — to\n * compare the collection total.\n * 3. Neither — the LOCAL mode (Wave 3): `field` is a dot-path into the\n * caller's object context (`ctx.object`, e.g. the loaded detail-page\n * record) — no request is made. This is how detail header actions gate\n * on the current record's state (`{ field: \"lifecycleState\", op: \"eq\",\n * value: \"approved\" }`).\n *\n * `op` is `eq | neq | gt | gte | lt | lte | empty | notEmpty | in | anyOf |\n * contains` (default `eq`); `anyOf` matches a list value that shares an entry\n * with the listed `value`, `contains` a list value that holds `value`. `value` is the\n * literal right-hand side. Evaluation is FAIL-SAFE: any fetch / shape error\n * resolves `false` (hidden) — a broken predicate never breaks a page.\n *\n * manifest-form-logic adds `evaluateVisibleWhenLocal(cond, data)`, a SYNC\n * counterpart to `evaluateVisibleWhen()` for the LOCAL mode only, composed\n * from `readVisibleWhenPath` + `compareVisibleWhen` with no fetch / promise.\n * `CnFormPage` calls it on every form-data change so conditions gating one\n * field on another's live value resolve without flicker. `endpoint` /\n * `source` conditions on form fields still go through the async\n * `evaluateVisibleWhen()`, evaluated once at mount and cached.\n *\n * @module utils/visibleWhen\n */\n\nimport { isAppInstalled } from './appInstalled.js'\nimport { buildHeaders, buildQueryString, prefixUrl } from './headers.js'\nimport { interpolateUrlTokens } from './interpolateUrlTokens.js'\nimport { resolveFilterTokens, resolveFilterValue } from './resolveFilterTokens.js'\n\n/** Supported visibleWhen comparison operators. */\nexport const VISIBLE_WHEN_OPS = ['eq', 'neq', 'gt', 'gte', 'lt', 'lte', 'empty', 'notEmpty', 'in', 'anyOf', 'contains']\n\n/**\n * Read a dot-path off an object (`'a.b.c'`); the object itself when no\n * field is given.\n *\n * @param {object} data The source object.\n * @param {string} [field] Dot-path into the object.\n * @return {unknown} The value at the path (undefined on a missing segment).\n */\nexport function readVisibleWhenPath(data, field) {\n\tif (!field) {\n\t\treturn data\n\t}\n\treturn String(field).split('.').reduce((obj, key) => (obj === null || obj === undefined ? obj : obj[key]), data)\n}\n\n/**\n * Whether a value is a date string: not a number, and a moment `Date.parse`\n * can read.\n *\n * @param {unknown} value The value.\n * @return {boolean}\n */\nfunction isDateLike(value) {\n\treturn typeof value === 'string' && value.trim() !== '' && !Number.isFinite(Number(value)) && Number.isFinite(Date.parse(value))\n}\n\n/**\n * Apply a visibleWhen comparison operator. Ordering operators coerce both\n * sides to Number; equality compares loosely-normalized primitives\n * (`String(a) === String(b)` when types differ) so `\"3\" eq 3` holds for\n * JSON round-trips.\n *\n * @param {unknown} actual The resolved left-hand value.\n * @param {string} op The operator (`eq` when unknown).\n * @param {unknown} expected The declared right-hand value.\n * @param {{objectId?: (string|number), object?: object, workspace?: object, config?: object}} [ctx] Token-resolution\n * context for the right-hand side, so `@object.<field>` and `@workspace.<key>` resolve\n * as well as `@me`. Omitted, only the context-free tokens resolve.\n * @return {boolean} Whether the comparison holds.\n */\nexport function compareVisibleWhen(actual, op, expected, ctx) {\n\tconst operator = VISIBLE_WHEN_OPS.includes(op) ? op : 'eq'\n\t// `empty` takes no `value`. It is the one question eq cannot ask: an unset\n\t// field arrives as undefined, null or '' depending on the store and the\n\t// serialiser, and `String(null)` is the word \"null\" rather than blank.\n\tif (operator === 'empty' || operator === 'notEmpty') {\n\t\tconst blank = actual === undefined || actual === null || actual === ''\n\t\t\t|| (Array.isArray(actual) === true && actual.length === 0)\n\t\treturn operator === 'empty' ? blank : !blank\n\t}\n\t// The shared @-token grammar, so a condition can name the READER (`@me`)\n\t// rather than a literal only the server knows.\n\tconst right = resolveFilterValue(expected, ctx || {})\n\t// `in` holds when the left-hand value is one of the listed values\n\t// (screens-page-lenses: a widget shown under several chips).\n\tif (operator === 'in') {\n\t\tconst list = Array.isArray(right) ? right : [right]\n\t\treturn list.some((entry) => entry === actual || String(entry) === String(actual))\n\t}\n\t// `anyOf` holds when the value, or any entry of a list value, is one of\n\t// the listed values: a record whose `dataCategories` holds \"health\" among\n\t// others matches `anyOf [\"health\", \"ethnicity\"]` (DqSociaalDomein).\n\t// `contains` holds when the value is a list holding the given value: a\n\t// case type whose `overviewCards` list names a card switches it on.\n\tif (operator === 'contains') {\n\t\tif (!Array.isArray(actual) || right === undefined || right === null) {\n\t\t\treturn false\n\t\t}\n\t\treturn actual.some((entry) => entry === right || String(entry) === String(right))\n\t}\n\tif (operator === 'anyOf') {\n\t\tconst list = Array.isArray(right) ? right : [right]\n\t\tconst values = Array.isArray(actual) ? actual : [actual]\n\t\treturn values.some((value) => value !== undefined && value !== null\n\t\t\t&& list.some((entry) => entry === value || String(entry) === String(value)))\n\t}\n\tif (operator === 'eq' || operator === 'neq') {\n\t\tconst equal = actual === right || String(actual) === String(right)\n\t\treturn operator === 'eq' ? equal : !equal\n\t}\n\tlet a = Number(actual)\n\tlet b = Number(right)\n\t// Two dates (`dueAt` against `@today`) compare as moments; a value that\n\t// is a number on either side never reads as a date.\n\tif ((!Number.isFinite(a) || !Number.isFinite(b)) && isDateLike(actual) && isDateLike(right)) {\n\t\ta = Date.parse(actual)\n\t\tb = Date.parse(right)\n\t}\n\tif (!Number.isFinite(a) || !Number.isFinite(b)) {\n\t\treturn false\n\t}\n\tif (operator === 'gt') {\n\t\treturn a > b\n\t}\n\tif (operator === 'gte') {\n\t\treturn a >= b\n\t}\n\tif (operator === 'lt') {\n\t\treturn a < b\n\t}\n\treturn a <= b\n}\n\n/**\n * Whether a condition reads the page workspace context (`workspace: \"<key>\"`).\n * Such a condition is answered synchronously from the reactive bag, so a\n * widget appears and disappears the moment a page control writes its key\n * (screens-page-lenses). A condition that also names an endpoint or a source\n * is not a workspace condition.\n *\n * @param {object|null} cond The visibleWhen condition.\n * @return {boolean} True for a workspace-mode condition.\n * @spec openspec/changes/screens-page-lenses/specs/page-lenses/spec.md#requirement-a-widget-can-be-shown-by-a-workspace-value\n */\nexport function isWorkspaceCondition(cond) {\n\treturn Boolean(cond) && typeof cond === 'object' && typeof cond.workspace === 'string' && cond.workspace !== ''\n\t\t&& !cond.endpoint && !cond.source\n}\n\n/**\n * Evaluate a workspace-mode condition against the workspace bag. No fetch.\n * A key nobody wrote is unset, so only `empty` and `neq` hold for it.\n *\n * @param {{workspace: string, op?: string, value?: unknown}} cond The condition.\n * @param {object} [workspace] The plain workspace bag.\n * @return {boolean} Whether the guarded element shows.\n * @spec openspec/changes/screens-page-lenses/specs/page-lenses/spec.md#requirement-a-widget-can-be-shown-by-a-workspace-value\n */\nexport function evaluateWorkspaceCondition(cond, workspace) {\n\tconst bag = workspace && typeof workspace === 'object' ? workspace : {}\n\treturn compareVisibleWhen(bag[cond.workspace], cond.op || 'eq', cond.value, { workspace: bag })\n}\n\n/**\n * Resolve the condition's left-hand value from its endpoint / OpenRegister\n * source / local object context (see the module docblock for the three\n * modes). Throws on unusable conditions and failed fetches — callers that\n * want the fail-safe boolean use {@link evaluateVisibleWhen}.\n *\n * An `endpoint` may name the page's record (`@objectId`, `@object.<field>`),\n * and its whole answer is the row a `sink` receives. A `source` may carry `order` (`{ field: \"asc\" | \"desc\" }`), so \"the first\n * row\" is the first of an ordered query, and `extend` (OpenRegister\n * `_extend[]` names) to inline the row's related objects. A caller that wants that row, not\n * just the value, passes `sink`: the first result is written to `sink.row`.\n *\n * @param {{endpoint?: string, source?: {register: string, schema: string, filter?: object, order?: object}, field?: string}} cond The visibleWhen condition.\n * @param {{objectId?: (string|number), object?: object, workspace?: object, config?: object}} [ctx] The caller's token / object context.\n * @param {{row?: object}} [sink] Receives the first result of a `source` query as `row`.\n * @return {Promise<unknown>} The value `field` points at.\n * @spec openspec/changes/screens-start-here-banner/specs/start-here-banner/spec.md#requirement-a-banner-can-name-the-first-row-of-a-query\n */\nexport async function readVisibleWhenValue(cond, ctx, sink) {\n\tif (cond.endpoint) {\n\t\t// `@objectId` / `@object.<field>` name the record the condition sits on;\n\t\t// without that record there is nothing to ask about.\n\t\tif (/@object(Id|\\.)/.test(cond.endpoint) && (ctx?.objectId === undefined || ctx?.objectId === null || ctx?.objectId === '')) {\n\t\t\tthrow new Error('endpoint names the record, and there is none')\n\t\t}\n\t\tconst response = await fetch(prefixUrl(interpolateUrlTokens(cond.endpoint, ctx)), { headers: buildHeaders() })\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`endpoint returned ${response.status}`)\n\t\t}\n\t\tconst data = await response.json()\n\t\tif (sink && typeof sink === 'object') {\n\t\t\tsink.row = data && typeof data === 'object' && !Array.isArray(data) ? data : undefined\n\t\t}\n\t\treturn readVisibleWhenPath(data, cond.field)\n\t}\n\tconst src = cond.source\n\tif (src && src.register && src.schema) {\n\t\tconst filter = resolveFilterTokens(src.filter || {}, ctx)\n\t\tconst order = {}\n\t\tfor (const [field, dir] of Object.entries(src.order && typeof src.order === 'object' ? src.order : {})) {\n\t\t\torder[`_order[${field}]`] = dir === 'desc' ? 'desc' : 'asc'\n\t\t}\n\t\t// `extend` inlines related objects on the row (`_extend[]`), so the\n\t\t// subject can name its type rather than its type's id.\n\t\tconst extend = Array.isArray(src.extend) ? { _extend: src.extend.filter((name) => typeof name === 'string' && name !== '') } : {}\n\t\tconst qs = buildQueryString({ ...filter, ...order, ...extend, _limit: 1 })\n\t\tconst url = prefixUrl(`/apps/openregister/api/objects/${src.register}/${src.schema}${qs}`)\n\t\tconst response = await fetch(url, { headers: buildHeaders() })\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`source returned ${response.status}`)\n\t\t}\n\t\tconst data = await response.json()\n\t\tconst first = Array.isArray(data.results) ? data.results[0] : data\n\t\tif (sink && typeof sink === 'object') {\n\t\t\tsink.row = first && typeof first === 'object' ? first : undefined\n\t\t}\n\t\tif (!cond.field || cond.field === '@total') {\n\t\t\treturn data.total ?? (Array.isArray(data.results) ? data.results.length : 0)\n\t\t}\n\t\treturn readVisibleWhenPath(first, cond.field)\n\t}\n\t// Local mode (Wave 3): evaluate against the caller's object context.\n\tif (cond.field && ctx && ctx.object && typeof ctx.object === 'object') {\n\t\treturn readVisibleWhenPath(ctx.object, cond.field)\n\t}\n\tthrow new Error('visibleWhen needs an endpoint, a source, or a field on the object context')\n}\n\n/**\n * Evaluate a visibleWhen condition to a boolean, FAIL-SAFE: any error\n * (fetch failure, unusable condition, missing context) resolves `false`.\n * A `null` / `undefined` condition resolves `true` (no condition = always\n * visible) so callers can pass the raw config value straight through.\n *\n * @param {{endpoint?: string, source?: object, field?: string, op?: string, value?: unknown}|null} cond The condition (or null).\n * @param {{objectId?: (string|number), object?: object, workspace?: object, config?: object}} [ctx] The caller's token / object context.\n * @return {Promise<boolean>} Whether the guarded element should show.\n */\nexport async function evaluateVisibleWhen(cond, ctx) {\n\tif (!cond) {\n\t\treturn true\n\t}\n\t// `all` / `any` compose conditions, so a gate can be more than one fact.\n\t// Without it a claim button could say \"not closed\" OR \"nobody holds it\",\n\t// never both, and the weaker of the two is the one that ships.\n\tif (Array.isArray(cond.all) === true || Array.isArray(cond.any) === true) {\n\t\ttry {\n\t\t\t// Read the key that IS an array: a malformed `{ all: {}, any: [] }`\n\t\t\t// enters this branch on `any`, and `cond.all ?? cond.any` would hand\n\t\t\t// the object to `.map`.\n\t\t\tconst parts = Array.isArray(cond.all) === true ? cond.all : cond.any\n\t\t\tconst results = await Promise.all(parts.map((part) => evaluateVisibleWhen(part, ctx)))\n\t\t\treturn Array.isArray(cond.all) === true ? results.every(Boolean) : results.some(Boolean)\n\t\t} catch {\n\t\t\treturn false\n\t\t}\n\t}\n\tif (isWorkspaceCondition(cond)) {\n\t\treturn evaluateWorkspaceCondition(cond, ctx && ctx.workspace)\n\t}\n\ttry {\n\t\t// `appInstalled` is checked FIRST and on its own: it answers \"is the app\n\t\t// that backs this action even here\", which has to settle before any of\n\t\t// the other modes are worth evaluating. The menu's `visibleIf` already\n\t\t// spoke this word, and `visibleWhen` did not, so a manifest author who\n\t\t// wrote `{ appInstalled: \"humaniq\" }` here got a condition with no\n\t\t// `field` — which the local mode rejects as malformed and hides. The\n\t\t// button then never appeared, and nothing said why.\n\t\tif (typeof cond.appInstalled === 'string' && cond.appInstalled !== '') {\n\t\t\tif (!isAppInstalled(cond.appInstalled)) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t// `appInstalled` on its own IS the whole condition. Combined with a\n\t\t\t// field/endpoint/source it acts as a precondition, and evaluation\n\t\t\t// falls through to that.\n\t\t\tif (!cond.field && !cond.endpoint && !cond.source) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\tconst actual = await readVisibleWhenValue(cond, ctx)\n\t\treturn compareVisibleWhen(actual, cond.op || 'eq', cond.value, ctx)\n\t} catch (error) {\n\t\t// Still false; `ctx.onError` lets a caller (a journey run) record why.\n\t\tif (ctx && typeof ctx.onError === 'function') {\n\t\t\tctx.onError(error, cond)\n\t\t}\n\t\treturn false\n\t}\n}\n\n/**\n * Evaluate a LOCAL-mode visibleWhen condition synchronously against a\n * plain data object (`CnFormPage`'s live `formData`). No fetch, no\n * promise — pure composition of {@link readVisibleWhenPath} and\n * {@link compareVisibleWhen}, so it is safe to call on every keystroke.\n *\n * A nullish condition resolves `true` (no condition = always visible),\n * mirroring {@link evaluateVisibleWhen}'s fail-safe posture. A malformed\n * condition — not a plain object, missing `field`, or declaring\n * `endpoint` / `source` (those are NOT local-mode conditions) — resolves\n * `false` (hidden).\n *\n * @param {{field?: string, op?: string, value?: unknown}|null} cond The LOCAL visibleWhen condition (or null).\n * @param {object} data The live data object `field` dot-paths into (e.g. formData).\n * @return {boolean} Whether the guarded element should show.\n */\nexport function evaluateVisibleWhenLocal(cond, data) {\n\tif (cond === null || cond === undefined) {\n\t\treturn true\n\t}\n\tif (typeof cond !== 'object' || Array.isArray(cond)) {\n\t\treturn false\n\t}\n\tif (Array.isArray(cond.all) === true || Array.isArray(cond.any) === true) {\n\t\ttry {\n\t\t\tconst parts = Array.isArray(cond.all) === true ? cond.all : cond.any\n\t\t\tconst results = parts.map((part) => evaluateVisibleWhenLocal(part, data))\n\t\t\treturn Array.isArray(cond.all) === true ? results.every(Boolean) : results.some(Boolean)\n\t\t} catch {\n\t\t\t// Same posture as the async twin: a malformed composition hides the\n\t\t\t// one element, rather than throwing out of the computed that calls it\n\t\t\t// and taking the render with it.\n\t\t\treturn false\n\t\t}\n\t}\n\tif (cond.endpoint || cond.source) {\n\t\treturn false\n\t}\n\tif (typeof cond.appInstalled === 'string' && cond.appInstalled !== '') {\n\t\tif (!isAppInstalled(cond.appInstalled)) {\n\t\t\treturn false\n\t\t}\n\t\tif (!cond.field) {\n\t\t\treturn true\n\t\t}\n\t}\n\tif (typeof cond.field !== 'string' || cond.field.length === 0) {\n\t\treturn false\n\t}\n\ttry {\n\t\tconst actual = readVisibleWhenPath(data, cond.field)\n\t\t// The row / form record IS the object context here, so `@object.<field>`\n\t\t// on the right-hand side compares one field against another instead of\n\t\t// against the literal token string.\n\t\treturn compareVisibleWhen(actual, cond.op || 'eq', cond.value, { object: data })\n\t} catch {\n\t\treturn false\n\t}\n}\n\n/**\n * Whether {@link evaluateVisibleWhenLocal} can actually DECIDE a condition.\n *\n * It answers `false` to anything naming an `endpoint` or a `source`, because it\n * cannot fetch. That is right for a form field, where an undecidable gate should\n * hide — and wrong for a surface that had no gate at all before, which would\n * simply lose the element. Callers in the second group check this first and skip\n * the gate when it returns `false`.\n *\n * @param {object|null} cond The condition (or null).\n * @return {boolean} True when every leaf is a local `field` / `appInstalled` check.\n */\nexport function isLocallyDecidableVisibleWhen(cond) {\n\tif (cond === null || cond === undefined) {\n\t\treturn true\n\t}\n\tif (typeof cond !== 'object' || Array.isArray(cond)) {\n\t\treturn false\n\t}\n\tif (Array.isArray(cond.all) === true || Array.isArray(cond.any) === true) {\n\t\tconst parts = Array.isArray(cond.all) === true ? cond.all : cond.any\n\t\treturn parts.every((part) => isLocallyDecidableVisibleWhen(part))\n\t}\n\treturn !cond.endpoint && !cond.source\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"visibleWhen.js","sources":["../../../src/utils/visibleWhen.js"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2026 Conduction B.V.\n * SPDX-License-Identifier: EUPL-1.2\n *\n * visibleWhen — the shared declarative visibility predicate (Wave 1 banner\n * shape, generalised in Wave 3 of nextcloud-vue#91 for manifest actions).\n *\n * A `visibleWhen` condition is\n * `{ appInstalled?, endpoint?, source?, field?, op?, value }`.\n *\n * `appInstalled` is a precondition rather than a mode: it names the Nextcloud\n * app that backs the guarded element, and it is checked before anything else.\n * On its own it IS the whole condition; combined with one of the modes below\n * it gates that mode. It exists because the menu's `visibleIf` already spoke\n * this word and `visibleWhen` did not, so the same manifest vocabulary meant\n * two different things in two places.\n *\n * The value itself comes from one of THREE evaluation modes (first match wins):\n *\n * 1. `endpoint` — GET a same-origin JSON endpoint; `field` is a dot-path\n * into the response body. `@objectId` and `@object.<field>` in the\n * endpoint resolve against the caller's record.\n * 2. `source` — `{ register, schema, filter? }`, an OpenRegister object\n * query (`filter` supports the shared @-token grammar). `field` is a\n * dot-path into the FIRST result; omit it — or use `@total` — to\n * compare the collection total.\n * 3. Neither — the LOCAL mode (Wave 3): `field` is a dot-path into the\n * caller's object context (`ctx.object`, e.g. the loaded detail-page\n * record) — no request is made. This is how detail header actions gate\n * on the current record's state (`{ field: \"lifecycleState\", op: \"eq\",\n * value: \"approved\" }`).\n *\n * `op` is `eq | neq | gt | gte | lt | lte | empty | notEmpty | in | anyOf |\n * contains` (default `eq`); `anyOf` matches a list value that shares an entry\n * with the listed `value`, `contains` a list value that holds `value`. `value` is the\n * literal right-hand side. Evaluation is FAIL-SAFE: any fetch / shape error\n * resolves `false` (hidden) — a broken predicate never breaks a page.\n *\n * manifest-form-logic adds `evaluateVisibleWhenLocal(cond, data)`, a SYNC\n * counterpart to `evaluateVisibleWhen()` for the LOCAL mode only, composed\n * from `readVisibleWhenPath` + `compareVisibleWhen` with no fetch / promise.\n * `CnFormPage` calls it on every form-data change so conditions gating one\n * field on another's live value resolve without flicker. `endpoint` /\n * `source` conditions on form fields still go through the async\n * `evaluateVisibleWhen()`, evaluated once at mount and cached.\n *\n * @module utils/visibleWhen\n */\n\nimport { isAppInstalled } from './appInstalled.js'\nimport { buildHeaders, buildQueryString, prefixUrl } from './headers.js'\nimport { interpolateUrlTokens } from './interpolateUrlTokens.js'\nimport { resolveFilterTokens, resolveFilterValue } from './resolveFilterTokens.js'\n\n/** Supported visibleWhen comparison operators. */\nexport const VISIBLE_WHEN_OPS = ['eq', 'neq', 'gt', 'gte', 'lt', 'lte', 'empty', 'notEmpty', 'in', 'anyOf', 'contains']\n\n/**\n * Read a dot-path off an object (`'a.b.c'`); the object itself when no\n * field is given.\n *\n * @param {object} data The source object.\n * @param {string} [field] Dot-path into the object.\n * @return {unknown} The value at the path (undefined on a missing segment).\n */\nexport function readVisibleWhenPath(data, field) {\n\tif (!field) {\n\t\treturn data\n\t}\n\treturn String(field).split('.').reduce((obj, key) => (obj === null || obj === undefined ? obj : obj[key]), data)\n}\n\n/**\n * Whether a value is a date string: not a number, and a moment `Date.parse`\n * can read.\n *\n * @param {unknown} value The value.\n * @return {boolean}\n */\nfunction isDateLike(value) {\n\treturn typeof value === 'string' && value.trim() !== '' && !Number.isFinite(Number(value)) && Number.isFinite(Date.parse(value))\n}\n\n/**\n * Apply a visibleWhen comparison operator. Ordering operators coerce both\n * sides to Number; equality compares loosely-normalized primitives\n * (`String(a) === String(b)` when types differ) so `\"3\" eq 3` holds for\n * JSON round-trips.\n *\n * @param {unknown} actual The resolved left-hand value.\n * @param {string} op The operator (`eq` when unknown).\n * @param {unknown} expected The declared right-hand value.\n * @param {{objectId?: (string|number), object?: object, workspace?: object, config?: object}} [ctx] Token-resolution\n * context for the right-hand side, so `@object.<field>` and `@workspace.<key>` resolve\n * as well as `@me`. Omitted, only the context-free tokens resolve.\n * @return {boolean} Whether the comparison holds.\n */\nexport function compareVisibleWhen(actual, op, expected, ctx) {\n\tconst operator = VISIBLE_WHEN_OPS.includes(op) ? op : 'eq'\n\t// `empty` takes no `value`. It is the one question eq cannot ask: an unset\n\t// field arrives as undefined, null or '' depending on the store and the\n\t// serialiser, and `String(null)` is the word \"null\" rather than blank.\n\tif (operator === 'empty' || operator === 'notEmpty') {\n\t\tconst blank = actual === undefined || actual === null || actual === ''\n\t\t\t|| (Array.isArray(actual) === true && actual.length === 0)\n\t\treturn operator === 'empty' ? blank : !blank\n\t}\n\t// The shared @-token grammar, so a condition can name the READER (`@me`)\n\t// rather than a literal only the server knows.\n\tconst right = resolveFilterValue(expected, ctx || {})\n\t// `in` holds when the left-hand value is one of the listed values\n\t// (screens-page-lenses: a widget shown under several chips).\n\tif (operator === 'in') {\n\t\tconst list = Array.isArray(right) ? right : [right]\n\t\treturn list.some((entry) => entry === actual || String(entry) === String(actual))\n\t}\n\t// `anyOf` holds when the value, or any entry of a list value, is one of\n\t// the listed values: a record whose `dataCategories` holds \"health\" among\n\t// others matches `anyOf [\"health\", \"ethnicity\"]` (DqSociaalDomein).\n\t// `contains` holds when the value is a list holding the given value: a\n\t// case type whose `overviewCards` list names a card switches it on.\n\tif (operator === 'contains') {\n\t\tif (!Array.isArray(actual) || right === undefined || right === null) {\n\t\t\treturn false\n\t\t}\n\t\treturn actual.some((entry) => entry === right || String(entry) === String(right))\n\t}\n\tif (operator === 'anyOf') {\n\t\tconst list = Array.isArray(right) ? right : [right]\n\t\tconst values = Array.isArray(actual) ? actual : [actual]\n\t\treturn values.some((value) => value !== undefined && value !== null\n\t\t\t&& list.some((entry) => entry === value || String(entry) === String(value)))\n\t}\n\tif (operator === 'eq' || operator === 'neq') {\n\t\tconst equal = actual === right || String(actual) === String(right)\n\t\treturn operator === 'eq' ? equal : !equal\n\t}\n\tlet a = Number(actual)\n\tlet b = Number(right)\n\t// Two dates (`dueAt` against `@today`) compare as moments; a value that\n\t// is a number on either side never reads as a date.\n\tif ((!Number.isFinite(a) || !Number.isFinite(b)) && isDateLike(actual) && isDateLike(right)) {\n\t\ta = Date.parse(actual)\n\t\tb = Date.parse(right)\n\t}\n\tif (!Number.isFinite(a) || !Number.isFinite(b)) {\n\t\treturn false\n\t}\n\tif (operator === 'gt') {\n\t\treturn a > b\n\t}\n\tif (operator === 'gte') {\n\t\treturn a >= b\n\t}\n\tif (operator === 'lt') {\n\t\treturn a < b\n\t}\n\treturn a <= b\n}\n\n/**\n * Whether a condition reads the page workspace context (`workspace: \"<key>\"`).\n * Such a condition is answered synchronously from the reactive bag, so a\n * widget appears and disappears the moment a page control writes its key\n * (screens-page-lenses). A condition that also names an endpoint or a source\n * is not a workspace condition.\n *\n * @param {object|null} cond The visibleWhen condition.\n * @return {boolean} True for a workspace-mode condition.\n * @spec openspec/changes/screens-page-lenses/specs/page-lenses/spec.md#requirement-a-widget-can-be-shown-by-a-workspace-value\n */\nexport function isWorkspaceCondition(cond) {\n\treturn Boolean(cond) && typeof cond === 'object' && typeof cond.workspace === 'string' && cond.workspace !== ''\n\t\t&& !cond.endpoint && !cond.source\n}\n\n/**\n * Evaluate a workspace-mode condition against the workspace bag. No fetch.\n * A key nobody wrote is unset, so only `empty` and `neq` hold for it.\n *\n * @param {{workspace: string, op?: string, value?: unknown}} cond The condition.\n * @param {object} [workspace] The plain workspace bag.\n * @return {boolean} Whether the guarded element shows.\n * @spec openspec/changes/screens-page-lenses/specs/page-lenses/spec.md#requirement-a-widget-can-be-shown-by-a-workspace-value\n */\nexport function evaluateWorkspaceCondition(cond, workspace) {\n\tconst bag = workspace && typeof workspace === 'object' ? workspace : {}\n\treturn compareVisibleWhen(bag[cond.workspace], cond.op || 'eq', cond.value, { workspace: bag })\n}\n\n/**\n * Resolve the condition's left-hand value from its endpoint / OpenRegister\n * source / local object context (see the module docblock for the three\n * modes). Throws on unusable conditions and failed fetches — callers that\n * want the fail-safe boolean use {@link evaluateVisibleWhen}.\n *\n * An `endpoint` may name the page's record (`@objectId`, `@object.<field>`),\n * and its whole answer is the row a `sink` receives. A `source` may carry `order` (`{ field: \"asc\" | \"desc\" }`), so \"the first\n * row\" is the first of an ordered query, and `extend` (OpenRegister\n * `_extend[]` names) to inline the row's related objects. A caller that wants that row, not\n * just the value, passes `sink`: the first result is written to `sink.row`.\n *\n * @param {{endpoint?: string, source?: {register: string, schema: string, filter?: object, order?: object}, field?: string}} cond The visibleWhen condition.\n * @param {{objectId?: (string|number), object?: object, workspace?: object, config?: object}} [ctx] The caller's token / object context.\n * @param {{row?: object}} [sink] Receives the first result of a `source` query as `row`.\n * @return {Promise<unknown>} The value `field` points at.\n * @spec openspec/changes/screens-start-here-banner/specs/start-here-banner/spec.md#requirement-a-banner-can-name-the-first-row-of-a-query\n */\nexport async function readVisibleWhenValue(cond, ctx, sink) {\n\tif (cond.endpoint) {\n\t\t// `@objectId` / `@object.<field>` name the record the condition sits on;\n\t\t// without that record there is nothing to ask about.\n\t\tif (/@object(Id|\\.)/.test(cond.endpoint) && (ctx?.objectId === undefined || ctx?.objectId === null || ctx?.objectId === '')) {\n\t\t\tthrow new Error('endpoint names the record, and there is none')\n\t\t}\n\t\tconst response = await fetch(prefixUrl(interpolateUrlTokens(cond.endpoint, ctx)), { headers: buildHeaders() })\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`endpoint returned ${response.status}`)\n\t\t}\n\t\tconst data = await response.json()\n\t\tif (sink && typeof sink === 'object') {\n\t\t\tsink.row = data && typeof data === 'object' && !Array.isArray(data) ? data : undefined\n\t\t}\n\t\treturn readVisibleWhenPath(data, cond.field)\n\t}\n\tconst src = cond.source\n\tif (src && src.register && src.schema) {\n\t\tconst filter = resolveFilterTokens(src.filter || {}, ctx)\n\t\tconst order = {}\n\t\tfor (const [field, dir] of Object.entries(src.order && typeof src.order === 'object' ? src.order : {})) {\n\t\t\torder[`_order[${field}]`] = dir === 'desc' ? 'desc' : 'asc'\n\t\t}\n\t\t// `extend` inlines related objects on the row (`_extend[]`), so the\n\t\t// subject can name its type rather than its type's id.\n\t\tconst extend = Array.isArray(src.extend) ? { _extend: src.extend.filter((name) => typeof name === 'string' && name !== '') } : {}\n\t\tconst qs = buildQueryString({ ...filter, ...order, ...extend, _limit: 1 })\n\t\tconst url = prefixUrl(`/apps/openregister/api/objects/${src.register}/${src.schema}${qs}`)\n\t\tconst response = await fetch(url, { headers: buildHeaders() })\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`source returned ${response.status}`)\n\t\t}\n\t\tconst data = await response.json()\n\t\tconst first = Array.isArray(data.results) ? data.results[0] : data\n\t\tif (sink && typeof sink === 'object') {\n\t\t\tsink.row = first && typeof first === 'object' ? first : undefined\n\t\t}\n\t\tif (!cond.field || cond.field === '@total') {\n\t\t\treturn data.total ?? (Array.isArray(data.results) ? data.results.length : 0)\n\t\t}\n\t\treturn readVisibleWhenPath(first, cond.field)\n\t}\n\t// `@context.<name>.<path>` reads the records the page's conditions name\n\t// (a detail page's case type), which the object context carries apart\n\t// from the record.\n\tif (cond.field && String(cond.field).startsWith('@context.') && ctx && ctx.context && typeof ctx.context === 'object') {\n\t\treturn readVisibleWhenPath({ '@context': ctx.context }, cond.field)\n\t}\n\t// Local mode (Wave 3): evaluate against the caller's object context.\n\tif (cond.field && ctx && ctx.object && typeof ctx.object === 'object') {\n\t\treturn readVisibleWhenPath(ctx.object, cond.field)\n\t}\n\tthrow new Error('visibleWhen needs an endpoint, a source, or a field on the object context')\n}\n\n/**\n * Evaluate a visibleWhen condition to a boolean, FAIL-SAFE: any error\n * (fetch failure, unusable condition, missing context) resolves `false`.\n * A `null` / `undefined` condition resolves `true` (no condition = always\n * visible) so callers can pass the raw config value straight through.\n *\n * @param {{endpoint?: string, source?: object, field?: string, op?: string, value?: unknown}|null} cond The condition (or null).\n * @param {{objectId?: (string|number), object?: object, workspace?: object, config?: object}} [ctx] The caller's token / object context.\n * @return {Promise<boolean>} Whether the guarded element should show.\n */\nexport async function evaluateVisibleWhen(cond, ctx) {\n\tif (!cond) {\n\t\treturn true\n\t}\n\t// `all` / `any` compose conditions, so a gate can be more than one fact.\n\t// Without it a claim button could say \"not closed\" OR \"nobody holds it\",\n\t// never both, and the weaker of the two is the one that ships.\n\tif (Array.isArray(cond.all) === true || Array.isArray(cond.any) === true) {\n\t\ttry {\n\t\t\t// Read the key that IS an array: a malformed `{ all: {}, any: [] }`\n\t\t\t// enters this branch on `any`, and `cond.all ?? cond.any` would hand\n\t\t\t// the object to `.map`.\n\t\t\tconst parts = Array.isArray(cond.all) === true ? cond.all : cond.any\n\t\t\tconst results = await Promise.all(parts.map((part) => evaluateVisibleWhen(part, ctx)))\n\t\t\treturn Array.isArray(cond.all) === true ? results.every(Boolean) : results.some(Boolean)\n\t\t} catch {\n\t\t\treturn false\n\t\t}\n\t}\n\tif (isWorkspaceCondition(cond)) {\n\t\treturn evaluateWorkspaceCondition(cond, ctx && ctx.workspace)\n\t}\n\ttry {\n\t\t// `appInstalled` is checked FIRST and on its own: it answers \"is the app\n\t\t// that backs this action even here\", which has to settle before any of\n\t\t// the other modes are worth evaluating. The menu's `visibleIf` already\n\t\t// spoke this word, and `visibleWhen` did not, so a manifest author who\n\t\t// wrote `{ appInstalled: \"humaniq\" }` here got a condition with no\n\t\t// `field` — which the local mode rejects as malformed and hides. The\n\t\t// button then never appeared, and nothing said why.\n\t\tif (typeof cond.appInstalled === 'string' && cond.appInstalled !== '') {\n\t\t\tif (!isAppInstalled(cond.appInstalled)) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t// `appInstalled` on its own IS the whole condition. Combined with a\n\t\t\t// field/endpoint/source it acts as a precondition, and evaluation\n\t\t\t// falls through to that.\n\t\t\tif (!cond.field && !cond.endpoint && !cond.source) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\tconst actual = await readVisibleWhenValue(cond, ctx)\n\t\treturn compareVisibleWhen(actual, cond.op || 'eq', cond.value, ctx)\n\t} catch (error) {\n\t\t// Still false; `ctx.onError` lets a caller (a journey run) record why.\n\t\tif (ctx && typeof ctx.onError === 'function') {\n\t\t\tctx.onError(error, cond)\n\t\t}\n\t\treturn false\n\t}\n}\n\n/**\n * Evaluate a LOCAL-mode visibleWhen condition synchronously against a\n * plain data object (`CnFormPage`'s live `formData`). No fetch, no\n * promise — pure composition of {@link readVisibleWhenPath} and\n * {@link compareVisibleWhen}, so it is safe to call on every keystroke.\n *\n * A nullish condition resolves `true` (no condition = always visible),\n * mirroring {@link evaluateVisibleWhen}'s fail-safe posture. A malformed\n * condition — not a plain object, missing `field`, or declaring\n * `endpoint` / `source` (those are NOT local-mode conditions) — resolves\n * `false` (hidden).\n *\n * @param {{field?: string, op?: string, value?: unknown}|null} cond The LOCAL visibleWhen condition (or null).\n * @param {object} data The live data object `field` dot-paths into (e.g. formData).\n * @return {boolean} Whether the guarded element should show.\n */\nexport function evaluateVisibleWhenLocal(cond, data) {\n\tif (cond === null || cond === undefined) {\n\t\treturn true\n\t}\n\tif (typeof cond !== 'object' || Array.isArray(cond)) {\n\t\treturn false\n\t}\n\tif (Array.isArray(cond.all) === true || Array.isArray(cond.any) === true) {\n\t\ttry {\n\t\t\tconst parts = Array.isArray(cond.all) === true ? cond.all : cond.any\n\t\t\tconst results = parts.map((part) => evaluateVisibleWhenLocal(part, data))\n\t\t\treturn Array.isArray(cond.all) === true ? results.every(Boolean) : results.some(Boolean)\n\t\t} catch {\n\t\t\t// Same posture as the async twin: a malformed composition hides the\n\t\t\t// one element, rather than throwing out of the computed that calls it\n\t\t\t// and taking the render with it.\n\t\t\treturn false\n\t\t}\n\t}\n\tif (cond.endpoint || cond.source) {\n\t\treturn false\n\t}\n\tif (typeof cond.appInstalled === 'string' && cond.appInstalled !== '') {\n\t\tif (!isAppInstalled(cond.appInstalled)) {\n\t\t\treturn false\n\t\t}\n\t\tif (!cond.field) {\n\t\t\treturn true\n\t\t}\n\t}\n\tif (typeof cond.field !== 'string' || cond.field.length === 0) {\n\t\treturn false\n\t}\n\ttry {\n\t\tconst actual = readVisibleWhenPath(data, cond.field)\n\t\t// The row / form record IS the object context here, so `@object.<field>`\n\t\t// on the right-hand side compares one field against another instead of\n\t\t// against the literal token string.\n\t\treturn compareVisibleWhen(actual, cond.op || 'eq', cond.value, { object: data })\n\t} catch {\n\t\treturn false\n\t}\n}\n\n/**\n * Whether {@link evaluateVisibleWhenLocal} can actually DECIDE a condition.\n *\n * It answers `false` to anything naming an `endpoint` or a `source`, because it\n * cannot fetch. That is right for a form field, where an undecidable gate should\n * hide — and wrong for a surface that had no gate at all before, which would\n * simply lose the element. Callers in the second group check this first and skip\n * the gate when it returns `false`.\n *\n * @param {object|null} cond The condition (or null).\n * @return {boolean} True when every leaf is a local `field` / `appInstalled` check.\n */\nexport function isLocallyDecidableVisibleWhen(cond) {\n\tif (cond === null || cond === undefined) {\n\t\treturn true\n\t}\n\tif (typeof cond !== 'object' || Array.isArray(cond)) {\n\t\treturn false\n\t}\n\tif (Array.isArray(cond.all) === true || Array.isArray(cond.any) === true) {\n\t\tconst parts = Array.isArray(cond.all) === true ? cond.all : cond.any\n\t\treturn parts.every((part) => isLocallyDecidableVisibleWhen(part))\n\t}\n\treturn !cond.endpoint && !cond.source\n}\n"],"names":[],"mappings":"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"}
|