@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.
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue.js +1 -1
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js +131 -3
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js.map +1 -1
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js +54 -18
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js.map +1 -1
- package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue.js +1 -1
- package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js +1 -1
- package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js.map +1 -1
- package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue3.js.map +1 -1
- package/dist/esm/components/CnBoardView/CnBoardView.vue.js +1 -1
- package/dist/esm/components/CnBoardView/CnBoardView.vue2.js +232 -4
- package/dist/esm/components/CnBoardView/CnBoardView.vue2.js.map +1 -1
- package/dist/esm/components/CnBoardView/CnBoardView.vue3.js +95 -51
- package/dist/esm/components/CnBoardView/CnBoardView.vue3.js.map +1 -1
- package/dist/esm/components/CnBodySections/CnBodySections.vue.js +1 -1
- package/dist/esm/components/CnBodySections/CnBodySections.vue2.js +22 -1
- package/dist/esm/components/CnBodySections/CnBodySections.vue2.js.map +1 -1
- package/dist/esm/components/CnBodySections/CnBodySections.vue3.js.map +1 -1
- package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue.js +1 -1
- package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue2.js +47 -4
- package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue.js +1 -1
- package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js +239 -3
- package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js.map +1 -1
- package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue3.js +5 -5
- package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue3.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue.js +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +50 -0
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +22 -12
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
- package/dist/esm/components/CnDeltaWidget/CnDeltaWidget.vue.js +1 -1
- package/dist/esm/components/CnDeltaWidget/CnDeltaWidget.vue2.js +1 -1
- package/dist/esm/components/CnDeltaWidget/CnDeltaWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnDeltaWidget/CnDeltaWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +226 -8
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue.js +1 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +3 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +18 -5
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue.js +1 -1
- package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js +38 -1
- package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js +45 -5
- package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnGaugeWidget/CnGaugeWidget.vue.js +1 -1
- package/dist/esm/components/CnGaugeWidget/CnGaugeWidget.vue2.js +1 -1
- package/dist/esm/components/CnGaugeWidget/CnGaugeWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnGaugeWidget/CnGaugeWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +548 -77
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +191 -82
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/useSelfFetchList.js +11 -2
- package/dist/esm/components/CnIndexPage/useSelfFetchList.js.map +1 -1
- package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue2.js +29 -6
- package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue.js +1 -1
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js +126 -2
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js +24 -2
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +106 -3
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue.js +1 -1
- package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue2.js +67 -5
- package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue2.js.map +1 -1
- package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue3.js +181 -124
- package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue3.js.map +1 -1
- package/dist/esm/components/CnReportsPage/CnReportsPage.vue.js +1 -1
- package/dist/esm/components/CnReportsPage/CnReportsPage.vue2.js +135 -2
- package/dist/esm/components/CnReportsPage/CnReportsPage.vue2.js.map +1 -1
- package/dist/esm/components/CnReportsPage/CnReportsPage.vue3.js +95 -43
- package/dist/esm/components/CnReportsPage/CnReportsPage.vue3.js.map +1 -1
- package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue.js +1 -1
- package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue2.js +5 -1
- package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue2.js.map +1 -1
- package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue3.js.map +1 -1
- package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue.js +1 -1
- package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js +72 -5
- package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js +33 -8
- package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue.js +1 -1
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js +135 -11
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js +6 -2
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue.js +1 -1
- package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue2.js +17 -2
- package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue3.js +1 -1
- package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue.js +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +39 -6
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue.js +1 -1
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue2.js +140 -7
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue.js +1 -1
- package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue2.js +37 -9
- package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue2.js.map +1 -1
- package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue3.js +6 -5
- package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue3.js.map +1 -1
- package/dist/esm/components/CnWalkthrough/CnWalkthrough.vue.js +1 -1
- package/dist/esm/components/CnWalkthrough/CnWalkthrough.vue2.js +16 -0
- package/dist/esm/components/CnWalkthrough/CnWalkthrough.vue2.js.map +1 -1
- package/dist/esm/components/CnWalkthrough/CnWalkthrough.vue3.js.map +1 -1
- package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue.js +1 -1
- package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue2.js +2 -1
- package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnWidgetCardGrid/CnWidgetCardGrid.vue2.js +53 -1
- package/dist/esm/components/CnWidgetCardGrid/CnWidgetCardGrid.vue2.js.map +1 -1
- package/dist/esm/components/CnWidgetCardGrid/CnWidgetCardGrid.vue3.js +3 -2
- package/dist/esm/components/CnWidgetCardGrid/CnWidgetCardGrid.vue3.js.map +1 -1
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue.js +1 -1
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js +135 -0
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js.map +1 -1
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue3.js.map +1 -1
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue.js +1 -1
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js +19 -0
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js.map +1 -1
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.js +37 -19
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.js.map +1 -1
- package/dist/esm/composables/useListView.js +21 -0
- package/dist/esm/composables/useListView.js.map +1 -1
- package/dist/esm/dialogs/CnTransitionInputDialog.vue.js +1 -1
- package/dist/esm/dialogs/CnTransitionInputDialog.vue2.js +68 -6
- package/dist/esm/dialogs/CnTransitionInputDialog.vue2.js.map +1 -1
- package/dist/esm/dialogs/CnTransitionInputDialog.vue3.js +133 -105
- package/dist/esm/dialogs/CnTransitionInputDialog.vue3.js.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/l10n/en.json.js +38 -1
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +78 -1
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/library-style.js +1 -1
- package/dist/esm/nextcloud-vue.css +1030 -533
- package/dist/esm/store/useObjectStore.js +16 -2
- package/dist/esm/store/useObjectStore.js.map +1 -1
- package/dist/esm/utils/boardColumns.js +8 -1
- package/dist/esm/utils/boardColumns.js.map +1 -1
- package/dist/esm/utils/boardReferenceColumns.js +278 -0
- package/dist/esm/utils/boardReferenceColumns.js.map +1 -0
- package/dist/esm/utils/buildManifest.js +41 -4
- package/dist/esm/utils/buildManifest.js.map +1 -1
- package/dist/esm/utils/detailWidgetVisibility.js +149 -0
- package/dist/esm/utils/detailWidgetVisibility.js.map +1 -0
- package/dist/esm/utils/formatMetric.js +39 -3
- package/dist/esm/utils/formatMetric.js.map +1 -1
- package/dist/esm/utils/gridStack.js +40 -1
- package/dist/esm/utils/gridStack.js.map +1 -1
- package/dist/esm/utils/humaniseKey.js +41 -0
- package/dist/esm/utils/humaniseKey.js.map +1 -0
- package/dist/esm/utils/notificationRuleLabel.js +6 -23
- package/dist/esm/utils/notificationRuleLabel.js.map +1 -1
- package/dist/esm/utils/resolveManifestTokens.js +1 -0
- package/dist/esm/utils/resolveManifestTokens.js.map +1 -1
- package/dist/esm/utils/sentinelTokens.js +9 -0
- package/dist/esm/utils/sentinelTokens.js.map +1 -1
- package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
- package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
- package/dist/esm/utils/widgetDispatch.js +8 -2
- package/dist/esm/utils/widgetDispatch.js.map +1 -1
- package/dist/nextcloud-vue.cjs.js +17159 -13422
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +1030 -533
- package/l10n/en.json +38 -1
- package/l10n/nl.json +78 -1
- package/package.json +1 -1
- package/src/components/CnAdminSettingsShell/CnAdminSettingsShell.vue +160 -8
- package/src/components/CnAuditTrailCard/CnAuditTrailCard.vue +1 -1
- package/src/components/CnBoardView/CnBoardView.vue +262 -6
- package/src/components/CnBodySections/CnBodySections.vue +22 -1
- package/src/components/CnCountdownWidget/CnCountdownWidget.vue +47 -4
- package/src/components/CnDashboardGrid/CnDashboardGrid.vue +244 -8
- package/src/components/CnDashboardPage/CnDashboardPage.vue +62 -2
- package/src/components/CnDeltaWidget/CnDeltaWidget.vue +1 -1
- package/src/components/CnDetailPage/CnDetailPage.md +3 -1
- package/src/components/CnDetailPage/CnDetailPage.vue +226 -8
- package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +3 -1
- package/src/components/CnFactsWidget/CnFactsWidget.vue +18 -5
- package/src/components/CnFieldListWidget/CnFieldListWidget.vue +63 -1
- package/src/components/CnGaugeWidget/CnGaugeWidget.vue +1 -1
- package/src/components/CnIndexPage/CnIndexPage.vue +586 -25
- package/src/components/CnIndexPage/useSelfFetchList.js +10 -1
- package/src/components/CnInteractionFormWidget/CnInteractionFormWidget.vue +29 -6
- package/src/components/CnObjectDataWidget/CnObjectDataWidget.md +1 -1
- package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +154 -5
- package/src/components/CnRecordListWidget/CnRecordListWidget.vue +106 -3
- package/src/components/CnRegisterMapping/CnRegisterMapping.md +5 -0
- package/src/components/CnRegisterMapping/CnRegisterMapping.vue +231 -96
- package/src/components/CnReportsPage/CnReportsPage.vue +179 -1
- package/src/components/CnSettingsPage/CnSettingsPage.vue +5 -1
- package/src/components/CnStagesWidget/CnStagesWidget.vue +103 -6
- package/src/components/CnStatWidget/CnStatWidget.vue +137 -12
- package/src/components/CnStatsBlockWidget/CnStatsBlockWidget.vue +34 -3
- package/src/components/CnTabsWidget/CnTabsWidget.vue +39 -6
- package/src/components/CnToggleTableWidget/CnToggleTableWidget.vue +140 -7
- package/src/components/CnVersionInfoCard/CnVersionInfoCard.md +2 -1
- package/src/components/CnVersionInfoCard/CnVersionInfoCard.vue +42 -13
- package/src/components/CnWalkthrough/CnWalkthrough.vue +16 -0
- package/src/components/CnWeekStripWidget/CnWeekStripWidget.vue +2 -1
- package/src/components/CnWidgetCardGrid/CnWidgetCardGrid.vue +55 -2
- package/src/components/CnWidgetObjectTable/CnWidgetObjectTable.vue +135 -0
- package/src/components/CnWidgetWrapper/CnWidgetWrapper.md +10 -0
- package/src/components/CnWidgetWrapper/CnWidgetWrapper.vue +44 -1
- package/src/composables/useListView.js +21 -0
- package/src/css/board.css +65 -4
- package/src/css/dialog.css +4 -2
- package/src/css/form-field.css +14 -0
- package/src/css/form-widget.css +11 -0
- package/src/css/index-page.css +49 -0
- package/src/css/kpi-card.css +13 -0
- package/src/css/look-board-reports.css +58 -0
- package/src/css/look-board.css +108 -7
- package/src/dialogs/CnTransitionInputDialog.vue +87 -7
- package/src/index.js +2 -0
- package/src/schemas/app-manifest-v2.schema.json +137 -6
- package/src/store/useObjectStore.js +16 -2
- package/src/utils/boardColumns.js +8 -1
- package/src/utils/boardReferenceColumns.js +274 -0
- package/src/utils/buildManifest.js +40 -3
- package/src/utils/detailWidgetVisibility.js +145 -0
- package/src/utils/formatMetric.js +38 -2
- package/src/utils/gridStack.js +39 -0
- package/src/utils/humaniseKey.js +38 -0
- package/src/utils/notificationRuleLabel.js +5 -23
- package/src/utils/resolveManifestTokens.js +1 -0
- package/src/utils/sentinelTokens.js +9 -0
- package/src/utils/validateManifestV2.compiled.js +3 -3
- 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")
|
|
300
|
-
* widget reads
|
|
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
|
|
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
|
|
2778
|
-
*
|
|
2779
|
-
* `@self.name` → `name` / `title` /
|
|
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
|
-
*
|
|
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)) {
|