@conduction/nextcloud-vue 2.56.0-beta.26 → 2.56.0-beta.27

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.
Files changed (119) hide show
  1. package/dist/esm/components/CnAppNav/CnAppNav.vue2.js +18 -3
  2. package/dist/esm/components/CnAppNav/CnAppNav.vue2.js.map +1 -1
  3. package/dist/esm/components/CnAppNav/CnAppNav.vue3.js +49 -3
  4. package/dist/esm/components/CnAppNav/CnAppNav.vue3.js.map +1 -1
  5. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +42 -1
  6. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
  7. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +228 -203
  8. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
  9. package/dist/esm/components/CnCellRenderer/CnGroupNameCell.vue.js +9 -0
  10. package/dist/esm/components/CnCellRenderer/CnGroupNameCell.vue.js.map +1 -0
  11. package/dist/esm/components/CnCellRenderer/CnGroupNameCell.vue2.js +50 -0
  12. package/dist/esm/components/CnCellRenderer/CnGroupNameCell.vue2.js.map +1 -0
  13. package/dist/esm/components/CnCellRenderer/CnGroupNameCell.vue3.js +13 -0
  14. package/dist/esm/components/CnCellRenderer/CnGroupNameCell.vue3.js.map +1 -0
  15. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +41 -4
  16. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  17. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +90 -51
  18. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  19. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +16 -28
  20. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  21. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +12 -24
  22. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  23. package/dist/esm/components/CnFavouriteToggle/CnFavouriteToggle.vue2.js +7 -2
  24. package/dist/esm/components/CnFavouriteToggle/CnFavouriteToggle.vue2.js.map +1 -1
  25. package/dist/esm/components/CnFavouriteToggle/CnFavouriteToggle.vue3.js.map +1 -1
  26. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +114 -1
  27. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
  28. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +115 -62
  29. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
  30. package/dist/esm/components/CnFollowToggle/CnFollowToggle.vue2.js +89 -7
  31. package/dist/esm/components/CnFollowToggle/CnFollowToggle.vue2.js.map +1 -1
  32. package/dist/esm/components/CnFollowToggle/CnFollowToggle.vue3.js +62 -30
  33. package/dist/esm/components/CnFollowToggle/CnFollowToggle.vue3.js.map +1 -1
  34. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +98 -13
  35. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  36. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +13 -9
  37. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  38. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js +199 -7
  39. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js.map +1 -1
  40. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js +155 -119
  41. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js.map +1 -1
  42. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js +6 -0
  43. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
  44. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +4 -1
  45. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
  46. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js +13 -0
  47. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js.map +1 -1
  48. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue3.js.map +1 -1
  49. package/dist/esm/composables/useListView.js +4 -0
  50. package/dist/esm/composables/useListView.js.map +1 -1
  51. package/dist/esm/index.js +2 -1
  52. package/dist/esm/index.js.map +1 -1
  53. package/dist/esm/l10n/en.json.js +25 -1
  54. package/dist/esm/l10n/en.json.js.map +1 -1
  55. package/dist/esm/l10n/nl.json.js +25 -1
  56. package/dist/esm/l10n/nl.json.js.map +1 -1
  57. package/dist/esm/nextcloud-vue.css +288 -74
  58. package/dist/esm/store/plugins/interactions.js +20 -10
  59. package/dist/esm/store/plugins/interactions.js.map +1 -1
  60. package/dist/esm/store/useObjectStore.js +17 -0
  61. package/dist/esm/store/useObjectStore.js.map +1 -1
  62. package/dist/esm/utils/builtInFormatters.js +15 -7
  63. package/dist/esm/utils/builtInFormatters.js.map +1 -1
  64. package/dist/esm/utils/groupAutocomplete.js +63 -1
  65. package/dist/esm/utils/groupAutocomplete.js.map +1 -1
  66. package/dist/esm/utils/lensAvailability.js +90 -0
  67. package/dist/esm/utils/lensAvailability.js.map +1 -0
  68. package/dist/esm/utils/personalLenses.js +13 -6
  69. package/dist/esm/utils/personalLenses.js.map +1 -1
  70. package/dist/esm/utils/recordInteractions.js +31 -13
  71. package/dist/esm/utils/recordInteractions.js.map +1 -1
  72. package/dist/esm/utils/resolveFilterTokens.js +46 -3
  73. package/dist/esm/utils/resolveFilterTokens.js.map +1 -1
  74. package/dist/esm/utils/schema.js +1 -1
  75. package/dist/esm/utils/schema.js.map +1 -1
  76. package/dist/esm/utils/sentinelTokens.js +4 -4
  77. package/dist/esm/utils/sentinelTokens.js.map +1 -1
  78. package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
  79. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  80. package/dist/esm/utils/widgetVisibility.js +46 -1
  81. package/dist/esm/utils/widgetVisibility.js.map +1 -1
  82. package/dist/nextcloud-vue.cjs.js +3873 -2674
  83. package/dist/nextcloud-vue.cjs.js.map +2 -2
  84. package/dist/nextcloud-vue.css +288 -74
  85. package/l10n/en.json +25 -1
  86. package/l10n/nl.json +25 -1
  87. package/package.json +1 -1
  88. package/src/components/CnAppNav/CnAppNav.vue +44 -5
  89. package/src/components/CnCellRenderer/CnCellRenderer.vue +56 -1
  90. package/src/components/CnCellRenderer/CnGroupNameCell.vue +61 -0
  91. package/src/components/CnDataTable/CnDataTable.md +9 -0
  92. package/src/components/CnDataTable/CnDataTable.vue +80 -20
  93. package/src/components/CnDetailPage/CnDetailPage.vue +10 -27
  94. package/src/components/CnFavouriteToggle/CnFavouriteToggle.vue +7 -2
  95. package/src/components/CnFilesBrowser/CnFilesBrowser.vue +204 -5
  96. package/src/components/CnFollowToggle/CnFollowToggle.vue +118 -13
  97. package/src/components/CnIndexPage/CnIndexPage.md +36 -0
  98. package/src/components/CnIndexPage/CnIndexPage.vue +106 -19
  99. package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +226 -2
  100. package/src/components/CnObjectSidebar/CnFilesTab.vue +9 -0
  101. package/src/components/CnWidgetObjectTable/CnWidgetObjectTable.vue +13 -0
  102. package/src/composables/useListView.js +4 -0
  103. package/src/css/look-board-detail.css +40 -2
  104. package/src/css/table.css +82 -17
  105. package/src/index.js +2 -1
  106. package/src/schemas/app-manifest-v2.schema.json +11 -7
  107. package/src/store/plugins/interactions.js +20 -10
  108. package/src/store/useObjectStore.js +17 -0
  109. package/src/utils/builtInFormatters.js +15 -7
  110. package/src/utils/groupAutocomplete.js +75 -0
  111. package/src/utils/index.js +1 -1
  112. package/src/utils/lensAvailability.js +86 -0
  113. package/src/utils/personalLenses.js +13 -6
  114. package/src/utils/recordInteractions.js +31 -13
  115. package/src/utils/resolveFilterTokens.js +45 -2
  116. package/src/utils/schema.js +1 -1
  117. package/src/utils/sentinelTokens.js +4 -4
  118. package/src/utils/validateManifestV2.compiled.js +2 -2
  119. package/src/utils/widgetVisibility.js +45 -0
@@ -1,5 +1,6 @@
1
1
  import { getCurrentUser } from '@nextcloud/auth';
2
2
  import { TODAY_DELTA_RE } from './sentinelTokens.js';
3
+ import { peekCurrentUserGroups } from './widgetVisibility.js';
3
4
 
4
5
  /**
5
6
  * SPDX-FileCopyrightText: 2026 Conduction B.V.
@@ -13,6 +14,13 @@ import { TODAY_DELTA_RE } from './sentinelTokens.js';
13
14
  * Supported tokens:
14
15
  * - `@me` → the current Nextcloud user id (`getCurrentUser()` from
15
16
  * `@nextcloud/auth`; `window.OC.currentUser` fallback)
17
+ * - `@myGroups` → the ids of the Nextcloud groups the current user is
18
+ * in, as an ARRAY (an IN filter). `ctx.myGroups` wins;
19
+ * otherwise a reactive peek over `getCurrentUserGroups`.
20
+ * Stays UNRESOLVED while loading and when the user is
21
+ * in no group, so the caller waits instead of sending
22
+ * an empty IN list (which OpenRegister reads as "no
23
+ * constraint"). Spread in place inside an IN-list array.
16
24
  * - `@now` → the current instant, ISO-8601
17
25
  * - `@today` → today at 00:00, `YYYY-MM-DD` (date-prefix comparable)
18
26
  * - `@today±Nd` → relative-date arithmetic at day granularity: N days
@@ -58,6 +66,33 @@ import { TODAY_DELTA_RE } from './sentinelTokens.js';
58
66
  */
59
67
 
60
68
 
69
+ /** The filter token for the current user's group ids. */
70
+ const MY_GROUPS_TOKEN = '@myGroups';
71
+
72
+ /**
73
+ * Resolve `@myGroups`: the current user's group ids, or the token itself while
74
+ * they are loading or when there are none (an empty IN list would match every
75
+ * row, so "no team" must mean "wait", never "everything").
76
+ *
77
+ * @spec openspec/changes/nextcloud-group-surfaces/specs/schema-utilities/spec.md#requirement-mygroups-resolves-to-the-current-users-group-ids
78
+ * @param {{myGroups?: string[]}} [ctx] Optional context; `ctx.myGroups` wins.
79
+ * @return {string[]|string} The group ids, or `'@myGroups'` when unresolved.
80
+ */
81
+ function resolveMyGroups(ctx) {
82
+ let groups = ctx && Array.isArray(ctx.myGroups) ? ctx.myGroups : null;
83
+ if (groups === null) {
84
+ try {
85
+ groups = peekCurrentUserGroups();
86
+ } catch {
87
+ groups = null;
88
+ }
89
+ }
90
+ const ids = Array.isArray(groups)
91
+ ? groups.filter((g) => typeof g === 'string' && g !== '')
92
+ : [];
93
+ return ids.length > 0 ? [...ids] : MY_GROUPS_TOKEN
94
+ }
95
+
61
96
  /**
62
97
  * Format a Date as `YYYY-MM-DD` (local).
63
98
  *
@@ -74,7 +109,7 @@ function ymd(d) {
74
109
  * Resolve a single filter value if it is a dynamic `@`-token, else pass through.
75
110
  *
76
111
  * @param {unknown} v The candidate value.
77
- * @param {{objectId?: (string|number), object?: object, workspace?: object, config?: object, range?: object}} [ctx] Optional
112
+ * @param {{objectId?: (string|number), object?: object, workspace?: object, config?: object, range?: object, myGroups?: string[]}} [ctx] Optional
78
113
  * context for `@objectId` / `@object.<field>` (detail page),
79
114
  * `@workspace.<key>` (page-level workspace state), and `@config.<key>`
80
115
  * (page-level app config) tokens.
@@ -85,6 +120,9 @@ function resolveFilterValue(v, ctx) {
85
120
  return v
86
121
  }
87
122
  const now = new Date();
123
+ if (v === MY_GROUPS_TOKEN) {
124
+ return resolveMyGroups(ctx)
125
+ }
88
126
  if (v === '@objectId') {
89
127
  return (ctx && ctx.objectId !== undefined && ctx.objectId !== null) ? String(ctx.objectId) : v
90
128
  }
@@ -314,8 +352,13 @@ function resolveFilterTokens(filter, ctx) {
314
352
  if (!filter || typeof filter !== 'object') {
315
353
  return filter
316
354
  }
355
+ // An item that resolves to a list (`@myGroups`) is spread in place, so
356
+ // `['@myGroups', 'archive']` stays one flat IN list.
317
357
  const resolveOne = (v) => (Array.isArray(v)
318
- ? v.map((item) => resolveFilterValue(item, ctx))
358
+ ? v.flatMap((item) => {
359
+ const r = resolveFilterValue(item, ctx);
360
+ return Array.isArray(r) ? r : [r]
361
+ })
319
362
  : resolveFilterValue(v, ctx));
320
363
  const out = {};
321
364
  for (const [k, v] of Object.entries(filter)) {
@@ -411,5 +454,5 @@ function dropOptionalUnresolvedDeep(value) {
411
454
  return value
412
455
  }
413
456
 
414
- export { dropOptionalUnresolved, dropOptionalUnresolvedDeep, hasUnresolvedDeepTokens, hasUnresolvedTokens, isOptionalUnresolved, resolveDeepTokens, resolveFilterTokens, resolveFilterValue };
457
+ export { MY_GROUPS_TOKEN, dropOptionalUnresolved, dropOptionalUnresolvedDeep, hasUnresolvedDeepTokens, hasUnresolvedTokens, isOptionalUnresolved, resolveDeepTokens, resolveFilterTokens, resolveFilterValue };
415
458
  //# sourceMappingURL=resolveFilterTokens.js.map
@@ -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 * - `@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 * - `@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 *\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'\nimport { TODAY_DELTA_RE } from './sentinelTokens.js'\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 * 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}} [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\tconst now = new Date()\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('@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 === '@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.'))\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\tconst resolveOne = (v) => (Array.isArray(v)\n\t\t? v.map((item) => resolveFilterValue(item, ctx))\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":"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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 * - `@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 * - `@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 *\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'\nimport { TODAY_DELTA_RE } from './sentinelTokens.js'\nimport { peekCurrentUserGroups } from './widgetVisibility.js'\n\n/** The filter token for the current user's group ids. */\nexport const MY_GROUPS_TOKEN = '@myGroups'\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 * 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\tconst now = new Date()\n\tif (v === MY_GROUPS_TOKEN) {\n\t\treturn resolveMyGroups(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('@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 === '@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.'))\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":"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"}
@@ -1351,5 +1351,5 @@ function validateStringFormat(format, value) {
1351
1351
  return null
1352
1352
  }
1353
1353
 
1354
- export { columnsFromSchema, fieldsFromSchema, filtersFromSchema, formatValue, isTenantProperty, splitDescription, validateValue };
1354
+ export { columnsFromSchema, fieldsFromSchema, filtersFromSchema, formatValue, isGroupProp, isTenantProperty, splitDescription, validateValue };
1355
1355
  //# sourceMappingURL=schema.js.map