@conduction/nextcloud-vue 2.83.0 → 2.85.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 (246) hide show
  1. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue.js +1 -1
  2. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js +131 -3
  3. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js.map +1 -1
  4. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js +54 -18
  5. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js.map +1 -1
  6. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue.js +1 -1
  7. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js +1 -1
  8. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js.map +1 -1
  9. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue3.js.map +1 -1
  10. package/dist/esm/components/CnBoardView/CnBoardView.vue.js +1 -1
  11. package/dist/esm/components/CnBoardView/CnBoardView.vue2.js +232 -4
  12. package/dist/esm/components/CnBoardView/CnBoardView.vue2.js.map +1 -1
  13. package/dist/esm/components/CnBoardView/CnBoardView.vue3.js +95 -51
  14. package/dist/esm/components/CnBoardView/CnBoardView.vue3.js.map +1 -1
  15. package/dist/esm/components/CnBodySections/CnBodySections.vue.js +1 -1
  16. package/dist/esm/components/CnBodySections/CnBodySections.vue2.js +22 -1
  17. package/dist/esm/components/CnBodySections/CnBodySections.vue2.js.map +1 -1
  18. package/dist/esm/components/CnBodySections/CnBodySections.vue3.js.map +1 -1
  19. package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue.js +1 -1
  20. package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue2.js +47 -4
  21. package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue2.js.map +1 -1
  22. package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue3.js.map +1 -1
  23. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue.js +1 -1
  24. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js +239 -3
  25. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js.map +1 -1
  26. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue3.js +5 -5
  27. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue3.js.map +1 -1
  28. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue.js +1 -1
  29. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +50 -0
  30. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  31. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +22 -12
  32. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  33. package/dist/esm/components/CnDeltaWidget/CnDeltaWidget.vue.js +1 -1
  34. package/dist/esm/components/CnDeltaWidget/CnDeltaWidget.vue2.js +1 -1
  35. package/dist/esm/components/CnDeltaWidget/CnDeltaWidget.vue2.js.map +1 -1
  36. package/dist/esm/components/CnDeltaWidget/CnDeltaWidget.vue3.js.map +1 -1
  37. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +226 -8
  38. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  39. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  40. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue.js +1 -1
  41. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +3 -1
  42. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
  43. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
  44. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +1 -1
  45. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +18 -5
  46. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
  47. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
  48. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue.js +1 -1
  49. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js +38 -1
  50. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js.map +1 -1
  51. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js +45 -5
  52. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js.map +1 -1
  53. package/dist/esm/components/CnGaugeWidget/CnGaugeWidget.vue.js +1 -1
  54. package/dist/esm/components/CnGaugeWidget/CnGaugeWidget.vue2.js +1 -1
  55. package/dist/esm/components/CnGaugeWidget/CnGaugeWidget.vue2.js.map +1 -1
  56. package/dist/esm/components/CnGaugeWidget/CnGaugeWidget.vue3.js.map +1 -1
  57. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +548 -77
  58. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  59. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +191 -82
  60. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  61. package/dist/esm/components/CnIndexPage/useSelfFetchList.js +11 -2
  62. package/dist/esm/components/CnIndexPage/useSelfFetchList.js.map +1 -1
  63. package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue2.js +29 -6
  64. package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue2.js.map +1 -1
  65. package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue3.js.map +1 -1
  66. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue.js +1 -1
  67. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js +126 -2
  68. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js.map +1 -1
  69. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js +24 -2
  70. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js.map +1 -1
  71. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
  72. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +106 -3
  73. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
  74. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
  75. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue.js +1 -1
  76. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue2.js +67 -5
  77. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue2.js.map +1 -1
  78. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue3.js +181 -124
  79. package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue3.js.map +1 -1
  80. package/dist/esm/components/CnReportsPage/CnReportsPage.vue.js +1 -1
  81. package/dist/esm/components/CnReportsPage/CnReportsPage.vue2.js +135 -2
  82. package/dist/esm/components/CnReportsPage/CnReportsPage.vue2.js.map +1 -1
  83. package/dist/esm/components/CnReportsPage/CnReportsPage.vue3.js +95 -43
  84. package/dist/esm/components/CnReportsPage/CnReportsPage.vue3.js.map +1 -1
  85. package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue.js +1 -1
  86. package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue2.js +5 -1
  87. package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue2.js.map +1 -1
  88. package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue3.js.map +1 -1
  89. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue.js +1 -1
  90. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js +72 -5
  91. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js.map +1 -1
  92. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js +33 -8
  93. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js.map +1 -1
  94. package/dist/esm/components/CnStatWidget/CnStatWidget.vue.js +1 -1
  95. package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js +135 -11
  96. package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js.map +1 -1
  97. package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js +6 -2
  98. package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js.map +1 -1
  99. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue.js +1 -1
  100. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue2.js +17 -2
  101. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue2.js.map +1 -1
  102. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue3.js +1 -1
  103. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue3.js.map +1 -1
  104. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue.js +1 -1
  105. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +39 -6
  106. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  107. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  108. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue.js +1 -1
  109. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue2.js +140 -7
  110. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue2.js.map +1 -1
  111. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue3.js.map +1 -1
  112. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue.js +1 -1
  113. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue2.js +37 -9
  114. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue2.js.map +1 -1
  115. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue3.js +6 -5
  116. package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue3.js.map +1 -1
  117. package/dist/esm/components/CnWalkthrough/CnWalkthrough.vue.js +1 -1
  118. package/dist/esm/components/CnWalkthrough/CnWalkthrough.vue2.js +16 -0
  119. package/dist/esm/components/CnWalkthrough/CnWalkthrough.vue2.js.map +1 -1
  120. package/dist/esm/components/CnWalkthrough/CnWalkthrough.vue3.js.map +1 -1
  121. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue.js +1 -1
  122. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue2.js +2 -1
  123. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue2.js.map +1 -1
  124. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue3.js.map +1 -1
  125. package/dist/esm/components/CnWidgetCardGrid/CnWidgetCardGrid.vue2.js +53 -1
  126. package/dist/esm/components/CnWidgetCardGrid/CnWidgetCardGrid.vue2.js.map +1 -1
  127. package/dist/esm/components/CnWidgetCardGrid/CnWidgetCardGrid.vue3.js +3 -2
  128. package/dist/esm/components/CnWidgetCardGrid/CnWidgetCardGrid.vue3.js.map +1 -1
  129. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue.js +1 -1
  130. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js +135 -0
  131. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js.map +1 -1
  132. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue3.js.map +1 -1
  133. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue.js +1 -1
  134. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js +19 -0
  135. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js.map +1 -1
  136. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.js +37 -19
  137. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.js.map +1 -1
  138. package/dist/esm/composables/useListView.js +21 -0
  139. package/dist/esm/composables/useListView.js.map +1 -1
  140. package/dist/esm/dialogs/CnTransitionInputDialog.vue.js +1 -1
  141. package/dist/esm/dialogs/CnTransitionInputDialog.vue2.js +68 -6
  142. package/dist/esm/dialogs/CnTransitionInputDialog.vue2.js.map +1 -1
  143. package/dist/esm/dialogs/CnTransitionInputDialog.vue3.js +133 -105
  144. package/dist/esm/dialogs/CnTransitionInputDialog.vue3.js.map +1 -1
  145. package/dist/esm/index.js +1 -0
  146. package/dist/esm/index.js.map +1 -1
  147. package/dist/esm/l10n/en.json.js +38 -1
  148. package/dist/esm/l10n/en.json.js.map +1 -1
  149. package/dist/esm/l10n/nl.json.js +78 -1
  150. package/dist/esm/l10n/nl.json.js.map +1 -1
  151. package/dist/esm/library-style.js +1 -1
  152. package/dist/esm/nextcloud-vue.css +1030 -533
  153. package/dist/esm/store/useObjectStore.js +16 -2
  154. package/dist/esm/store/useObjectStore.js.map +1 -1
  155. package/dist/esm/utils/boardColumns.js +8 -1
  156. package/dist/esm/utils/boardColumns.js.map +1 -1
  157. package/dist/esm/utils/boardReferenceColumns.js +278 -0
  158. package/dist/esm/utils/boardReferenceColumns.js.map +1 -0
  159. package/dist/esm/utils/buildManifest.js +41 -4
  160. package/dist/esm/utils/buildManifest.js.map +1 -1
  161. package/dist/esm/utils/detailWidgetVisibility.js +149 -0
  162. package/dist/esm/utils/detailWidgetVisibility.js.map +1 -0
  163. package/dist/esm/utils/formatMetric.js +39 -3
  164. package/dist/esm/utils/formatMetric.js.map +1 -1
  165. package/dist/esm/utils/gridStack.js +40 -1
  166. package/dist/esm/utils/gridStack.js.map +1 -1
  167. package/dist/esm/utils/humaniseKey.js +41 -0
  168. package/dist/esm/utils/humaniseKey.js.map +1 -0
  169. package/dist/esm/utils/notificationRuleLabel.js +6 -23
  170. package/dist/esm/utils/notificationRuleLabel.js.map +1 -1
  171. package/dist/esm/utils/resolveManifestTokens.js +1 -0
  172. package/dist/esm/utils/resolveManifestTokens.js.map +1 -1
  173. package/dist/esm/utils/sentinelTokens.js +9 -0
  174. package/dist/esm/utils/sentinelTokens.js.map +1 -1
  175. package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
  176. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  177. package/dist/esm/utils/widgetDispatch.js +8 -2
  178. package/dist/esm/utils/widgetDispatch.js.map +1 -1
  179. package/dist/nextcloud-vue.cjs.js +17159 -13422
  180. package/dist/nextcloud-vue.cjs.js.map +2 -2
  181. package/dist/nextcloud-vue.css +1030 -533
  182. package/l10n/en.json +38 -1
  183. package/l10n/nl.json +78 -1
  184. package/package.json +1 -1
  185. package/src/components/CnAdminSettingsShell/CnAdminSettingsShell.vue +160 -8
  186. package/src/components/CnAuditTrailCard/CnAuditTrailCard.vue +1 -1
  187. package/src/components/CnBoardView/CnBoardView.vue +262 -6
  188. package/src/components/CnBodySections/CnBodySections.vue +22 -1
  189. package/src/components/CnCountdownWidget/CnCountdownWidget.vue +47 -4
  190. package/src/components/CnDashboardGrid/CnDashboardGrid.vue +244 -8
  191. package/src/components/CnDashboardPage/CnDashboardPage.vue +62 -2
  192. package/src/components/CnDeltaWidget/CnDeltaWidget.vue +1 -1
  193. package/src/components/CnDetailPage/CnDetailPage.md +3 -1
  194. package/src/components/CnDetailPage/CnDetailPage.vue +226 -8
  195. package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +3 -1
  196. package/src/components/CnFactsWidget/CnFactsWidget.vue +18 -5
  197. package/src/components/CnFieldListWidget/CnFieldListWidget.vue +63 -1
  198. package/src/components/CnGaugeWidget/CnGaugeWidget.vue +1 -1
  199. package/src/components/CnIndexPage/CnIndexPage.vue +586 -25
  200. package/src/components/CnIndexPage/useSelfFetchList.js +10 -1
  201. package/src/components/CnInteractionFormWidget/CnInteractionFormWidget.vue +29 -6
  202. package/src/components/CnObjectDataWidget/CnObjectDataWidget.md +1 -1
  203. package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +154 -5
  204. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +106 -3
  205. package/src/components/CnRegisterMapping/CnRegisterMapping.md +5 -0
  206. package/src/components/CnRegisterMapping/CnRegisterMapping.vue +231 -96
  207. package/src/components/CnReportsPage/CnReportsPage.vue +179 -1
  208. package/src/components/CnSettingsPage/CnSettingsPage.vue +5 -1
  209. package/src/components/CnStagesWidget/CnStagesWidget.vue +103 -6
  210. package/src/components/CnStatWidget/CnStatWidget.vue +137 -12
  211. package/src/components/CnStatsBlockWidget/CnStatsBlockWidget.vue +34 -3
  212. package/src/components/CnTabsWidget/CnTabsWidget.vue +39 -6
  213. package/src/components/CnToggleTableWidget/CnToggleTableWidget.vue +140 -7
  214. package/src/components/CnVersionInfoCard/CnVersionInfoCard.md +2 -1
  215. package/src/components/CnVersionInfoCard/CnVersionInfoCard.vue +42 -13
  216. package/src/components/CnWalkthrough/CnWalkthrough.vue +16 -0
  217. package/src/components/CnWeekStripWidget/CnWeekStripWidget.vue +2 -1
  218. package/src/components/CnWidgetCardGrid/CnWidgetCardGrid.vue +55 -2
  219. package/src/components/CnWidgetObjectTable/CnWidgetObjectTable.vue +135 -0
  220. package/src/components/CnWidgetWrapper/CnWidgetWrapper.md +10 -0
  221. package/src/components/CnWidgetWrapper/CnWidgetWrapper.vue +44 -1
  222. package/src/composables/useListView.js +21 -0
  223. package/src/css/board.css +65 -4
  224. package/src/css/dialog.css +4 -2
  225. package/src/css/form-field.css +14 -0
  226. package/src/css/form-widget.css +11 -0
  227. package/src/css/index-page.css +49 -0
  228. package/src/css/kpi-card.css +13 -0
  229. package/src/css/look-board-reports.css +58 -0
  230. package/src/css/look-board.css +108 -7
  231. package/src/dialogs/CnTransitionInputDialog.vue +87 -7
  232. package/src/index.js +2 -0
  233. package/src/schemas/app-manifest-v2.schema.json +137 -6
  234. package/src/store/useObjectStore.js +16 -2
  235. package/src/utils/boardColumns.js +8 -1
  236. package/src/utils/boardReferenceColumns.js +274 -0
  237. package/src/utils/buildManifest.js +40 -3
  238. package/src/utils/detailWidgetVisibility.js +145 -0
  239. package/src/utils/formatMetric.js +38 -2
  240. package/src/utils/gridStack.js +39 -0
  241. package/src/utils/humaniseKey.js +38 -0
  242. package/src/utils/notificationRuleLabel.js +5 -23
  243. package/src/utils/resolveManifestTokens.js +1 -0
  244. package/src/utils/sentinelTokens.js +9 -0
  245. package/src/utils/validateManifestV2.compiled.js +3 -3
  246. package/src/utils/widgetDispatch.js +8 -2
@@ -46,6 +46,7 @@ import { isAppInstalled } from '../../utils/appInstalled.js';
46
46
  import { compactLayoutRows } from '../../utils/dashboardPlacement.js';
47
47
  import { defaultDetailGrid } from '../../utils/defaultDetailGrid.js';
48
48
  import { stageOf, normalisePinnedAction, stageEntry, MAX_QUICK_ACTIONS, groupMenuEntries, resolveNextStep, pillCountSource, resolveCountPill, resolvePill } from '../../utils/detailActionModel.js';
49
+ import { visibilityContextRefs, widgetConditionData, fetchVisibilityRows, detailWidgetVisible } from '../../utils/detailWidgetVisibility.js';
49
50
  import { reportBindingProblems } from '../../utils/diagnostics.js';
50
51
  import { fetchListTotal } from '../../utils/fetchFilterCounts.js';
51
52
  import { cnGridCellStyle, hasGridRow } from '../../utils/grid.js';
@@ -53,6 +54,7 @@ import { resolveHeaderMeta, isActivityWidget } from '../../utils/headerMeta.js';
53
54
  import { patchStoredSelf } from '../../utils/patchStoredSelf.js';
54
55
  import { setReadState } from '../../utils/recordInteractions.js';
55
56
  import { slotRenders } from '../../utils/slotContent.js';
57
+ import { isLocallyDecidableVisibleWhen, evaluateVisibleWhen } from '../../utils/visibleWhen.js';
56
58
  import { isDataWidgetDef, isRelatedWidgetDef, isGeoWidgetDef, isContentOnlyWidgetDef, isCardWidgetDef, widgetContentOf, resolveRegistryRenderer, widgetTitleOf } from '../../utils/widgetDispatch.js';
57
59
  import __sfc_main$a from '../CnActionButtons/CnActionButtons.vue.js';
58
60
  import __sfc_main$b from '../CnBreadcrumbs/CnBreadcrumbs.vue.js';
@@ -296,8 +298,8 @@ var script = {
296
298
 
297
299
  /**
298
300
  * Offer the board look's tab list name to the tabs widget below this page
299
- * (`config.tabsLabel`, default "<type> parts"). A getter object, so the
300
- * widget reads it live.
301
+ * (`config.tabsLabel`, default "<type> parts"), and the records
302
+ * `visibilityContext` names. Getter objects, so the widget reads them live.
301
303
  *
302
304
  * @return {object} The provided values.
303
305
  * @spec openspec/changes/screens-detail-page-parity/specs/detail-page-board-look/spec.md#requirement-folder-tabs-take-the-board-strip
@@ -305,6 +307,7 @@ var script = {
305
307
  provide() {
306
308
  const isBoard = computed(() => this.isBoard);
307
309
  const tabsLabel = computed(() => this.resolvedTabsLabel);
310
+ const visibilityRows = computed(() => (this.visibilityRowsPending ? null : this.visibilityRows));
308
311
  return {
309
312
  // The page's own look reaches the tabs, the cards and the activity
310
313
  // below it, also when it came from the `look` prop and not the app.
@@ -314,6 +317,15 @@ var script = {
314
317
  return tabsLabel.value
315
318
  },
316
319
  },
320
+
321
+ // The records `visibilityContext` names, keyed `@context.<name>`, so a tab's
322
+ // `visibleWhen` reads the case type as a grid widget's does. Null
323
+ // while they are on their way.
324
+ cnDetailVisibilityRows: {
325
+ get value() {
326
+ return visibilityRows.value
327
+ },
328
+ },
317
329
  }
318
330
  },
319
331
 
@@ -1356,6 +1368,25 @@ var script = {
1356
1368
  default: '',
1357
1369
  },
1358
1370
 
1371
+ /**
1372
+ * Records the page reads beside the loaded one, so a `visibleWhen`
1373
+ * can ask about them (manifest `config.visibilityContext`). Each entry
1374
+ * is `{ <name>: { field, register, schema } }`: `field` is the
1375
+ * property of the loaded record holding the other record's id, and a
1376
+ * condition reads that record as `@context.<name>.<path>`. A case page that
1377
+ * declares `{ caseType: { field: "caseType", register: "dossiq",
1378
+ * schema: "caseType" } }` can show a widget for some case types only
1379
+ * with `{ field: "@context.caseType.category", op: "in", value: [...] }`.
1380
+ * A record that cannot be read is absent, so its condition fails safe.
1381
+ * Empty (the default) reads nothing extra.
1382
+ *
1383
+ * @spec openspec/changes/detail-widgets-visible-when/specs/detail-widgets-visible-when/spec.md#requirement-a-detail-page-can-load-records-a-condition-names
1384
+ */
1385
+ visibilityContext: {
1386
+ type: Object,
1387
+ default: () => ({}),
1388
+ },
1389
+
1359
1390
  /**
1360
1391
  * Whether the current user administers this instance. Shows the
1361
1392
  * `adminOnly` header actions. `null` (the default) reads it from
@@ -1417,6 +1448,19 @@ var script = {
1417
1448
  type: String,
1418
1449
  default: '',
1419
1450
  },
1451
+
1452
+ /**
1453
+ * The record field the header names the record by (manifest
1454
+ * `config.titleField`, a dotted path such as `number`), as an invoice
1455
+ * page names the invoice number. An empty value falls back to the
1456
+ * display name. Empty (the default) changes nothing.
1457
+ *
1458
+ * @spec openspec/changes/detail-title-field/specs/detail-page/spec.md#requirement-a-detail-page-can-name-the-record-by-a-field
1459
+ */
1460
+ titleField: {
1461
+ type: String,
1462
+ default: '',
1463
+ },
1420
1464
  },
1421
1465
 
1422
1466
  emits: [
@@ -1583,6 +1627,19 @@ var script = {
1583
1627
 
1584
1628
  data() {
1585
1629
  return {
1630
+ /**
1631
+ * The records `visibilityContext` names, keyed `@context.<name>`: the row,
1632
+ * `null` when it could not be read, absent while it is on its way.
1633
+ */
1634
+ visibilityRows: {},
1635
+ /** The `visibilityRefsKey` the rows in `visibilityRows` were read for. */
1636
+ visibilityRowsFor: '',
1637
+ /** Sequence of the last `visibilityContext` read, so a late answer for another record is dropped. */
1638
+ visibilityRowsSeq: 0,
1639
+ /** The answers of endpoint and source `visibleWhen` conditions on grid widgets, by widget id. */
1640
+ widgetConditionAnswers: {},
1641
+ /** Sequence of the last remote condition round. */
1642
+ widgetConditionSeq: 0,
1586
1643
  /** The counts of the header's count pills (`countFrom`), by pill key (`type`, `status`). */
1587
1644
  pillCounts: {},
1588
1645
  /** Sequence of the last pill count round, so a late answer does not overwrite a newer one. */
@@ -1842,11 +1899,17 @@ var script = {
1842
1899
  * because a keyboard user who cannot see the page needs to know what
1843
1900
  * they are being offered before they take it.
1844
1901
  *
1902
+ * One library string with a placeholder, not "Skip to" from the host's
1903
+ * catalogue glued to the label: no app carried that fragment, so every
1904
+ * Dutch reader got "Skip to In behandeling nemen" (Zuiddrecht live
1905
+ * round 3), and a fragment cannot be put in Dutch word order anyway.
1906
+ *
1845
1907
  * @return {string} The link text.
1846
1908
  * @spec openspec/changes/case-page-and-list-as-a-place/specs/index-page/spec.md
1909
+ * @spec openspec/changes/detail-page-strings-dutch/specs/detail-page-strings-dutch/spec.md#requirement-the-detail-page-speaks-the-readers-language
1847
1910
  */
1848
1911
  skipLinkLabel() {
1849
- return `${this.effectiveTranslate('Skip to')} ${this.effectivePrimaryLabel}`
1912
+ return translate('nextcloud-vue', 'Skip to {action}', { action: this.effectivePrimaryLabel })
1850
1913
  },
1851
1914
 
1852
1915
  // ── The action model (detail-action-model-and-case-surfaces) ────
@@ -2688,6 +2751,68 @@ var script = {
2688
2751
  return store.objects?.[this.objectType]?.[this.objectId] ?? null
2689
2752
  },
2690
2753
 
2754
+ /**
2755
+ * The records `visibilityContext` names for the loaded record.
2756
+ *
2757
+ * @return {Array<{key: string, register: string, schema: string, id: string}>}
2758
+ * @spec openspec/changes/detail-widgets-visible-when/specs/detail-widgets-visible-when/spec.md#requirement-a-detail-page-can-load-records-a-condition-names
2759
+ */
2760
+ visibilityRefs() {
2761
+ return visibilityContextRefs(this.visibilityContext, this.resolvedObject)
2762
+ },
2763
+
2764
+ /**
2765
+ * Whether a record `visibilityContext` names is still on its way.
2766
+ *
2767
+ * @return {boolean}
2768
+ * @spec openspec/changes/detail-widgets-visible-when/specs/detail-widgets-visible-when/spec.md#requirement-a-detail-page-can-load-records-a-condition-names
2769
+ */
2770
+ visibilityRowsPending() {
2771
+ return this.visibilityRefs.length > 0 && this.visibilityRowsFor !== this.visibilityRefsKey
2772
+ },
2773
+
2774
+ /**
2775
+ * The named references as one key, so another record (or another case
2776
+ * type on the same record) reads them again.
2777
+ *
2778
+ * @return {string}
2779
+ * @spec openspec/changes/detail-widgets-visible-when/specs/detail-widgets-visible-when/spec.md#requirement-a-detail-page-can-load-records-a-condition-names
2780
+ */
2781
+ visibilityRefsKey() {
2782
+ return JSON.stringify(this.visibilityRefs)
2783
+ },
2784
+
2785
+ /**
2786
+ * What a grid widget's `visibleWhen` reads: the record, with the
2787
+ * `visibilityContext` records under `@context.<name>`. Null until the record loads.
2788
+ *
2789
+ * @return {object|null}
2790
+ * @spec openspec/changes/detail-widgets-visible-when/specs/detail-widgets-visible-when/spec.md#requirement-a-detail-grid-widget-shows-only-while-its-visiblewhen-holds-for-the-record
2791
+ */
2792
+ widgetVisibilityData() {
2793
+ return widgetConditionData(this.resolvedObject, this.visibilityRows)
2794
+ },
2795
+
2796
+ /**
2797
+ * The grid widgets whose `visibleWhen` needs a request (endpoint or
2798
+ * source), with what they ask, as one key: a change re-asks them.
2799
+ *
2800
+ * @return {string}
2801
+ * @spec openspec/changes/detail-widgets-visible-when/specs/detail-widgets-visible-when/spec.md#requirement-a-detail-grid-widget-shows-only-while-its-visiblewhen-holds-for-the-record
2802
+ */
2803
+ remoteWidgetConditionsKey() {
2804
+ if (!this.widgetVisibilityData || this.visibilityRowsPending) {
2805
+ return ''
2806
+ }
2807
+ const defs = [...(this.bodyGridWidgets || []), ...((this.activeView && this.activeView.widgets) || [])];
2808
+ const remote = defs.filter((def) => def && def.visibleWhen && typeof def.visibleWhen === 'object'
2809
+ && !isLocallyDecidableVisibleWhen(def.visibleWhen));
2810
+ if (remote.length === 0) {
2811
+ return ''
2812
+ }
2813
+ return JSON.stringify([String(this.objectId || ''), remote.map((def) => [def.id, def.visibleWhen])])
2814
+ },
2815
+
2691
2816
  /**
2692
2817
  * The `@self` block of the resolved object (interaction markers live here).
2693
2818
  *
@@ -2774,10 +2899,10 @@ var script = {
2774
2899
  },
2775
2900
 
2776
2901
  /**
2777
- * The resolved record's human display name, drawn from the loaded
2778
- * object via the same fallback chain the relation resolver uses:
2779
- * `@self.name` → `name` / `title` / `displayName` → `firstName
2780
- * lastName`. Empty string while the object is still loading or when no
2902
+ * The resolved record's human display name: the `titleField` value
2903
+ * when the page names one and it is filled, else the same fallback
2904
+ * chain the relation resolver uses: `@self.name` → `name` / `title` /
2905
+ * `displayName` → `firstName lastName`. Empty string while the object is still loading or when no
2781
2906
  * name-like field exists (a raw id is never used as a name — ADR-062).
2782
2907
  *
2783
2908
  * @return {string}
@@ -2787,6 +2912,12 @@ var script = {
2787
2912
  if (!obj || typeof obj !== 'object') {
2788
2913
  return ''
2789
2914
  }
2915
+ if (this.titleField) {
2916
+ const named = stageOf(obj, this.titleField);
2917
+ if (named !== '') {
2918
+ return named
2919
+ }
2920
+ }
2790
2921
  const self = obj['@self'] || {};
2791
2922
  const id = this.objectId !== null && this.objectId !== undefined ? String(this.objectId) : '';
2792
2923
  const candidates = [self.name, self.title, obj.name, obj.title, obj.displayName];
@@ -3220,6 +3351,22 @@ var script = {
3220
3351
  },
3221
3352
 
3222
3353
  watch: {
3354
+ // The records a condition names are read again for another record.
3355
+ visibilityRefsKey: {
3356
+ immediate: true,
3357
+ handler() {
3358
+ this.refreshVisibilityRows();
3359
+ },
3360
+ },
3361
+
3362
+ // Endpoint and source conditions on grid widgets are asked once per record.
3363
+ remoteWidgetConditionsKey: {
3364
+ immediate: true,
3365
+ handler() {
3366
+ this.refreshWidgetConditions();
3367
+ },
3368
+ },
3369
+
3223
3370
  // The header's count pills count again for another record or other lists.
3224
3371
  pillCountKey: {
3225
3372
  immediate: true,
@@ -4458,6 +4605,62 @@ var script = {
4458
4605
  || undefined
4459
4606
  },
4460
4607
 
4608
+ /**
4609
+ * Read the records `visibilityContext` names for the loaded record. A
4610
+ * late answer for a record the page has left is dropped.
4611
+ *
4612
+ * @return {Promise<void>}
4613
+ * @spec openspec/changes/detail-widgets-visible-when/specs/detail-widgets-visible-when/spec.md#requirement-a-detail-page-can-load-records-a-condition-names
4614
+ */
4615
+ async refreshVisibilityRows() {
4616
+ const key = this.visibilityRefsKey;
4617
+ const refs = this.visibilityRefs;
4618
+ const seq = ++this.visibilityRowsSeq;
4619
+ if (refs.length === 0) {
4620
+ // Write only on a change, so a page without `visibilityContext`
4621
+ // never touches the state its layout could read.
4622
+ if (Object.keys(this.visibilityRows).length > 0) {
4623
+ this.visibilityRows = {};
4624
+ }
4625
+ if (this.visibilityRowsFor !== key) {
4626
+ this.visibilityRowsFor = key;
4627
+ }
4628
+ return
4629
+ }
4630
+ if (!this._visibilityRowCache) {
4631
+ this._visibilityRowCache = new Map();
4632
+ }
4633
+ const rows = await fetchVisibilityRows(refs, this._visibilityRowCache);
4634
+ if (seq !== this.visibilityRowsSeq) {
4635
+ return
4636
+ }
4637
+ this.visibilityRows = rows;
4638
+ this.visibilityRowsFor = key;
4639
+ },
4640
+
4641
+ /**
4642
+ * Ask the endpoint and source `visibleWhen` conditions of the grid
4643
+ * widgets, once per record. Each is fail-safe: an error hides the widget.
4644
+ *
4645
+ * @return {Promise<void>}
4646
+ * @spec openspec/changes/detail-widgets-visible-when/specs/detail-widgets-visible-when/spec.md#requirement-a-detail-grid-widget-shows-only-while-its-visiblewhen-holds-for-the-record
4647
+ */
4648
+ async refreshWidgetConditions() {
4649
+ const seq = ++this.widgetConditionSeq;
4650
+ if (this.remoteWidgetConditionsKey === '') {
4651
+ return
4652
+ }
4653
+ const [, entries] = JSON.parse(this.remoteWidgetConditionsKey);
4654
+ const ctx = { objectId: this.objectId, object: this.widgetVisibilityData || undefined };
4655
+ const answers = {};
4656
+ await Promise.all(entries.map(async ([id, cond]) => {
4657
+ answers[id] = await evaluateVisibleWhen(cond, ctx);
4658
+ }));
4659
+ if (seq === this.widgetConditionSeq) {
4660
+ this.widgetConditionAnswers = answers;
4661
+ }
4662
+ },
4663
+
4461
4664
  /**
4462
4665
  * Drop the items that draw nothing, then close the rows they freed —
4463
4666
  * `float: true` leaves the item below pinned under a gap nobody owns.
@@ -4480,7 +4683,10 @@ var script = {
4480
4683
  * Whether a layout item has anything to draw, so a grid cell is worth
4481
4684
  * spending on it.
4482
4685
  *
4483
- * TWO widget types are judged, and no others.
4686
+ * A widget whose definition carries `visibleWhen` draws only while the
4687
+ * condition holds for the record (see `detailWidgetVisible`).
4688
+ *
4689
+ * Beyond that, TWO widget types are judged, and no others.
4484
4690
  *
4485
4691
  * `integration`, in the case where nothing can ever appear: a leaf from
4486
4692
  * another app that is not registered, with no `requiredApp` to fall back
@@ -4527,6 +4733,18 @@ var script = {
4527
4733
  if (!widget) {
4528
4734
  return true
4529
4735
  }
4736
+ // The widget's own `visibleWhen`, read against the record and the
4737
+ // records `visibilityContext` names (a case's case type). Without
4738
+ // one the widget shows, as it always did, and the layout takes no
4739
+ // dependency on the record: a page without conditions re-lays out
4740
+ // exactly as often as before.
4741
+ if (widget.visibleWhen !== undefined && widget.visibleWhen !== null
4742
+ && !detailWidgetVisible(widget, this.widgetVisibilityData, {
4743
+ pending: this.visibilityRowsPending,
4744
+ answers: this.widgetConditionAnswers,
4745
+ })) {
4746
+ return false
4747
+ }
4530
4748
  // The board look shows the activity as the History tab. When a tabs
4531
4749
  // widget already holds it, it is not also a body section.
4532
4750
  if (this.isBoard && isActivityWidget(widget) && this.tabbedWidgetIds.has(widget.id)) {