@conduction/nextcloud-vue 2.80.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/CnActionsBar/CnActionsBar.vue2.js.map +1 -1
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js +3 -3
- 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 +140 -10
- 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 +17 -3
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +63 -52
- 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 +3 -2
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +72 -0
- 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/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.vue2.js +131 -0
- 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.vue2.js +80 -5
- package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js +282 -69
- package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js.map +1 -1
- 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/CnFormPage/CnFormPage.vue2.js +60 -0
- 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 +29 -2
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +48 -4
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
- 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/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.vue2.js +30 -6
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +34 -25
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
- 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/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/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.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 +47 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +16 -14
- 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 +7 -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 +197 -6
- package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue3.js +96 -50
- package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue3.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 +17 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/l10n/en.json.js +9 -1
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +55 -1
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/nextcloud-vue.css +1041 -12
- package/dist/esm/utils/contentHeaderLink.js +51 -0
- package/dist/esm/utils/contentHeaderLink.js.map +1 -0
- 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 +7 -1
- package/dist/esm/utils/fillTemplate.js.map +1 -1
- package/dist/esm/utils/initials.js +32 -0
- package/dist/esm/utils/initials.js.map +1 -0
- package/dist/esm/utils/libraryWidgetKeys.js +7 -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/resolveFilterTokens.js +1 -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/sentinelTokens.js +19 -1
- 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 +1 -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 +13589 -7833
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +1041 -12
- package/l10n/en.json +9 -1
- package/l10n/nl.json +55 -1
- package/package.json +2 -1
- package/scripts/check-docs-mdx.mjs +108 -0
- package/src/components/CnActionsBar/CnActionsBar.vue +6 -1
- package/src/components/CnAppRoot/CnAppRoot.md +4 -2
- package/src/components/CnAppRoot/CnAppRoot.vue +151 -59
- package/src/components/CnBannerWidget/CnBannerWidget.vue +205 -20
- package/src/components/CnCellRenderer/CnCellRenderer.md +2 -0
- package/src/components/CnCellRenderer/CnCellRenderer.vue +47 -4
- 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 +21 -12
- package/src/components/CnDetailPage/CnDetailPage.vue +89 -3
- package/src/components/CnDocumentReviewList/CnDocumentReviewWidget.vue +1 -1
- package/src/components/CnFacetSidebar/CnFacetSidebar.vue +7 -7
- package/src/components/CnFactsWidget/CnFactsWidget.vue +142 -2
- package/src/components/CnFieldListWidget/CnFieldListWidget.vue +268 -6
- 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/CnFormPage/CnFormPage.vue +81 -0
- package/src/components/CnIndexPage/CnIndexPage.vue +56 -4
- 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/CnRadioCardsWidget/CnRadioCardsWidget.vue +313 -0
- package/src/components/CnRadioCardsWidget/index.js +27 -0
- package/src/components/CnRecordListWidget/CnRecordListWidget.vue +55 -6
- package/src/components/CnSavedViewsWidget/CnSavedViewsWidget.vue +296 -0
- package/src/components/CnSavedViewsWidget/index.js +29 -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/CnStatWidget/CnStatWidget.vue +87 -6
- 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 +82 -3
- 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 +7 -0
- package/src/components/CnWidgetObjectTable/CnWidgetObjectTable.vue +7 -2
- package/src/components/CnWidgetObjectTable/dashboardRegistration.js +5 -0
- package/src/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue +309 -11
- package/src/components/index.js +15 -0
- package/src/composables/useListView.js +4 -4
- package/src/css/look-board-detail.css +36 -2
- package/src/css/look-board-index.css +39 -8
- package/src/css/look-board.css +72 -0
- package/src/index.js +15 -0
- package/src/schemas/app-manifest-v2.schema.json +93 -9
- package/src/utils/contentHeaderLink.js +48 -0
- package/src/utils/facets.js +74 -2
- package/src/utils/fetchFilterCounts.js +39 -4
- package/src/utils/fillTemplate.js +7 -1
- package/src/utils/initials.js +29 -0
- package/src/utils/libraryWidgetKeys.js +7 -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/resolveFilterTokens.js +3 -1
- package/src/utils/resolveManifestTokens.js +2 -0
- package/src/utils/sentinelTokens.js +19 -1
- 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 +1 -1
- package/src/utils/widgetVisibility.js +7 -56
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SPDX-FileCopyrightText: 2026 Conduction B.V.
|
|
3
|
+
* SPDX-License-Identifier: EUPL-1.2
|
|
4
|
+
*
|
|
5
|
+
* objectWrite: the one-object PATCH the settings widgets share.
|
|
6
|
+
*
|
|
7
|
+
* @module utils/objectWrite
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { prefixUrl } from './headers.js'
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* The OpenRegister URL of one object, or '' when register, schema or id is missing.
|
|
14
|
+
*
|
|
15
|
+
* @param {string|object} register Register slug.
|
|
16
|
+
* @param {string|object} schema Schema slug.
|
|
17
|
+
* @param {string|number} id Object id.
|
|
18
|
+
* @return {string} The object URL.
|
|
19
|
+
*/
|
|
20
|
+
export function objectUrlOf(register, schema, id) {
|
|
21
|
+
if (typeof register !== 'string' || typeof schema !== 'string' || !register || !schema || id === undefined || id === null || id === '') {
|
|
22
|
+
return ''
|
|
23
|
+
}
|
|
24
|
+
return `/apps/openregister/api/objects/${encodeURIComponent(register)}/${encodeURIComponent(schema)}/${encodeURIComponent(String(id))}`
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* PATCH only the given fields of one object.
|
|
29
|
+
*
|
|
30
|
+
* @param {string} url The object URL (see objectUrlOf).
|
|
31
|
+
* @param {object} patch The fields to write.
|
|
32
|
+
* @return {Promise<object>} The object the server answered with.
|
|
33
|
+
*/
|
|
34
|
+
export async function patchObject(url, patch) {
|
|
35
|
+
const { default: axios } = await import('@nextcloud/axios')
|
|
36
|
+
const { data } = await axios.patch(prefixUrl(url), patch)
|
|
37
|
+
return data && typeof data === 'object' ? data : {}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* The fields of `next` that differ from `base`, compared by value.
|
|
42
|
+
*
|
|
43
|
+
* @param {object} base What the server last held.
|
|
44
|
+
* @param {object} next What the form holds.
|
|
45
|
+
* @return {object} The changed fields only.
|
|
46
|
+
*/
|
|
47
|
+
export function changedFields(base, next) {
|
|
48
|
+
const patch = {}
|
|
49
|
+
for (const [key, value] of Object.entries(next)) {
|
|
50
|
+
if (JSON.stringify(value === undefined ? null : value) !== JSON.stringify(base[key] === undefined ? null : base[key])) {
|
|
51
|
+
patch[key] = value
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return patch
|
|
55
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SPDX-FileCopyrightText: 2026 Conduction B.V.
|
|
3
|
+
* SPDX-License-Identifier: EUPL-1.2
|
|
4
|
+
*
|
|
5
|
+
* pageControls: how a list widget listens to the page's controls.
|
|
6
|
+
*
|
|
7
|
+
* A page control (a `workspace-filter` select or switch) writes a value to the
|
|
8
|
+
* page workspace. A list widget declares which control it listens to and what
|
|
9
|
+
* the value means for it:
|
|
10
|
+
*
|
|
11
|
+
* pageControls: {
|
|
12
|
+
* sort: { key: "sort", map: { deadline: { field: "slaDeadline", dir: "asc" } } },
|
|
13
|
+
* toggle: { key: "showDone", removes: ["status"] }
|
|
14
|
+
* }
|
|
15
|
+
*
|
|
16
|
+
* `sort`: the workspace value at `key` picks an entry of `map` (the sort the
|
|
17
|
+
* list uses); a value with no entry leaves the list's own sort.
|
|
18
|
+
* `toggle`: while the workspace value at `key` is on (true, "1", "true"), the
|
|
19
|
+
* filter keys in `removes` are dropped, so a list that hides finished work
|
|
20
|
+
* shows it.
|
|
21
|
+
*
|
|
22
|
+
* @module utils/pageControls
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Whether a workspace value reads as on.
|
|
27
|
+
*
|
|
28
|
+
* @param {unknown} value The value.
|
|
29
|
+
* @return {boolean} True for true, 1, "1" and "true".
|
|
30
|
+
*/
|
|
31
|
+
export function isOn(value) {
|
|
32
|
+
return value === true || value === 1 || value === '1' || value === 'true'
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* The sort a list uses once the page's sort control is read.
|
|
37
|
+
*
|
|
38
|
+
* @param {object|null} pageControls The widget's `pageControls`.
|
|
39
|
+
* @param {object} workspace The plain workspace bag.
|
|
40
|
+
* @param {{field: string, dir?: string}|null} own The list's own sort.
|
|
41
|
+
* @return {{field: string, dir?: string}|null} The sort to use.
|
|
42
|
+
* @spec openspec/changes/screens-page-controls/specs/page-controls/spec.md#requirement-a-list-listens-to-the-pages-controls
|
|
43
|
+
*/
|
|
44
|
+
export function pageSort(pageControls, workspace, own) {
|
|
45
|
+
const listen = pageControls && typeof pageControls === 'object' ? pageControls.sort : null
|
|
46
|
+
if (!listen || typeof listen.key !== 'string' || !listen.map || typeof listen.map !== 'object') {
|
|
47
|
+
return own
|
|
48
|
+
}
|
|
49
|
+
const chosen = workspace ? workspace[listen.key] : undefined
|
|
50
|
+
const entry = chosen !== undefined && chosen !== null ? listen.map[String(chosen)] : null
|
|
51
|
+
return entry && typeof entry === 'object' && typeof entry.field === 'string' && entry.field !== '' ? entry : own
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The filter a list uses once the page's toggle is read: with the toggle on,
|
|
56
|
+
* the keys it `removes` are gone.
|
|
57
|
+
*
|
|
58
|
+
* @param {object|null} pageControls The widget's `pageControls`.
|
|
59
|
+
* @param {object} workspace The plain workspace bag.
|
|
60
|
+
* @param {object} filter The list's own filter (before token resolution).
|
|
61
|
+
* @return {object} The filter to use (the same object when nothing is removed).
|
|
62
|
+
* @spec openspec/changes/screens-page-controls/specs/page-controls/spec.md#requirement-a-list-listens-to-the-pages-controls
|
|
63
|
+
*/
|
|
64
|
+
export function pageFilter(pageControls, workspace, filter) {
|
|
65
|
+
const listen = pageControls && typeof pageControls === 'object' ? pageControls.toggle : null
|
|
66
|
+
const base = filter && typeof filter === 'object' ? filter : {}
|
|
67
|
+
if (!listen || typeof listen.key !== 'string' || !Array.isArray(listen.removes)) {
|
|
68
|
+
return base
|
|
69
|
+
}
|
|
70
|
+
if (!isOn(workspace ? workspace[listen.key] : undefined)) {
|
|
71
|
+
return base
|
|
72
|
+
}
|
|
73
|
+
const out = { ...base }
|
|
74
|
+
for (const key of listen.removes) {
|
|
75
|
+
delete out[key]
|
|
76
|
+
}
|
|
77
|
+
return out
|
|
78
|
+
}
|
|
@@ -37,6 +37,42 @@ export function personalLensTabs(lenses) {
|
|
|
37
37
|
.map((id) => ({ label: labels[id], filter: { [LENS_FILTER_KEYS[id]]: true }, lens: id }))
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
+
/**
|
|
41
|
+
* Turn the `empty` / `notEmpty` shorthand of quick filters into a filter.
|
|
42
|
+
*
|
|
43
|
+
* `{ label: "Not logged in yet", empty: "lastLoginAt" }` is the rows where the
|
|
44
|
+
* field has no value: the filter `{ lastLoginAt: { isnull: true } }`, which
|
|
45
|
+
* OpenRegister reads as `lastLoginAt[isnull]=true`. `notEmpty` is the rows
|
|
46
|
+
* where it has one. Either takes a field or a list of fields and merges with
|
|
47
|
+
* the entry's own `filter`. Returns the same array when no entry uses it.
|
|
48
|
+
*
|
|
49
|
+
* @param {Array<object>|null} quickFilters The page's quick filters.
|
|
50
|
+
* @return {Array<object>|null} The quick filters with the shorthand expanded.
|
|
51
|
+
*/
|
|
52
|
+
export function expandEmptyFilters(quickFilters) {
|
|
53
|
+
if (!Array.isArray(quickFilters)) {
|
|
54
|
+
return quickFilters
|
|
55
|
+
}
|
|
56
|
+
const uses = (tab) => tab && typeof tab === 'object' && (tab.empty || tab.notEmpty)
|
|
57
|
+
if (!quickFilters.some(uses)) {
|
|
58
|
+
return quickFilters
|
|
59
|
+
}
|
|
60
|
+
const fieldsOf = (value) => (Array.isArray(value) ? value : [value]).filter((f) => typeof f === 'string' && f !== '')
|
|
61
|
+
return quickFilters.map((tab) => {
|
|
62
|
+
if (!uses(tab)) {
|
|
63
|
+
return tab
|
|
64
|
+
}
|
|
65
|
+
const filter = { ...(tab.filter && typeof tab.filter === 'object' ? tab.filter : {}) }
|
|
66
|
+
for (const field of fieldsOf(tab.empty)) {
|
|
67
|
+
filter[field] = { isnull: true }
|
|
68
|
+
}
|
|
69
|
+
for (const field of fieldsOf(tab.notEmpty)) {
|
|
70
|
+
filter[field] = { isnull: false }
|
|
71
|
+
}
|
|
72
|
+
return { ...tab, filter }
|
|
73
|
+
})
|
|
74
|
+
}
|
|
75
|
+
|
|
40
76
|
/**
|
|
41
77
|
* The page's quick filters with its personal lenses appended. A page with no
|
|
42
78
|
* quick filters of its own gets an "All" tab first, so a lens is not active
|
|
@@ -48,10 +84,11 @@ export function personalLensTabs(lenses) {
|
|
|
48
84
|
*/
|
|
49
85
|
export function withPersonalLenses(quickFilters, lenses) {
|
|
50
86
|
const tabs = personalLensTabs(lenses)
|
|
87
|
+
const expanded = expandEmptyFilters(quickFilters)
|
|
51
88
|
if (tabs.length === 0) {
|
|
52
|
-
return
|
|
89
|
+
return expanded
|
|
53
90
|
}
|
|
54
|
-
const own = Array.isArray(
|
|
91
|
+
const own = Array.isArray(expanded) ? expanded : []
|
|
55
92
|
return own.length > 0
|
|
56
93
|
? [...own, ...tabs]
|
|
57
94
|
: [{ label: t('nextcloud-vue', 'All'), filter: {}, default: true }, ...tabs]
|
|
@@ -67,7 +67,9 @@
|
|
|
67
67
|
|
|
68
68
|
import { getCurrentUser } from '@nextcloud/auth'
|
|
69
69
|
import { TODAY_DELTA_RE } from './sentinelTokens.js'
|
|
70
|
-
|
|
70
|
+
// userGroupsPeek, not widgetVisibility: that one imports @nextcloud/axios, and
|
|
71
|
+
// this resolver runs on public pages and in node (see userGroupsPeek.js).
|
|
72
|
+
import { peekCurrentUserGroups } from './userGroupsPeek.js'
|
|
71
73
|
|
|
72
74
|
/** The filter token for the current user's group ids. */
|
|
73
75
|
export const MY_GROUPS_TOKEN = '@myGroups'
|
|
@@ -54,6 +54,8 @@ export const SENTINEL_RESOLVERS = Object.freeze({
|
|
|
54
54
|
declarative: 'fetchAggregate (OpenRegister server-side)',
|
|
55
55
|
visibleWhen: 'evaluateVisibleWhen (utils/visibleWhen.js)',
|
|
56
56
|
answer: 'resolveAssignValue (utils/formAssign.js)',
|
|
57
|
+
row: 'CnFieldListWidget (rowActions request)',
|
|
58
|
+
subject: 'CnBannerWidget (action route)',
|
|
57
59
|
})
|
|
58
60
|
|
|
59
61
|
/**
|
|
@@ -83,6 +83,12 @@ export const SENTINEL_TOKEN_PATTERNS = Object.freeze({
|
|
|
83
83
|
visibleWhen: '^@total$',
|
|
84
84
|
// form-live-values: another answer in the same form, read by a field's `assign` rule.
|
|
85
85
|
answer: '^@answer\\.[A-Za-z][A-Za-z0-9_]*$',
|
|
86
|
+
// A field of the row a row action is run on (`@row.<field>`, dot path), read by the
|
|
87
|
+
// field-list widget's `rowActions` request URL and payload.
|
|
88
|
+
row: '^@row\\.[A-Za-z][A-Za-z0-9_.@]*$',
|
|
89
|
+
// A field of the record a start-here attention card names (`@subject.<field>`, dot path),
|
|
90
|
+
// read by the banner widget's action routes.
|
|
91
|
+
subject: '^@subject\\.[A-Za-z][A-Za-z0-9_.]*$',
|
|
86
92
|
// Deprecated-but-not-yet-removed tokens. Kept in the schema union so
|
|
87
93
|
// deployed manifests still validate during the migration window; the gate
|
|
88
94
|
// downgrades them to a WARN (see SENTINEL_DEPRECATIONS).
|
|
@@ -90,7 +96,7 @@ export const SENTINEL_TOKEN_PATTERNS = Object.freeze({
|
|
|
90
96
|
})
|
|
91
97
|
|
|
92
98
|
/**
|
|
93
|
-
* The
|
|
99
|
+
* The nine canonical context names (excludes `deprecated`, which is a
|
|
94
100
|
* transitional overlay, not a resolution context).
|
|
95
101
|
*
|
|
96
102
|
* @type {string[]}
|
|
@@ -104,6 +110,8 @@ export const SENTINEL_CONTEXTS = Object.freeze([
|
|
|
104
110
|
'declarative',
|
|
105
111
|
'visibleWhen',
|
|
106
112
|
'answer',
|
|
113
|
+
'row',
|
|
114
|
+
'subject',
|
|
107
115
|
])
|
|
108
116
|
|
|
109
117
|
/**
|
|
@@ -154,6 +162,16 @@ export const SENTINEL_VOCABULARY = Object.freeze({
|
|
|
154
162
|
description: 'Another answer in the same form, read by a field\'s `assign` rule.',
|
|
155
163
|
members: ['@answer.<field>'],
|
|
156
164
|
},
|
|
165
|
+
row: {
|
|
166
|
+
resolver: 'CnFieldListWidget (rowActions request url and payload)',
|
|
167
|
+
description: 'A field of the row a row action runs on, read by the field-list widget when it sends the action\'s request. Dot paths are allowed (`@row.owner.id`).',
|
|
168
|
+
members: ['@row.<field>'],
|
|
169
|
+
},
|
|
170
|
+
subject: {
|
|
171
|
+
resolver: 'CnBannerWidget (action route params and query)',
|
|
172
|
+
description: 'A field of the record an attention card names (the first row of its ordered `visibleWhen` source query), read when the card builds an action\'s route. Dot paths are allowed (`@subject.owner.id`).',
|
|
173
|
+
members: ['@subject.<field>'],
|
|
174
|
+
},
|
|
157
175
|
})
|
|
158
176
|
|
|
159
177
|
/**
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SPDX-FileCopyrightText: 2026 Conduction B.V.
|
|
3
|
+
* SPDX-License-Identifier: EUPL-1.2
|
|
4
|
+
*
|
|
5
|
+
* The synchronous, reactive read of the current user's group ids, without
|
|
6
|
+
* the request that loads them.
|
|
7
|
+
*
|
|
8
|
+
* `resolveFilterTokens` (and through it `visibleWhen`) needs the groups for
|
|
9
|
+
* `@myGroups`, and those utilities are used on public, signed-out pages too.
|
|
10
|
+
* Importing `widgetVisibility.js` statically pulled `@nextcloud/axios` and
|
|
11
|
+
* `@nextcloud/router` into every bundle that resolves a filter token: a public
|
|
12
|
+
* site bundle broke its size budget, and node specs crashed because axios
|
|
13
|
+
* reads the request token when it is imported. This module imports no
|
|
14
|
+
* `@nextcloud/*` package. It loads `widgetVisibility.js` lazily, only the
|
|
15
|
+
* first time a signed-in user's groups are actually peeked.
|
|
16
|
+
*
|
|
17
|
+
* @module utils/userGroupsPeek
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { reactive } from 'vue'
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Reactive mirror of the group cache, keyed by user id. A computed that reads
|
|
24
|
+
* a missing key tracks it, so it re-runs when the groups arrive.
|
|
25
|
+
*
|
|
26
|
+
* @type {{ byUser: Record<string, string[]> }}
|
|
27
|
+
*/
|
|
28
|
+
const _peek = reactive({ byUser: {} })
|
|
29
|
+
|
|
30
|
+
/** User ids whose groups a peek already asked for (not reactive on purpose). */
|
|
31
|
+
const _peekRequested = new Set()
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Get the current Nextcloud user ID from OC.currentUser.
|
|
35
|
+
*
|
|
36
|
+
* @return {string|null} The current user ID, or null if not logged in
|
|
37
|
+
*/
|
|
38
|
+
export function getCurrentUserId() {
|
|
39
|
+
return window.OC?.currentUser?.uid
|
|
40
|
+
|| window.OC?.currentUser
|
|
41
|
+
|| null
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Synchronous, reactive read of the current user's group ids, for code that
|
|
46
|
+
* cannot await (the `@myGroups` filter token). Returns the ids once they are
|
|
47
|
+
* loaded, `null` while the first request is in flight (and starts that
|
|
48
|
+
* request on first use), and `[]` when nobody is signed in. Read inside a
|
|
49
|
+
* computed, the computed re-runs when the groups arrive.
|
|
50
|
+
*
|
|
51
|
+
* @spec openspec/changes/nextcloud-group-surfaces/specs/schema-utilities/spec.md#requirement-mygroups-resolves-to-the-current-users-group-ids
|
|
52
|
+
* @return {string[]|null} The group ids, or null while loading.
|
|
53
|
+
*/
|
|
54
|
+
export function peekCurrentUserGroups() {
|
|
55
|
+
const userId = getCurrentUserId()
|
|
56
|
+
if (!userId) {
|
|
57
|
+
return []
|
|
58
|
+
}
|
|
59
|
+
const known = _peek.byUser[userId]
|
|
60
|
+
if (Array.isArray(known)) {
|
|
61
|
+
return known
|
|
62
|
+
}
|
|
63
|
+
if (!_peekRequested.has(userId)) {
|
|
64
|
+
_peekRequested.add(userId)
|
|
65
|
+
import('./widgetVisibility.js')
|
|
66
|
+
.then((module) => module.getCurrentUserGroups())
|
|
67
|
+
.then((groups) => {
|
|
68
|
+
_peek.byUser[userId] = Array.isArray(groups) ? [...groups] : []
|
|
69
|
+
})
|
|
70
|
+
.catch(() => {
|
|
71
|
+
_peek.byUser[userId] = []
|
|
72
|
+
})
|
|
73
|
+
}
|
|
74
|
+
return null
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Forget every peeked group list. `resetVisibilityCache()` calls this.
|
|
79
|
+
*
|
|
80
|
+
* @spec exclude test helper behind resetVisibilityCache, no behaviour of its own
|
|
81
|
+
*/
|
|
82
|
+
export function resetGroupsPeek() {
|
|
83
|
+
_peekRequested.clear()
|
|
84
|
+
for (const key of Object.keys(_peek.byUser)) {
|
|
85
|
+
delete _peek.byUser[key]
|
|
86
|
+
}
|
|
87
|
+
}
|