@conduction/nextcloud-vue 2.142.0 → 2.143.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.
Files changed (87) hide show
  1. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue.js +1 -1
  2. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js +27 -0
  3. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js.map +1 -1
  4. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js +1 -1
  5. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js.map +1 -1
  6. package/dist/esm/components/CnAiCompanion/CnAiChatPanel.vue2.js.map +1 -1
  7. package/dist/esm/components/CnAiCompanion/CnAiChatPanel.vue3.js +2 -1
  8. package/dist/esm/components/CnAiCompanion/CnAiChatPanel.vue3.js.map +1 -1
  9. package/dist/esm/components/CnAiCompanion/CnAiInput.vue2.js +9 -0
  10. package/dist/esm/components/CnAiCompanion/CnAiInput.vue2.js.map +1 -1
  11. package/dist/esm/components/CnAiCompanion/CnAiInput.vue3.js +21 -22
  12. package/dist/esm/components/CnAiCompanion/CnAiInput.vue3.js.map +1 -1
  13. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue.js +1 -1
  14. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js +29 -1
  15. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js.map +1 -1
  16. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue3.js +28 -13
  17. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue3.js.map +1 -1
  18. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue.js +1 -1
  19. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue2.js.map +1 -1
  20. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue3.js +2 -1
  21. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue3.js.map +1 -1
  22. package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue.js +1 -1
  23. package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue2.js.map +1 -1
  24. package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue3.js.map +1 -1
  25. package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue.js +1 -1
  26. package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue2.js.map +1 -1
  27. package/dist/esm/components/CnChoiceCards/CnChoiceCards.vue3.js.map +1 -1
  28. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue.js +1 -1
  29. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
  30. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js +2 -1
  31. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
  32. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue.js +1 -1
  33. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +27 -2
  34. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
  35. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +4 -2
  36. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
  37. package/dist/esm/components/CnFilesBrowser/filesBrowser.js +17 -4
  38. package/dist/esm/components/CnFilesBrowser/filesBrowser.js.map +1 -1
  39. package/dist/esm/components/CnFilesBrowser/filesBrowserColumns.js +21 -1
  40. package/dist/esm/components/CnFilesBrowser/filesBrowserColumns.js.map +1 -1
  41. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +15 -1
  42. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  43. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  44. package/dist/esm/components/CnPageHeader/CnHeaderTrail.vue2.js +6 -1
  45. package/dist/esm/components/CnPageHeader/CnHeaderTrail.vue2.js.map +1 -1
  46. package/dist/esm/components/CnPageHeader/CnHeaderTrail.vue3.js.map +1 -1
  47. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
  48. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +12 -1
  49. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
  50. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +2 -2
  51. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
  52. package/dist/esm/components/CnSavedViewAlertWidget/CnSavedViewAlertWidget.vue.js +1 -1
  53. package/dist/esm/components/CnSavedViewAlertWidget/CnSavedViewAlertWidget.vue2.js.map +1 -1
  54. package/dist/esm/components/CnSavedViewAlertWidget/CnSavedViewAlertWidget.vue3.js.map +1 -1
  55. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue.js +1 -1
  56. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue2.js +4 -0
  57. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue2.js.map +1 -1
  58. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue3.js +18 -8
  59. package/dist/esm/components/CnTimelineWidget/CnTimelineManage.vue3.js.map +1 -1
  60. package/dist/esm/l10n/nl.json.js +1 -1
  61. package/dist/esm/library-style.js +1 -1
  62. package/dist/esm/nextcloud-vue.css +537 -322
  63. package/dist/nextcloud-vue.cjs.js +300 -119
  64. package/dist/nextcloud-vue.cjs.js.map +2 -2
  65. package/dist/nextcloud-vue.css +537 -322
  66. package/l10n/nl.json +1 -1
  67. package/package.json +1 -1
  68. package/src/components/CnAdminSettingsShell/CnAdminSettingsShell.vue +28 -1
  69. package/src/components/CnAiCompanion/CnAiChatPanel.vue +12 -0
  70. package/src/components/CnAiCompanion/CnAiInput.vue +32 -1
  71. package/src/components/CnAuditTrailCard/CnAuditTrailCard.vue +34 -4
  72. package/src/components/CnAuditTrailWidget/CnAuditTrailWidget.vue +1 -0
  73. package/src/components/CnChecklistRunWidget/CnChecklistRunWidget.vue +8 -0
  74. package/src/components/CnChoiceCards/CnChoiceCards.vue +1 -0
  75. package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +1 -0
  76. package/src/components/CnFilesBrowser/CnFilesBrowser.vue +28 -3
  77. package/src/components/CnFilesBrowser/filesBrowser.js +17 -4
  78. package/src/components/CnFilesBrowser/filesBrowserColumns.js +20 -1
  79. package/src/components/CnIndexPage/CnIndexPage.vue +15 -1
  80. package/src/components/CnPageHeader/CnHeaderTrail.vue +6 -1
  81. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +21 -1
  82. package/src/components/CnSavedViewAlertWidget/CnSavedViewAlertWidget.vue +6 -0
  83. package/src/components/CnTimelineWidget/CnTimelineManage.vue +10 -1
  84. package/src/css/dialog.css +18 -0
  85. package/src/css/look-board-detail.css +31 -0
  86. package/src/css/look-board-index.css +42 -1
  87. package/src/css/look-board.css +73 -1
@@ -5907,7 +5907,7 @@ var translations$c = {
5907
5907
  Now: "Nu",
5908
5908
  "Tell me above a number": "Melden vanaf een aantal",
5909
5909
  Threshold: "Grens",
5910
- "A message to you when there are {threshold} or more": "Bericht aan u als er {threshold} of meer zijn",
5910
+ "A message to you when there are {threshold} or more": "Bericht aan u als er {threshold} of meer open zijn",
5911
5911
  "Save this search or open a saved one to set an alert on it.": "Sla deze zoekopdracht op of open een opgeslagen zoekopdracht om er een melding op te zetten.",
5912
5912
  "The alert could not be saved.": "De melding kon niet worden opgeslagen.",
5913
5913
  "Your exports could not be loaded.": "Uw exports konden niet worden geladen.",
@@ -7309,7 +7309,7 @@ const _hoisted_8$4i = {
7309
7309
  key: 0,
7310
7310
  class: "cn-ai-history-list__item-desc"
7311
7311
  };
7312
- const _hoisted_9$3Y = { class: "cn-ai-history-list__item-time" };
7312
+ const _hoisted_9$3X = { class: "cn-ai-history-list__item-time" };
7313
7313
  const _hoisted_10$3t = ["aria-label", "title", "onClick"];
7314
7314
 
7315
7315
  function render$8G(_ctx, _cache, $props, $setup, $data, $options) {
@@ -7411,7 +7411,7 @@ function render$8G(_ctx, _cache, $props, $setup, $data, $options) {
7411
7411
  (conv.description)
7412
7412
  ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_8$4i, vue$1.toDisplayString(conv.description), 1 /* TEXT */))
7413
7413
  : vue$1.createCommentVNode("v-if", true),
7414
- vue$1.createElementVNode("span", _hoisted_9$3Y, vue$1.toDisplayString($options.formatRelative(conv.updatedAt || conv.createdAt)), 1 /* TEXT */)
7414
+ vue$1.createElementVNode("span", _hoisted_9$3X, vue$1.toDisplayString($options.formatRelative(conv.updatedAt || conv.createdAt)), 1 /* TEXT */)
7415
7415
  ], 8 /* PROPS */, _hoisted_6$5c),
7416
7416
  vue$1.createElementVNode("button", {
7417
7417
  type: "button",
@@ -9234,6 +9234,15 @@ var script$8G = {
9234
9234
  default: '',
9235
9235
  },
9236
9236
 
9237
+ /**
9238
+ * The narrow layout of a card: the text box and the send button on the
9239
+ * first line, dictation and attach on a line under it.
9240
+ */
9241
+ stacked: {
9242
+ type: Boolean,
9243
+ default: false,
9244
+ },
9245
+
9237
9246
  /**
9238
9247
  * Backend app id the attach control uploads files to
9239
9248
  * (`POST /index.php/apps/{chatAppId}/api/chat/attachments`). See
@@ -10041,21 +10050,17 @@ var script$8G = {
10041
10050
  };
10042
10051
 
10043
10052
  const _hoisted_1$8e = {
10044
- class: "cn-ai-input",
10045
- "data-testid": "cn-ai-input"
10046
- };
10047
- const _hoisted_2$7U = {
10048
10053
  key: 2,
10049
10054
  class: "cn-ai-input__chips",
10050
10055
  "data-testid": "cn-ai-input-chips"
10051
10056
  };
10052
- const _hoisted_3$73 = { class: "cn-ai-input__chip-name" };
10053
- const _hoisted_4$6l = ["aria-label", "disabled", "data-testid", "onClick"];
10054
- const _hoisted_5$5C = { class: "cn-ai-input__row" };
10055
- const _hoisted_6$5b = ["aria-label", "title", "aria-pressed", "aria-disabled", "disabled", "data-engine"];
10056
- const _hoisted_7$4J = ["aria-label", "title", "aria-pressed", "disabled"];
10057
- const _hoisted_8$4h = ["aria-label", "disabled", "placeholder"];
10058
- const _hoisted_9$3X = ["aria-label", "disabled"];
10057
+ const _hoisted_2$7U = { class: "cn-ai-input__chip-name" };
10058
+ const _hoisted_3$73 = ["aria-label", "disabled", "data-testid", "onClick"];
10059
+ const _hoisted_4$6l = { class: "cn-ai-input__row" };
10060
+ const _hoisted_5$5C = ["aria-label", "title", "aria-pressed", "aria-disabled", "disabled", "data-engine"];
10061
+ const _hoisted_6$5b = ["aria-label", "title", "aria-pressed", "disabled"];
10062
+ const _hoisted_7$4J = ["aria-label", "disabled", "placeholder"];
10063
+ const _hoisted_8$4h = ["aria-label", "disabled"];
10059
10064
 
10060
10065
  function render$8F(_ctx, _cache, $props, $setup, $data, $options) {
10061
10066
  const _component_NcNoteCard = vue$1.resolveComponent("NcNoteCard");
@@ -10072,7 +10077,10 @@ function render$8F(_ctx, _cache, $props, $setup, $data, $options) {
10072
10077
  const _component_NcActions = vue$1.resolveComponent("NcActions");
10073
10078
  const _component_Send = vue$1.resolveComponent("Send");
10074
10079
 
10075
- return (vue$1.openBlock(), vue$1.createElementBlock("div", _hoisted_1$8e, [
10080
+ return (vue$1.openBlock(), vue$1.createElementBlock("div", {
10081
+ class: vue$1.normalizeClass(["cn-ai-input", { 'cn-ai-input--stacked': $props.stacked }]),
10082
+ "data-testid": "cn-ai-input"
10083
+ }, [
10076
10084
  ($data.uploadError)
10077
10085
  ? (vue$1.openBlock(), vue$1.createBlock(_component_NcNoteCard, {
10078
10086
  key: 0,
@@ -10100,7 +10108,7 @@ function render$8F(_ctx, _cache, $props, $setup, $data, $options) {
10100
10108
  }))
10101
10109
  : vue$1.createCommentVNode("v-if", true),
10102
10110
  ($data.attachments.length)
10103
- ? (vue$1.openBlock(), vue$1.createElementBlock("ul", _hoisted_2$7U, [
10111
+ ? (vue$1.openBlock(), vue$1.createElementBlock("ul", _hoisted_1$8e, [
10104
10112
  (vue$1.openBlock(true), vue$1.createElementBlock(vue$1.Fragment, null, vue$1.renderList($data.attachments, (attachment, index) => {
10105
10113
  return (vue$1.openBlock(), vue$1.createElementBlock("li", {
10106
10114
  key: attachment.fileId !== undefined ? 'f' + attachment.fileId : attachment.path,
@@ -10110,7 +10118,7 @@ function render$8F(_ctx, _cache, $props, $setup, $data, $options) {
10110
10118
  size: 14,
10111
10119
  class: "cn-ai-input__chip-icon"
10112
10120
  }),
10113
- vue$1.createElementVNode("span", _hoisted_3$73, vue$1.toDisplayString(attachment.name), 1 /* TEXT */),
10121
+ vue$1.createElementVNode("span", _hoisted_2$7U, vue$1.toDisplayString(attachment.name), 1 /* TEXT */),
10114
10122
  vue$1.createElementVNode("button", {
10115
10123
  type: "button",
10116
10124
  class: "cn-ai-input__chip-remove",
@@ -10120,12 +10128,12 @@ function render$8F(_ctx, _cache, $props, $setup, $data, $options) {
10120
10128
  onClick: $event => ($options.removeAttachment(index))
10121
10129
  }, [
10122
10130
  vue$1.createVNode(_component_Close, { size: 14 })
10123
- ], 8 /* PROPS */, _hoisted_4$6l)
10131
+ ], 8 /* PROPS */, _hoisted_3$73)
10124
10132
  ]))
10125
10133
  }), 128 /* KEYED_FRAGMENT */))
10126
10134
  ]))
10127
10135
  : vue$1.createCommentVNode("v-if", true),
10128
- vue$1.createElementVNode("div", _hoisted_5$5C, [
10136
+ vue$1.createElementVNode("div", _hoisted_4$6l, [
10129
10137
  ($options.speechButtonVisible)
10130
10138
  ? (vue$1.openBlock(), vue$1.createElementBlock("button", {
10131
10139
  key: 0,
@@ -10158,7 +10166,7 @@ function render$8F(_ctx, _cache, $props, $setup, $data, $options) {
10158
10166
  key: 2,
10159
10167
  size: 20
10160
10168
  }))
10161
- ], 10 /* CLASS, PROPS */, _hoisted_6$5b))
10169
+ ], 10 /* CLASS, PROPS */, _hoisted_5$5C))
10162
10170
  : vue$1.createCommentVNode("v-if", true),
10163
10171
  ($options.conversationButtonVisible)
10164
10172
  ? (vue$1.openBlock(), vue$1.createElementBlock("button", {
@@ -10181,7 +10189,7 @@ function render$8F(_ctx, _cache, $props, $setup, $data, $options) {
10181
10189
  key: 1,
10182
10190
  size: 20
10183
10191
  }))
10184
- ], 10 /* CLASS, PROPS */, _hoisted_7$4J))
10192
+ ], 10 /* CLASS, PROPS */, _hoisted_6$5b))
10185
10193
  : vue$1.createCommentVNode("v-if", true),
10186
10194
  vue$1.createVNode(_component_NcActions, {
10187
10195
  class: "cn-ai-input__attach-menu",
@@ -10252,7 +10260,7 @@ function render$8F(_ctx, _cache, $props, $setup, $data, $options) {
10252
10260
  _cache[5] || (_cache[5] = vue$1.withKeys(vue$1.withModifiers((...args) => ($options.handleShiftEnter && $options.handleShiftEnter(...args)), ["shift","exact"]), ["enter"]))
10253
10261
  ],
10254
10262
  onInput: _cache[6] || (_cache[6] = (...args) => ($options.autoGrow && $options.autoGrow(...args)))
10255
- }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_8$4h), [
10263
+ }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_7$4J), [
10256
10264
  [vue$1.vModelText, $data.inputText]
10257
10265
  ]),
10258
10266
  vue$1.createElementVNode("button", {
@@ -10276,9 +10284,9 @@ function render$8F(_ctx, _cache, $props, $setup, $data, $options) {
10276
10284
  key: 2,
10277
10285
  size: 20
10278
10286
  }))
10279
- ], 10 /* CLASS, PROPS */, _hoisted_9$3X)
10287
+ ], 10 /* CLASS, PROPS */, _hoisted_8$4h)
10280
10288
  ])
10281
- ]))
10289
+ ], 2 /* CLASS */))
10282
10290
  }
10283
10291
 
10284
10292
  script$8G.render = render$8F;
@@ -10499,7 +10507,7 @@ const _hoisted_10$3s = {
10499
10507
  "data-testid": "cn-ai-message-attachments"
10500
10508
  };
10501
10509
  const _hoisted_11$36 = ["href"];
10502
- const _hoisted_12$2O = ["src", "alt"];
10510
+ const _hoisted_12$2P = ["src", "alt"];
10503
10511
  const _hoisted_13$2w = ["href"];
10504
10512
  const _hoisted_14$2m = {
10505
10513
  key: 2,
@@ -10603,7 +10611,7 @@ function render$8E(_ctx, _cache, $props, $setup, $data, $options) {
10603
10611
  src: $options.previewSrc(file),
10604
10612
  alt: file.name,
10605
10613
  loading: "lazy"
10606
- }, null, 8 /* PROPS */, _hoisted_12$2O)
10614
+ }, null, 8 /* PROPS */, _hoisted_12$2P)
10607
10615
  ], 8 /* PROPS */, _hoisted_11$36))
10608
10616
  : ($options.fileHref(file))
10609
10617
  ? (vue$1.openBlock(), vue$1.createElementBlock("a", {
@@ -11770,7 +11778,7 @@ const _hoisted_9$3V = {
11770
11778
  };
11771
11779
  const _hoisted_10$3r = { class: "cn-ai-approval__head" };
11772
11780
  const _hoisted_11$35 = { class: "cn-ai-approval__title" };
11773
- const _hoisted_12$2N = { class: "cn-ai-approval__reach" };
11781
+ const _hoisted_12$2O = { class: "cn-ai-approval__reach" };
11774
11782
  const _hoisted_13$2v = {
11775
11783
  key: 0,
11776
11784
  class: "cn-ai-approval__reason"
@@ -12031,7 +12039,7 @@ function render$8D(_ctx, _cache, $props, $setup, $data, $options) {
12031
12039
  }, [
12032
12040
  vue$1.createElementVNode("div", _hoisted_10$3r, [
12033
12041
  vue$1.createElementVNode("span", _hoisted_11$35, vue$1.toDisplayString(approval.title), 1 /* TEXT */),
12034
- vue$1.createElementVNode("span", _hoisted_12$2N, vue$1.toDisplayString(approval.reach), 1 /* TEXT */)
12042
+ vue$1.createElementVNode("span", _hoisted_12$2O, vue$1.toDisplayString(approval.reach), 1 /* TEXT */)
12035
12043
  ]),
12036
12044
  (approval.reason)
12037
12045
  ? (vue$1.openBlock(), vue$1.createElementBlock("p", _hoisted_13$2v, vue$1.toDisplayString(approval.reason), 1 /* TEXT */))
@@ -12082,6 +12090,7 @@ function render$8D(_ctx, _cache, $props, $setup, $data, $options) {
12082
12090
  disabled: $props.streamState.isStreaming,
12083
12091
  placeholder: $props.inputPlaceholder,
12084
12092
  sendLabel: $props.sendLabel,
12093
+ stacked: $props.titled,
12085
12094
  chatAppId: $props.chatAppId,
12086
12095
  speechInputEngine: $options.speechPolicy.inputEngine,
12087
12096
  dictationSilenceTimeout: $options.speechPolicy.silenceTimeout,
@@ -12089,7 +12098,7 @@ function render$8D(_ctx, _cache, $props, $setup, $data, $options) {
12089
12098
  conversationEnabled: $options.speechPolicy.conversationEnabled,
12090
12099
  onSend: $options.onSend,
12091
12100
  onConversationState: $options.onConversationTurn
12092
- }, null, 8 /* PROPS */, ["disabled", "placeholder", "sendLabel", "chatAppId", "speechInputEngine", "dictationSilenceTimeout", "localSpeechAvailable", "conversationEnabled", "onSend", "onConversationState"])
12101
+ }, null, 8 /* PROPS */, ["disabled", "placeholder", "sendLabel", "stacked", "chatAppId", "speechInputEngine", "dictationSilenceTimeout", "localSpeechAvailable", "conversationEnabled", "onSend", "onConversationState"])
12093
12102
  ])
12094
12103
  ]))
12095
12104
  : (vue$1.openBlock(), vue$1.createElementBlock("div", _hoisted_18$1v, [
@@ -26808,7 +26817,7 @@ const _hoisted_11$34 = {
26808
26817
  class: "cn-chart-widget__html",
26809
26818
  "data-testid": "cn-chart-widget-matrix"
26810
26819
  };
26811
- const _hoisted_12$2M = ["aria-label"];
26820
+ const _hoisted_12$2N = ["aria-label"];
26812
26821
  const _hoisted_13$2u = {
26813
26822
  role: "row",
26814
26823
  class: "cn-chart-widget__matrix-row"
@@ -26975,7 +26984,7 @@ function render$8y(_ctx, _cache, $props, $setup, $data, $options) {
26975
26984
  }), 128 /* KEYED_FRAGMENT */))
26976
26985
  ]))
26977
26986
  }), 128 /* KEYED_FRAGMENT */))
26978
- ], 12 /* STYLE, PROPS */, _hoisted_12$2M),
26987
+ ], 12 /* STYLE, PROPS */, _hoisted_12$2N),
26979
26988
  ($props.footnote)
26980
26989
  ? (vue$1.openBlock(), vue$1.createElementBlock("p", _hoisted_16$1W, vue$1.toDisplayString($options.hostTranslate($props.footnote)), 1 /* TEXT */))
26981
26990
  : vue$1.createCommentVNode("v-if", true)
@@ -29449,7 +29458,7 @@ const _hoisted_11$33 = {
29449
29458
  key: 0,
29450
29459
  class: "cn-quick-filter-bar__label"
29451
29460
  };
29452
- const _hoisted_12$2L = { class: "cn-quick-filter-bar__more-heading" };
29461
+ const _hoisted_12$2M = { class: "cn-quick-filter-bar__more-heading" };
29453
29462
  const _hoisted_13$2t = { class: "cn-quick-filter-bar__more-list" };
29454
29463
  const _hoisted_14$2j = ["aria-pressed", "onClick"];
29455
29464
  const _hoisted_15$26 = { class: "cn-quick-filter-bar__label" };
@@ -29582,7 +29591,7 @@ function render$8r(_ctx, _cache, $props, $setup, $data, $options) {
29582
29591
  class: "cn-quick-filter-bar__more-panel",
29583
29592
  onKeydown: _cache[1] || (_cache[1] = vue$1.withKeys(vue$1.withModifiers($event => ($data.moreOpen = false), ["stop"]), ["escape"]))
29584
29593
  }, [
29585
- vue$1.createElementVNode("p", _hoisted_12$2L, vue$1.toDisplayString($options.moreHeading), 1 /* TEXT */),
29594
+ vue$1.createElementVNode("p", _hoisted_12$2M, vue$1.toDisplayString($options.moreHeading), 1 /* TEXT */),
29586
29595
  vue$1.createElementVNode("div", _hoisted_13$2t, [
29587
29596
  (vue$1.openBlock(true), vue$1.createElementBlock(vue$1.Fragment, null, vue$1.renderList($options.overflowEntries, (entry) => {
29588
29597
  return (vue$1.openBlock(), vue$1.createElementBlock("button", {
@@ -30092,7 +30101,7 @@ const _hoisted_11$32 = {
30092
30101
  class: "cn-conversation-thread__avatar",
30093
30102
  "aria-hidden": "true"
30094
30103
  };
30095
- const _hoisted_12$2K = { class: "cn-conversation-thread__bubble" };
30104
+ const _hoisted_12$2L = { class: "cn-conversation-thread__bubble" };
30096
30105
  const _hoisted_13$2s = { class: "cn-conversation-thread__meta" };
30097
30106
  const _hoisted_14$2i = { class: "hidden-visually" };
30098
30107
  const _hoisted_15$25 = { class: "cn-conversation-thread__author" };
@@ -30202,7 +30211,7 @@ function render$8q(_ctx, _cache, $props, $setup, $data, $options) {
30202
30211
  "data-side": row.side
30203
30212
  }, [
30204
30213
  vue$1.createElementVNode("span", _hoisted_11$32, vue$1.toDisplayString(row.initials), 1 /* TEXT */),
30205
- vue$1.createElementVNode("div", _hoisted_12$2K, [
30214
+ vue$1.createElementVNode("div", _hoisted_12$2L, [
30206
30215
  vue$1.createElementVNode("span", _hoisted_13$2s, [
30207
30216
  vue$1.createElementVNode("span", _hoisted_14$2i, vue$1.toDisplayString(row.directionLabel), 1 /* TEXT */),
30208
30217
  vue$1.createElementVNode("span", _hoisted_15$25, vue$1.toDisplayString(row.author), 1 /* TEXT */),
@@ -37326,7 +37335,7 @@ const _hoisted_9$3P = {
37326
37335
  };
37327
37336
  const _hoisted_10$3n = { class: "cn-calendar-event-picker__breadcrumb" };
37328
37337
  const _hoisted_11$31 = { class: "cn-calendar-event-picker__breadcrumb-calendar" };
37329
- const _hoisted_12$2J = {
37338
+ const _hoisted_12$2K = {
37330
37339
  key: 1,
37331
37340
  class: "cn-calendar-event-picker__banner cn-calendar-event-picker__banner--error",
37332
37341
  role: "alert"
@@ -37446,7 +37455,7 @@ function render$8h(_ctx, _cache, $props, $setup, $data, $options) {
37446
37455
  size: 32
37447
37456
  }))
37448
37457
  : ($data.errorEvents)
37449
- ? (vue$1.openBlock(), vue$1.createElementBlock("div", _hoisted_12$2J, vue$1.toDisplayString($data.errorEvents), 1 /* TEXT */))
37458
+ ? (vue$1.openBlock(), vue$1.createElementBlock("div", _hoisted_12$2K, vue$1.toDisplayString($data.errorEvents), 1 /* TEXT */))
37450
37459
  : ($options.filteredEvents.length > 0)
37451
37460
  ? (vue$1.openBlock(), vue$1.createElementBlock("ul", _hoisted_13$2r, [
37452
37461
  (vue$1.openBlock(true), vue$1.createElementBlock(vue$1.Fragment, null, vue$1.renderList($options.filteredEvents, (ev) => {
@@ -42406,7 +42415,7 @@ const _hoisted_11$30 = {
42406
42415
  key: 4,
42407
42416
  class: "cn-pagination__page-size"
42408
42417
  };
42409
- const _hoisted_12$2I = ["for"];
42418
+ const _hoisted_12$2J = ["for"];
42410
42419
 
42411
42420
  function render$88(_ctx, _cache, $props, $setup, $data, $options) {
42412
42421
  const _component_ChevronLeft = vue$1.resolveComponent("ChevronLeft");
@@ -42559,7 +42568,7 @@ function render$88(_ctx, _cache, $props, $setup, $data, $options) {
42559
42568
  : vue$1.createCommentVNode("v-if", true),
42560
42569
  (!$props.compact && !$options.isBoardVariant)
42561
42570
  ? (vue$1.openBlock(), vue$1.createElementBlock("div", _hoisted_11$30, [
42562
- vue$1.createElementVNode("label", { for: $options.pageSizeId }, vue$1.toDisplayString($props.itemsPerPageLabel), 9 /* TEXT, PROPS */, _hoisted_12$2I),
42571
+ vue$1.createElementVNode("label", { for: $options.pageSizeId }, vue$1.toDisplayString($props.itemsPerPageLabel), 9 /* TEXT, PROPS */, _hoisted_12$2J),
42563
42572
  vue$1.createVNode(_component_NcSelect, {
42564
42573
  inputId: $options.pageSizeId,
42565
42574
  class: "cn-pagination__page-size-select",
@@ -42903,7 +42912,7 @@ const _hoisted_11$2$ = {
42903
42912
  key: 1,
42904
42913
  class: "cn-column-filter__options"
42905
42914
  };
42906
- const _hoisted_12$2H = { class: "cn-column-filter__sr-only" };
42915
+ const _hoisted_12$2I = { class: "cn-column-filter__sr-only" };
42907
42916
  const _hoisted_13$2q = ["name", "value", "checked", "onChange"];
42908
42917
  const _hoisted_14$2g = {
42909
42918
  key: 2,
@@ -42988,7 +42997,7 @@ function render$87(_ctx, _cache, $props, $setup, $data, $options) {
42988
42997
  ], 64 /* STABLE_FRAGMENT */))
42989
42998
  : ($props.def.kind === 'boolean')
42990
42999
  ? (vue$1.openBlock(), vue$1.createElementBlock("fieldset", _hoisted_11$2$, [
42991
- vue$1.createElementVNode("legend", _hoisted_12$2H, vue$1.toDisplayString($options.headingText), 1 /* TEXT */),
43000
+ vue$1.createElementVNode("legend", _hoisted_12$2I, vue$1.toDisplayString($options.headingText), 1 /* TEXT */),
42992
43001
  (vue$1.openBlock(true), vue$1.createElementBlock(vue$1.Fragment, null, vue$1.renderList($options.booleanOptions, (option) => {
42993
43002
  return (vue$1.openBlock(), vue$1.createElementBlock("label", {
42994
43003
  key: option.value,
@@ -46340,7 +46349,7 @@ const _hoisted_11$2_ = {
46340
46349
  key: 0,
46341
46350
  class: "cn-cell-renderer__dash"
46342
46351
  };
46343
- const _hoisted_12$2G = {
46352
+ const _hoisted_12$2H = {
46344
46353
  key: 1,
46345
46354
  class: "cn-cell-renderer__ref-labels",
46346
46355
  "data-testid": "cn-cell-ref-labels"
@@ -46395,7 +46404,7 @@ const _hoisted_30$s = {
46395
46404
  "data-testid": "cn-cell-renderer-due"
46396
46405
  };
46397
46406
  const _hoisted_31$q = ["datetime", "title"];
46398
- const _hoisted_32$p = { class: "cn-cell-renderer__date-tile" };
46407
+ const _hoisted_32$q = { class: "cn-cell-renderer__date-tile" };
46399
46408
  const _hoisted_33$o = { class: "cn-cell-renderer__date-day" };
46400
46409
  const _hoisted_34$o = { class: "cn-cell-renderer__date-month" };
46401
46410
  const _hoisted_35$m = { class: "cn-cell-renderer__date-lines" };
@@ -46597,7 +46606,7 @@ function render$84(_ctx, _cache, $props, $setup, $data, $options) {
46597
46606
  ? (vue$1.openBlock(), vue$1.createElementBlock(vue$1.Fragment, { key: 7 }, [
46598
46607
  (!$options.refLabelItems.length)
46599
46608
  ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_11$2_, "—"))
46600
- : (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_12$2G, [
46609
+ : (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_12$2H, [
46601
46610
  (vue$1.openBlock(true), vue$1.createElementBlock(vue$1.Fragment, null, vue$1.renderList($options.refLabelItems, (item, i) => {
46602
46611
  return (vue$1.openBlock(), vue$1.createElementBlock(vue$1.Fragment, {
46603
46612
  key: item.id
@@ -46742,7 +46751,7 @@ function render$84(_ctx, _cache, $props, $setup, $data, $options) {
46742
46751
  title: $options.absoluteDateLabel,
46743
46752
  "data-testid": "cn-cell-date-block"
46744
46753
  }, [
46745
- vue$1.createElementVNode("span", _hoisted_32$p, [
46754
+ vue$1.createElementVNode("span", _hoisted_32$q, [
46746
46755
  vue$1.createElementVNode("strong", _hoisted_33$o, vue$1.toDisplayString($options.dateBlock.day), 1 /* TEXT */),
46747
46756
  vue$1.createElementVNode("span", _hoisted_34$o, vue$1.toDisplayString($options.dateBlock.month), 1 /* TEXT */)
46748
46757
  ]),
@@ -49459,7 +49468,7 @@ const _hoisted_10$3j = {
49459
49468
  scope: "col"
49460
49469
  };
49461
49470
  const _hoisted_11$2Z = { class: "hidden-visually" };
49462
- const _hoisted_12$2F = {
49471
+ const _hoisted_12$2G = {
49463
49472
  key: 2,
49464
49473
  scope: "col"
49465
49474
  };
@@ -49515,7 +49524,7 @@ const _hoisted_29$s = {
49515
49524
  };
49516
49525
  const _hoisted_30$r = ["title", "data-testid"];
49517
49526
  const _hoisted_31$p = { class: "hidden-visually" };
49518
- const _hoisted_32$o = {
49527
+ const _hoisted_32$p = {
49519
49528
  key: 4,
49520
49529
  class: "cn-table-cell__overline",
49521
49530
  "data-testid": "cn-cell-overline"
@@ -49655,7 +49664,7 @@ function render$81(_ctx, _cache, $props, $setup, $data, $options) {
49655
49664
  ]))
49656
49665
  }), 128 /* KEYED_FRAGMENT */)),
49657
49666
  (_ctx.$slots['row-actions'])
49658
- ? (vue$1.openBlock(), vue$1.createElementBlock("th", _hoisted_12$2F, [
49667
+ ? (vue$1.openBlock(), vue$1.createElementBlock("th", _hoisted_12$2G, [
49659
49668
  vue$1.createElementVNode("span", _hoisted_13$2o, vue$1.toDisplayString($options.actionsColumnLabel), 1 /* TEXT */)
49660
49669
  ]))
49661
49670
  : vue$1.createCommentVNode("v-if", true)
@@ -49879,7 +49888,7 @@ function render$81(_ctx, _cache, $props, $setup, $data, $options) {
49879
49888
  ]))
49880
49889
  : vue$1.createCommentVNode("v-if", true),
49881
49890
  ($options.overlineValue(row, col))
49882
- ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_32$o, vue$1.toDisplayString($options.overlineValue(row, col)), 1 /* TEXT */))
49891
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_32$p, vue$1.toDisplayString($options.overlineValue(row, col)), 1 /* TEXT */))
49883
49892
  : vue$1.createCommentVNode("v-if", true),
49884
49893
  vue$1.renderSlot(_ctx.$slots, 'column-' + col.key, {
49885
49894
  row: row,
@@ -50570,7 +50579,7 @@ const _hoisted_11$2Y = {
50570
50579
  class: "cn-child-records-field__more",
50571
50580
  "data-testid": "cn-child-records-more"
50572
50581
  };
50573
- const _hoisted_12$2E = ["href"];
50582
+ const _hoisted_12$2F = ["href"];
50574
50583
  const _hoisted_13$2n = {
50575
50584
  key: 3,
50576
50585
  class: "cn-child-records-field__error",
@@ -50685,7 +50694,7 @@ function render$7$(_ctx, _cache, $props, $setup, $data, $options) {
50685
50694
  ? (vue$1.openBlock(), vue$1.createElementBlock("a", {
50686
50695
  key: 0,
50687
50696
  href: $options.listUrl
50688
- }, vue$1.toDisplayString($options.moreLabel), 9 /* TEXT, PROPS */, _hoisted_12$2E))
50697
+ }, vue$1.toDisplayString($options.moreLabel), 9 /* TEXT, PROPS */, _hoisted_12$2F))
50689
50698
  : (vue$1.openBlock(), vue$1.createElementBlock(vue$1.Fragment, { key: 1 }, [
50690
50699
  vue$1.createTextVNode(vue$1.toDisplayString($options.moreLabel), 1 /* TEXT */)
50691
50700
  ], 64 /* STABLE_FRAGMENT */))
@@ -85580,7 +85589,7 @@ const _hoisted_8$3$ = ["title", "aria-label"];
85580
85589
  const _hoisted_9$3G = ["aria-label"];
85581
85590
  const _hoisted_10$3g = ["id", "aria-selected", "aria-controls", "tabindex", "onClick", "onKeydown"];
85582
85591
  const _hoisted_11$2W = ["id", "role", "aria-labelledby"];
85583
- const _hoisted_12$2D = ["placeholder", "aria-label"];
85592
+ const _hoisted_12$2E = ["placeholder", "aria-label"];
85584
85593
  const _hoisted_13$2m = {
85585
85594
  key: 0,
85586
85595
  class: "cn-icon-browser-panel__grid"
@@ -85628,7 +85637,7 @@ const _hoisted_31$o = {
85628
85637
  key: 1,
85629
85638
  class: "cn-icon-browser-panel__grid"
85630
85639
  };
85631
- const _hoisted_32$n = ["title", "aria-label", "onClick"];
85640
+ const _hoisted_32$o = ["title", "aria-label", "onClick"];
85632
85641
  const _hoisted_33$m = ["src", "alt"];
85633
85642
  const _hoisted_34$m = {
85634
85643
  key: 0,
@@ -85729,7 +85738,7 @@ function render$7S(_ctx, _cache, $props, $setup, $data, $options) {
85729
85738
  class: "cn-icon-browser-panel__search",
85730
85739
  placeholder: $options.t('nextcloud-vue', 'Search icons…'),
85731
85740
  "aria-label": $options.t('nextcloud-vue', 'Search icons')
85732
- }, null, 8 /* PROPS */, _hoisted_12$2D), [
85741
+ }, null, 8 /* PROPS */, _hoisted_12$2E), [
85733
85742
  [vue$1.vModelText, $data.query]
85734
85743
  ]),
85735
85744
  ($options.visibleIcons.length > 0)
@@ -85879,7 +85888,7 @@ function render$7S(_ctx, _cache, $props, $setup, $data, $options) {
85879
85888
  ($props.showLabels)
85880
85889
  ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_34$m, vue$1.toDisplayString(icon.label), 1 /* TEXT */))
85881
85890
  : vue$1.createCommentVNode("v-if", true)
85882
- ], 10 /* CLASS, PROPS */, _hoisted_32$n))
85891
+ ], 10 /* CLASS, PROPS */, _hoisted_32$o))
85883
85892
  }), 128 /* KEYED_FRAGMENT */))
85884
85893
  ]))
85885
85894
  : vue$1.createCommentVNode("v-if", true),
@@ -95776,7 +95785,7 @@ const _hoisted_10$3f = {
95776
95785
  class: "cn-activity-card__headline-recent"
95777
95786
  };
95778
95787
  const _hoisted_11$2V = { class: "cn-activity-card__headline-actor" };
95779
- const _hoisted_12$2C = { class: "cn-activity-card__headline-subject" };
95788
+ const _hoisted_12$2D = { class: "cn-activity-card__headline-subject" };
95780
95789
  const _hoisted_13$2l = { class: "cn-activity-card__headline-time" };
95781
95790
  const _hoisted_14$2c = {
95782
95791
  key: 0,
@@ -95843,7 +95852,7 @@ function render$7I(_ctx, _cache, $props, $setup, $data, $options) {
95843
95852
  (vue$1.openBlock(), vue$1.createBlock(vue$1.resolveDynamicComponent($options.iconFor($options.mostRecent)), { size: 14 })),
95844
95853
  vue$1.createElementVNode("span", _hoisted_11$2V, vue$1.toDisplayString($options.actorFor($options.mostRecent)), 1 /* TEXT */),
95845
95854
  _cache[1] || (_cache[1] = vue$1.createElementVNode("span", { class: "cn-activity-card__chip-sep" }, "·", -1 /* CACHED */)),
95846
- vue$1.createElementVNode("span", _hoisted_12$2C, vue$1.toDisplayString($options.subjectFor($options.mostRecent)), 1 /* TEXT */),
95855
+ vue$1.createElementVNode("span", _hoisted_12$2D, vue$1.toDisplayString($options.subjectFor($options.mostRecent)), 1 /* TEXT */),
95847
95856
  _cache[2] || (_cache[2] = vue$1.createElementVNode("span", { class: "cn-activity-card__chip-sep" }, "·", -1 /* CACHED */)),
95848
95857
  vue$1.createElementVNode("span", _hoisted_13$2l, vue$1.toDisplayString($options.relativeTime($options.mostRecent)), 1 /* TEXT */)
95849
95858
  ]))
@@ -96763,7 +96772,7 @@ const _hoisted_8$3Y = ["aria-label"];
96763
96772
  const _hoisted_9$3E = ["aria-pressed", "data-testid", "onClick"];
96764
96773
  const _hoisted_10$3e = ["data-testid"];
96765
96774
  const _hoisted_11$2U = { class: "cn-activity-tab__filter-row" };
96766
- const _hoisted_12$2B = {
96775
+ const _hoisted_12$2C = {
96767
96776
  key: 0,
96768
96777
  class: "cn-activity-tab__filter"
96769
96778
  };
@@ -96803,7 +96812,7 @@ const _hoisted_31$n = {
96803
96812
  key: 3,
96804
96813
  class: "cn-activity-tab__dates"
96805
96814
  };
96806
- const _hoisted_32$m = { class: "cn-activity-tab__filter" };
96815
+ const _hoisted_32$n = { class: "cn-activity-tab__filter" };
96807
96816
  const _hoisted_33$l = { class: "cn-activity-tab__filter-label" };
96808
96817
  const _hoisted_34$l = ["value"];
96809
96818
  const _hoisted_35$j = { class: "cn-activity-tab__filter" };
@@ -96942,7 +96951,7 @@ function render$7H(_ctx, _cache, $props, $setup, $data, $options) {
96942
96951
  : vue$1.createCommentVNode("v-if", true),
96943
96952
  vue$1.createElementVNode("div", _hoisted_11$2U, [
96944
96953
  ($data.legacy)
96945
- ? (vue$1.openBlock(), vue$1.createElementBlock("label", _hoisted_12$2B, [
96954
+ ? (vue$1.openBlock(), vue$1.createElementBlock("label", _hoisted_12$2C, [
96946
96955
  vue$1.createElementVNode("span", _hoisted_13$2k, vue$1.toDisplayString($data.typeLabel), 1 /* TEXT */),
96947
96956
  vue$1.withDirectives(vue$1.createElementVNode("select", {
96948
96957
  "onUpdate:modelValue": _cache[1] || (_cache[1] = $event => (($data.selectedType) = $event)),
@@ -97031,7 +97040,7 @@ function render$7H(_ctx, _cache, $props, $setup, $data, $options) {
97031
97040
  ], 8 /* PROPS */, _hoisted_29$q),
97032
97041
  (!$data.legacy)
97033
97042
  ? (vue$1.openBlock(), vue$1.createElementBlock("div", _hoisted_31$n, [
97034
- vue$1.createElementVNode("label", _hoisted_32$m, [
97043
+ vue$1.createElementVNode("label", _hoisted_32$n, [
97035
97044
  vue$1.createElementVNode("span", _hoisted_33$l, vue$1.toDisplayString($data.fromLabel), 1 /* TEXT */),
97036
97045
  vue$1.createElementVNode("input", {
97037
97046
  type: "date",
@@ -97564,7 +97573,7 @@ const _hoisted_10$3d = {
97564
97573
  class: "cn-analytics-card__view-all"
97565
97574
  };
97566
97575
  const _hoisted_11$2T = ["href"];
97567
- const _hoisted_12$2A = {
97576
+ const _hoisted_12$2B = {
97568
97577
  key: 0,
97569
97578
  class: "cn-analytics-card__empty"
97570
97579
  };
@@ -97651,7 +97660,7 @@ function render$7G(_ctx, _cache, $props, $setup, $data, $options) {
97651
97660
  ], 64 /* STABLE_FRAGMENT */))
97652
97661
  : (vue$1.openBlock(), vue$1.createElementBlock(vue$1.Fragment, { key: 3 }, [
97653
97662
  ($data.degraded)
97654
- ? (vue$1.openBlock(), vue$1.createElementBlock("div", _hoisted_12$2A, vue$1.toDisplayString($data.degraded), 1 /* TEXT */))
97663
+ ? (vue$1.openBlock(), vue$1.createElementBlock("div", _hoisted_12$2B, vue$1.toDisplayString($data.degraded), 1 /* TEXT */))
97655
97664
  : ($data.reports.length === 0)
97656
97665
  ? (vue$1.openBlock(), vue$1.createElementBlock("div", _hoisted_13$2j, vue$1.toDisplayString($props.emptyLabel), 1 /* TEXT */))
97657
97666
  : (vue$1.openBlock(), vue$1.createElementBlock("ul", _hoisted_14$2a, [
@@ -98833,6 +98842,12 @@ var script$7D = {
98833
98842
 
98834
98843
  /** Maximum rows to render. */
98835
98844
  maxDisplay: { type: Number, default: 5 },
98845
+ /**
98846
+ * `stacked` (DqTaak "Historie"): the action, then one muted line under
98847
+ * it with the moment ("6 okt 09:05") and who, when the action does not
98848
+ * already name them. Default: the moment beside the action, who under it.
98849
+ */
98850
+ layout: { type: String, default: '' },
98836
98851
  /**
98837
98852
  * Actions the card leaves out (case-insensitive), such as `['read']`
98838
98853
  * for a history of what changed. It then reads more entries than it
@@ -99119,7 +99134,27 @@ var script$7D = {
99119
99134
  * @return {string} Who did it, by name where the entry carries one.
99120
99135
  */
99121
99136
  actorName(entry) {
99122
- return entry.actorDisplayName || entry.actor || entry.userId || entry.user || ''
99137
+ if (entry.actorDisplayName) {
99138
+ return entry.actorDisplayName
99139
+ }
99140
+ const id = entry.actor || entry.userId || entry.user || '';
99141
+ // A person's user id reads as their display name once it is known.
99142
+ return (id && (!entry.performerType || entry.performerType === 'user') && userDisplayName(String(id))) || id
99143
+ },
99144
+
99145
+ /**
99146
+ * The muted line of a stacked row: the moment in the board's short
99147
+ * form ("6 okt 09:05") and who, unless the action names them already.
99148
+ *
99149
+ * @param {object} entry The entry.
99150
+ * @return {string} The line.
99151
+ * @spec openspec/changes/audit-card-stacked-rows/specs/audit-trail/spec.md#requirement-an-audit-row-can-put-its-moment-under-the-action
99152
+ */
99153
+ stackedLine(entry) {
99154
+ const raw = entry.creationDateTime || entry.created || entry.timestamp;
99155
+ const date = raw ? new Date(raw) : null;
99156
+ const when = date && !Number.isNaN(date.getTime()) ? `${formatBoardDate(date)} ${formatTimeOfDay(date)}` : '';
99157
+ return [when, this.formatActor(entry)].filter((part) => part !== '').join(' · ')
99123
99158
  },
99124
99159
 
99125
99160
  /**
@@ -99171,19 +99206,30 @@ const _hoisted_3$6o = {
99171
99206
  };
99172
99207
  const _hoisted_4$5N = { class: "cn-audit-card__row-head" };
99173
99208
  const _hoisted_5$56 = { class: "cn-audit-card__action" };
99174
- const _hoisted_6$4K = { class: "cn-audit-card__when" };
99209
+ const _hoisted_6$4K = {
99210
+ key: 0,
99211
+ class: "cn-audit-card__when"
99212
+ };
99175
99213
  const _hoisted_7$4j = { class: "cn-audit-card__row-body" };
99176
- const _hoisted_8$3U = { class: "cn-audit-card__actor" };
99177
- const _hoisted_9$3A = {
99214
+ const _hoisted_8$3U = {
99178
99215
  key: 0,
99216
+ class: "cn-audit-card__when",
99217
+ "data-testid": "cn-audit-card-when-below"
99218
+ };
99219
+ const _hoisted_9$3A = {
99220
+ key: 1,
99221
+ class: "cn-audit-card__actor"
99222
+ };
99223
+ const _hoisted_10$3b = {
99224
+ key: 2,
99179
99225
  class: "cn-audit-card__refused",
99180
99226
  "data-testid": "cn-audit-card-refused"
99181
99227
  };
99182
- const _hoisted_10$3b = {
99228
+ const _hoisted_11$2R = {
99183
99229
  key: 0,
99184
99230
  class: "cn-audit-card__reason"
99185
99231
  };
99186
- const _hoisted_11$2R = {
99232
+ const _hoisted_12$2A = {
99187
99233
  key: 4,
99188
99234
  class: "cn-audit-card__footnote",
99189
99235
  "data-testid": "cn-audit-trail-widget-footnote"
@@ -99210,26 +99256,30 @@ function render$7C(_ctx, _cache, $props, $setup, $data, $options) {
99210
99256
  (vue$1.openBlock(true), vue$1.createElementBlock(vue$1.Fragment, null, vue$1.renderList($options.displayedEntries, (entry) => {
99211
99257
  return (vue$1.openBlock(), vue$1.createElementBlock("li", {
99212
99258
  key: entry.id,
99213
- class: "cn-audit-card__row"
99259
+ class: vue$1.normalizeClass(["cn-audit-card__row", { 'cn-audit-card__row--stacked': $props.layout === 'stacked' }])
99214
99260
  }, [
99215
99261
  vue$1.createElementVNode("div", _hoisted_4$5N, [
99216
99262
  vue$1.createElementVNode("strong", _hoisted_5$56, vue$1.toDisplayString($options.formatAction(entry)), 1 /* TEXT */),
99217
- vue$1.createElementVNode("span", _hoisted_6$4K, vue$1.toDisplayString($options.formatWhen(entry)), 1 /* TEXT */)
99263
+ ($props.layout !== 'stacked')
99264
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_6$4K, vue$1.toDisplayString($options.formatWhen(entry)), 1 /* TEXT */))
99265
+ : vue$1.createCommentVNode("v-if", true)
99218
99266
  ]),
99219
99267
  vue$1.createElementVNode("div", _hoisted_7$4j, [
99220
- vue$1.createElementVNode("span", _hoisted_8$3U, vue$1.toDisplayString($options.formatActor(entry)), 1 /* TEXT */),
99268
+ ($props.layout === 'stacked')
99269
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_8$3U, vue$1.toDisplayString($options.stackedLine(entry)), 1 /* TEXT */))
99270
+ : (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_9$3A, vue$1.toDisplayString($options.formatActor(entry)), 1 /* TEXT */)),
99221
99271
  (entry.authorized === false)
99222
- ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_9$3A, vue$1.toDisplayString($props.refusedLabel), 1 /* TEXT */))
99272
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_10$3b, vue$1.toDisplayString($props.refusedLabel), 1 /* TEXT */))
99223
99273
  : vue$1.createCommentVNode("v-if", true)
99224
99274
  ]),
99225
99275
  (entry.reason)
99226
- ? (vue$1.openBlock(), vue$1.createElementBlock("p", _hoisted_10$3b, vue$1.toDisplayString(entry.reason), 1 /* TEXT */))
99276
+ ? (vue$1.openBlock(), vue$1.createElementBlock("p", _hoisted_11$2R, vue$1.toDisplayString(entry.reason), 1 /* TEXT */))
99227
99277
  : vue$1.createCommentVNode("v-if", true)
99228
- ]))
99278
+ ], 2 /* CLASS */))
99229
99279
  }), 128 /* KEYED_FRAGMENT */))
99230
99280
  ])),
99231
99281
  ($props.footnote)
99232
- ? (vue$1.openBlock(), vue$1.createElementBlock("p", _hoisted_11$2R, vue$1.toDisplayString($props.footnote), 1 /* TEXT */))
99282
+ ? (vue$1.openBlock(), vue$1.createElementBlock("p", _hoisted_12$2A, vue$1.toDisplayString($props.footnote), 1 /* TEXT */))
99233
99283
  : vue$1.createCommentVNode("v-if", true)
99234
99284
  ]),
99235
99285
  _: 2 /* DYNAMIC */
@@ -99250,7 +99300,7 @@ function render$7C(_ctx, _cache, $props, $setup, $data, $options) {
99250
99300
  }
99251
99301
 
99252
99302
  script$7D.render = render$7C;
99253
- script$7D.__scopeId = "data-v-834a0068";
99303
+ script$7D.__scopeId = "data-v-401394d1";
99254
99304
  const __sfc_main$7x = script$7D;
99255
99305
 
99256
99306
  // SPDX-FileCopyrightText: 2026 Conduction B.V.
@@ -102826,7 +102876,7 @@ const _hoisted_30$o = {
102826
102876
  class: "cn-calendar-tab__location"
102827
102877
  };
102828
102878
  const _hoisted_31$m = { class: "cn-calendar-tab__location-text" };
102829
- const _hoisted_32$l = {
102879
+ const _hoisted_32$m = {
102830
102880
  key: 1,
102831
102881
  class: "cn-calendar-tab__attendees"
102832
102882
  };
@@ -103029,7 +103079,7 @@ function render$7t(_ctx, _cache, $props, $setup, $data, $options) {
103029
103079
  ]))
103030
103080
  : vue$1.createCommentVNode("v-if", true),
103031
103081
  ($options.attendeeList(ev).length > 0)
103032
- ? (vue$1.openBlock(), vue$1.createElementBlock("div", _hoisted_32$l, [
103082
+ ? (vue$1.openBlock(), vue$1.createElementBlock("div", _hoisted_32$m, [
103033
103083
  (vue$1.openBlock(true), vue$1.createElementBlock(vue$1.Fragment, null, vue$1.renderList($options.visibleAttendees(ev), (att, idx) => {
103034
103084
  return (vue$1.openBlock(), vue$1.createElementBlock("span", {
103035
103085
  key: idx,
@@ -116385,15 +116435,19 @@ function indexRowData(data, { path = '', key = 'fileId' } = {}) {
116385
116435
  *
116386
116436
  * `visibleIf.extension` lists file extensions (no case, a leading dot is
116387
116437
  * allowed); `visibleIf.mime` lists mime types, where one ending in `/` or
116388
- * `/*` names the whole family. Every condition named must hold. An action
116389
- * without `visibleIf` is offered on every file, as before. An action with
116390
- * `when` is offered only while `when` is `true`.
116438
+ * `/*` names the whole family; `visibleIf.row` maps fields of the host's row
116439
+ * for the file to the value each must have (compared strictly, so `true` is
116440
+ * not `"true"`). Every condition named must hold. An action without
116441
+ * `visibleIf` is offered on every file, as before. An action with `when` is
116442
+ * offered only while `when` is `true`.
116391
116443
  *
116392
116444
  * @param {object} action The declared action.
116393
116445
  * @param {object} node The file (`basename`, `mime`).
116446
+ * @param {((key: string) => unknown)|null} rowValue Reads a field of the host's row for the file; without it a `row` condition fails.
116394
116447
  * @return {boolean} True when the action belongs on this file.
116448
+ * @spec openspec/changes/files-browser-action-visible-if-row/specs/files-browser/spec.md#requirement-a-host-action-can-be-offered-by-a-field-of-the-files-row
116395
116449
  */
116396
- function hostActionApplies(action, node) {
116450
+ function hostActionApplies(action, node, rowValue = null) {
116397
116451
  // `when`: the action applies only while it is true (a case type flag).
116398
116452
  // @spec openspec/changes/files-review-row-when/specs/files-review-row-when/spec.md#requirement-a-files-browser-entry-can-apply-only-when-a-condition-holds
116399
116453
  if (action && typeof action === 'object' && 'when' in action && action.when !== true) {
@@ -116425,6 +116479,15 @@ function hostActionApplies(action, node) {
116425
116479
  return false
116426
116480
  }
116427
116481
  }
116482
+ if (condition.row && typeof condition.row === 'object') {
116483
+ if (typeof rowValue !== 'function') {
116484
+ return false
116485
+ }
116486
+ const holds = Object.entries(condition.row).every(([key, wanted]) => rowValue(key) === wanted);
116487
+ if (!holds) {
116488
+ return false
116489
+ }
116490
+ }
116428
116491
  return true
116429
116492
  }
116430
116493
 
@@ -116433,6 +116496,7 @@ function hostActionApplies(action, node) {
116433
116496
  * SPDX-License-Identifier: AGPL-3.0-or-later
116434
116497
  */
116435
116498
 
116499
+
116436
116500
  /**
116437
116501
  * The built-in columns a host may name by string, and what each one reads.
116438
116502
  *
@@ -116483,12 +116547,26 @@ function isBuiltInFileColumn(name) {
116483
116547
  return typeof name === 'string' && Object.hasOwn(BUILT_IN_FILE_COLUMNS, name)
116484
116548
  }
116485
116549
 
116550
+ /**
116551
+ * Whether the app a column leans on is enabled: one app id, or a list of which
116552
+ * any one will do. A column without `requiredApp` always applies.
116553
+ *
116554
+ * @param {(string|string[]|undefined)} requiredApp The app id(s).
116555
+ * @return {boolean} True when the column applies.
116556
+ * @spec openspec/changes/files-column-required-app/specs/files-column-required-app/spec.md#requirement-a-file-column-can-require-another-app
116557
+ */
116558
+ function requiredAppPresent(requiredApp) {
116559
+ const ids = (Array.isArray(requiredApp) ? requiredApp : [requiredApp]).filter((id) => typeof id === 'string' && id !== '');
116560
+ return ids.length === 0 || ids.some((id) => isAppInstalled(id))
116561
+ }
116562
+
116486
116563
  /**
116487
116564
  * Resolve a host's `columns` declaration into column objects.
116488
116565
  *
116489
116566
  * A string names a built-in. An object declares its own: `key`, `label`,
116490
116567
  * `source` (`node`, `attribute` or `row`), `attribute`, `formatter` and
116491
- * `sortable`. An entry naming an unknown built-in is dropped here and refused
116568
+ * `sortable`, and `requiredApp` (an app id, or a list of which any one will
116569
+ * do; without it the column is left out). An entry naming an unknown built-in is dropped here and refused
116492
116570
  * by the manifest validator, so an author hears about it at authoring time
116493
116571
  * rather than finding a column missing at runtime.
116494
116572
  *
@@ -116513,6 +116591,9 @@ function normaliseFileColumns(columns) {
116513
116591
  if ('when' in entry && entry.when !== true) {
116514
116592
  return
116515
116593
  }
116594
+ if (!requiredAppPresent(entry.requiredApp)) {
116595
+ return
116596
+ }
116516
116597
  if (isBuiltInFileColumn(entry.key) && entry.source === undefined) {
116517
116598
  out.push({ ...BUILT_IN_FILE_COLUMNS[entry.key], ...entry, builtIn: true });
116518
116599
  return
@@ -117539,6 +117620,19 @@ var script$71 = {
117539
117620
  return crumbsFor(this.rootPath, this.currentPath, this.rootLabel)
117540
117621
  },
117541
117622
 
117623
+ /**
117624
+ * Whether the open folder is the browser's root: the trail then ends on
117625
+ * the root itself (the board look draws no trail there).
117626
+ *
117627
+ * @return {boolean}
117628
+ * @spec openspec/changes/board-files-root-crumb/specs/board-files-root-crumb/spec.md#requirement-the-board-files-bar-draws-no-trail-at-the-root
117629
+ */
117630
+ atRoot() {
117631
+ const root = String(this.rootPath || '/').replace(/\/+$/, '') || '/';
117632
+ const last = this.crumbs[this.crumbs.length - 1];
117633
+ return Boolean(last) && last.path === root
117634
+ },
117635
+
117542
117636
  /**
117543
117637
  * The children in the chosen order, folders first the way the Files app
117544
117638
  * lists them.
@@ -118836,7 +118930,8 @@ var script$71 = {
118836
118930
  }
118837
118931
  })
118838
118932
  .filter((field) => field.value !== null && field.value !== undefined && field.value !== ''),
118839
- actions: (Array.isArray(card.actions) ? card.actions : []).filter((action) => action && action.id),
118933
+ actions: (Array.isArray(card.actions) ? card.actions : [])
118934
+ .filter((action) => action && action.id && hostActionApplies(action, node, this.rowValueOf(node))),
118840
118935
  }))
118841
118936
  },
118842
118937
 
@@ -119132,7 +119227,18 @@ var script$71 = {
119132
119227
  * @spec openspec/changes/files-browser-hosts-a-documents-list/specs/files-browser/spec.md
119133
119228
  */
119134
119229
  hostActionsFor(node) {
119135
- return this.rowActions.filter((action) => hostActionApplies(action, node))
119230
+ return this.rowActions.filter((action) => hostActionApplies(action, node, this.rowValueOf(node)))
119231
+ },
119232
+
119233
+ /**
119234
+ * A reader of the host's row fields for one file, for `visibleIf.row`.
119235
+ *
119236
+ * @param {object} node The file.
119237
+ * @return {(key: string) => unknown} `(key) => value` over the row the host gave for the file.
119238
+ * @spec openspec/changes/files-browser-action-visible-if-row/specs/files-browser/spec.md#requirement-a-host-action-can-be-offered-by-a-field-of-the-files-row
119239
+ */
119240
+ rowValueOf(node) {
119241
+ return (key) => fileColumnValue({ key, source: 'row' }, node, this.resolvedRowData)
119136
119242
  },
119137
119243
 
119138
119244
  /**
@@ -119312,7 +119418,7 @@ const _hoisted_30$n = {
119312
119418
  scope: "col"
119313
119419
  };
119314
119420
  const _hoisted_31$l = { class: "hidden-visually" };
119315
- const _hoisted_32$k = {
119421
+ const _hoisted_32$l = {
119316
119422
  key: 0,
119317
119423
  class: "cn-files-browser__group",
119318
119424
  "data-testid": "cn-files-browser-group"
@@ -119431,7 +119537,9 @@ function render$70(_ctx, _cache, $props, $setup, $data, $options) {
119431
119537
  ? (vue$1.openBlock(), vue$1.createElementBlock("p", _hoisted_5$4H, vue$1.toDisplayString($data.dropStatus), 1 /* TEXT */))
119432
119538
  : vue$1.createCommentVNode("v-if", true),
119433
119539
  vue$1.createElementVNode("div", _hoisted_6$4j, [
119434
- vue$1.createVNode(_component_NcBreadcrumbs, { class: "cn-files-browser__crumbs" }, {
119540
+ vue$1.createVNode(_component_NcBreadcrumbs, {
119541
+ class: vue$1.normalizeClass(["cn-files-browser__crumbs", { 'cn-files-browser__crumbs--at-root': $options.atRoot }])
119542
+ }, {
119435
119543
  default: vue$1.withCtx(() => [
119436
119544
  (vue$1.openBlock(true), vue$1.createElementBlock(vue$1.Fragment, null, vue$1.renderList($options.crumbs, (crumb, index) => {
119437
119545
  return (vue$1.openBlock(), vue$1.createBlock(_component_NcBreadcrumb, {
@@ -119448,7 +119556,7 @@ function render$70(_ctx, _cache, $props, $setup, $data, $options) {
119448
119556
  }), 128 /* KEYED_FRAGMENT */))
119449
119557
  ]),
119450
119558
  _: 1 /* STABLE */
119451
- }),
119559
+ }, 8 /* PROPS */, ["class"]),
119452
119560
  ($options.columnsChooserEnabled)
119453
119561
  ? (vue$1.openBlock(), vue$1.createBlock(_component_NcActions, {
119454
119562
  key: 0,
@@ -119863,7 +119971,7 @@ function render$70(_ctx, _cache, $props, $setup, $data, $options) {
119863
119971
  (vue$1.openBlock(true), vue$1.createElementBlock(vue$1.Fragment, null, vue$1.renderList($options.displayRows, ({ key, group, node }) => {
119864
119972
  return (vue$1.openBlock(), vue$1.createElementBlock(vue$1.Fragment, { key: key }, [
119865
119973
  group
119866
- ? (vue$1.openBlock(), vue$1.createElementBlock("tr", _hoisted_32$k, [
119974
+ ? (vue$1.openBlock(), vue$1.createElementBlock("tr", _hoisted_32$l, [
119867
119975
  vue$1.createElementVNode("th", {
119868
119976
  colspan: $options.columnCount,
119869
119977
  scope: "rowgroup",
@@ -120445,7 +120553,7 @@ function render$70(_ctx, _cache, $props, $setup, $data, $options) {
120445
120553
  }
120446
120554
 
120447
120555
  script$71.render = render$70;
120448
- script$71.__scopeId = "data-v-ebaa2c0e";
120556
+ script$71.__scopeId = "data-v-23ff0221";
120449
120557
  const __sfc_main$6X = script$71;
120450
120558
 
120451
120559
  /**
@@ -154887,7 +154995,7 @@ const _hoisted_31$k = {
154887
154995
  key: 12,
154888
154996
  class: "cn-form-dialog__switch-wrapper"
154889
154997
  };
154890
- const _hoisted_32$j = {
154998
+ const _hoisted_32$k = {
154891
154999
  key: 13,
154892
155000
  class: "cn-form-dialog__select-wrapper"
154893
155001
  };
@@ -155762,7 +155870,7 @@ function render$6c(_ctx, _cache, $props, $setup, $data, $options) {
155762
155870
  }, null, 8 /* PROPS */, ["id", "text", "more", "help", "label", "error"])
155763
155871
  ]))
155764
155872
  : (field.widget === 'date' || field.widget === 'datetime')
155765
- ? (vue$1.openBlock(), vue$1.createElementBlock("div", _hoisted_32$j, [
155873
+ ? (vue$1.openBlock(), vue$1.createElementBlock("div", _hoisted_32$k, [
155766
155874
  (!$options.showsOuterLabel(field))
155767
155875
  ? (vue$1.openBlock(), vue$1.createElementBlock("label", {
155768
155876
  key: 0,
@@ -165782,7 +165890,7 @@ const _hoisted_31$j = {
165782
165890
  key: 1,
165783
165891
  class: "cn-related-objects-widget__detail"
165784
165892
  };
165785
- const _hoisted_32$i = {
165893
+ const _hoisted_32$j = {
165786
165894
  key: 3,
165787
165895
  class: "cn-related-objects-widget__children",
165788
165896
  "data-testid": "cn-related-children"
@@ -166065,7 +166173,7 @@ function render$64(_ctx, _cache, $props, $setup, $data, $options) {
166065
166173
  : vue$1.createCommentVNode("v-if", true)
166066
166174
  ], 42 /* CLASS, PROPS, NEED_HYDRATION */, _hoisted_28$o)),
166067
166175
  (item.children && item.children.length)
166068
- ? (vue$1.openBlock(), vue$1.createElementBlock("ul", _hoisted_32$i, [
166176
+ ? (vue$1.openBlock(), vue$1.createElementBlock("ul", _hoisted_32$j, [
166069
166177
  (vue$1.openBlock(true), vue$1.createElementBlock(vue$1.Fragment, null, vue$1.renderList(item.children, (child) => {
166070
166178
  return (vue$1.openBlock(), vue$1.createElementBlock("li", {
166071
166179
  key: child.key
@@ -185114,18 +185222,19 @@ function render$5E(_ctx, _cache, $props, $setup, $data, $options) {
185114
185222
  scope: $options.resolvedScope,
185115
185223
  title: $options.resolvedTitle,
185116
185224
  maxDisplay: $options.resolvedMaxDisplay,
185225
+ layout: $props.content && typeof $props.content.layout === 'string' ? $props.content.layout : '',
185117
185226
  excludeActions: $options.resolvedExcludeActions,
185118
185227
  actionLabels: $options.actionLabels,
185119
185228
  valueLabels: $options.valueLabels,
185120
185229
  relatedSources: $options.relatedSources,
185121
185230
  footnote: $options.footnote
185122
- }, $options.emptyText ? { noEntriesLabel: $options.emptyText } : {}), null, 16 /* FULL_PROPS */, ["source", "endpoint", "register", "schema", "objectId", "scope", "title", "maxDisplay", "excludeActions", "actionLabels", "valueLabels", "relatedSources", "footnote"])
185231
+ }, $options.emptyText ? { noEntriesLabel: $options.emptyText } : {}), null, 16 /* FULL_PROPS */, ["source", "endpoint", "register", "schema", "objectId", "scope", "title", "maxDisplay", "layout", "excludeActions", "actionLabels", "valueLabels", "relatedSources", "footnote"])
185123
185232
  ]))
185124
185233
  : vue$1.createCommentVNode("v-if", true)
185125
185234
  }
185126
185235
 
185127
185236
  script$5F.render = render$5E;
185128
- script$5F.__scopeId = "data-v-3f7bbf0c";
185237
+ script$5F.__scopeId = "data-v-6387051e";
185129
185238
  const __sfc_main$5z = script$5F;
185130
185239
 
185131
185240
  /** Variants understood by NcNoteCard. */
@@ -190325,7 +190434,7 @@ function render$5t(_ctx, _cache, $props, $setup, $data, $options) {
190325
190434
  }
190326
190435
 
190327
190436
  script$5u.render = render$5t;
190328
- script$5u.__scopeId = "data-v-05cd7cb8";
190437
+ script$5u.__scopeId = "data-v-5f54dc93";
190329
190438
  const __sfc_main$5o = script$5u;
190330
190439
 
190331
190440
  /**
@@ -191294,6 +191403,10 @@ var script$5s = {
191294
191403
  return `cn-timeline-draft-${this.uid}`
191295
191404
  },
191296
191405
 
191406
+ blockId() {
191407
+ return `cn-timeline-block-${this.uid}`
191408
+ },
191409
+
191297
191410
  /**
191298
191411
  * The kind options, the plain note first. A note is an entry with NO
191299
191412
  * kind, so "Note" filters on its absence.
@@ -191807,8 +191920,9 @@ const _hoisted_26$w = { class: "cn-timeline-manage__subtitle" };
191807
191920
  const _hoisted_27$o = { class: "cn-timeline-manage__composer-title" };
191808
191921
  const _hoisted_28$n = { class: "cn-timeline-manage__composer-hint" };
191809
191922
  const _hoisted_29$l = ["for"];
191810
- const _hoisted_30$k = ["id", "placeholder"];
191811
- const _hoisted_31$i = { class: "cn-timeline-manage__composer-foot" };
191923
+ const _hoisted_30$k = ["for"];
191924
+ const _hoisted_31$i = ["id", "placeholder"];
191925
+ const _hoisted_32$i = { class: "cn-timeline-manage__composer-foot" };
191812
191926
 
191813
191927
  function render$5r(_ctx, _cache, $props, $setup, $data, $options) {
191814
191928
  const _component_Plus = vue$1.resolveComponent("Plus");
@@ -192065,8 +192179,15 @@ function render$5r(_ctx, _cache, $props, $setup, $data, $options) {
192065
192179
  ], 64 /* STABLE_FRAGMENT */))
192066
192180
  : vue$1.createCommentVNode("v-if", true),
192067
192181
  ($data.textBlocks.length)
192068
- ? (vue$1.openBlock(), vue$1.createBlock(_component_NcSelect, {
192182
+ ? (vue$1.openBlock(), vue$1.createElementBlock("label", {
192069
192183
  key: 1,
192184
+ class: "cn-timeline-manage__draft-label",
192185
+ for: $options.blockId
192186
+ }, vue$1.toDisplayString($options.t('nextcloud-vue', 'Template')), 9 /* TEXT, PROPS */, _hoisted_29$l))
192187
+ : vue$1.createCommentVNode("v-if", true),
192188
+ ($data.textBlocks.length)
192189
+ ? (vue$1.openBlock(), vue$1.createBlock(_component_NcSelect, {
192190
+ key: 2,
192070
192191
  modelValue: $data.chosenBlock,
192071
192192
  "onUpdate:modelValue": [
192072
192193
  _cache[2] || (_cache[2] = $event => (($data.chosenBlock) = $event)),
@@ -192076,25 +192197,27 @@ function render$5r(_ctx, _cache, $props, $setup, $data, $options) {
192076
192197
  options: $options.blockOptions,
192077
192198
  clearable: true,
192078
192199
  label: "label",
192079
- inputLabel: $options.t('nextcloud-vue', 'Template'),
192200
+ inputId: $options.blockId,
192201
+ labelOutside: true,
192202
+ ariaLabelCombobox: $options.t('nextcloud-vue', 'Template'),
192080
192203
  placeholder: $options.t('nextcloud-vue', 'Write your own'),
192081
192204
  "data-testid": "cn-timeline-block"
192082
- }, null, 8 /* PROPS */, ["modelValue", "options", "inputLabel", "placeholder", "onUpdate:modelValue"]))
192205
+ }, null, 8 /* PROPS */, ["modelValue", "options", "inputId", "ariaLabelCombobox", "placeholder", "onUpdate:modelValue"]))
192083
192206
  : vue$1.createCommentVNode("v-if", true),
192084
192207
  vue$1.createElementVNode("label", {
192085
192208
  class: "cn-timeline-manage__draft-label",
192086
192209
  for: $options.draftId
192087
- }, vue$1.toDisplayString($options.t('nextcloud-vue', 'Note')), 9 /* TEXT, PROPS */, _hoisted_29$l),
192210
+ }, vue$1.toDisplayString($options.t('nextcloud-vue', 'Note')), 9 /* TEXT, PROPS */, _hoisted_30$k),
192088
192211
  vue$1.withDirectives(vue$1.createElementVNode("textarea", {
192089
192212
  id: $options.draftId,
192090
192213
  "onUpdate:modelValue": _cache[3] || (_cache[3] = $event => (($data.draft) = $event)),
192091
192214
  class: "cn-timeline-manage__draft",
192092
192215
  placeholder: $options.t('nextcloud-vue', 'Write a note on this record'),
192093
192216
  "data-testid": "cn-timeline-draft"
192094
- }, null, 8 /* PROPS */, _hoisted_30$k), [
192217
+ }, null, 8 /* PROPS */, _hoisted_31$i), [
192095
192218
  [vue$1.vModelText, $data.draft]
192096
192219
  ]),
192097
- vue$1.createElementVNode("div", _hoisted_31$i, [
192220
+ vue$1.createElementVNode("div", _hoisted_32$i, [
192098
192221
  vue$1.createVNode(_component_NcCheckboxRadioSwitch, {
192099
192222
  modelValue: $data.draftIsPublic,
192100
192223
  "onUpdate:modelValue": _cache[4] || (_cache[4] = $event => (($data.draftIsPublic) = $event)),
@@ -192126,7 +192249,7 @@ function render$5r(_ctx, _cache, $props, $setup, $data, $options) {
192126
192249
  }
192127
192250
 
192128
192251
  script$5s.render = render$5r;
192129
- script$5s.__scopeId = "data-v-a4c73a6a";
192252
+ script$5s.__scopeId = "data-v-31e6673c";
192130
192253
  const __sfc_main$5m = script$5s;
192131
192254
 
192132
192255
  /**
@@ -195351,7 +195474,8 @@ var script$5k = {
195351
195474
 
195352
195475
  /**
195353
195476
  * The crumbs for CnBreadcrumbs: each declared crumb as a link, then the
195354
- * current page. Empty without a declared crumb.
195477
+ * current page, once (a last crumb that names the page is dropped).
195478
+ * Empty without a declared crumb.
195355
195479
  *
195356
195480
  * @spec openspec/changes/page-header-breadcrumb/specs/page-header/spec.md#requirement-a-list-dashboard-or-settings-page-can-show-a-breadcrumb-and-a-meta-note
195357
195481
  * @return {Array<object>}
@@ -195373,6 +195497,10 @@ var script$5k = {
195373
195497
  return entry
195374
195498
  });
195375
195499
  if (this.current) {
195500
+ // A last crumb naming the page itself is the current one, drawn once.
195501
+ if (out.length > 0 && out[out.length - 1].label === this.current) {
195502
+ out.pop();
195503
+ }
195376
195504
  out.push({ label: this.current });
195377
195505
  }
195378
195506
  return out
@@ -201493,6 +201621,7 @@ function render$5d(_ctx, _cache, $props, $setup, $data, $options) {
201493
201621
  ? (vue$1.openBlock(), vue$1.createBlock(_component_CnObjectDataWidget, {
201494
201622
  key: 1,
201495
201623
  title: $options.resolvedTitle,
201624
+ subtitle: $options.widgetSubtitle,
201496
201625
  chromeless: $options.isBare,
201497
201626
  showActions: !$options.isBare && $options.actionsShown,
201498
201627
  icon: $props.widget.icon || null,
@@ -201508,7 +201637,7 @@ function render$5d(_ctx, _cache, $props, $setup, $data, $options) {
201508
201637
  collapsedFields: $options.content.collapsedFields ?? null,
201509
201638
  footnote: $options.content.footnote || '',
201510
201639
  editable: $options.content.editable !== false
201511
- }, null, 8 /* PROPS */, ["title", "chromeless", "showActions", "icon", "schema", "objectData", "objectType", "store", "overrides", "include", "exclude", "hideEmpty", "columns", "collapsedFields", "footnote", "editable"]))
201640
+ }, null, 8 /* PROPS */, ["title", "subtitle", "chromeless", "showActions", "icon", "schema", "objectData", "objectType", "store", "overrides", "include", "exclude", "hideEmpty", "columns", "collapsedFields", "footnote", "editable"]))
201512
201641
  : ($options.isRelated)
201513
201642
  ? (vue$1.openBlock(), vue$1.createBlock(_component_CnRelatedObjectsWidget, {
201514
201643
  key: 2,
@@ -202044,7 +202173,7 @@ function render$5d(_ctx, _cache, $props, $setup, $data, $options) {
202044
202173
  }
202045
202174
 
202046
202175
  script$5e.render = render$5d;
202047
- script$5e.__scopeId = "data-v-10c797a6";
202176
+ script$5e.__scopeId = "data-v-38f1ce74";
202048
202177
  const __sfc_main$58 = script$5e;
202049
202178
 
202050
202179
  /**
@@ -242559,7 +242688,7 @@ function render$42(_ctx, _cache, $props, $setup, $data, $options) {
242559
242688
  }
242560
242689
 
242561
242690
  script$43.render = render$42;
242562
- script$43.__scopeId = "data-v-3d97a9f0";
242691
+ script$43.__scopeId = "data-v-dd87442e";
242563
242692
  const __sfc_main$43 = script$43;
242564
242693
 
242565
242694
  /**
@@ -251582,7 +251711,7 @@ function unwrap$1(value) {
251582
251711
  * `rowRoute`, `pageControls`), or `endpointSource` (an app endpoint whose
251583
251712
  * payload, after `responsePath`, is the array of rows, as on the object table), or `objectRows`
251584
251713
  * (`{ path, where?, valuePath? }`: rows the page record holds, such as one answer of a case); `avatar` puts a circle with the initials of a name
251585
- * template before the title; what differs is the drawing: `presentation` is `rows`, `feed`
251714
+ * template before the title (`{ text, size: 32 }` draws the 32px circle 12px from the title, as DqZaakBesluiten); what differs is the drawing: `presentation` is `rows`, `feed`
251586
251715
  * or `inline`, and each line is a template (`"{identifier} · {caseTypeName}"`,
251587
251716
  * `"Termijn {deadline|date}"`). `cards` draws a framed card per row in a
251588
251717
  * grid, with `trailing` as the large figure (board ShBank's accounts).
@@ -251778,6 +251907,17 @@ var script$3Q = {
251778
251907
  },
251779
251908
 
251780
251909
  computed: {
251910
+ /**
251911
+ * Whether the avatar is the 32px circle (`avatar.size: 32`).
251912
+ *
251913
+ * @return {boolean}
251914
+ * @spec openspec/changes/record-list-avatar-size/specs/record-list-avatar/spec.md#requirement-a-record-list-avatar-can-be-the-small-circle
251915
+ */
251916
+ avatarSmall() {
251917
+ const avatar = this.content?.avatar;
251918
+ return Boolean(avatar && typeof avatar === 'object' && Number(avatar.size) === 32)
251919
+ },
251920
+
251781
251921
  /** @return {boolean} Whether a row's pill comes before its title (`pillAt: "start"`). */
251782
251922
  pillFirst() {
251783
251923
  return this.content?.pillAt === 'start'
@@ -254277,7 +254417,7 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
254277
254417
  (group.items.length > 0)
254278
254418
  ? (vue$1.openBlock(), vue$1.createElementBlock("ul", {
254279
254419
  key: 2,
254280
- class: "cn-record-list__list",
254420
+ class: vue$1.normalizeClass(["cn-record-list__list", { 'cn-record-list__list--avatar-small': $options.avatarSmall }]),
254281
254421
  "aria-labelledby": group.label ? group.headingId : null,
254282
254422
  "data-testid": $options.isGrouped ? 'cn-record-list-group' : null
254283
254423
  }, [
@@ -254652,7 +254792,7 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
254652
254792
  : vue$1.createCommentVNode("v-if", true)
254653
254793
  ]))
254654
254794
  }), 128 /* KEYED_FRAGMENT */))
254655
- ], 8 /* PROPS */, _hoisted_23$u))
254795
+ ], 10 /* CLASS, PROPS */, _hoisted_23$u))
254656
254796
  : vue$1.createCommentVNode("v-if", true)
254657
254797
  ], 64 /* STABLE_FRAGMENT */))
254658
254798
  }), 128 /* KEYED_FRAGMENT */)),
@@ -254785,7 +254925,7 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
254785
254925
  }
254786
254926
 
254787
254927
  script$3Q.render = render$3P;
254788
- script$3Q.__scopeId = "data-v-2c65cbc2";
254928
+ script$3Q.__scopeId = "data-v-544b79cd";
254789
254929
  const __sfc_main$3Q = script$3Q;
254790
254930
 
254791
254931
  /**
@@ -318504,7 +318644,7 @@ function render$2C(_ctx, _cache, $props, $setup, $data, $options) {
318504
318644
  }
318505
318645
 
318506
318646
  script$2D.render = render$2C;
318507
- script$2D.__scopeId = "data-v-cfc2a11a";
318647
+ script$2D.__scopeId = "data-v-51150930";
318508
318648
  const __sfc_main$2D = script$2D;
318509
318649
 
318510
318650
  /**
@@ -322190,6 +322330,16 @@ var script$2A = {
322190
322330
  type: Number,
322191
322331
  default: 0,
322192
322332
  },
322333
+
322334
+ /**
322335
+ * The board look's gap in px between a card's title and its
322336
+ * description, when the app's board draws it other than 4px; the
322337
+ * content follows 10px further (DqBeheerinstellingen 6, so 16).
322338
+ */
322339
+ descGap: {
322340
+ type: Number,
322341
+ default: 0,
322342
+ },
322193
322343
  },
322194
322344
 
322195
322345
  emits: ['update', 'reimported', 'reimport-error', 'tab-change'],
@@ -322228,6 +322378,23 @@ var script$2A = {
322228
322378
  },
322229
322379
 
322230
322380
  computed: {
322381
+ /**
322382
+ * The board look sizes an app's board sets on the shell
322383
+ * (`versionTitleSize`, `descGap`), as CSS custom properties.
322384
+ *
322385
+ * @return {object|null} The style, or null when none is set.
322386
+ */
322387
+ shellStyle() {
322388
+ const style = {};
322389
+ if (this.versionTitleSize) {
322390
+ style['--cn-board-version-title-size'] = `${this.versionTitleSize}px`;
322391
+ }
322392
+ if (this.descGap) {
322393
+ style['--cn-board-settings-desc-gap'] = `${this.descGap}px`;
322394
+ }
322395
+ return Object.keys(style).length > 0 ? style : null
322396
+ },
322397
+
322231
322398
  /**
322232
322399
  * The tabs that have an id and a label.
322233
322400
  *
@@ -322567,7 +322734,7 @@ function render$2z(_ctx, _cache, $props, $setup, $data, $options) {
322567
322734
 
322568
322735
  return (vue$1.openBlock(), vue$1.createElementBlock("div", {
322569
322736
  class: vue$1.normalizeClass(["cn-admin-settings-shell", [$setup.ownLookClass, $props.sectionColumns ? `cn-admin-settings-shell--columns-${$props.sectionColumns}` : '']]),
322570
- style: vue$1.normalizeStyle($props.versionTitleSize ? { '--cn-board-version-title-size': `${$props.versionTitleSize}px` } : null)
322737
+ style: vue$1.normalizeStyle($options.shellStyle)
322571
322738
  }, [
322572
322739
  ($setup.environmentName)
322573
322740
  ? (vue$1.openBlock(), vue$1.createBlock(_component_CnEnvironmentBanner, {
@@ -322853,7 +323020,7 @@ function render$2z(_ctx, _cache, $props, $setup, $data, $options) {
322853
323020
  }
322854
323021
 
322855
323022
  script$2A.render = render$2z;
322856
- script$2A.__scopeId = "data-v-447d33ea";
323023
+ script$2A.__scopeId = "data-v-69055093";
322857
323024
  const __sfc_main$2A = script$2A;
322858
323025
 
322859
323026
  /**
@@ -359337,7 +359504,9 @@ var script$20 = {
359337
359504
  return [
359338
359505
  ...this.searchTermChips,
359339
359506
  ...this.quickFilterActiveChips,
359340
- ...this.filterChipsOf(this.effectiveActiveFilters, (key, value) => this.isFixedFilter(key, value) || ownToView(key, value)),
359507
+ // The folder pane's own filter is not a chip: the selected folder
359508
+ // shows in the pane and as the heading above the list (DqAfdelingen).
359509
+ ...this.filterChipsOf(this.effectiveActiveFilters, (key, value) => this.isFixedFilter(key, value) || ownToView(key, value) || this.isFolderFilter(key)),
359341
359510
  ]
359342
359511
  },
359343
359512
 
@@ -360523,6 +360692,18 @@ var script$20 = {
360523
360692
  * @return {boolean}
360524
360693
  * @spec openspec/changes/index-scope-presentation/specs/index-page/spec.md#requirement-the-query-that-chose-a-preset-is-not-a-removable-filter
360525
360694
  */
360695
+ /**
360696
+ * Whether a filter key is the folder pane's (`folderSidebar.filterField`).
360697
+ *
360698
+ * @param {string} key The filter key.
360699
+ * @return {boolean}
360700
+ * @spec openspec/changes/board-folder-scope-outside-card/specs/index-page/spec.md#requirement-the-selected-folder-heads-the-list-from-outside-its-card
360701
+ */
360702
+ isFolderFilter(key) {
360703
+ const field = this.folderSidebar && this.folderSidebar.filterField;
360704
+ return typeof field === 'string' && field !== '' && key === field
360705
+ },
360706
+
360526
360707
  isFixedFilter(key, value) {
360527
360708
  const fixed = this.fixedFilters;
360528
360709
  if (!fixed || !Object.hasOwn(fixed, key)) {