@conduction/nextcloud-vue 2.79.0 → 2.81.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/CnActionButtons/CnActionButtons.vue2.js.map +1 -1
- package/dist/esm/components/CnActionButtons/CnActionButtons.vue3.js +3 -1
- package/dist/esm/components/CnActionButtons/CnActionButtons.vue3.js.map +1 -1
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js +32 -3
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js.map +1 -1
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js +13 -11
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js.map +1 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +80 -4
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js +95 -91
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js +179 -13
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js +52 -16
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +96 -4
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +158 -110
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
- package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue.js +10 -0
- package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue.js.map +1 -0
- package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue2.js +252 -0
- package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue3.js +140 -0
- package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnChipsFieldWidget/index.js +26 -0
- package/dist/esm/components/CnChipsFieldWidget/index.js.map +1 -0
- package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue.js +10 -0
- package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue.js.map +1 -0
- package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue2.js +354 -0
- package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue3.js +172 -0
- package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnChoicePickerWidget/index.js +27 -0
- package/dist/esm/components/CnChoicePickerWidget/index.js.map +1 -0
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js +1 -1
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js +2 -2
- package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js.map +1 -1
- package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue3.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +65 -5
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +2 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +19 -11
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +4 -2
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +134 -4
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +21 -4
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +24 -0
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js +43 -4
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue2.js +1 -1
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnFacetSidebar/CnFacetSidebar.vue2.js +7 -7
- package/dist/esm/components/CnFacetSidebar/CnFacetSidebar.vue2.js.map +1 -1
- package/dist/esm/components/CnFacetSidebar/CnFacetSidebar.vue3.js.map +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +11 -0
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js.map +1 -0
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +867 -0
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js +238 -0
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnFactsWidget/index.js +30 -0
- package/dist/esm/components/CnFactsWidget/index.js.map +1 -0
- package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue.js +10 -0
- package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue.js.map +1 -0
- package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js +626 -0
- package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js +396 -0
- package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnFieldListWidget/index.js +29 -0
- package/dist/esm/components/CnFieldListWidget/index.js.map +1 -0
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +302 -4
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +417 -244
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/filesBrowser.js +101 -1
- package/dist/esm/components/CnFilesBrowser/filesBrowser.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/filesBrowserColumns.js +141 -1
- package/dist/esm/components/CnFilesBrowser/filesBrowserColumns.js.map +1 -1
- package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js +65 -17
- package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js.map +1 -1
- package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js +4 -4
- package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js.map +1 -1
- package/dist/esm/components/CnFormPage/CnFormPage.vue2.js +78 -3
- package/dist/esm/components/CnFormPage/CnFormPage.vue2.js.map +1 -1
- package/dist/esm/components/CnFormPage/CnFormPage.vue3.js +74 -49
- package/dist/esm/components/CnFormPage/CnFormPage.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +333 -73
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +79 -17
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue.js +10 -0
- package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue.js.map +1 -0
- package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue2.js +99 -0
- package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue2.js.map +1 -0
- package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue3.js +48 -0
- package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue3.js.map +1 -0
- package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js +7 -7
- package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js.map +1 -1
- package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue2.js +1 -1
- package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +65 -2
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js +6 -2
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js +63 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +8 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue2.js +14 -0
- package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue3.js +5 -1
- package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue3.js.map +1 -1
- package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue2.js +29 -1
- package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue2.js.map +1 -1
- package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue3.js.map +1 -1
- package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue.js +10 -0
- package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue.js.map +1 -0
- package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue2.js +174 -0
- package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue3.js +75 -0
- package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnRadioCardsWidget/index.js +28 -0
- package/dist/esm/components/CnRadioCardsWidget/index.js.map +1 -0
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +10 -0
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js.map +1 -0
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +411 -0
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +178 -0
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnRecordListWidget/index.js +31 -0
- package/dist/esm/components/CnRecordListWidget/index.js.map +1 -0
- package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue.js +10 -0
- package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue.js.map +1 -0
- package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue2.js +222 -0
- package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue3.js +64 -0
- package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnSavedViewsWidget/index.js +30 -0
- package/dist/esm/components/CnSavedViewsWidget/index.js.map +1 -0
- package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue.js +10 -0
- package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue.js.map +1 -0
- package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue2.js +351 -0
- package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue3.js +71 -0
- package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnSectionsWidget/index.js +35 -0
- package/dist/esm/components/CnSectionsWidget/index.js.map +1 -0
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js.map +1 -1
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js.map +1 -1
- package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue.js +10 -0
- package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue.js.map +1 -0
- package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue2.js +347 -0
- package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue3.js +184 -0
- package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnSettingsFormWidget/index.js +27 -0
- package/dist/esm/components/CnSettingsFormWidget/index.js.map +1 -0
- package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js +81 -2
- package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js +87 -6
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js +1 -0
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue2.js +84 -1
- package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue3.js +85 -41
- package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue.js +10 -0
- package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue.js.map +1 -0
- package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue2.js +159 -0
- package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue3.js +60 -0
- package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnSwitchRowsWidget/index.js +26 -0
- package/dist/esm/components/CnSwitchRowsWidget/index.js.map +1 -0
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +168 -7
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +86 -23
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js +80 -1
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js +75 -32
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue.js +10 -0
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue.js.map +1 -0
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue2.js +269 -0
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue3.js +106 -0
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnToggleTableWidget/index.js +27 -0
- package/dist/esm/components/CnToggleTableWidget/index.js.map +1 -0
- package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +11 -0
- package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js +7 -2
- 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/CnWidgetObjectTable/dashboardRegistration.js +5 -0
- package/dist/esm/components/CnWidgetObjectTable/dashboardRegistration.js.map +1 -1
- package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js +301 -6
- package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue3.js +153 -55
- package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue3.js.map +1 -1
- package/dist/esm/composables/useFormDraft.js +140 -9
- package/dist/esm/composables/useFormDraft.js.map +1 -1
- package/dist/esm/composables/useListView.js +4 -4
- package/dist/esm/composables/useListView.js.map +1 -1
- package/dist/esm/index.js +21 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue2.js +28 -20
- package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue3.js +9 -0
- package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/field-inspection.js +21 -0
- package/dist/esm/integrations/builtin/field-inspection.js.map +1 -1
- package/dist/esm/integrations/offline/checklistSubmission.js +141 -0
- package/dist/esm/integrations/offline/checklistSubmission.js.map +1 -0
- package/dist/esm/integrations/offline/fieldCollectionHelpers.js +70 -5
- package/dist/esm/integrations/offline/fieldCollectionHelpers.js.map +1 -1
- package/dist/esm/integrations/offline/index.js +2 -1
- package/dist/esm/integrations/offline/index.js.map +1 -1
- package/dist/esm/integrations/offline/offlineDb.js +6 -1
- package/dist/esm/integrations/offline/offlineDb.js.map +1 -1
- package/dist/esm/integrations/offline/syncReplayService.js +8 -2
- package/dist/esm/integrations/offline/syncReplayService.js.map +1 -1
- package/dist/esm/l10n/en.json.js +20 -1
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +70 -2
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/nextcloud-vue.css +2192 -222
- package/dist/esm/utils/contentHeaderLink.js +51 -0
- package/dist/esm/utils/contentHeaderLink.js.map +1 -0
- package/dist/esm/utils/detailActionModel.js +60 -3
- package/dist/esm/utils/detailActionModel.js.map +1 -1
- package/dist/esm/utils/facets.js +75 -3
- package/dist/esm/utils/facets.js.map +1 -1
- package/dist/esm/utils/fetchFilterCounts.js +40 -5
- package/dist/esm/utils/fetchFilterCounts.js.map +1 -1
- package/dist/esm/utils/fillTemplate.js +120 -0
- package/dist/esm/utils/fillTemplate.js.map +1 -0
- package/dist/esm/utils/initials.js +32 -0
- package/dist/esm/utils/initials.js.map +1 -0
- package/dist/esm/utils/libraryWidgetKeys.js +11 -0
- package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
- package/dist/esm/utils/objectWrite.js +59 -0
- package/dist/esm/utils/objectWrite.js.map +1 -0
- package/dist/esm/utils/pageControls.js +81 -0
- package/dist/esm/utils/pageControls.js.map +1 -0
- package/dist/esm/utils/personalLenses.js +40 -3
- package/dist/esm/utils/personalLenses.js.map +1 -1
- package/dist/esm/utils/queryPresets.js +96 -0
- package/dist/esm/utils/queryPresets.js.map +1 -0
- package/dist/esm/utils/resolveFilterTokens.js +12 -1
- package/dist/esm/utils/resolveFilterTokens.js.map +1 -1
- package/dist/esm/utils/resolveManifestTokens.js +2 -0
- package/dist/esm/utils/resolveManifestTokens.js.map +1 -1
- package/dist/esm/utils/schema.js +21 -0
- package/dist/esm/utils/schema.js.map +1 -1
- package/dist/esm/utils/sentinelTokens.js +22 -4
- package/dist/esm/utils/sentinelTokens.js.map +1 -1
- package/dist/esm/utils/userGroupsPeek.js +91 -0
- package/dist/esm/utils/userGroupsPeek.js.map +1 -0
- package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
- package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
- package/dist/esm/utils/visibleWhen.js +57 -5
- package/dist/esm/utils/visibleWhen.js.map +1 -1
- package/dist/esm/utils/widgetDispatch.js +7 -1
- package/dist/esm/utils/widgetDispatch.js.map +1 -1
- package/dist/esm/utils/widgetVisibility.js +4 -57
- package/dist/esm/utils/widgetVisibility.js.map +1 -1
- package/dist/nextcloud-vue.cjs.js +19708 -9301
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +2192 -222
- package/l10n/en.json +20 -1
- package/l10n/nl.json +70 -2
- package/package.json +2 -1
- package/scripts/check-docs-mdx.mjs +108 -0
- package/src/components/CnActionButtons/CnActionButtons.vue +2 -0
- package/src/components/CnActionsBar/CnActionsBar.md +4 -0
- package/src/components/CnActionsBar/CnActionsBar.vue +48 -11
- package/src/components/CnAppRoot/CnAppRoot.md +4 -2
- package/src/components/CnAppRoot/CnAppRoot.vue +151 -59
- package/src/components/CnBannerWidget/CnBannerWidget.vue +244 -23
- package/src/components/CnCellRenderer/CnCellRenderer.md +2 -0
- package/src/components/CnCellRenderer/CnCellRenderer.vue +235 -5
- package/src/components/CnChipsFieldWidget/CnChipsFieldWidget.vue +433 -0
- package/src/components/CnChipsFieldWidget/index.js +25 -0
- package/src/components/CnChoicePickerWidget/CnChoicePickerWidget.vue +556 -0
- package/src/components/CnChoicePickerWidget/index.js +26 -0
- package/src/components/CnConversationThread/CnConversationWidget.vue +1 -1
- package/src/components/CnDashboardGrid/CnDashboardGrid.vue +2 -2
- package/src/components/CnDashboardPage/CnDashboardPage.vue +78 -5
- package/src/components/CnDataTable/CnDataTable.vue +22 -12
- package/src/components/CnDetailPage/CnDetailPage.md +1 -1
- package/src/components/CnDetailPage/CnDetailPage.vue +152 -6
- package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +66 -0
- package/src/components/CnDocumentReviewList/CnDocumentReviewWidget.vue +1 -1
- package/src/components/CnFacetSidebar/CnFacetSidebar.vue +7 -7
- package/src/components/CnFactsWidget/CnFactsWidget.vue +1190 -0
- package/src/components/CnFactsWidget/index.js +29 -0
- package/src/components/CnFieldListWidget/CnFieldListWidget.vue +1008 -0
- package/src/components/CnFieldListWidget/index.js +28 -0
- package/src/components/CnFilesBrowser/CnFilesBrowser.vue +588 -117
- package/src/components/CnFilesBrowser/filesBrowser.js +100 -0
- package/src/components/CnFilesBrowser/filesBrowserColumns.js +140 -0
- package/src/components/CnFormDialog/CnFormDialog.md +9 -3
- package/src/components/CnFormDialog/CnFormDialog.vue +69 -21
- package/src/components/CnFormPage/CnFormPage.vue +99 -3
- package/src/components/CnIndexPage/CnIndexPage.vue +309 -9
- package/src/components/CnIndexPage/CnIndexPageWidgets.vue +169 -0
- package/src/components/CnIndexSidebar/CnIndexSidebar.vue +7 -7
- package/src/components/CnNextStepCard/CnNextStepWidget.vue +1 -1
- package/src/components/CnObjectListWidget/CnObjectListWidget.vue +69 -2
- package/src/components/CnObjectSidebar/CnFilesTab.vue +70 -1
- package/src/components/CnObjectSidebar/CnNotesTab.vue +16 -0
- package/src/components/CnPageRenderer/CnPageRenderer.vue +29 -1
- package/src/components/CnRadioCardsWidget/CnRadioCardsWidget.vue +313 -0
- package/src/components/CnRadioCardsWidget/index.js +27 -0
- package/src/components/CnRecordListWidget/CnRecordListWidget.vue +652 -0
- package/src/components/CnRecordListWidget/index.js +30 -0
- package/src/components/CnSavedViewsWidget/CnSavedViewsWidget.vue +296 -0
- package/src/components/CnSavedViewsWidget/index.js +29 -0
- package/src/components/CnSectionsWidget/CnSectionsWidget.vue +489 -0
- package/src/components/CnSectionsWidget/index.js +34 -0
- package/src/components/CnSegmentedControl/CnSegmentedControl.vue +13 -0
- package/src/components/CnSettingsFormWidget/CnSettingsFormWidget.vue +555 -0
- package/src/components/CnSettingsFormWidget/index.js +26 -0
- package/src/components/CnStagesWidget/CnStagesWidget.vue +81 -2
- package/src/components/CnStatWidget/CnStatWidget.vue +88 -7
- package/src/components/CnStatsBlockWidget/CnStatsBlockWidget.vue +180 -3
- package/src/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue +226 -0
- package/src/components/CnSwitchRowsWidget/index.js +25 -0
- package/src/components/CnTabsWidget/CnTabsWidget.vue +263 -8
- package/src/components/CnTasksWidget/CnTasksWidget.vue +175 -15
- package/src/components/CnToggleTableWidget/CnToggleTableWidget.vue +386 -0
- package/src/components/CnToggleTableWidget/index.js +26 -0
- package/src/components/CnWidgetGrid/registerDashboardWidgets.js +11 -0
- package/src/components/CnWidgetObjectTable/CnWidgetObjectTable.vue +7 -2
- package/src/components/CnWidgetObjectTable/dashboardRegistration.js +5 -0
- package/src/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue +493 -11
- package/src/components/index.js +19 -0
- package/src/composables/__tests__/useFormDraft.spec.js +69 -0
- package/src/composables/useFormDraft.js +139 -8
- package/src/composables/useListView.js +4 -4
- package/src/css/form-field.css +14 -0
- package/src/css/index-page.css +71 -0
- package/src/css/kpi-card.css +32 -0
- package/src/css/look-board-detail.css +113 -2
- package/src/css/look-board-index.css +90 -8
- package/src/css/look-board.css +109 -2
- package/src/css/table.css +19 -0
- package/src/index.js +19 -0
- package/src/integrations/builtin/field-inspection/CnFieldInspectionCard.vue +35 -20
- package/src/integrations/builtin/field-inspection.js +21 -0
- package/src/integrations/offline/checklistSubmission.js +137 -0
- package/src/integrations/offline/fieldCollectionHelpers.js +69 -4
- package/src/integrations/offline/index.js +3 -0
- package/src/integrations/offline/offlineDb.js +6 -1
- package/src/integrations/offline/syncReplayService.js +8 -2
- package/src/schemas/app-manifest-v2.schema.json +196 -13
- package/src/utils/contentHeaderLink.js +48 -0
- package/src/utils/detailActionModel.js +59 -2
- package/src/utils/facets.js +74 -2
- package/src/utils/fetchFilterCounts.js +39 -4
- package/src/utils/fillTemplate.js +116 -0
- package/src/utils/initials.js +29 -0
- package/src/utils/libraryWidgetKeys.js +11 -0
- package/src/utils/objectWrite.js +55 -0
- package/src/utils/pageControls.js +78 -0
- package/src/utils/personalLenses.js +39 -2
- package/src/utils/queryPresets.js +93 -0
- package/src/utils/resolveFilterTokens.js +14 -1
- package/src/utils/resolveManifestTokens.js +2 -0
- package/src/utils/schema.js +21 -0
- package/src/utils/sentinelTokens.js +22 -4
- package/src/utils/userGroupsPeek.js +87 -0
- package/src/utils/validateManifestV2.compiled.js +3 -3
- package/src/utils/visibleWhen.js +56 -4
- package/src/utils/widgetDispatch.js +7 -1
- package/src/utils/widgetVisibility.js +7 -56
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
<section
|
|
8
8
|
v-if="visible && isAttention"
|
|
9
9
|
class="cn-banner-widget cn-banner-widget--attention"
|
|
10
|
-
:class="'cn-banner-widget--' + resolvedVariant"
|
|
10
|
+
:class="['cn-banner-widget--' + resolvedVariant, { 'cn-banner-widget--stacked': isStacked }]"
|
|
11
11
|
:aria-labelledby="headingId"
|
|
12
12
|
data-testid="cn-banner-widget-attention">
|
|
13
13
|
<div class="cn-banner-widget__body">
|
|
@@ -48,15 +48,27 @@
|
|
|
48
48
|
</p>
|
|
49
49
|
<div v-else-if="visible" class="cn-banner-widget">
|
|
50
50
|
<NcNoteCard :type="resolvedVariant" class="cn-banner-widget__card">
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
51
|
+
<!-- A named icon replaces the variant's own glyph. -->
|
|
52
|
+
<template v-if="resolvedIcon" #icon>
|
|
53
|
+
<CnIcon :name="resolvedIcon" :size="22" data-testid="cn-banner-widget-icon" />
|
|
54
|
+
</template>
|
|
55
|
+
<span class="cn-banner-widget__line">
|
|
56
|
+
<component
|
|
57
|
+
:is="clickable ? 'a' : 'span'"
|
|
58
|
+
class="cn-banner-widget__text"
|
|
59
|
+
:class="{ 'cn-banner-widget__text--clickable': clickable }"
|
|
60
|
+
:href="clickable ? routeHref : null"
|
|
61
|
+
data-testid="cn-banner-widget-text"
|
|
62
|
+
@click="onClick"><strong v-if="displayLead" class="cn-banner-widget__lead" data-testid="cn-banner-widget-lead">{{ displayLead }}</strong>{{ displayLead && displayText ? ' ' : '' }}{{ displayText }}</component>
|
|
63
|
+
<!-- Board look: the actions as links at the end of the line. -->
|
|
64
|
+
<a
|
|
65
|
+
v-for="action in noteActions"
|
|
66
|
+
:key="action.key"
|
|
67
|
+
class="cn-banner-widget__link"
|
|
68
|
+
:href="action.href || null"
|
|
69
|
+
data-testid="cn-banner-widget-link"
|
|
70
|
+
@click="onActionClick($event, action)">{{ action.label }}</a>
|
|
71
|
+
</span>
|
|
60
72
|
</NcNoteCard>
|
|
61
73
|
</div>
|
|
62
74
|
</template>
|
|
@@ -64,7 +76,11 @@
|
|
|
64
76
|
<script>
|
|
65
77
|
import { translate as t } from '@nextcloud/l10n'
|
|
66
78
|
import { NcNoteCard } from '@nextcloud/vue'
|
|
79
|
+
import CnIcon from '../CnIcon/CnIcon.vue'
|
|
80
|
+
import { normalizeLook } from '../../composables/useLook.js'
|
|
81
|
+
import { fillTemplate } from '../../utils/fillTemplate.js'
|
|
67
82
|
import { followLinkClick, resolveHref } from '../../utils/linkNavigation.js'
|
|
83
|
+
import { readPath } from '../../utils/readPath.js'
|
|
68
84
|
import { safeHref } from '../../utils/safeHref.js'
|
|
69
85
|
import { nextUid } from '../../utils/uid.js'
|
|
70
86
|
import { compareVisibleWhen, readVisibleWhenValue } from '../../utils/visibleWhen.js'
|
|
@@ -78,6 +94,12 @@ const LAYOUTS = ['banner', 'attention']
|
|
|
78
94
|
/** An attention card offers a primary and a secondary action, no more. */
|
|
79
95
|
const MAX_ACTIONS = 2
|
|
80
96
|
|
|
97
|
+
/**
|
|
98
|
+
* Under the board look the card takes what the boards draw: DqMijnWerk's
|
|
99
|
+
* "Vandaag eerst" has three secondary actions and the primary one.
|
|
100
|
+
*/
|
|
101
|
+
const MAX_ACTIONS_BOARD = 4
|
|
102
|
+
|
|
81
103
|
/**
|
|
82
104
|
* CnBannerWidget — declarative notice banner for dashboards and v2 pages
|
|
83
105
|
* (`banner` widget type, Wave 1 of nextcloud-vue#91).
|
|
@@ -140,7 +162,7 @@ const MAX_ACTIONS = 2
|
|
|
140
162
|
export default {
|
|
141
163
|
name: 'CnBannerWidget',
|
|
142
164
|
|
|
143
|
-
components: { NcNoteCard },
|
|
165
|
+
components: { CnIcon, NcNoteCard },
|
|
144
166
|
|
|
145
167
|
inject: {
|
|
146
168
|
/**
|
|
@@ -148,6 +170,8 @@ export default {
|
|
|
148
170
|
* label that is not a key renders as written.
|
|
149
171
|
*/
|
|
150
172
|
cnTranslate: { default: () => (key) => key },
|
|
173
|
+
/** The app's look, provided by CnAppRoot or CnPageRenderer (`nextcloud` or `board`). */
|
|
174
|
+
cnLook: { default: 'nextcloud' },
|
|
151
175
|
},
|
|
152
176
|
|
|
153
177
|
props: {
|
|
@@ -168,6 +192,27 @@ export default {
|
|
|
168
192
|
default: '',
|
|
169
193
|
},
|
|
170
194
|
|
|
195
|
+
/**
|
|
196
|
+
* A bold lead in front of the text ("2 aanmeldingen wachten op
|
|
197
|
+
* goedkeuring." before the rest of the sentence). `{value}` is replaced
|
|
198
|
+
* like in `text`, and it goes through the app's translate. Empty falls
|
|
199
|
+
* back to the `content` blob.
|
|
200
|
+
*/
|
|
201
|
+
lead: {
|
|
202
|
+
type: String,
|
|
203
|
+
default: '',
|
|
204
|
+
},
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* A named icon (`AccountPlus`, `AlertOutline`, ...) drawn before the
|
|
208
|
+
* text instead of the variant's own glyph. Empty falls back to the
|
|
209
|
+
* `content` blob, then to the variant glyph.
|
|
210
|
+
*/
|
|
211
|
+
icon: {
|
|
212
|
+
type: String,
|
|
213
|
+
default: '',
|
|
214
|
+
},
|
|
215
|
+
|
|
171
216
|
/**
|
|
172
217
|
* Optional visibility condition. Shape:
|
|
173
218
|
* `{ endpoint?, source?, field?, op?, value }` — exactly one of
|
|
@@ -232,7 +277,8 @@ export default {
|
|
|
232
277
|
},
|
|
233
278
|
|
|
234
279
|
/**
|
|
235
|
-
* Attention card: at most
|
|
280
|
+
* Attention card: its actions, two at most (four under the board look,
|
|
281
|
+
* or `maxActions`). Each is `{ label, route?,
|
|
236
282
|
* href?, primary?, id? }`: `route` is a route name or location,
|
|
237
283
|
* `href` an URL. An action with neither renders a button that emits
|
|
238
284
|
* `action`. The first action is the primary one unless one sets
|
|
@@ -245,6 +291,29 @@ export default {
|
|
|
245
291
|
default: null,
|
|
246
292
|
},
|
|
247
293
|
|
|
294
|
+
/**
|
|
295
|
+
* Attention card: how many actions it shows at most. Null takes the
|
|
296
|
+
* default: two, four under the board look.
|
|
297
|
+
*
|
|
298
|
+
* @spec openspec/changes/screens-banner-actions-parity/specs/banner-actions/spec.md#requirement-the-board-attention-card-shows-the-boards-actions
|
|
299
|
+
*/
|
|
300
|
+
maxActions: {
|
|
301
|
+
type: Number,
|
|
302
|
+
default: null,
|
|
303
|
+
},
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* Attention card: stack the actions under the text instead of beside it,
|
|
307
|
+
* the "Begin hier" card of PqMijnWerk (16px title, the action under the
|
|
308
|
+
* reason). Falls back to the `content` blob.
|
|
309
|
+
*
|
|
310
|
+
* @spec openspec/changes/screens-start-here-banner/specs/start-here-banner/spec.md#requirement-a-card-can-stack-its-action-under-the-text
|
|
311
|
+
*/
|
|
312
|
+
stacked: {
|
|
313
|
+
type: Boolean,
|
|
314
|
+
default: false,
|
|
315
|
+
},
|
|
316
|
+
|
|
248
317
|
/**
|
|
249
318
|
* Stored content blob (CnDashboardPage registry branch) carrying the
|
|
250
319
|
* same keys as the flat props: `{ variant, text, visibleWhen, route,
|
|
@@ -305,6 +374,12 @@ export default {
|
|
|
305
374
|
* the text wherever it says `{value}`.
|
|
306
375
|
*/
|
|
307
376
|
conditionValue: null,
|
|
377
|
+
/**
|
|
378
|
+
* The first row of the `visibleWhen` source query (its `order`
|
|
379
|
+
* applied), the card's subject: `{subject.<field>}` in the texts
|
|
380
|
+
* and `@subject.<field>` in an action route read it.
|
|
381
|
+
*/
|
|
382
|
+
conditionRow: null,
|
|
308
383
|
/** Whether the visibleWhen request itself failed (not: answered "no"). */
|
|
309
384
|
conditionFailed: false,
|
|
310
385
|
/** Why it failed, as the request reported it. */
|
|
@@ -319,9 +394,38 @@ export default {
|
|
|
319
394
|
return VARIANTS.includes(v) ? v : 'info'
|
|
320
395
|
},
|
|
321
396
|
|
|
322
|
-
/** The effective banner text (prop → content → ''). */
|
|
397
|
+
/** The effective banner text (prop → content → ''), through the app's translate. */
|
|
323
398
|
resolvedText() {
|
|
324
|
-
|
|
399
|
+
const text = this.text || (this.content && this.content.text) || ''
|
|
400
|
+
return text ? this.tl(text) : ''
|
|
401
|
+
},
|
|
402
|
+
|
|
403
|
+
/** The effective bold lead (prop → content → ''), through the app's translate. */
|
|
404
|
+
resolvedLead() {
|
|
405
|
+
const lead = this.lead || (this.content && this.content.lead) || ''
|
|
406
|
+
return lead ? this.tl(lead) : ''
|
|
407
|
+
},
|
|
408
|
+
|
|
409
|
+
/** The lead with `{value}` filled in. */
|
|
410
|
+
displayLead() {
|
|
411
|
+
return this.fillValue(this.resolvedLead)
|
|
412
|
+
},
|
|
413
|
+
|
|
414
|
+
/** The effective icon name (prop → content → ''). */
|
|
415
|
+
resolvedIcon() {
|
|
416
|
+
return this.icon || (this.content && this.content.icon) || ''
|
|
417
|
+
},
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* The note card's actions as links, under the board look only: the
|
|
421
|
+
* first resolved action of `actions`, as the board draws "Beleid
|
|
422
|
+
* wijzigen" at the end of the line. Without the look the note card
|
|
423
|
+
* ignores `actions`, as it always did.
|
|
424
|
+
*
|
|
425
|
+
* @return {Array<object>} The resolved actions (at most one).
|
|
426
|
+
*/
|
|
427
|
+
noteActions() {
|
|
428
|
+
return normalizeLook(this.cnLook) === 'board' ? this.resolvedActions.slice(0, 1) : []
|
|
325
429
|
},
|
|
326
430
|
|
|
327
431
|
/** The effective visibleWhen condition (prop → content → null). */
|
|
@@ -362,6 +466,15 @@ export default {
|
|
|
362
466
|
return (this.layout || (this.content && this.content.layout) || 'banner') === 'attention'
|
|
363
467
|
},
|
|
364
468
|
|
|
469
|
+
/**
|
|
470
|
+
* Whether the actions sit under the text.
|
|
471
|
+
*
|
|
472
|
+
* @return {boolean}
|
|
473
|
+
*/
|
|
474
|
+
isStacked() {
|
|
475
|
+
return this.stacked || Boolean(this.content && this.content.stacked)
|
|
476
|
+
},
|
|
477
|
+
|
|
365
478
|
/**
|
|
366
479
|
* The attention card's kicker (prop, else content).
|
|
367
480
|
*
|
|
@@ -370,7 +483,7 @@ export default {
|
|
|
370
483
|
*/
|
|
371
484
|
resolvedKicker() {
|
|
372
485
|
const kicker = this.kicker || (this.content && this.content.kicker) || ''
|
|
373
|
-
return kicker ? this.tl(kicker) : ''
|
|
486
|
+
return kicker ? this.fillValue(this.tl(kicker)) : ''
|
|
374
487
|
},
|
|
375
488
|
|
|
376
489
|
/**
|
|
@@ -403,12 +516,27 @@ export default {
|
|
|
403
516
|
},
|
|
404
517
|
|
|
405
518
|
/**
|
|
406
|
-
* The attention card's actions: the first
|
|
519
|
+
* The attention card's actions: the first `actionCap` that have a label, each
|
|
407
520
|
* with its href and whether it is the primary one.
|
|
408
521
|
*
|
|
409
522
|
* @return {Array<{key: string, id: (string|undefined), label: string, href: string, target: (object|null), primary: boolean, index: number}>}
|
|
410
523
|
* @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-attention-card
|
|
411
524
|
*/
|
|
525
|
+
/**
|
|
526
|
+
* How many actions the attention card shows: `maxActions` (prop, then
|
|
527
|
+
* content), else four under the board look and two without it.
|
|
528
|
+
*
|
|
529
|
+
* @return {number} The cap.
|
|
530
|
+
* @spec openspec/changes/screens-banner-actions-parity/specs/banner-actions/spec.md#requirement-the-board-attention-card-shows-the-boards-actions
|
|
531
|
+
*/
|
|
532
|
+
actionCap() {
|
|
533
|
+
const explicit = this.maxActions ?? (this.content ? this.content.maxActions : undefined)
|
|
534
|
+
if (Number.isInteger(explicit) && explicit > 0) {
|
|
535
|
+
return explicit
|
|
536
|
+
}
|
|
537
|
+
return normalizeLook(this.cnLook) === 'board' ? MAX_ACTIONS_BOARD : MAX_ACTIONS
|
|
538
|
+
},
|
|
539
|
+
|
|
412
540
|
resolvedActions() {
|
|
413
541
|
const raw = this.actions || (this.content && this.content.actions) || []
|
|
414
542
|
if (!Array.isArray(raw)) {
|
|
@@ -416,14 +544,14 @@ export default {
|
|
|
416
544
|
}
|
|
417
545
|
const usable = raw
|
|
418
546
|
.filter((action) => action && typeof action === 'object' && typeof action.label === 'string' && action.label !== '')
|
|
419
|
-
.slice(0,
|
|
547
|
+
.slice(0, this.actionCap)
|
|
420
548
|
const declaredPrimary = usable.findIndex((action) => action.primary === true)
|
|
421
549
|
const primaryIndex = declaredPrimary === -1 ? 0 : declaredPrimary
|
|
422
550
|
return usable.map((action, index) => {
|
|
423
551
|
let target = null
|
|
424
552
|
let href = ''
|
|
425
553
|
if (action.route) {
|
|
426
|
-
target = typeof action.route === 'string' ? { name: action.route } : action.route
|
|
554
|
+
target = typeof action.route === 'string' ? { name: action.route } : this.resolveSubject(action.route)
|
|
427
555
|
href = resolveHref(target, this.$router)
|
|
428
556
|
} else if (typeof action.href === 'string' && action.href !== '') {
|
|
429
557
|
const safe = safeHref(action.href)
|
|
@@ -448,7 +576,7 @@ export default {
|
|
|
448
576
|
*/
|
|
449
577
|
visible() {
|
|
450
578
|
const title = this.title || (this.content && this.content.title) || ''
|
|
451
|
-
if (this.resolvedText === '' && !(this.isAttention && title !== '')) {
|
|
579
|
+
if (this.resolvedText === '' && this.resolvedLead === '' && !(this.isAttention && title !== '')) {
|
|
452
580
|
return false
|
|
453
581
|
}
|
|
454
582
|
if (!this.resolvedVisibleWhen) {
|
|
@@ -482,7 +610,7 @@ export default {
|
|
|
482
610
|
*/
|
|
483
611
|
uncheckedText() {
|
|
484
612
|
const title = this.title || (this.content && this.content.title) || this.resolvedText
|
|
485
|
-
if (!title || title.includes('{value}')) {
|
|
613
|
+
if (!title || title.includes('{value}') || title.includes('{subject.')) {
|
|
486
614
|
return t('nextcloud-vue', 'Could not check')
|
|
487
615
|
}
|
|
488
616
|
// `escape: false`: the result is rendered through `{{ }}`, which escapes.
|
|
@@ -554,10 +682,55 @@ export default {
|
|
|
554
682
|
* @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-attention-card
|
|
555
683
|
*/
|
|
556
684
|
fillValue(text) {
|
|
557
|
-
|
|
685
|
+
let out = text
|
|
686
|
+
if (this.conditionValue !== null && out.includes('{value}')) {
|
|
687
|
+
out = out.replaceAll('{value}', String(this.conditionValue))
|
|
688
|
+
}
|
|
689
|
+
return this.fillSubject(out)
|
|
690
|
+
},
|
|
691
|
+
|
|
692
|
+
/**
|
|
693
|
+
* Fill `{subject.<field>}` (and `{subject.<field>|date}`, `|days`) from
|
|
694
|
+
* the card's subject row. A token with no value empties the whole text,
|
|
695
|
+
* as in a record list. Text without a subject token is untouched.
|
|
696
|
+
*
|
|
697
|
+
* @param {string} text The text.
|
|
698
|
+
* @return {string} The filled text.
|
|
699
|
+
* @spec openspec/changes/screens-start-here-banner/specs/start-here-banner/spec.md#requirement-a-banner-can-name-the-first-row-of-a-query
|
|
700
|
+
*/
|
|
701
|
+
fillSubject(text) {
|
|
702
|
+
if (typeof text !== 'string' || !text.includes('{subject.')) {
|
|
558
703
|
return text
|
|
559
704
|
}
|
|
560
|
-
|
|
705
|
+
// `{value}` is not a subject token: keep it out of the template fill.
|
|
706
|
+
const guard = '\u0000value\u0000'
|
|
707
|
+
const filled = fillTemplate(text.replaceAll('{value}', guard), { subject: this.conditionRow || {} })
|
|
708
|
+
return filled.replaceAll(guard, '{value}')
|
|
709
|
+
},
|
|
710
|
+
|
|
711
|
+
/**
|
|
712
|
+
* Replace `@subject.<field>` strings anywhere in an action route
|
|
713
|
+
* (params, query) by the subject's value.
|
|
714
|
+
*
|
|
715
|
+
* @param {unknown} node A route name, location or any nested part of one.
|
|
716
|
+
* @return {unknown} The same shape with the tokens resolved.
|
|
717
|
+
* @spec openspec/changes/screens-start-here-banner/specs/start-here-banner/spec.md#requirement-a-banner-can-name-the-first-row-of-a-query
|
|
718
|
+
*/
|
|
719
|
+
resolveSubject(node) {
|
|
720
|
+
if (typeof node === 'string') {
|
|
721
|
+
if (!node.startsWith('@subject.')) {
|
|
722
|
+
return node
|
|
723
|
+
}
|
|
724
|
+
const value = this.conditionRow ? readPath(this.conditionRow, node.slice('@subject.'.length)) : undefined
|
|
725
|
+
return value === undefined || value === null ? '' : String(value)
|
|
726
|
+
}
|
|
727
|
+
if (Array.isArray(node)) {
|
|
728
|
+
return node.map((item) => this.resolveSubject(item))
|
|
729
|
+
}
|
|
730
|
+
if (node && typeof node === 'object') {
|
|
731
|
+
return Object.fromEntries(Object.entries(node).map(([key, value]) => [key, this.resolveSubject(value)]))
|
|
732
|
+
}
|
|
733
|
+
return node
|
|
561
734
|
},
|
|
562
735
|
|
|
563
736
|
/**
|
|
@@ -600,6 +773,7 @@ export default {
|
|
|
600
773
|
if (outcome) {
|
|
601
774
|
this.conditionMet = outcome.met === true
|
|
602
775
|
this.conditionValue = outcome.value !== undefined ? outcome.value : null
|
|
776
|
+
this.conditionRow = outcome.row && typeof outcome.row === 'object' ? outcome.row : null
|
|
603
777
|
this.conditionFailed = outcome.failed === true
|
|
604
778
|
this.conditionFailureReason = outcome.failed === true && typeof outcome.reason === 'string' ? outcome.reason : ''
|
|
605
779
|
return
|
|
@@ -608,12 +782,15 @@ export default {
|
|
|
608
782
|
if (!cond) {
|
|
609
783
|
this.conditionMet = null
|
|
610
784
|
this.conditionValue = null
|
|
785
|
+
this.conditionRow = null
|
|
611
786
|
this.conditionFailed = false
|
|
612
787
|
this.conditionFailureReason = ''
|
|
613
788
|
return
|
|
614
789
|
}
|
|
615
790
|
try {
|
|
616
|
-
const
|
|
791
|
+
const sink = {}
|
|
792
|
+
const value = await readVisibleWhenValue(cond, undefined, sink)
|
|
793
|
+
this.conditionRow = sink.row || null
|
|
617
794
|
this.conditionValue = value
|
|
618
795
|
this.conditionMet = compareVisibleWhen(value, cond.op || 'eq', cond.value)
|
|
619
796
|
this.conditionFailed = false
|
|
@@ -626,6 +803,7 @@ export default {
|
|
|
626
803
|
console.warn('[CnBannerWidget] visibleWhen could not be evaluated, banner hidden:', error?.message || error)
|
|
627
804
|
this.conditionMet = false
|
|
628
805
|
this.conditionValue = null
|
|
806
|
+
this.conditionRow = null
|
|
629
807
|
this.conditionFailed = true
|
|
630
808
|
this.conditionFailureReason = typeof error?.message === 'string' ? error.message : String(error ?? '')
|
|
631
809
|
}
|
|
@@ -657,6 +835,23 @@ export default {
|
|
|
657
835
|
margin: 0;
|
|
658
836
|
}
|
|
659
837
|
|
|
838
|
+
.cn-banner-widget__line {
|
|
839
|
+
display: flex;
|
|
840
|
+
flex-wrap: wrap;
|
|
841
|
+
align-items: baseline;
|
|
842
|
+
gap: 4px 20px;
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
.cn-banner-widget__lead {
|
|
846
|
+
font-weight: 700;
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
.cn-banner-widget__link {
|
|
850
|
+
margin-inline-start: auto;
|
|
851
|
+
font-size: 14px;
|
|
852
|
+
font-weight: 600;
|
|
853
|
+
}
|
|
854
|
+
|
|
660
855
|
.cn-banner-widget__text--clickable {
|
|
661
856
|
cursor: pointer;
|
|
662
857
|
text-decoration: underline;
|
|
@@ -748,6 +943,32 @@ export default {
|
|
|
748
943
|
color: var(--color-text-maxcontrast);
|
|
749
944
|
}
|
|
750
945
|
|
|
946
|
+
/* Stacked (PqMijnWerk "Begin hier"): the text, then the action under it. */
|
|
947
|
+
.cn-banner-widget--stacked {
|
|
948
|
+
flex-direction: column;
|
|
949
|
+
align-items: flex-start;
|
|
950
|
+
gap: 10px;
|
|
951
|
+
}
|
|
952
|
+
|
|
953
|
+
.cn-banner-widget--stacked .cn-banner-widget__body {
|
|
954
|
+
flex: 0 0 auto;
|
|
955
|
+
gap: 10px;
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
.cn-banner-widget--stacked .cn-banner-widget__title {
|
|
959
|
+
font-size: 16px;
|
|
960
|
+
line-height: 1.4;
|
|
961
|
+
}
|
|
962
|
+
|
|
963
|
+
.cn-banner-widget--stacked .cn-banner-widget__reason {
|
|
964
|
+
font-size: 14px;
|
|
965
|
+
}
|
|
966
|
+
|
|
967
|
+
.cn-banner-widget--stacked .cn-banner-widget__action {
|
|
968
|
+
min-height: var(--cn-board-control-height, 40px);
|
|
969
|
+
font-size: 14px;
|
|
970
|
+
}
|
|
971
|
+
|
|
751
972
|
.cn-banner-widget__actions {
|
|
752
973
|
display: flex;
|
|
753
974
|
flex-wrap: wrap;
|
|
@@ -86,6 +86,8 @@ fall back to the normal rendering. See `docs/migrating-to-manifest.md` →
|
|
|
86
86
|
> `cnFormatters: { automationTrigger: v => ({ 'lead.created': 'Lead created' }[v] ?? v) }`);
|
|
87
87
|
> standalone (no provider) it falls back to rendering the raw value.
|
|
88
88
|
|
|
89
|
+
The `secondary` prop is the column's secondary line: the `avatar` widget draws it under the name, beside the picture (`CnDataTable` passes it for an avatar column); other cells ignore it.
|
|
90
|
+
|
|
89
91
|
Column widget — `widget="badge"`, `widget="fkResolve"` (uuid → related object label via the shared object store with per-schema caching; config `widgetProps { register, schema, labelField }`), and `widget="link"` are built-in; any other id resolves against the app's `cellWidgets` registry (`CnAppRoot`'s `cellWidgets` prop → `cnCellWidgets`), and that component receives `{ value, row, property, formatted, ...widgetProps }`. `widget` takes precedence over `formatter`; when both are set the widget gets the formatter-shaped value as `formatted`. See `docs/migrating-to-manifest.md` → "Column widgets" + "Built-in cell formatters / widgets".
|
|
90
92
|
|
|
91
93
|
- `widget="badge"` — `CnStatusBadge` pill; `widgetProps.variant` picks the colour.
|