@conduction/nextcloud-vue 2.139.0 → 2.140.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/CnAppRoot/CnAppRoot.vue2.js +9 -2
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue.js +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +17 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +2 -2
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue.js +1 -1
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js +52 -1
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue3.js +23 -1
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue.js +1 -1
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js +106 -0
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js +30 -7
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +59 -3
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js +44 -34
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue.js +1 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +28 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/filesBrowser.js +7 -1
- package/dist/esm/components/CnFilesBrowser/filesBrowser.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/filesBrowserColumns.js +5 -0
- package/dist/esm/components/CnFilesBrowser/filesBrowserColumns.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +30 -2
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue.js +1 -1
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js +28 -3
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordNoteRows.vue.js +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordNoteRows.vue2.js +10 -0
- package/dist/esm/components/CnRecordListWidget/CnRecordNoteRows.vue2.js.map +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordNoteRows.vue3.js.map +1 -1
- package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue.js +1 -1
- package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue2.js +12 -1
- package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue3.js +1 -1
- package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnTransitionInputFields/CnTransitionInputFields.vue.js +1 -1
- package/dist/esm/components/CnTransitionInputFields/CnTransitionInputFields.vue2.js +23 -1
- package/dist/esm/components/CnTransitionInputFields/CnTransitionInputFields.vue2.js.map +1 -1
- package/dist/esm/components/CnTransitionInputFields/CnTransitionInputFields.vue3.js +43 -13
- package/dist/esm/components/CnTransitionInputFields/CnTransitionInputFields.vue3.js.map +1 -1
- package/dist/esm/composables/indexSources.js +5 -2
- package/dist/esm/composables/indexSources.js.map +1 -1
- package/dist/esm/composables/useTaskInboxStore.js +4 -3
- package/dist/esm/composables/useTaskInboxStore.js.map +1 -1
- package/dist/esm/l10n/en.json.js +2 -1
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +5 -1
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/library-style.js +1 -1
- package/dist/esm/nextcloud-vue.css +466 -371
- package/dist/esm/utils/builtInFormatters.js +23 -1
- package/dist/esm/utils/builtInFormatters.js.map +1 -1
- package/dist/esm/utils/fillTemplate.js +7 -1
- package/dist/esm/utils/fillTemplate.js.map +1 -1
- package/dist/esm/utils/myTeam.js +24 -4
- package/dist/esm/utils/myTeam.js.map +1 -1
- package/dist/esm/utils/resolveFilterTokens.js +5 -4
- package/dist/esm/utils/resolveFilterTokens.js.map +1 -1
- package/dist/esm/utils/transitionInputs.js +43 -2
- package/dist/esm/utils/transitionInputs.js.map +1 -1
- package/dist/nextcloud-vue.cjs.js +771 -222
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +466 -371
- package/l10n/en.json +2 -1
- package/l10n/nl.json +5 -1
- package/package.json +1 -1
- package/src/components/CnAppRoot/CnAppRoot.vue +9 -2
- package/src/components/CnCellRenderer/CnCellRenderer.vue +19 -3
- package/src/components/CnChartWidget/CnChartWidget.md +1 -0
- package/src/components/CnChartWidget/CnChartWidget.vue +72 -1
- package/src/components/CnConversationThread/CnConversationWidget.vue +126 -1
- package/src/components/CnFactsWidget/CnFactsWidget.vue +72 -5
- package/src/components/CnFilesBrowser/CnFilesBrowser.vue +28 -1
- package/src/components/CnFilesBrowser/filesBrowser.js +7 -1
- package/src/components/CnFilesBrowser/filesBrowserColumns.js +5 -0
- package/src/components/CnIndexPage/CnIndexPage.vue +30 -2
- package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +28 -3
- package/src/components/CnRecordListWidget/CnRecordNoteRows.vue +10 -0
- package/src/components/CnStackedBarWidget/CnStackedBarWidget.vue +68 -2
- package/src/components/CnTransitionInputFields/CnTransitionInputFields.vue +43 -1
- package/src/composables/indexSources.js +5 -2
- package/src/composables/useTaskInboxStore.js +4 -3
- package/src/css/look-board.css +10 -2
- package/src/css/table.css +13 -0
- package/src/utils/builtInFormatters.js +22 -0
- package/src/utils/fillTemplate.js +7 -1
- package/src/utils/myTeam.js +24 -4
- package/src/utils/resolveFilterTokens.js +5 -4
- package/src/utils/transitionInputs.js +42 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveFilterTokens.js","sources":["../../../src/utils/resolveFilterTokens.js"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2026 Conduction B.V.\n * SPDX-License-Identifier: EUPL-1.2\n *\n * Resolve dynamic `@`-tokens inside a widget filter at FETCH time, so manifest\n * filters can express \"relative to now / the current user\" without baking a\n * fixed value. The widgets call this just before sending the filter to\n * OpenRegister.\n *\n * Supported tokens:\n * - `@me` → the current Nextcloud user id (`getCurrentUser()` from\n * `@nextcloud/auth`; `window.OC.currentUser` fallback)\n * - `@myGroups` → the ids of the Nextcloud groups the current user is\n * in, as an ARRAY (an IN filter). `ctx.myGroups` wins;\n * otherwise a reactive peek over `getCurrentUserGroups`.\n * Stays UNRESOLVED while loading and when the user is\n * in no group, so the caller waits instead of sending\n * an empty IN list (which OpenRegister reads as \"no\n * constraint\"). Spread in place inside an IN-list array.\n * - `@myTeam` → the current user's primary team, a Nextcloud group id,\n * as the app answers it (`registerMyTeamSource`;\n * `ctx.myTeam` wins). Stays UNRESOLVED while it is read;\n * a user in no team gets `@myTeam?`, an optional token\n * the caller drops, so the filter goes away rather than\n * widening to all of the user's groups.\n * - `@now` → the current instant, ISO-8601\n * - `@today` → today at 00:00, `YYYY-MM-DD` (date-prefix comparable)\n * - `@today±Nd` → relative-date arithmetic at day granularity: N days\n * from today (e.g. `@today-30d`, `@today+7d`)\n * - `@monthStart` → first day of the current month, `YYYY-MM-DD`\n * - `@monthEnd` → last day of the current month, `YYYY-MM-DD`; on a\n * date-time field use `lt: '@nextMonthStart'` instead,\n * since `lte` a date stops at that day's midnight\n * - `@nextMonthStart` → first day of the next month, `YYYY-MM-DD`\n * - `@quarterStart` → first day of the current quarter, `YYYY-MM-DD`\n * - `@yearStart` → first day of the current year, `YYYY-MM-DD`\n * - `@currentFiscalYear` → the current calendar year as a number string, e.g. `2026`\n * - `@range.from` / `@range.to` / `@range.preset` → the active date range a\n * widget passes in `ctx.range` (CnStatWidget: its own\n * picker, else the dashboard's). A trailing `?` marks it\n * optional, as for `@workspace.<key>?`.\n * - `@objectId` → the current detail-page object's id (needs `ctx`)\n * - `@object.<field>` → a field off the current detail-page object (needs `ctx`)\n * - `@workspace.<key>` → a value off the page-level workspace context (needs `ctx.workspace`)\n * - `@config.<key>` → a value off the page-level app config (needs `ctx.config`)\n * - `@context.<name>.<path>` → a value off a record the detail page reads beside\n * the loaded one (needs `ctx.context`); left as written\n * while that record is not read\n *\n * `@objectId` / `@object.<field>` are OBJECT-CONTEXT tokens: they resolve only\n * when a `ctx` `{ objectId, object }` is supplied (a detail page provides it via\n * the `cnObjectContext` inject). `@workspace.<key>` is a WORKSPACE-CONTEXT token:\n * it resolves a key off `ctx.workspace` (the reactive `cnWorkspaceContext` a\n * dashboard/workspace page provides) so a list widget can react to page-level\n * state another widget writes (e.g. a selected client). Without the matching\n * context the tokens pass through unchanged — and an UNRESOLVED `@workspace.*`\n * token signals \"no selection yet\" to the caller (see {@link hasUnresolvedTokens}).\n *\n * `@config.<key>` is an APP-CONFIG token: it resolves a key off `ctx.config` (the\n * page-level app config a dashboard/detail page provides via `cnAppConfig` — e.g.\n * a reporting `currency` captured by the setup wizard). Like `@workspace.<key>`, a\n * trailing `?` marks it optional. An UNRESOLVED required `@config.<key>` passes\n * through unchanged; this lets `format: { currency: '@config.currency' }` fall\n * back to a literal default when the config is unset.\n *\n * IN-lists: a filter value MAY be an ARRAY (`{ status: ['open', 'pending'] }`,\n * or the explicit operator form `{ status: { in: [...] } }`). Tokens inside the\n * array are resolved item-by-item (`{ assignee: ['@me', 'shared'] }` works).\n * OpenRegister expects an IN-list as repeated bracket params\n * (`status[]=open&status[]=pending` — the same shape `buildQueryString` /\n * `useObjectStore` send), so widget fetchers serialize a resolved array as\n * repeated `field[]` params, never as a JSON blob or a single joined string.\n *\n * @module utils/resolveFilterTokens\n */\n\nimport { getCurrentUser } from '@nextcloud/auth'\n// userGroupsPeek, not widgetVisibility: that one imports @nextcloud/axios, and\n// this resolver runs on public pages and in node (see userGroupsPeek.js).\nimport { peekMyTeam } from './myTeam.js'\nimport { readPath } from './readPath.js'\nimport { TODAY_DELTA_RE } from './sentinelTokens.js'\nimport { peekCurrentUserGroups } from './userGroupsPeek.js'\n\n/** The filter token for the current user's group ids. */\nexport const MY_GROUPS_TOKEN = '@myGroups'\n\n/** The filter token for the current user's primary team. */\nexport const MY_TEAM_TOKEN = '@myTeam'\n\n/**\n * Resolve `@myTeam`: the team's group id; `@myTeam` while it is being read (the\n * caller waits); `@myTeam?` for a user in no team (the caller drops the key).\n *\n * @spec openspec/changes/saved-view-tokens-my-team/specs/schema-utilities/spec.md#requirement-myteam-resolves-to-the-current-users-primary-team\n * @param {{myTeam?: string}} [ctx] Optional context; `ctx.myTeam` wins.\n * @return {string} The group id or the token.\n */\nfunction resolveMyTeam(ctx) {\n\tconst team = ctx && typeof ctx.myTeam === 'string' ? ctx.myTeam : peekMyTeam()\n\tif (team === null) {\n\t\treturn MY_TEAM_TOKEN\n\t}\n\treturn team === '' ? `${MY_TEAM_TOKEN}?` : team\n}\n\n/**\n * Resolve `@myGroups`: the current user's group ids, or the token itself while\n * they are loading or when there are none (an empty IN list would match every\n * row, so \"no team\" must mean \"wait\", never \"everything\").\n *\n * @spec openspec/changes/nextcloud-group-surfaces/specs/schema-utilities/spec.md#requirement-mygroups-resolves-to-the-current-users-group-ids\n * @param {{myGroups?: string[]}} [ctx] Optional context; `ctx.myGroups` wins.\n * @return {string[]|string} The group ids, or `'@myGroups'` when unresolved.\n */\nfunction resolveMyGroups(ctx) {\n\tlet groups = ctx && Array.isArray(ctx.myGroups) ? ctx.myGroups : null\n\tif (groups === null) {\n\t\ttry {\n\t\t\tgroups = peekCurrentUserGroups()\n\t\t} catch {\n\t\t\tgroups = null\n\t\t}\n\t}\n\tconst ids = Array.isArray(groups)\n\t\t? groups.filter((g) => typeof g === 'string' && g !== '')\n\t\t: []\n\treturn ids.length > 0 ? [...ids] : MY_GROUPS_TOKEN\n}\n\n/**\n * Format a Date as `YYYY-MM-DD` (local).\n *\n * @param {Date} d The date.\n * @return {string} The date-only string.\n */\nfunction ymd(d) {\n\tconst m = String(d.getMonth() + 1).padStart(2, '0')\n\tconst day = String(d.getDate()).padStart(2, '0')\n\treturn `${d.getFullYear()}-${m}-${day}`\n}\n\n/**\n * Fill each `{@config.<key>}` inside a token from `ctx.config`, so a token can\n * take an admin setting (`@today-{@config.lead_stale_threshold_days}d`). The\n * token comes back unchanged when any key is missing from the config.\n *\n * @param {string} token The token.\n * @param {object} [ctx] The token context.\n * @return {string} The token with the config values in.\n * @spec openspec/changes/pl4-cell-rules/specs/pl4-cell-rules/spec.md#requirement-a-token-can-take-a-config-value\n */\nfunction fillConfigInToken(token, ctx) {\n\tconst config = (ctx && ctx.config) || {}\n\tlet missing = false\n\tconst filled = token.replace(/\\{@config\\.([A-Za-z0-9_.-]+)\\}/g, (whole, key) => {\n\t\tconst value = config[key]\n\t\tif (value === undefined || value === null || value === '') {\n\t\t\tmissing = true\n\t\t\treturn whole\n\t\t}\n\t\treturn String(value)\n\t})\n\treturn missing ? token : filled\n}\n\n/**\n * Resolve a single filter value if it is a dynamic `@`-token, else pass through.\n *\n * @param {unknown} v The candidate value.\n * @param {{objectId?: (string|number), object?: object, workspace?: object, config?: object, range?: object, myGroups?: string[]}} [ctx] Optional\n * context for `@objectId` / `@object.<field>` (detail page),\n * `@workspace.<key>` (page-level workspace state), and `@config.<key>`\n * (page-level app config) tokens.\n * @return {unknown} The resolved value.\n */\nexport function resolveFilterValue(v, ctx) {\n\tif (typeof v !== 'string' || v.charAt(0) !== '@') {\n\t\treturn v\n\t}\n\tif (v.includes('{@config.')) {\n\t\tconst filled = fillConfigInToken(v, ctx)\n\t\treturn filled === v ? v : resolveFilterValue(filled, ctx)\n\t}\n\tconst now = new Date()\n\tif (v === MY_GROUPS_TOKEN) {\n\t\treturn resolveMyGroups(ctx)\n\t}\n\tif (v === MY_TEAM_TOKEN) {\n\t\treturn resolveMyTeam(ctx)\n\t}\n\tif (v === '@objectId') {\n\t\treturn (ctx && ctx.objectId !== undefined && ctx.objectId !== null) ? String(ctx.objectId) : v\n\t}\n\tif (v.startsWith('@object.')) {\n\t\tconst field = v.slice('@object.'.length)\n\t\tif (ctx && ctx.object && field && ctx.object[field] !== undefined) {\n\t\t\treturn ctx.object[field]\n\t\t}\n\t\treturn v\n\t}\n\tif (v.startsWith('@context.')) {\n\t\t// @spec openspec/changes/files-second-line-fields/specs/files-second-line-fields/spec.md#requirement-widget-props-can-read-the-detail-pages-context-records\n\t\tconst found = ctx && ctx.context ? readPath(ctx.context, v.slice('@context.'.length)) : undefined\n\t\treturn found === undefined ? v : found\n\t}\n\tif (v.startsWith('@workspace.')) {\n\t\t// A trailing `?` marks the token OPTIONAL: when unset the caller drops the\n\t\t// filter key (show all) instead of waiting (see hasUnresolvedTokens /\n\t\t// CnObjectListWidget). The `?` is stripped from the key lookup.\n\t\tconst raw = v.slice('@workspace.'.length)\n\t\tconst key = raw.endsWith('?') ? raw.slice(0, -1) : raw\n\t\tif (ctx && ctx.workspace && key && ctx.workspace[key] !== undefined\n\t\t\t&& ctx.workspace[key] !== null && ctx.workspace[key] !== '') {\n\t\t\treturn ctx.workspace[key]\n\t\t}\n\t\treturn v\n\t}\n\tif (v.startsWith('@config.')) {\n\t\t// A trailing `?` marks the token OPTIONAL (same convention as\n\t\t// `@workspace.<key>?`): an unset value lets the caller drop the key. A\n\t\t// required `@config.<key>` that is unset passes through unchanged so a\n\t\t// downstream consumer can fall back to a literal default (e.g.\n\t\t// `format.currency` → `'EUR'`).\n\t\tconst raw = v.slice('@config.'.length)\n\t\tconst key = raw.endsWith('?') ? raw.slice(0, -1) : raw\n\t\tif (ctx && ctx.config && key && ctx.config[key] !== undefined\n\t\t\t&& ctx.config[key] !== null && ctx.config[key] !== '') {\n\t\t\treturn ctx.config[key]\n\t\t}\n\t\treturn v\n\t}\n\tif (v.startsWith('@range.')) {\n\t\t// `@range.from` / `@range.to` / `@range.preset`: the active date range the\n\t\t// caller put in `ctx.range`. CnStatWidget documented these tokens and put\n\t\t// `range` in its endpoint context, but nothing resolved them, so the\n\t\t// literal token stayed in the params, hasUnresolvedTokens blocked the\n\t\t// request, and a card that used its own period picker never loaded. A\n\t\t// trailing `?` marks the token OPTIONAL, the same convention as\n\t\t// `@workspace.<key>?`: unset, the caller drops the key.\n\t\tconst raw = v.slice('@range.'.length)\n\t\tconst key = raw.endsWith('?') ? raw.slice(0, -1) : raw\n\t\tif (ctx && ctx.range && key && ctx.range[key] !== undefined\n\t\t\t&& ctx.range[key] !== null && ctx.range[key] !== '') {\n\t\t\treturn ctx.range[key]\n\t\t}\n\t\treturn v\n\t}\n\tif (v === '@me.displayName' || v === '@me.email') {\n\t\t// The form's own context wins (`ctx.me`, e.g. an email fetched from the\n\t\t// profile); @nextcloud/auth only knows the uid and display name.\n\t\tconst key = v.slice('@me.'.length)\n\t\tif (ctx && ctx.me && ctx.me[key] !== undefined && ctx.me[key] !== null && ctx.me[key] !== '') {\n\t\t\treturn ctx.me[key]\n\t\t}\n\t\ttry {\n\t\t\tconst user = getCurrentUser()\n\t\t\tif (user && user[key]) {\n\t\t\t\treturn user[key]\n\t\t\t}\n\t\t} catch {\n\t\t\t// not signed in: leave the token unresolved\n\t\t}\n\t\treturn v\n\t}\n\tif (v === '@me') {\n\t\t// Canonical source is @nextcloud/auth; window.OC is the fallback for\n\t\t// environments where the auth package can't read the page state (jsdom).\n\t\tlet uid\n\t\ttry {\n\t\t\tconst user = getCurrentUser()\n\t\t\tuid = user && user.uid\n\t\t} catch {\n\t\t\tuid = null\n\t\t}\n\t\treturn uid || (typeof window !== 'undefined' && window.OC && window.OC.currentUser) || ''\n\t}\n\tif (v === '@now') {\n\t\treturn now.toISOString()\n\t}\n\tif (v === '@today') {\n\t\tconst d = new Date(now)\n\t\td.setHours(0, 0, 0, 0)\n\t\treturn ymd(d)\n\t}\n\tif (v === '@monthStart') {\n\t\treturn ymd(new Date(now.getFullYear(), now.getMonth(), 1))\n\t}\n\tif (v === '@monthEnd') {\n\t\t// Day 0 of the next month is the last day of this one.\n\t\treturn ymd(new Date(now.getFullYear(), now.getMonth() + 1, 0))\n\t}\n\tif (v === '@nextMonthStart') {\n\t\treturn ymd(new Date(now.getFullYear(), now.getMonth() + 1, 1))\n\t}\n\tif (v === '@quarterStart') {\n\t\treturn ymd(new Date(now.getFullYear(), Math.floor(now.getMonth() / 3) * 3, 1))\n\t}\n\tif (v === '@yearStart') {\n\t\treturn ymd(new Date(now.getFullYear(), 0, 1))\n\t}\n\tif (v === '@currentFiscalYear') {\n\t\treturn String(now.getFullYear())\n\t}\n\tconst m = v.match(TODAY_DELTA_RE)\n\tif (m) {\n\t\tconst d = new Date(now)\n\t\td.setHours(0, 0, 0, 0)\n\t\td.setDate(d.getDate() + Number(m[1]))\n\t\treturn ymd(d)\n\t}\n\treturn v\n}\n\n/**\n * Whether a value is an UNRESOLVED OPTIONAL token — a string still shaped like\n * `@workspace.<key>?` or `@config.<key>?` after token resolution (the `?` marks\n * it as \"drop me when unset\"). Callers strip such keys from the filter so the\n * list shows all rows rather than waiting for a selection / a config value.\n *\n * @param {unknown} v A (possibly resolved) filter value.\n * @return {boolean}\n */\nexport function isOptionalUnresolved(v) {\n\treturn typeof v === 'string'\n\t\t&& (v.startsWith('@workspace.') || v.startsWith('@config.') || v.startsWith('@range.') || v === `${MY_TEAM_TOKEN}?`)\n\t\t&& v.endsWith('?')\n}\n\n/**\n * Return a copy of a resolved filter map with every UNRESOLVED OPTIONAL\n * workspace token (`@workspace.<key>?` left as-is) removed. Required tokens and\n * concrete values are kept untouched. Inside an IN-list array, unresolved\n * optional ITEMS are dropped; a key whose array empties out is dropped whole\n * (an empty IN-list means \"no constraint\", not \"match nothing\").\n *\n * @param {object} filter A filter map already passed through {@link resolveFilterTokens}.\n * @return {object} The filter without optional-unresolved keys.\n */\nexport function dropOptionalUnresolved(filter) {\n\tif (!filter || typeof filter !== 'object') {\n\t\treturn filter\n\t}\n\tconst out = {}\n\tfor (const [k, v] of Object.entries(filter)) {\n\t\tif (isOptionalUnresolved(v)) {\n\t\t\tcontinue\n\t\t}\n\t\tif (Array.isArray(v)) {\n\t\t\tconst items = v.filter((item) => !isOptionalUnresolved(item))\n\t\t\tif (items.length > 0) {\n\t\t\t\tout[k] = items\n\t\t\t}\n\t\t} else if (v && typeof v === 'object') {\n\t\t\tconst inner = {}\n\t\t\tfor (const [op, ov] of Object.entries(v)) {\n\t\t\t\tif (Array.isArray(ov)) {\n\t\t\t\t\tconst items = ov.filter((item) => !isOptionalUnresolved(item))\n\t\t\t\t\tif (items.length > 0) {\n\t\t\t\t\t\tinner[op] = items\n\t\t\t\t\t}\n\t\t\t\t} else if (!isOptionalUnresolved(ov)) {\n\t\t\t\t\tinner[op] = ov\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (Object.keys(inner).length > 0) {\n\t\t\t\tout[k] = inner\n\t\t\t}\n\t\t} else {\n\t\t\tout[k] = v\n\t\t}\n\t}\n\treturn out\n}\n\n/**\n * Whether a resolved filter map still carries an unresolved `@`-token. Used by\n * context-bound widgets to detect \"the page state this widget depends on isn't\n * set yet\" (e.g. a client-overview list whose `client` filter is still the raw\n * `@workspace.selectedClient` because no client is selected) and skip the query\n * / render a prompt instead of fetching the whole register.\n *\n * OPTIONAL tokens (`@workspace.<key>?`) are NOT counted — they are meant to be\n * dropped, not waited on (see {@link dropOptionalUnresolved}).\n *\n * @param {object} filter A filter map already passed through {@link resolveFilterTokens}.\n * @return {boolean} True when any value is still a (non-optional) string beginning with `@`.\n */\nexport function hasUnresolvedTokens(filter) {\n\tif (!filter || typeof filter !== 'object') {\n\t\treturn false\n\t}\n\tconst blocking = (x) => typeof x === 'string' && x.charAt(0) === '@' && !isOptionalUnresolved(x)\n\tconst anyBlocking = (v) => {\n\t\tif (blocking(v)) {\n\t\t\treturn true\n\t\t}\n\t\tif (Array.isArray(v)) {\n\t\t\treturn v.some(blocking)\n\t\t}\n\t\treturn false\n\t}\n\tfor (const v of Object.values(filter)) {\n\t\tif (anyBlocking(v)) {\n\t\t\treturn true\n\t\t}\n\t\tif (v && typeof v === 'object' && !Array.isArray(v)) {\n\t\t\tfor (const ov of Object.values(v)) {\n\t\t\t\tif (anyBlocking(ov)) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn false\n}\n\n/**\n * Resolve every dynamic `@`-token in a filter map (equality, operator, and\n * IN-list array shapes). Array values resolve item-by-item so a list can mix\n * tokens and literals (`{ assignee: ['@me', 'shared'] }`).\n *\n * @param {object} filter The filter map (`{ field: value | value[] | { op: value | value[] } }`).\n * @param {{objectId?: (string|number), object?: object, workspace?: object, config?: object, range?: object}} [ctx] Optional\n * context forwarded to {@link resolveFilterValue} for `@objectId` /\n * `@object.<field>` / `@workspace.<key>` / `@config.<key>` tokens.\n * @return {object} A new filter map with tokens resolved.\n */\nexport function resolveFilterTokens(filter, ctx) {\n\tif (!filter || typeof filter !== 'object') {\n\t\treturn filter\n\t}\n\t// An item that resolves to a list (`@myGroups`) is spread in place, so\n\t// `['@myGroups', 'archive']` stays one flat IN list.\n\tconst resolveOne = (v) => (Array.isArray(v)\n\t\t? v.flatMap((item) => {\n\t\t\t\tconst r = resolveFilterValue(item, ctx)\n\t\t\t\treturn Array.isArray(r) ? r : [r]\n\t\t\t})\n\t\t: resolveFilterValue(v, ctx))\n\tconst out = {}\n\tfor (const [k, v] of Object.entries(filter)) {\n\t\tif (v && typeof v === 'object' && !Array.isArray(v)) {\n\t\t\tconst inner = {}\n\t\t\tfor (const [op, ov] of Object.entries(v)) {\n\t\t\t\tinner[op] = resolveOne(ov)\n\t\t\t}\n\t\t\tout[k] = inner\n\t\t} else {\n\t\t\tout[k] = resolveOne(v)\n\t\t}\n\t}\n\treturn out\n}\n\n/**\n * Recursively resolve `@`-tokens inside an arbitrary JSON value — objects\n * and arrays at ANY depth, unlike {@link resolveFilterTokens} which only\n * understands the flat filter-map shape (equality / operator / IN-list, one\n * level of nesting). Used by the `api-call` action's `payload`: a\n * Filinq-style generation body like\n * `{ dataRefs: [{ register: 'crm', schema: 'lead', id: '@objectId' }] }`\n * needs the token resolved inside a nested array of objects, which the\n * shallow filter-map resolver can't reach.\n *\n * @param {unknown} value The value to resolve — object / array / primitive.\n * @param {{objectId?: (string|number), object?: object, workspace?: object, config?: object, range?: object}} [ctx] Optional\n * context forwarded to {@link resolveFilterValue}.\n * @return {unknown} A new value with every string leaf token-resolved (structure preserved).\n */\nexport function resolveDeepTokens(value, ctx) {\n\tif (Array.isArray(value)) {\n\t\treturn value.map((v) => resolveDeepTokens(v, ctx))\n\t}\n\tif (value && typeof value === 'object') {\n\t\tconst out = {}\n\t\tfor (const [k, v] of Object.entries(value)) {\n\t\t\tout[k] = resolveDeepTokens(v, ctx)\n\t\t}\n\t\treturn out\n\t}\n\treturn resolveFilterValue(value, ctx)\n}\n\n/**\n * Deep-tree counterpart to {@link hasUnresolvedTokens}: whether an\n * already-{@link resolveDeepTokens}-resolved value still carries an\n * unresolved, non-optional `@`-token anywhere inside it (any depth). Used to\n * BLOCK an `api-call` whose `payload` has a required token (typically\n * `@objectId` / `@object.<field>`) that failed to resolve, instead of\n * silently sending the literal token string to the server.\n *\n * @param {unknown} value The (already deep-resolved) value.\n * @return {boolean} True when a required token is still unresolved.\n */\nexport function hasUnresolvedDeepTokens(value) {\n\tif (Array.isArray(value)) {\n\t\treturn value.some(hasUnresolvedDeepTokens)\n\t}\n\tif (value && typeof value === 'object') {\n\t\treturn Object.values(value).some(hasUnresolvedDeepTokens)\n\t}\n\treturn typeof value === 'string' && value.charAt(0) === '@' && !isOptionalUnresolved(value)\n}\n\n/**\n * Deep-tree counterpart to {@link dropOptionalUnresolved}: strips unresolved\n * OPTIONAL tokens (`@workspace.<key>?` / `@config.<key>?` left as-is after\n * resolution) out of an arbitrary JSON value at any depth. An object key\n * whose value is an unresolved optional token is dropped entirely; an array\n * item that resolves unresolved-optional is filtered out.\n *\n * @param {unknown} value The (already {@link resolveDeepTokens}-resolved) value.\n * @return {unknown} The value with unresolved-optional leaves removed.\n */\nexport function dropOptionalUnresolvedDeep(value) {\n\tif (Array.isArray(value)) {\n\t\treturn value\n\t\t\t.filter((v) => !isOptionalUnresolved(v))\n\t\t\t.map((v) => dropOptionalUnresolvedDeep(v))\n\t}\n\tif (value && typeof value === 'object') {\n\t\tconst out = {}\n\t\tfor (const [k, v] of Object.entries(value)) {\n\t\t\tif (isOptionalUnresolved(v)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tout[k] = dropOptionalUnresolvedDeep(v)\n\t\t}\n\t\treturn out\n\t}\n\treturn value\n}\n"],"names":[],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAQA;AACA;AACY,MAAC,eAAe,GAAG,YAAW;AAC1C;AACA;AACY,MAAC,aAAa,GAAG,UAAS;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,aAAa,CAAC,GAAG,EAAE;AAC5B,CAAC,MAAM,IAAI,GAAG,GAAG,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,GAAG,GAAG,CAAC,MAAM,GAAG,UAAU,GAAE;AAC/E,CAAC,IAAI,IAAI,KAAK,IAAI,EAAE;AACpB,EAAE,OAAO,aAAa;AACtB,EAAE;AACF,CAAC,OAAO,IAAI,KAAK,EAAE,GAAG,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI;AAChD,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,eAAe,CAAC,GAAG,EAAE;AAC9B,CAAC,IAAI,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,QAAQ,GAAG,KAAI;AACtE,CAAC,IAAI,MAAM,KAAK,IAAI,EAAE;AACtB,EAAE,IAAI;AACN,GAAG,MAAM,GAAG,qBAAqB,GAAE;AACnC,GAAG,CAAC,MAAM;AACV,GAAG,MAAM,GAAG,KAAI;AAChB,GAAG;AACH,EAAE;AACF,CAAC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;AAClC,IAAI,MAAM,CAAC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"}
|
|
1
|
+
{"version":3,"file":"resolveFilterTokens.js","sources":["../../../src/utils/resolveFilterTokens.js"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2026 Conduction B.V.\n * SPDX-License-Identifier: EUPL-1.2\n *\n * Resolve dynamic `@`-tokens inside a widget filter at FETCH time, so manifest\n * filters can express \"relative to now / the current user\" without baking a\n * fixed value. The widgets call this just before sending the filter to\n * OpenRegister.\n *\n * Supported tokens:\n * - `@me` → the current Nextcloud user id (`getCurrentUser()` from\n * `@nextcloud/auth`; `window.OC.currentUser` fallback)\n * - `@myGroups` → the ids of the Nextcloud groups the current user is\n * in, as an ARRAY (an IN filter). `ctx.myGroups` wins;\n * otherwise a reactive peek over `getCurrentUserGroups`.\n * Stays UNRESOLVED while loading and when the user is\n * in no group, so the caller waits instead of sending\n * an empty IN list (which OpenRegister reads as \"no\n * constraint\"). Spread in place inside an IN-list array.\n * - `@myTeam` → the current user's primary team, a Nextcloud group id,\n * as the app answers it (`registerMyTeamSource`;\n * `ctx.myTeam` wins). Stays UNRESOLVED while it is read;\n * a user in no team gets `@myTeam?`, an optional token\n * the caller drops, so the filter goes away rather than\n * widening to all of the user's groups.\n * - `@now` → the current instant, ISO-8601\n * - `@today` → today at 00:00, `YYYY-MM-DD` (date-prefix comparable)\n * - `@today±Nd` → relative-date arithmetic at day granularity: N days\n * from today (e.g. `@today-30d`, `@today+7d`)\n * - `@monthStart` → first day of the current month, `YYYY-MM-DD`\n * - `@monthEnd` → last day of the current month, `YYYY-MM-DD`; on a\n * date-time field use `lt: '@nextMonthStart'` instead,\n * since `lte` a date stops at that day's midnight\n * - `@nextMonthStart` → first day of the next month, `YYYY-MM-DD`\n * - `@quarterStart` → first day of the current quarter, `YYYY-MM-DD`\n * - `@yearStart` → first day of the current year, `YYYY-MM-DD`\n * - `@currentFiscalYear` → the current calendar year as a number string, e.g. `2026`\n * - `@range.from` / `@range.to` / `@range.preset` → the active date range a\n * widget passes in `ctx.range` (CnStatWidget: its own\n * picker, else the dashboard's). A trailing `?` marks it\n * optional, as for `@workspace.<key>?`.\n * - `@objectId` → the current detail-page object's id (needs `ctx`)\n * - `@object.<field>` → a field off the current detail-page object (needs `ctx`)\n * - `@workspace.<key>` → a value off the page-level workspace context (needs `ctx.workspace`)\n * - `@config.<key>` → a value off the page-level app config (needs `ctx.config`)\n * - `@context.<name>.<path>` → a value off a record the detail page reads beside\n * the loaded one (needs `ctx.context`); left as written\n * while that record is not read\n *\n * `@objectId` / `@object.<field>` are OBJECT-CONTEXT tokens: they resolve only\n * when a `ctx` `{ objectId, object }` is supplied (a detail page provides it via\n * the `cnObjectContext` inject). `@workspace.<key>` is a WORKSPACE-CONTEXT token:\n * it resolves a key off `ctx.workspace` (the reactive `cnWorkspaceContext` a\n * dashboard/workspace page provides) so a list widget can react to page-level\n * state another widget writes (e.g. a selected client). Without the matching\n * context the tokens pass through unchanged — and an UNRESOLVED `@workspace.*`\n * token signals \"no selection yet\" to the caller (see {@link hasUnresolvedTokens}).\n *\n * `@config.<key>` is an APP-CONFIG token: it resolves a key off `ctx.config` (the\n * page-level app config a dashboard/detail page provides via `cnAppConfig` — e.g.\n * a reporting `currency` captured by the setup wizard). Like `@workspace.<key>`, a\n * trailing `?` marks it optional. An UNRESOLVED required `@config.<key>` passes\n * through unchanged; this lets `format: { currency: '@config.currency' }` fall\n * back to a literal default when the config is unset.\n *\n * IN-lists: a filter value MAY be an ARRAY (`{ status: ['open', 'pending'] }`,\n * or the explicit operator form `{ status: { in: [...] } }`). Tokens inside the\n * array are resolved item-by-item (`{ assignee: ['@me', 'shared'] }` works).\n * OpenRegister expects an IN-list as repeated bracket params\n * (`status[]=open&status[]=pending` — the same shape `buildQueryString` /\n * `useObjectStore` send), so widget fetchers serialize a resolved array as\n * repeated `field[]` params, never as a JSON blob or a single joined string.\n *\n * @module utils/resolveFilterTokens\n */\n\nimport { getCurrentUser } from '@nextcloud/auth'\n// userGroupsPeek, not widgetVisibility: that one imports @nextcloud/axios, and\n// this resolver runs on public pages and in node (see userGroupsPeek.js).\nimport { peekMyTeam } from './myTeam.js'\nimport { readPath } from './readPath.js'\nimport { TODAY_DELTA_RE } from './sentinelTokens.js'\nimport { peekCurrentUserGroups } from './userGroupsPeek.js'\n\n/** The filter token for the current user's group ids. */\nexport const MY_GROUPS_TOKEN = '@myGroups'\n\n/** The filter token for the current user's primary team. */\nexport const MY_TEAM_TOKEN = '@myTeam'\n\n/**\n * Resolve `@myTeam`: the team's group id, or the ids of several teams when the\n * app answers a list (an IN filter); `@myTeam` while it is being read (the\n * caller waits); `@myTeam?` for a user in no team (the caller drops the key).\n *\n * @spec openspec/changes/saved-view-tokens-my-team/specs/schema-utilities/spec.md#requirement-myteam-resolves-to-the-current-users-primary-team\n * @param {{myTeam?: (string|string[])}} [ctx] Optional context; `ctx.myTeam` wins.\n * @return {string|string[]} The group id(s) or the token.\n */\nfunction resolveMyTeam(ctx) {\n\tconst team = ctx && (typeof ctx.myTeam === 'string' || Array.isArray(ctx.myTeam)) ? ctx.myTeam : peekMyTeam()\n\tif (team === null) {\n\t\treturn MY_TEAM_TOKEN\n\t}\n\treturn team === '' ? `${MY_TEAM_TOKEN}?` : team\n}\n\n/**\n * Resolve `@myGroups`: the current user's group ids, or the token itself while\n * they are loading or when there are none (an empty IN list would match every\n * row, so \"no team\" must mean \"wait\", never \"everything\").\n *\n * @spec openspec/changes/nextcloud-group-surfaces/specs/schema-utilities/spec.md#requirement-mygroups-resolves-to-the-current-users-group-ids\n * @param {{myGroups?: string[]}} [ctx] Optional context; `ctx.myGroups` wins.\n * @return {string[]|string} The group ids, or `'@myGroups'` when unresolved.\n */\nfunction resolveMyGroups(ctx) {\n\tlet groups = ctx && Array.isArray(ctx.myGroups) ? ctx.myGroups : null\n\tif (groups === null) {\n\t\ttry {\n\t\t\tgroups = peekCurrentUserGroups()\n\t\t} catch {\n\t\t\tgroups = null\n\t\t}\n\t}\n\tconst ids = Array.isArray(groups)\n\t\t? groups.filter((g) => typeof g === 'string' && g !== '')\n\t\t: []\n\treturn ids.length > 0 ? [...ids] : MY_GROUPS_TOKEN\n}\n\n/**\n * Format a Date as `YYYY-MM-DD` (local).\n *\n * @param {Date} d The date.\n * @return {string} The date-only string.\n */\nfunction ymd(d) {\n\tconst m = String(d.getMonth() + 1).padStart(2, '0')\n\tconst day = String(d.getDate()).padStart(2, '0')\n\treturn `${d.getFullYear()}-${m}-${day}`\n}\n\n/**\n * Fill each `{@config.<key>}` inside a token from `ctx.config`, so a token can\n * take an admin setting (`@today-{@config.lead_stale_threshold_days}d`). The\n * token comes back unchanged when any key is missing from the config.\n *\n * @param {string} token The token.\n * @param {object} [ctx] The token context.\n * @return {string} The token with the config values in.\n * @spec openspec/changes/pl4-cell-rules/specs/pl4-cell-rules/spec.md#requirement-a-token-can-take-a-config-value\n */\nfunction fillConfigInToken(token, ctx) {\n\tconst config = (ctx && ctx.config) || {}\n\tlet missing = false\n\tconst filled = token.replace(/\\{@config\\.([A-Za-z0-9_.-]+)\\}/g, (whole, key) => {\n\t\tconst value = config[key]\n\t\tif (value === undefined || value === null || value === '') {\n\t\t\tmissing = true\n\t\t\treturn whole\n\t\t}\n\t\treturn String(value)\n\t})\n\treturn missing ? token : filled\n}\n\n/**\n * Resolve a single filter value if it is a dynamic `@`-token, else pass through.\n *\n * @param {unknown} v The candidate value.\n * @param {{objectId?: (string|number), object?: object, workspace?: object, config?: object, range?: object, myGroups?: string[]}} [ctx] Optional\n * context for `@objectId` / `@object.<field>` (detail page),\n * `@workspace.<key>` (page-level workspace state), and `@config.<key>`\n * (page-level app config) tokens.\n * @return {unknown} The resolved value.\n */\nexport function resolveFilterValue(v, ctx) {\n\tif (typeof v !== 'string' || v.charAt(0) !== '@') {\n\t\treturn v\n\t}\n\tif (v.includes('{@config.')) {\n\t\tconst filled = fillConfigInToken(v, ctx)\n\t\treturn filled === v ? v : resolveFilterValue(filled, ctx)\n\t}\n\tconst now = new Date()\n\tif (v === MY_GROUPS_TOKEN) {\n\t\treturn resolveMyGroups(ctx)\n\t}\n\tif (v === MY_TEAM_TOKEN) {\n\t\treturn resolveMyTeam(ctx)\n\t}\n\tif (v === '@objectId') {\n\t\treturn (ctx && ctx.objectId !== undefined && ctx.objectId !== null) ? String(ctx.objectId) : v\n\t}\n\tif (v.startsWith('@object.')) {\n\t\tconst field = v.slice('@object.'.length)\n\t\tif (ctx && ctx.object && field && ctx.object[field] !== undefined) {\n\t\t\treturn ctx.object[field]\n\t\t}\n\t\treturn v\n\t}\n\tif (v.startsWith('@context.')) {\n\t\t// @spec openspec/changes/files-second-line-fields/specs/files-second-line-fields/spec.md#requirement-widget-props-can-read-the-detail-pages-context-records\n\t\tconst found = ctx && ctx.context ? readPath(ctx.context, v.slice('@context.'.length)) : undefined\n\t\treturn found === undefined ? v : found\n\t}\n\tif (v.startsWith('@workspace.')) {\n\t\t// A trailing `?` marks the token OPTIONAL: when unset the caller drops the\n\t\t// filter key (show all) instead of waiting (see hasUnresolvedTokens /\n\t\t// CnObjectListWidget). The `?` is stripped from the key lookup.\n\t\tconst raw = v.slice('@workspace.'.length)\n\t\tconst key = raw.endsWith('?') ? raw.slice(0, -1) : raw\n\t\tif (ctx && ctx.workspace && key && ctx.workspace[key] !== undefined\n\t\t\t&& ctx.workspace[key] !== null && ctx.workspace[key] !== '') {\n\t\t\treturn ctx.workspace[key]\n\t\t}\n\t\treturn v\n\t}\n\tif (v.startsWith('@config.')) {\n\t\t// A trailing `?` marks the token OPTIONAL (same convention as\n\t\t// `@workspace.<key>?`): an unset value lets the caller drop the key. A\n\t\t// required `@config.<key>` that is unset passes through unchanged so a\n\t\t// downstream consumer can fall back to a literal default (e.g.\n\t\t// `format.currency` → `'EUR'`).\n\t\tconst raw = v.slice('@config.'.length)\n\t\tconst key = raw.endsWith('?') ? raw.slice(0, -1) : raw\n\t\tif (ctx && ctx.config && key && ctx.config[key] !== undefined\n\t\t\t&& ctx.config[key] !== null && ctx.config[key] !== '') {\n\t\t\treturn ctx.config[key]\n\t\t}\n\t\treturn v\n\t}\n\tif (v.startsWith('@range.')) {\n\t\t// `@range.from` / `@range.to` / `@range.preset`: the active date range the\n\t\t// caller put in `ctx.range`. CnStatWidget documented these tokens and put\n\t\t// `range` in its endpoint context, but nothing resolved them, so the\n\t\t// literal token stayed in the params, hasUnresolvedTokens blocked the\n\t\t// request, and a card that used its own period picker never loaded. A\n\t\t// trailing `?` marks the token OPTIONAL, the same convention as\n\t\t// `@workspace.<key>?`: unset, the caller drops the key.\n\t\tconst raw = v.slice('@range.'.length)\n\t\tconst key = raw.endsWith('?') ? raw.slice(0, -1) : raw\n\t\tif (ctx && ctx.range && key && ctx.range[key] !== undefined\n\t\t\t&& ctx.range[key] !== null && ctx.range[key] !== '') {\n\t\t\treturn ctx.range[key]\n\t\t}\n\t\treturn v\n\t}\n\tif (v === '@me.displayName' || v === '@me.email') {\n\t\t// The form's own context wins (`ctx.me`, e.g. an email fetched from the\n\t\t// profile); @nextcloud/auth only knows the uid and display name.\n\t\tconst key = v.slice('@me.'.length)\n\t\tif (ctx && ctx.me && ctx.me[key] !== undefined && ctx.me[key] !== null && ctx.me[key] !== '') {\n\t\t\treturn ctx.me[key]\n\t\t}\n\t\ttry {\n\t\t\tconst user = getCurrentUser()\n\t\t\tif (user && user[key]) {\n\t\t\t\treturn user[key]\n\t\t\t}\n\t\t} catch {\n\t\t\t// not signed in: leave the token unresolved\n\t\t}\n\t\treturn v\n\t}\n\tif (v === '@me') {\n\t\t// Canonical source is @nextcloud/auth; window.OC is the fallback for\n\t\t// environments where the auth package can't read the page state (jsdom).\n\t\tlet uid\n\t\ttry {\n\t\t\tconst user = getCurrentUser()\n\t\t\tuid = user && user.uid\n\t\t} catch {\n\t\t\tuid = null\n\t\t}\n\t\treturn uid || (typeof window !== 'undefined' && window.OC && window.OC.currentUser) || ''\n\t}\n\tif (v === '@now') {\n\t\treturn now.toISOString()\n\t}\n\tif (v === '@today') {\n\t\tconst d = new Date(now)\n\t\td.setHours(0, 0, 0, 0)\n\t\treturn ymd(d)\n\t}\n\tif (v === '@monthStart') {\n\t\treturn ymd(new Date(now.getFullYear(), now.getMonth(), 1))\n\t}\n\tif (v === '@monthEnd') {\n\t\t// Day 0 of the next month is the last day of this one.\n\t\treturn ymd(new Date(now.getFullYear(), now.getMonth() + 1, 0))\n\t}\n\tif (v === '@nextMonthStart') {\n\t\treturn ymd(new Date(now.getFullYear(), now.getMonth() + 1, 1))\n\t}\n\tif (v === '@quarterStart') {\n\t\treturn ymd(new Date(now.getFullYear(), Math.floor(now.getMonth() / 3) * 3, 1))\n\t}\n\tif (v === '@yearStart') {\n\t\treturn ymd(new Date(now.getFullYear(), 0, 1))\n\t}\n\tif (v === '@currentFiscalYear') {\n\t\treturn String(now.getFullYear())\n\t}\n\tconst m = v.match(TODAY_DELTA_RE)\n\tif (m) {\n\t\tconst d = new Date(now)\n\t\td.setHours(0, 0, 0, 0)\n\t\td.setDate(d.getDate() + Number(m[1]))\n\t\treturn ymd(d)\n\t}\n\treturn v\n}\n\n/**\n * Whether a value is an UNRESOLVED OPTIONAL token — a string still shaped like\n * `@workspace.<key>?` or `@config.<key>?` after token resolution (the `?` marks\n * it as \"drop me when unset\"). Callers strip such keys from the filter so the\n * list shows all rows rather than waiting for a selection / a config value.\n *\n * @param {unknown} v A (possibly resolved) filter value.\n * @return {boolean}\n */\nexport function isOptionalUnresolved(v) {\n\treturn typeof v === 'string'\n\t\t&& (v.startsWith('@workspace.') || v.startsWith('@config.') || v.startsWith('@range.') || v === `${MY_TEAM_TOKEN}?`)\n\t\t&& v.endsWith('?')\n}\n\n/**\n * Return a copy of a resolved filter map with every UNRESOLVED OPTIONAL\n * workspace token (`@workspace.<key>?` left as-is) removed. Required tokens and\n * concrete values are kept untouched. Inside an IN-list array, unresolved\n * optional ITEMS are dropped; a key whose array empties out is dropped whole\n * (an empty IN-list means \"no constraint\", not \"match nothing\").\n *\n * @param {object} filter A filter map already passed through {@link resolveFilterTokens}.\n * @return {object} The filter without optional-unresolved keys.\n */\nexport function dropOptionalUnresolved(filter) {\n\tif (!filter || typeof filter !== 'object') {\n\t\treturn filter\n\t}\n\tconst out = {}\n\tfor (const [k, v] of Object.entries(filter)) {\n\t\tif (isOptionalUnresolved(v)) {\n\t\t\tcontinue\n\t\t}\n\t\tif (Array.isArray(v)) {\n\t\t\tconst items = v.filter((item) => !isOptionalUnresolved(item))\n\t\t\tif (items.length > 0) {\n\t\t\t\tout[k] = items\n\t\t\t}\n\t\t} else if (v && typeof v === 'object') {\n\t\t\tconst inner = {}\n\t\t\tfor (const [op, ov] of Object.entries(v)) {\n\t\t\t\tif (Array.isArray(ov)) {\n\t\t\t\t\tconst items = ov.filter((item) => !isOptionalUnresolved(item))\n\t\t\t\t\tif (items.length > 0) {\n\t\t\t\t\t\tinner[op] = items\n\t\t\t\t\t}\n\t\t\t\t} else if (!isOptionalUnresolved(ov)) {\n\t\t\t\t\tinner[op] = ov\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (Object.keys(inner).length > 0) {\n\t\t\t\tout[k] = inner\n\t\t\t}\n\t\t} else {\n\t\t\tout[k] = v\n\t\t}\n\t}\n\treturn out\n}\n\n/**\n * Whether a resolved filter map still carries an unresolved `@`-token. Used by\n * context-bound widgets to detect \"the page state this widget depends on isn't\n * set yet\" (e.g. a client-overview list whose `client` filter is still the raw\n * `@workspace.selectedClient` because no client is selected) and skip the query\n * / render a prompt instead of fetching the whole register.\n *\n * OPTIONAL tokens (`@workspace.<key>?`) are NOT counted — they are meant to be\n * dropped, not waited on (see {@link dropOptionalUnresolved}).\n *\n * @param {object} filter A filter map already passed through {@link resolveFilterTokens}.\n * @return {boolean} True when any value is still a (non-optional) string beginning with `@`.\n */\nexport function hasUnresolvedTokens(filter) {\n\tif (!filter || typeof filter !== 'object') {\n\t\treturn false\n\t}\n\tconst blocking = (x) => typeof x === 'string' && x.charAt(0) === '@' && !isOptionalUnresolved(x)\n\tconst anyBlocking = (v) => {\n\t\tif (blocking(v)) {\n\t\t\treturn true\n\t\t}\n\t\tif (Array.isArray(v)) {\n\t\t\treturn v.some(blocking)\n\t\t}\n\t\treturn false\n\t}\n\tfor (const v of Object.values(filter)) {\n\t\tif (anyBlocking(v)) {\n\t\t\treturn true\n\t\t}\n\t\tif (v && typeof v === 'object' && !Array.isArray(v)) {\n\t\t\tfor (const ov of Object.values(v)) {\n\t\t\t\tif (anyBlocking(ov)) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn false\n}\n\n/**\n * Resolve every dynamic `@`-token in a filter map (equality, operator, and\n * IN-list array shapes). Array values resolve item-by-item so a list can mix\n * tokens and literals (`{ assignee: ['@me', 'shared'] }`).\n *\n * @param {object} filter The filter map (`{ field: value | value[] | { op: value | value[] } }`).\n * @param {{objectId?: (string|number), object?: object, workspace?: object, config?: object, range?: object}} [ctx] Optional\n * context forwarded to {@link resolveFilterValue} for `@objectId` /\n * `@object.<field>` / `@workspace.<key>` / `@config.<key>` tokens.\n * @return {object} A new filter map with tokens resolved.\n */\nexport function resolveFilterTokens(filter, ctx) {\n\tif (!filter || typeof filter !== 'object') {\n\t\treturn filter\n\t}\n\t// An item that resolves to a list (`@myGroups`) is spread in place, so\n\t// `['@myGroups', 'archive']` stays one flat IN list.\n\tconst resolveOne = (v) => (Array.isArray(v)\n\t\t? v.flatMap((item) => {\n\t\t\t\tconst r = resolveFilterValue(item, ctx)\n\t\t\t\treturn Array.isArray(r) ? r : [r]\n\t\t\t})\n\t\t: resolveFilterValue(v, ctx))\n\tconst out = {}\n\tfor (const [k, v] of Object.entries(filter)) {\n\t\tif (v && typeof v === 'object' && !Array.isArray(v)) {\n\t\t\tconst inner = {}\n\t\t\tfor (const [op, ov] of Object.entries(v)) {\n\t\t\t\tinner[op] = resolveOne(ov)\n\t\t\t}\n\t\t\tout[k] = inner\n\t\t} else {\n\t\t\tout[k] = resolveOne(v)\n\t\t}\n\t}\n\treturn out\n}\n\n/**\n * Recursively resolve `@`-tokens inside an arbitrary JSON value — objects\n * and arrays at ANY depth, unlike {@link resolveFilterTokens} which only\n * understands the flat filter-map shape (equality / operator / IN-list, one\n * level of nesting). Used by the `api-call` action's `payload`: a\n * Filinq-style generation body like\n * `{ dataRefs: [{ register: 'crm', schema: 'lead', id: '@objectId' }] }`\n * needs the token resolved inside a nested array of objects, which the\n * shallow filter-map resolver can't reach.\n *\n * @param {unknown} value The value to resolve — object / array / primitive.\n * @param {{objectId?: (string|number), object?: object, workspace?: object, config?: object, range?: object}} [ctx] Optional\n * context forwarded to {@link resolveFilterValue}.\n * @return {unknown} A new value with every string leaf token-resolved (structure preserved).\n */\nexport function resolveDeepTokens(value, ctx) {\n\tif (Array.isArray(value)) {\n\t\treturn value.map((v) => resolveDeepTokens(v, ctx))\n\t}\n\tif (value && typeof value === 'object') {\n\t\tconst out = {}\n\t\tfor (const [k, v] of Object.entries(value)) {\n\t\t\tout[k] = resolveDeepTokens(v, ctx)\n\t\t}\n\t\treturn out\n\t}\n\treturn resolveFilterValue(value, ctx)\n}\n\n/**\n * Deep-tree counterpart to {@link hasUnresolvedTokens}: whether an\n * already-{@link resolveDeepTokens}-resolved value still carries an\n * unresolved, non-optional `@`-token anywhere inside it (any depth). Used to\n * BLOCK an `api-call` whose `payload` has a required token (typically\n * `@objectId` / `@object.<field>`) that failed to resolve, instead of\n * silently sending the literal token string to the server.\n *\n * @param {unknown} value The (already deep-resolved) value.\n * @return {boolean} True when a required token is still unresolved.\n */\nexport function hasUnresolvedDeepTokens(value) {\n\tif (Array.isArray(value)) {\n\t\treturn value.some(hasUnresolvedDeepTokens)\n\t}\n\tif (value && typeof value === 'object') {\n\t\treturn Object.values(value).some(hasUnresolvedDeepTokens)\n\t}\n\treturn typeof value === 'string' && value.charAt(0) === '@' && !isOptionalUnresolved(value)\n}\n\n/**\n * Deep-tree counterpart to {@link dropOptionalUnresolved}: strips unresolved\n * OPTIONAL tokens (`@workspace.<key>?` / `@config.<key>?` left as-is after\n * resolution) out of an arbitrary JSON value at any depth. An object key\n * whose value is an unresolved optional token is dropped entirely; an array\n * item that resolves unresolved-optional is filtered out.\n *\n * @param {unknown} value The (already {@link resolveDeepTokens}-resolved) value.\n * @return {unknown} The value with unresolved-optional leaves removed.\n */\nexport function dropOptionalUnresolvedDeep(value) {\n\tif (Array.isArray(value)) {\n\t\treturn value\n\t\t\t.filter((v) => !isOptionalUnresolved(v))\n\t\t\t.map((v) => dropOptionalUnresolvedDeep(v))\n\t}\n\tif (value && typeof value === 'object') {\n\t\tconst out = {}\n\t\tfor (const [k, v] of Object.entries(value)) {\n\t\t\tif (isOptionalUnresolved(v)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tout[k] = dropOptionalUnresolvedDeep(v)\n\t\t}\n\t\treturn out\n\t}\n\treturn value\n}\n"],"names":[],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAQA;AACA;AACY,MAAC,eAAe,GAAG,YAAW;AAC1C;AACA;AACY,MAAC,aAAa,GAAG,UAAS;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,aAAa,CAAC,GAAG,EAAE;AAC5B,CAAC,MAAM,IAAI,GAAG,GAAG,KAAK,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,UAAU,GAAE;AAC9G,CAAC,IAAI,IAAI,KAAK,IAAI,EAAE;AACpB,EAAE,OAAO,aAAa;AACtB,EAAE;AACF,CAAC,OAAO,IAAI,KAAK,EAAE,GAAG,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI;AAChD,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,eAAe,CAAC,GAAG,EAAE;AAC9B,CAAC,IAAI,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,QAAQ,GAAG,KAAI;AACtE,CAAC,IAAI,MAAM,KAAK,IAAI,EAAE;AACtB,EAAE,IAAI;AACN,GAAG,MAAM,GAAG,qBAAqB,GAAE;AACnC,GAAG,CAAC,MAAM;AACV,GAAG,MAAM,GAAG,KAAI;AAChB,GAAG;AACH,EAAE;AACF,CAAC,MAAM,GAAG,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"}
|
|
@@ -224,6 +224,41 @@ function daysAfter(days, now) {
|
|
|
224
224
|
return date
|
|
225
225
|
}
|
|
226
226
|
|
|
227
|
+
/**
|
|
228
|
+
* Today plus that many days, as a date input's value.
|
|
229
|
+
*
|
|
230
|
+
* @param {unknown} days Whole days, 1 or more.
|
|
231
|
+
* @param {Date} [now] What counts as today.
|
|
232
|
+
* @return {string} `yyyy-mm-dd`, '' without a positive whole number.
|
|
233
|
+
* @spec openspec/changes/days-input-as-date/specs/transition-inputs/spec.md
|
|
234
|
+
*/
|
|
235
|
+
function dayAfterIso(days, now = new Date()) {
|
|
236
|
+
const date = daysAfter(days, now);
|
|
237
|
+
if (date === null) {
|
|
238
|
+
return ''
|
|
239
|
+
}
|
|
240
|
+
const pad = (number) => String(number).padStart(2, '0');
|
|
241
|
+
return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* The whole days from today to a date input's value, at least 1.
|
|
246
|
+
*
|
|
247
|
+
* @param {unknown} iso A `yyyy-mm-dd` date.
|
|
248
|
+
* @param {Date} [now] What counts as today.
|
|
249
|
+
* @return {string} The days, '' without a date.
|
|
250
|
+
* @spec openspec/changes/days-input-as-date/specs/transition-inputs/spec.md
|
|
251
|
+
*/
|
|
252
|
+
function daysUntilIso(iso, now = new Date()) {
|
|
253
|
+
const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(String(iso ?? '').trim());
|
|
254
|
+
if (!match) {
|
|
255
|
+
return ''
|
|
256
|
+
}
|
|
257
|
+
const target = Date.UTC(Number(match[1]), Number(match[2]) - 1, Number(match[3]));
|
|
258
|
+
const today = Date.UTC(now.getFullYear(), now.getMonth(), now.getDate());
|
|
259
|
+
return String(Math.max(1, Math.round((target - today) / 86400000)))
|
|
260
|
+
}
|
|
261
|
+
|
|
227
262
|
/**
|
|
228
263
|
* A date as a reader sees it: day, short month and year.
|
|
229
264
|
*
|
|
@@ -291,6 +326,9 @@ function fillInputTemplate(template, values, now = new Date()) {
|
|
|
291
326
|
* in that other input.
|
|
292
327
|
* - `preview: { label, template, note, testid }`: a line under the input,
|
|
293
328
|
* filled by `fillInputTemplate` and shown only once it resolves.
|
|
329
|
+
* - `dateField: { label, note, testid }`: on a days input, an editable date
|
|
330
|
+
* under it, today plus the days; a chosen date sets the days to the whole
|
|
331
|
+
* days from today, at least 1. `dateValue` carries the date.
|
|
294
332
|
* - `default`: the starting value.
|
|
295
333
|
* - Presentation: `labelOutside`, `id`, `note`, `wide`, `testid`, `rows`,
|
|
296
334
|
* `placeholder`.
|
|
@@ -303,7 +341,7 @@ function fillInputTemplate(template, values, now = new Date()) {
|
|
|
303
341
|
* @param {string} [options.register] Register the reference pickers fall back to.
|
|
304
342
|
* @param {object} [options.context] What `optionsSource` reads.
|
|
305
343
|
* @param {object} [options.values] The values so far.
|
|
306
|
-
* @param {Date} [options.now] What counts as today, for previews
|
|
344
|
+
* @param {Date} [options.now] What counts as today, for previews and `dateField`.
|
|
307
345
|
* @return {Array<object>} The descriptors.
|
|
308
346
|
*/
|
|
309
347
|
function resolveInputFields(declared, { schema = null, register = '', context = {}, values = {}, now } = {}) {
|
|
@@ -346,6 +384,9 @@ function resolveInputFields(declared, { schema = null, register = '', context =
|
|
|
346
384
|
field.previewText = preview && typeof preview === 'object'
|
|
347
385
|
? fillInputTemplate(preview.template, values, now)
|
|
348
386
|
: '';
|
|
387
|
+
field.dateValue = field.input.dateField && typeof field.input.dateField === 'object'
|
|
388
|
+
? dayAfterIso(values[field.key], now)
|
|
389
|
+
: '';
|
|
349
390
|
}
|
|
350
391
|
|
|
351
392
|
return fields
|
|
@@ -489,5 +530,5 @@ function readTransitionInputs(declared, values, options = {}) {
|
|
|
489
530
|
return { complete: inputFieldsComplete(fields, current), data }
|
|
490
531
|
}
|
|
491
532
|
|
|
492
|
-
export { OTHER_OPTION_VALUE, applyTemplateText, clampWidget, declaredOptions, fillInputTemplate, initialInputValues, inputFieldsComplete, isInputFilled, isSubInputFilled, normaliseInputs, readTransitionInputs, resolveInputFields, submittedValue };
|
|
533
|
+
export { OTHER_OPTION_VALUE, applyTemplateText, clampWidget, dayAfterIso, daysUntilIso, declaredOptions, fillInputTemplate, initialInputValues, inputFieldsComplete, isInputFilled, isSubInputFilled, normaliseInputs, readTransitionInputs, resolveInputFields, submittedValue };
|
|
493
534
|
//# sourceMappingURL=transitionInputs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transitionInputs.js","sources":["../../../src/utils/transitionInputs.js"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2026 Conduction B.V.\n * SPDX-License-Identifier: EUPL-1.2\n *\n * The declared inputs of a transition or an act, resolved into the fields a\n * form draws, the check that they are complete and the values they send.\n *\n * Shared by CnTransitionInputDialog (the inputs in their own dialog) and\n * CnTransitionInputFields (the same inputs drawn wherever a host puts them,\n * such as under the chosen card of a list of acts), so the two never decide\n * differently whether a form may be confirmed.\n *\n * @module utils/transitionInputs\n * @spec openspec/changes/dq-abstract-forms/specs/transition-inputs/spec.md\n */\n\nimport { formatDateForDisplay } from './dateDisplay.js'\nimport { readPath } from './readPath.js'\nimport { fieldsFromSchema } from './schema.js'\n\n/**\n * The picker value of an input's \"Other\" entry. Never sent: see `submittedValue`.\n *\n * @type {string}\n */\nexport const OTHER_OPTION_VALUE = '__other'\n\n/** Widgets an input may name outright, whatever the schema says. */\nconst DECLARED_WIDGETS = ['text', 'textarea', 'number', 'date', 'select', 'template']\n\n/**\n * A non-empty trimmed string, or null.\n *\n * @param {unknown} value The value.\n * @return {string|null}\n */\nfunction text(value) {\n\treturn typeof value === 'string' && value.trim() !== '' ? value.trim() : null\n}\n\n/**\n * The choices an input declares, as `[{ value, label }]`, or null when it\n * declares none. An option without a value is dropped, because it cannot be\n * sent; one without a label shows its value.\n *\n * @param {unknown} options The input's declared `options`.\n * @return {Array<{value: string, label: string}>|null}\n */\nexport function declaredOptions(options) {\n\tif (!Array.isArray(options)) {\n\t\treturn null\n\t}\n\tconst usable = options\n\t\t.filter((option) => option && typeof option === 'object'\n\t\t\t&& (typeof option.value === 'string' || typeof option.value === 'number')\n\t\t\t&& String(option.value).trim() !== '')\n\t\t.map((option) => ({\n\t\t\tvalue: String(option.value),\n\t\t\tlabel: text(option.label) || String(option.value),\n\t\t}))\n\treturn usable.length > 0 ? usable : null\n}\n\n/**\n * The declared inputs, normalised. An input without a `field` is dropped.\n *\n * @param {unknown} declared The declared `inputs`.\n * @return {Array<object>} The inputs.\n */\nexport function normaliseInputs(declared) {\n\tif (!Array.isArray(declared)) {\n\t\treturn []\n\t}\n\treturn declared\n\t\t.filter((input) => input && typeof input.field === 'string' && input.field !== '')\n\t\t.map((input) => ({\n\t\t\t...input,\n\t\t\tfield: input.field,\n\t\t\trequired: input.required === true,\n\t\t\tpicker: input.picker && typeof input.picker === 'object' ? input.picker : null,\n\t\t\tfields: Array.isArray(input.fields) ? input.fields.filter((f) => typeof f === 'string') : null,\n\t\t\tlabel: text(input.label),\n\t\t\toptions: declaredOptions(input.options),\n\t\t\twidget: DECLARED_WIDGETS.includes(input.widget) ? input.widget : null,\n\t\t\toptionsSource: text(input.optionsSource),\n\t\t\tother: input.other && typeof input.other === 'object' && text(input.other.label) ? input.other : null,\n\t\t}))\n}\n\n/**\n * Clamp a `fieldsFromSchema()` widget to the minimal set the inputs draw.\n * Anything richer (select, user picker, …) degrades to a plain text input\n * rather than pulling a form engine in.\n *\n * @param {string} widget The resolved widget name.\n * @return {'text'|'textarea'|'number'|'checkbox'}\n */\nexport function clampWidget(widget) {\n\tif (widget === 'checkbox' || widget === 'switch') {\n\t\treturn 'checkbox'\n\t}\n\tif (widget === 'textarea' || widget === 'number') {\n\t\treturn widget\n\t}\n\treturn 'text'\n}\n\n/**\n * The choices an `optionsSource` input reads off the context: each row's\n * `optionValue` (default `value`) and `optionLabel` (default `label`), with\n * the rows kept so `helperFrom` can read another key of the picked one.\n *\n * @param {object} input The normalised input.\n * @param {object} context What the source path is read from.\n * @return {{options: Array<{value: string, label: string}>, rows: Array<object>}}\n */\nfunction sourcedOptions(input, context) {\n\tconst list = readPath(context || {}, input.optionsSource)\n\tconst valueKey = text(input.optionValue) || 'value'\n\tconst labelKey = text(input.optionLabel) || 'label'\n\tconst options = []\n\tconst rows = []\n\tfor (const row of Array.isArray(list) ? list : []) {\n\t\tconst value = row && typeof row === 'object' ? row[valueKey] : row\n\t\tif ((typeof value !== 'string' && typeof value !== 'number') || String(value).trim() === '') {\n\t\t\tcontinue\n\t\t}\n\t\tconst label = row && typeof row === 'object' ? row[labelKey] : null\n\t\toptions.push({ value: String(value), label: text(label) || String(value) })\n\t\trows.push(row)\n\t}\n\treturn { options, rows }\n}\n\n/**\n * The descriptor of an object input: its sub-properties (narrowed to the\n * input's `fields` when it names them), each with its own widget. A\n * sub-field is required when the input names it in `fields` and the\n * sub-schema lists it as required, or when the whole input is required and\n * it is the only one asked.\n *\n * @param {object} input The normalised input.\n * @param {object} prop The object property's schema.\n * @return {object} The field descriptor.\n */\nfunction objectField(input, prop) {\n\tconst subs = fieldsFromSchema(prop, { includeReadOnly: true, ...(input.fields ? { include: input.fields } : {}) })\n\tconst required = Array.isArray(prop.required) ? prop.required : []\n\tconst only = subs.length === 1\n\treturn {\n\t\tkey: input.field,\n\t\tlabel: prop.title || input.field,\n\t\tdescription: prop.description || '',\n\t\twidget: 'object',\n\t\trequired: input.required,\n\t\tsubFields: subs.map((sub) => ({\n\t\t\t...sub,\n\t\t\twidget: clampWidget(sub.widget),\n\t\t\trequired: (input.fields ? required.includes(sub.key) : sub.required === true) || (input.required && only),\n\t\t})),\n\t}\n}\n\n/**\n * The field one input resolves to before the context is applied.\n *\n * @param {object} input The normalised input.\n * @param {object} resolved The schema's fields for the declared keys.\n * @param {object} options What the field is resolved against.\n * @param {object|null} options.schema The object's JSON Schema.\n * @param {string} options.register Register the reference pickers fall back to.\n * @param {object} options.context What `optionsSource` reads.\n * @return {object} The field descriptor.\n */\nfunction baseField(input, resolved, { schema, register, context }) {\n\tconst field = resolved.find((f) => f.key === input.field)\n\tconst label = input.label || (field && field.label) || input.field\n\tconst description = text(input.description) || (field && field.description) || ''\n\n\tif (input.widget === 'template') {\n\t\treturn { key: input.field, label, description, widget: 'template', required: false }\n\t}\n\tif (input.optionsSource) {\n\t\tconst { options, rows } = sourcedOptions(input, context)\n\t\treturn { key: input.field, label, description, widget: 'select', options, rows, required: input.required }\n\t}\n\tif (input.options) {\n\t\treturn { key: input.field, label, description, widget: 'select', options: input.options, rows: [], required: input.required }\n\t}\n\tif (input.widget && input.widget !== 'select') {\n\t\treturn { key: input.field, label, description, widget: input.widget, required: input.required }\n\t}\n\tconst prop = (schema && schema.properties && schema.properties[input.field]) || null\n\tif (prop && prop.type === 'object' && prop.properties && typeof prop.properties === 'object') {\n\t\treturn objectField(input, prop)\n\t}\n\tif (!field) {\n\t\treturn { key: input.field, label, description, widget: 'text', required: input.required }\n\t}\n\tif (field.reference && field.reference.multiple !== true) {\n\t\tconst referenceRegister = field.reference.register || register\n\t\tif (referenceRegister !== '') {\n\t\t\treturn { ...field, label, widget: 'reference', referenceRegister, picker: input.picker, required: input.required }\n\t\t}\n\t}\n\treturn { ...field, label, widget: clampWidget(field.widget), required: input.required }\n}\n\n/**\n * A date `days` whole days after `now`, or null without a positive count.\n *\n * @param {unknown} days The count.\n * @param {Date} now Today.\n * @return {Date|null}\n */\nfunction daysAfter(days, now) {\n\tconst count = Number.parseInt(String(days ?? ''), 10)\n\tif (!Number.isFinite(count) || count < 1) {\n\t\treturn null\n\t}\n\tconst date = new Date(now.getTime())\n\tdate.setDate(date.getDate() + count)\n\treturn date\n}\n\n/**\n * A date as a reader sees it: day, short month and year.\n *\n * @param {Date|string} value The date.\n * @return {string} The text, '' when not a date.\n */\nfunction dateText(value) {\n\tconst shown = formatDateForDisplay(value, { dateOptions: { day: 'numeric', month: 'short', year: 'numeric' } })\n\treturn shown ? shown.text : ''\n}\n\n/**\n * Fill a preview template from the input values.\n *\n * Tokens are `{field}`, `{field|date}`, `{today|date}` and\n * `{today+field|date}` (today plus that many days). A token that resolves\n * to nothing empties the whole preview, so a half-filled sentence is never\n * shown: `{today+days|date}` says nothing until `days` is a positive whole\n * number.\n *\n * @param {string} template The template.\n * @param {object} values The input values.\n * @param {Date} [now] What counts as today.\n * @return {string} The filled text, or ''.\n */\nexport function fillInputTemplate(template, values, now = new Date()) {\n\tif (typeof template !== 'string' || template === '') {\n\t\treturn ''\n\t}\n\tlet empty = false\n\tconst filled = template.replace(/\\{([^{}|]+)(?:\\|(date))?\\}/g, (whole, expression, format) => {\n\t\tconst name = expression.trim()\n\t\tlet value\n\t\tif (name === 'today') {\n\t\t\tvalue = new Date(now.getTime())\n\t\t} else if (name.startsWith('today+')) {\n\t\t\tvalue = daysAfter((values || {})[name.slice(6).trim()], now)\n\t\t} else {\n\t\t\tvalue = (values || {})[name]\n\t\t}\n\t\tif (value === null || value === undefined || String(value).trim() === '') {\n\t\t\tempty = true\n\t\t\treturn ''\n\t\t}\n\t\tconst shown = format === 'date' ? dateText(value) : String(value)\n\t\tif (shown === '') {\n\t\t\tempty = true\n\t\t}\n\t\treturn shown\n\t})\n\treturn empty ? '' : filled\n}\n\n/**\n * The descriptors of the declared inputs, with the context applied.\n *\n * Next to what the schema says, an input may declare:\n * - `widget`: `text`, `textarea`, `number`, `date`, `select` or `template`.\n * - `optionsSource`: a dot path into `context` holding the rows to pick from,\n * read through `optionValue` and `optionLabel`. With no rows the input is\n * hidden and asks nothing.\n * - `other: { label, input }`: adds an \"Other\" entry; the input it names is\n * only shown (and only asked) when this picker is hidden or Other is picked.\n * - `helperFrom: { input, key }`: the helper text is `key` of the row picked\n * in that other input.\n * - `preview: { label, template, note, testid }`: a line under the input,\n * filled by `fillInputTemplate` and shown only once it resolves.\n * - `default`: the starting value.\n * - Presentation: `labelOutside`, `id`, `note`, `wide`, `testid`, `rows`,\n * `placeholder`.\n *\n * Every descriptor carries `hidden`; a hidden one is neither drawn nor asked.\n *\n * @param {unknown} declared The declared inputs.\n * @param {object} [options] Options.\n * @param {object|null} [options.schema] The object's JSON Schema.\n * @param {string} [options.register] Register the reference pickers fall back to.\n * @param {object} [options.context] What `optionsSource` reads.\n * @param {object} [options.values] The values so far.\n * @param {Date} [options.now] What counts as today, for previews.\n * @return {Array<object>} The descriptors.\n */\nexport function resolveInputFields(declared, { schema = null, register = '', context = {}, values = {}, now } = {}) {\n\tconst inputs = normaliseInputs(declared)\n\tconst resolved = fieldsFromSchema(schema, { include: inputs.map((input) => input.field), includeReadOnly: true })\n\tconst fields = inputs.map((input) => ({\n\t\t...baseField(input, resolved, { schema, register, context }),\n\t\tinput,\n\t\thidden: false,\n\t}))\n\n\tfor (const field of fields) {\n\t\tconst other = field.input.other\n\t\tif (field.widget !== 'select') {\n\t\t\tcontinue\n\t\t}\n\t\tif (field.input.optionsSource && field.options.length === 0) {\n\t\t\tfield.hidden = true\n\t\t}\n\t\tif (other) {\n\t\t\tfield.options = [...field.options, { value: OTHER_OPTION_VALUE, label: other.label.trim() }]\n\t\t\tconst target = fields.find((candidate) => candidate.key === other.input)\n\t\t\tif (target && !field.hidden && values[field.key] !== OTHER_OPTION_VALUE) {\n\t\t\t\ttarget.hidden = true\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const field of fields) {\n\t\tconst helperFrom = field.input.helperFrom\n\t\tif (helperFrom && typeof helperFrom === 'object') {\n\t\t\tconst source = fields.find((candidate) => candidate.key === helperFrom.input)\n\t\t\tconst picked = source && Array.isArray(source.rows) && !source.hidden\n\t\t\t\t? source.rows[source.options.findIndex((option) => option.value === String(values[source.key] ?? ''))]\n\t\t\t\t: null\n\t\t\tconst helper = picked && typeof picked === 'object' ? picked[helperFrom.key] : null\n\t\t\tfield.description = helper === null || helper === undefined ? field.description : String(helper)\n\t\t}\n\t\tconst preview = field.input.preview\n\t\tfield.previewText = preview && typeof preview === 'object'\n\t\t\t? fillInputTemplate(preview.template, values, now)\n\t\t\t: ''\n\t}\n\n\treturn fields\n}\n\n/**\n * Whether a field holds a value: a checked switch for booleans, a non-blank\n * string otherwise.\n *\n * @param {object} field The descriptor.\n * @param {object} values The values.\n * @return {boolean}\n */\nexport function isInputFilled(field, values) {\n\tconst value = (values || {})[field.key]\n\tif (field.widget === 'checkbox') {\n\t\treturn value === true\n\t}\n\treturn String(value ?? '').trim() !== ''\n}\n\n/**\n * Whether an object input's sub-field holds a value.\n *\n * @param {object} field The object descriptor.\n * @param {object} sub The sub-field descriptor.\n * @param {object} values The values.\n * @return {boolean}\n */\nexport function isSubInputFilled(field, sub, values) {\n\tconst group = (values || {})[field.key]\n\tconst value = group && typeof group === 'object' ? group[sub.key] : undefined\n\treturn sub.widget === 'checkbox' ? value === true : String(value ?? '').trim() !== ''\n}\n\n/**\n * Whether every shown, required field is filled. \"Other\" counts as a pick.\n *\n * @param {Array<object>} fields The descriptors (`resolveInputFields`).\n * @param {object} values The values.\n * @return {boolean}\n */\nexport function inputFieldsComplete(fields, values) {\n\treturn fields.every((field) => {\n\t\tif (field.hidden || field.widget === 'template') {\n\t\t\treturn true\n\t\t}\n\t\tif (field.widget === 'object') {\n\t\t\treturn field.subFields.every((sub) => !sub.required || isSubInputFilled(field, sub, values))\n\t\t}\n\t\treturn !field.required || isInputFilled(field, values)\n\t})\n}\n\n/**\n * A picked value as it is sent: the \"Other\" entry becomes ''.\n *\n * @param {unknown} value The picked value.\n * @return {unknown}\n */\nexport function submittedValue(value) {\n\treturn value === OTHER_OPTION_VALUE ? '' : value\n}\n\n/**\n * The values to start from: each input's `default`, else its schema default,\n * else false for a boolean and '' otherwise. An object input starts from the\n * record's present value, so the sub-fields it asks for show what is there.\n *\n * @param {unknown} declared The declared inputs.\n * @param {object|null} [schema] The object's JSON Schema.\n * @param {object|null} [currentObject] The record.\n * @return {object} The values.\n */\nexport function initialInputValues(declared, schema = null, currentObject = null) {\n\tconst values = {}\n\tconst properties = (schema && schema.properties) || {}\n\tfor (const input of normaliseInputs(declared)) {\n\t\tconst prop = properties[input.field] || {}\n\t\tif (prop.type === 'object' && prop.properties && typeof prop.properties === 'object') {\n\t\t\tconst present = currentObject ? currentObject[input.field] : null\n\t\t\tvalues[input.field] = present && typeof present === 'object' ? { ...present } : {}\n\t\t\tcontinue\n\t\t}\n\t\tif (input.default !== undefined) {\n\t\t\tvalues[input.field] = input.default\n\t\t\tcontinue\n\t\t}\n\t\tvalues[input.field] = prop.default !== undefined\n\t\t\t? prop.default\n\t\t\t: (prop.type === 'boolean' ? false : '')\n\t}\n\treturn values\n}\n\n/**\n * The text a chosen template puts into its `applyTo` input: the template's\n * `body`, else `presets.body`. It never writes over what was already typed,\n * because text lost to a template cannot be got back.\n *\n * @param {object} values The values.\n * @param {string} target The input the template fills.\n * @param {object|null} option The chosen template.\n * @return {object} The new values, or the same object when nothing changes.\n */\nexport function applyTemplateText(values, target, option) {\n\tconst body = option ? (option.body || (option.presets && option.presets.body) || '') : ''\n\tif (!target || typeof body !== 'string' || body === '' || String((values || {})[target] ?? '').trim() !== '') {\n\t\treturn values\n\t}\n\treturn { ...values, [target]: body }\n}\n\n/**\n * Read a host's values against the declared inputs: whether every shown,\n * required input is filled, and the values to send for the inputs that are\n * asked now. A hidden input and a template are left out, a picked \"Other\"\n * is sent as '' and a number input as a number. An object input is sent as\n * it stands (CnTransitionInputDialog merges it over the record).\n *\n * @param {unknown} declared The declared inputs.\n * @param {object} values The values, keyed by field.\n * @param {object} [options] `{ schema, register, context, now }`, as for `resolveInputFields`.\n * @return {{complete: boolean, data: object}}\n * @spec openspec/changes/dq-abstract-forms/specs/transition-inputs/spec.md\n */\nexport function readTransitionInputs(declared, values, options = {}) {\n\tconst current = values || {}\n\tconst fields = resolveInputFields(declared, { ...options, values: current })\n\tconst data = {}\n\tfor (const field of fields) {\n\t\tif (field.hidden || field.widget === 'template') {\n\t\t\tcontinue\n\t\t}\n\t\tlet value = submittedValue(current[field.key])\n\t\tif (field.widget === 'number' && String(value ?? '').trim() !== '' && !Number.isNaN(Number(value))) {\n\t\t\tvalue = Number(value)\n\t\t}\n\t\tdata[field.key] = value\n\t}\n\treturn { complete: inputFieldsComplete(fields, current), data }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"transitionInputs.js","sources":["../../../src/utils/transitionInputs.js"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2026 Conduction B.V.\n * SPDX-License-Identifier: EUPL-1.2\n *\n * The declared inputs of a transition or an act, resolved into the fields a\n * form draws, the check that they are complete and the values they send.\n *\n * Shared by CnTransitionInputDialog (the inputs in their own dialog) and\n * CnTransitionInputFields (the same inputs drawn wherever a host puts them,\n * such as under the chosen card of a list of acts), so the two never decide\n * differently whether a form may be confirmed.\n *\n * @module utils/transitionInputs\n * @spec openspec/changes/dq-abstract-forms/specs/transition-inputs/spec.md\n */\n\nimport { formatDateForDisplay } from './dateDisplay.js'\nimport { readPath } from './readPath.js'\nimport { fieldsFromSchema } from './schema.js'\n\n/**\n * The picker value of an input's \"Other\" entry. Never sent: see `submittedValue`.\n *\n * @type {string}\n */\nexport const OTHER_OPTION_VALUE = '__other'\n\n/** Widgets an input may name outright, whatever the schema says. */\nconst DECLARED_WIDGETS = ['text', 'textarea', 'number', 'date', 'select', 'template']\n\n/**\n * A non-empty trimmed string, or null.\n *\n * @param {unknown} value The value.\n * @return {string|null}\n */\nfunction text(value) {\n\treturn typeof value === 'string' && value.trim() !== '' ? value.trim() : null\n}\n\n/**\n * The choices an input declares, as `[{ value, label }]`, or null when it\n * declares none. An option without a value is dropped, because it cannot be\n * sent; one without a label shows its value.\n *\n * @param {unknown} options The input's declared `options`.\n * @return {Array<{value: string, label: string}>|null}\n */\nexport function declaredOptions(options) {\n\tif (!Array.isArray(options)) {\n\t\treturn null\n\t}\n\tconst usable = options\n\t\t.filter((option) => option && typeof option === 'object'\n\t\t\t&& (typeof option.value === 'string' || typeof option.value === 'number')\n\t\t\t&& String(option.value).trim() !== '')\n\t\t.map((option) => ({\n\t\t\tvalue: String(option.value),\n\t\t\tlabel: text(option.label) || String(option.value),\n\t\t}))\n\treturn usable.length > 0 ? usable : null\n}\n\n/**\n * The declared inputs, normalised. An input without a `field` is dropped.\n *\n * @param {unknown} declared The declared `inputs`.\n * @return {Array<object>} The inputs.\n */\nexport function normaliseInputs(declared) {\n\tif (!Array.isArray(declared)) {\n\t\treturn []\n\t}\n\treturn declared\n\t\t.filter((input) => input && typeof input.field === 'string' && input.field !== '')\n\t\t.map((input) => ({\n\t\t\t...input,\n\t\t\tfield: input.field,\n\t\t\trequired: input.required === true,\n\t\t\tpicker: input.picker && typeof input.picker === 'object' ? input.picker : null,\n\t\t\tfields: Array.isArray(input.fields) ? input.fields.filter((f) => typeof f === 'string') : null,\n\t\t\tlabel: text(input.label),\n\t\t\toptions: declaredOptions(input.options),\n\t\t\twidget: DECLARED_WIDGETS.includes(input.widget) ? input.widget : null,\n\t\t\toptionsSource: text(input.optionsSource),\n\t\t\tother: input.other && typeof input.other === 'object' && text(input.other.label) ? input.other : null,\n\t\t}))\n}\n\n/**\n * Clamp a `fieldsFromSchema()` widget to the minimal set the inputs draw.\n * Anything richer (select, user picker, …) degrades to a plain text input\n * rather than pulling a form engine in.\n *\n * @param {string} widget The resolved widget name.\n * @return {'text'|'textarea'|'number'|'checkbox'}\n */\nexport function clampWidget(widget) {\n\tif (widget === 'checkbox' || widget === 'switch') {\n\t\treturn 'checkbox'\n\t}\n\tif (widget === 'textarea' || widget === 'number') {\n\t\treturn widget\n\t}\n\treturn 'text'\n}\n\n/**\n * The choices an `optionsSource` input reads off the context: each row's\n * `optionValue` (default `value`) and `optionLabel` (default `label`), with\n * the rows kept so `helperFrom` can read another key of the picked one.\n *\n * @param {object} input The normalised input.\n * @param {object} context What the source path is read from.\n * @return {{options: Array<{value: string, label: string}>, rows: Array<object>}}\n */\nfunction sourcedOptions(input, context) {\n\tconst list = readPath(context || {}, input.optionsSource)\n\tconst valueKey = text(input.optionValue) || 'value'\n\tconst labelKey = text(input.optionLabel) || 'label'\n\tconst options = []\n\tconst rows = []\n\tfor (const row of Array.isArray(list) ? list : []) {\n\t\tconst value = row && typeof row === 'object' ? row[valueKey] : row\n\t\tif ((typeof value !== 'string' && typeof value !== 'number') || String(value).trim() === '') {\n\t\t\tcontinue\n\t\t}\n\t\tconst label = row && typeof row === 'object' ? row[labelKey] : null\n\t\toptions.push({ value: String(value), label: text(label) || String(value) })\n\t\trows.push(row)\n\t}\n\treturn { options, rows }\n}\n\n/**\n * The descriptor of an object input: its sub-properties (narrowed to the\n * input's `fields` when it names them), each with its own widget. A\n * sub-field is required when the input names it in `fields` and the\n * sub-schema lists it as required, or when the whole input is required and\n * it is the only one asked.\n *\n * @param {object} input The normalised input.\n * @param {object} prop The object property's schema.\n * @return {object} The field descriptor.\n */\nfunction objectField(input, prop) {\n\tconst subs = fieldsFromSchema(prop, { includeReadOnly: true, ...(input.fields ? { include: input.fields } : {}) })\n\tconst required = Array.isArray(prop.required) ? prop.required : []\n\tconst only = subs.length === 1\n\treturn {\n\t\tkey: input.field,\n\t\tlabel: prop.title || input.field,\n\t\tdescription: prop.description || '',\n\t\twidget: 'object',\n\t\trequired: input.required,\n\t\tsubFields: subs.map((sub) => ({\n\t\t\t...sub,\n\t\t\twidget: clampWidget(sub.widget),\n\t\t\trequired: (input.fields ? required.includes(sub.key) : sub.required === true) || (input.required && only),\n\t\t})),\n\t}\n}\n\n/**\n * The field one input resolves to before the context is applied.\n *\n * @param {object} input The normalised input.\n * @param {object} resolved The schema's fields for the declared keys.\n * @param {object} options What the field is resolved against.\n * @param {object|null} options.schema The object's JSON Schema.\n * @param {string} options.register Register the reference pickers fall back to.\n * @param {object} options.context What `optionsSource` reads.\n * @return {object} The field descriptor.\n */\nfunction baseField(input, resolved, { schema, register, context }) {\n\tconst field = resolved.find((f) => f.key === input.field)\n\tconst label = input.label || (field && field.label) || input.field\n\tconst description = text(input.description) || (field && field.description) || ''\n\n\tif (input.widget === 'template') {\n\t\treturn { key: input.field, label, description, widget: 'template', required: false }\n\t}\n\tif (input.optionsSource) {\n\t\tconst { options, rows } = sourcedOptions(input, context)\n\t\treturn { key: input.field, label, description, widget: 'select', options, rows, required: input.required }\n\t}\n\tif (input.options) {\n\t\treturn { key: input.field, label, description, widget: 'select', options: input.options, rows: [], required: input.required }\n\t}\n\tif (input.widget && input.widget !== 'select') {\n\t\treturn { key: input.field, label, description, widget: input.widget, required: input.required }\n\t}\n\tconst prop = (schema && schema.properties && schema.properties[input.field]) || null\n\tif (prop && prop.type === 'object' && prop.properties && typeof prop.properties === 'object') {\n\t\treturn objectField(input, prop)\n\t}\n\tif (!field) {\n\t\treturn { key: input.field, label, description, widget: 'text', required: input.required }\n\t}\n\tif (field.reference && field.reference.multiple !== true) {\n\t\tconst referenceRegister = field.reference.register || register\n\t\tif (referenceRegister !== '') {\n\t\t\treturn { ...field, label, widget: 'reference', referenceRegister, picker: input.picker, required: input.required }\n\t\t}\n\t}\n\treturn { ...field, label, widget: clampWidget(field.widget), required: input.required }\n}\n\n/**\n * A date `days` whole days after `now`, or null without a positive count.\n *\n * @param {unknown} days The count.\n * @param {Date} now Today.\n * @return {Date|null}\n */\nfunction daysAfter(days, now) {\n\tconst count = Number.parseInt(String(days ?? ''), 10)\n\tif (!Number.isFinite(count) || count < 1) {\n\t\treturn null\n\t}\n\tconst date = new Date(now.getTime())\n\tdate.setDate(date.getDate() + count)\n\treturn date\n}\n\n/**\n * Today plus that many days, as a date input's value.\n *\n * @param {unknown} days Whole days, 1 or more.\n * @param {Date} [now] What counts as today.\n * @return {string} `yyyy-mm-dd`, '' without a positive whole number.\n * @spec openspec/changes/days-input-as-date/specs/transition-inputs/spec.md\n */\nexport function dayAfterIso(days, now = new Date()) {\n\tconst date = daysAfter(days, now)\n\tif (date === null) {\n\t\treturn ''\n\t}\n\tconst pad = (number) => String(number).padStart(2, '0')\n\treturn `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`\n}\n\n/**\n * The whole days from today to a date input's value, at least 1.\n *\n * @param {unknown} iso A `yyyy-mm-dd` date.\n * @param {Date} [now] What counts as today.\n * @return {string} The days, '' without a date.\n * @spec openspec/changes/days-input-as-date/specs/transition-inputs/spec.md\n */\nexport function daysUntilIso(iso, now = new Date()) {\n\tconst match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(String(iso ?? '').trim())\n\tif (!match) {\n\t\treturn ''\n\t}\n\tconst target = Date.UTC(Number(match[1]), Number(match[2]) - 1, Number(match[3]))\n\tconst today = Date.UTC(now.getFullYear(), now.getMonth(), now.getDate())\n\treturn String(Math.max(1, Math.round((target - today) / 86400000)))\n}\n\n/**\n * A date as a reader sees it: day, short month and year.\n *\n * @param {Date|string} value The date.\n * @return {string} The text, '' when not a date.\n */\nfunction dateText(value) {\n\tconst shown = formatDateForDisplay(value, { dateOptions: { day: 'numeric', month: 'short', year: 'numeric' } })\n\treturn shown ? shown.text : ''\n}\n\n/**\n * Fill a preview template from the input values.\n *\n * Tokens are `{field}`, `{field|date}`, `{today|date}` and\n * `{today+field|date}` (today plus that many days). A token that resolves\n * to nothing empties the whole preview, so a half-filled sentence is never\n * shown: `{today+days|date}` says nothing until `days` is a positive whole\n * number.\n *\n * @param {string} template The template.\n * @param {object} values The input values.\n * @param {Date} [now] What counts as today.\n * @return {string} The filled text, or ''.\n */\nexport function fillInputTemplate(template, values, now = new Date()) {\n\tif (typeof template !== 'string' || template === '') {\n\t\treturn ''\n\t}\n\tlet empty = false\n\tconst filled = template.replace(/\\{([^{}|]+)(?:\\|(date))?\\}/g, (whole, expression, format) => {\n\t\tconst name = expression.trim()\n\t\tlet value\n\t\tif (name === 'today') {\n\t\t\tvalue = new Date(now.getTime())\n\t\t} else if (name.startsWith('today+')) {\n\t\t\tvalue = daysAfter((values || {})[name.slice(6).trim()], now)\n\t\t} else {\n\t\t\tvalue = (values || {})[name]\n\t\t}\n\t\tif (value === null || value === undefined || String(value).trim() === '') {\n\t\t\tempty = true\n\t\t\treturn ''\n\t\t}\n\t\tconst shown = format === 'date' ? dateText(value) : String(value)\n\t\tif (shown === '') {\n\t\t\tempty = true\n\t\t}\n\t\treturn shown\n\t})\n\treturn empty ? '' : filled\n}\n\n/**\n * The descriptors of the declared inputs, with the context applied.\n *\n * Next to what the schema says, an input may declare:\n * - `widget`: `text`, `textarea`, `number`, `date`, `select` or `template`.\n * - `optionsSource`: a dot path into `context` holding the rows to pick from,\n * read through `optionValue` and `optionLabel`. With no rows the input is\n * hidden and asks nothing.\n * - `other: { label, input }`: adds an \"Other\" entry; the input it names is\n * only shown (and only asked) when this picker is hidden or Other is picked.\n * - `helperFrom: { input, key }`: the helper text is `key` of the row picked\n * in that other input.\n * - `preview: { label, template, note, testid }`: a line under the input,\n * filled by `fillInputTemplate` and shown only once it resolves.\n * - `dateField: { label, note, testid }`: on a days input, an editable date\n * under it, today plus the days; a chosen date sets the days to the whole\n * days from today, at least 1. `dateValue` carries the date.\n * - `default`: the starting value.\n * - Presentation: `labelOutside`, `id`, `note`, `wide`, `testid`, `rows`,\n * `placeholder`.\n *\n * Every descriptor carries `hidden`; a hidden one is neither drawn nor asked.\n *\n * @param {unknown} declared The declared inputs.\n * @param {object} [options] Options.\n * @param {object|null} [options.schema] The object's JSON Schema.\n * @param {string} [options.register] Register the reference pickers fall back to.\n * @param {object} [options.context] What `optionsSource` reads.\n * @param {object} [options.values] The values so far.\n * @param {Date} [options.now] What counts as today, for previews and `dateField`.\n * @return {Array<object>} The descriptors.\n */\nexport function resolveInputFields(declared, { schema = null, register = '', context = {}, values = {}, now } = {}) {\n\tconst inputs = normaliseInputs(declared)\n\tconst resolved = fieldsFromSchema(schema, { include: inputs.map((input) => input.field), includeReadOnly: true })\n\tconst fields = inputs.map((input) => ({\n\t\t...baseField(input, resolved, { schema, register, context }),\n\t\tinput,\n\t\thidden: false,\n\t}))\n\n\tfor (const field of fields) {\n\t\tconst other = field.input.other\n\t\tif (field.widget !== 'select') {\n\t\t\tcontinue\n\t\t}\n\t\tif (field.input.optionsSource && field.options.length === 0) {\n\t\t\tfield.hidden = true\n\t\t}\n\t\tif (other) {\n\t\t\tfield.options = [...field.options, { value: OTHER_OPTION_VALUE, label: other.label.trim() }]\n\t\t\tconst target = fields.find((candidate) => candidate.key === other.input)\n\t\t\tif (target && !field.hidden && values[field.key] !== OTHER_OPTION_VALUE) {\n\t\t\t\ttarget.hidden = true\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const field of fields) {\n\t\tconst helperFrom = field.input.helperFrom\n\t\tif (helperFrom && typeof helperFrom === 'object') {\n\t\t\tconst source = fields.find((candidate) => candidate.key === helperFrom.input)\n\t\t\tconst picked = source && Array.isArray(source.rows) && !source.hidden\n\t\t\t\t? source.rows[source.options.findIndex((option) => option.value === String(values[source.key] ?? ''))]\n\t\t\t\t: null\n\t\t\tconst helper = picked && typeof picked === 'object' ? picked[helperFrom.key] : null\n\t\t\tfield.description = helper === null || helper === undefined ? field.description : String(helper)\n\t\t}\n\t\tconst preview = field.input.preview\n\t\tfield.previewText = preview && typeof preview === 'object'\n\t\t\t? fillInputTemplate(preview.template, values, now)\n\t\t\t: ''\n\t\tfield.dateValue = field.input.dateField && typeof field.input.dateField === 'object'\n\t\t\t? dayAfterIso(values[field.key], now)\n\t\t\t: ''\n\t}\n\n\treturn fields\n}\n\n/**\n * Whether a field holds a value: a checked switch for booleans, a non-blank\n * string otherwise.\n *\n * @param {object} field The descriptor.\n * @param {object} values The values.\n * @return {boolean}\n */\nexport function isInputFilled(field, values) {\n\tconst value = (values || {})[field.key]\n\tif (field.widget === 'checkbox') {\n\t\treturn value === true\n\t}\n\treturn String(value ?? '').trim() !== ''\n}\n\n/**\n * Whether an object input's sub-field holds a value.\n *\n * @param {object} field The object descriptor.\n * @param {object} sub The sub-field descriptor.\n * @param {object} values The values.\n * @return {boolean}\n */\nexport function isSubInputFilled(field, sub, values) {\n\tconst group = (values || {})[field.key]\n\tconst value = group && typeof group === 'object' ? group[sub.key] : undefined\n\treturn sub.widget === 'checkbox' ? value === true : String(value ?? '').trim() !== ''\n}\n\n/**\n * Whether every shown, required field is filled. \"Other\" counts as a pick.\n *\n * @param {Array<object>} fields The descriptors (`resolveInputFields`).\n * @param {object} values The values.\n * @return {boolean}\n */\nexport function inputFieldsComplete(fields, values) {\n\treturn fields.every((field) => {\n\t\tif (field.hidden || field.widget === 'template') {\n\t\t\treturn true\n\t\t}\n\t\tif (field.widget === 'object') {\n\t\t\treturn field.subFields.every((sub) => !sub.required || isSubInputFilled(field, sub, values))\n\t\t}\n\t\treturn !field.required || isInputFilled(field, values)\n\t})\n}\n\n/**\n * A picked value as it is sent: the \"Other\" entry becomes ''.\n *\n * @param {unknown} value The picked value.\n * @return {unknown}\n */\nexport function submittedValue(value) {\n\treturn value === OTHER_OPTION_VALUE ? '' : value\n}\n\n/**\n * The values to start from: each input's `default`, else its schema default,\n * else false for a boolean and '' otherwise. An object input starts from the\n * record's present value, so the sub-fields it asks for show what is there.\n *\n * @param {unknown} declared The declared inputs.\n * @param {object|null} [schema] The object's JSON Schema.\n * @param {object|null} [currentObject] The record.\n * @return {object} The values.\n */\nexport function initialInputValues(declared, schema = null, currentObject = null) {\n\tconst values = {}\n\tconst properties = (schema && schema.properties) || {}\n\tfor (const input of normaliseInputs(declared)) {\n\t\tconst prop = properties[input.field] || {}\n\t\tif (prop.type === 'object' && prop.properties && typeof prop.properties === 'object') {\n\t\t\tconst present = currentObject ? currentObject[input.field] : null\n\t\t\tvalues[input.field] = present && typeof present === 'object' ? { ...present } : {}\n\t\t\tcontinue\n\t\t}\n\t\tif (input.default !== undefined) {\n\t\t\tvalues[input.field] = input.default\n\t\t\tcontinue\n\t\t}\n\t\tvalues[input.field] = prop.default !== undefined\n\t\t\t? prop.default\n\t\t\t: (prop.type === 'boolean' ? false : '')\n\t}\n\treturn values\n}\n\n/**\n * The text a chosen template puts into its `applyTo` input: the template's\n * `body`, else `presets.body`. It never writes over what was already typed,\n * because text lost to a template cannot be got back.\n *\n * @param {object} values The values.\n * @param {string} target The input the template fills.\n * @param {object|null} option The chosen template.\n * @return {object} The new values, or the same object when nothing changes.\n */\nexport function applyTemplateText(values, target, option) {\n\tconst body = option ? (option.body || (option.presets && option.presets.body) || '') : ''\n\tif (!target || typeof body !== 'string' || body === '' || String((values || {})[target] ?? '').trim() !== '') {\n\t\treturn values\n\t}\n\treturn { ...values, [target]: body }\n}\n\n/**\n * Read a host's values against the declared inputs: whether every shown,\n * required input is filled, and the values to send for the inputs that are\n * asked now. A hidden input and a template are left out, a picked \"Other\"\n * is sent as '' and a number input as a number. An object input is sent as\n * it stands (CnTransitionInputDialog merges it over the record).\n *\n * @param {unknown} declared The declared inputs.\n * @param {object} values The values, keyed by field.\n * @param {object} [options] `{ schema, register, context, now }`, as for `resolveInputFields`.\n * @return {{complete: boolean, data: object}}\n * @spec openspec/changes/dq-abstract-forms/specs/transition-inputs/spec.md\n */\nexport function readTransitionInputs(declared, values, options = {}) {\n\tconst current = values || {}\n\tconst fields = resolveInputFields(declared, { ...options, values: current })\n\tconst data = {}\n\tfor (const field of fields) {\n\t\tif (field.hidden || field.widget === 'template') {\n\t\t\tcontinue\n\t\t}\n\t\tlet value = submittedValue(current[field.key])\n\t\tif (field.widget === 'number' && String(value ?? '').trim() !== '' && !Number.isNaN(Number(value))) {\n\t\t\tvalue = Number(value)\n\t\t}\n\t\tdata[field.key] = value\n\t}\n\treturn { complete: inputFieldsComplete(fields, current), data }\n}\n"],"names":[],"mappings":"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"}
|