@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
|
@@ -5,9 +5,123 @@
|
|
|
5
5
|
|
|
6
6
|
<template>
|
|
7
7
|
<div class="cn-field-list-widget" data-testid="cn-field-list-widget">
|
|
8
|
+
<div v-if="canAdd && addTrigger && addPlacement === 'header'" class="cn-field-list-widget__toolbar">
|
|
9
|
+
<NcButton
|
|
10
|
+
variant="secondary"
|
|
11
|
+
:disabled="busy !== ''"
|
|
12
|
+
data-testid="cn-field-list-open-add"
|
|
13
|
+
@click="adding = !adding">
|
|
14
|
+
+ {{ addLabel }}
|
|
15
|
+
</NcButton>
|
|
16
|
+
</div>
|
|
17
|
+
<form
|
|
18
|
+
v-if="canAdd && addTrigger && addPlacement === 'header' && adding"
|
|
19
|
+
class="cn-field-list-widget__add"
|
|
20
|
+
data-testid="cn-field-list-add"
|
|
21
|
+
@submit.prevent="add">
|
|
22
|
+
<div
|
|
23
|
+
v-for="field in addFields"
|
|
24
|
+
:key="field.key"
|
|
25
|
+
class="cn-field-list-widget__field"
|
|
26
|
+
:data-testid="`cn-field-list-input-${field.key}`">
|
|
27
|
+
<NcSelect
|
|
28
|
+
v-if="field.type === 'select'"
|
|
29
|
+
v-model="draft[field.key]"
|
|
30
|
+
:inputLabel="field.label"
|
|
31
|
+
:options="field.options"
|
|
32
|
+
:reduce="(option) => option.value"
|
|
33
|
+
:clearable="false"
|
|
34
|
+
label="label" />
|
|
35
|
+
<NcTextField
|
|
36
|
+
v-else
|
|
37
|
+
v-model="draft[field.key]"
|
|
38
|
+
:label="field.label"
|
|
39
|
+
:error="Boolean(errors[field.key])"
|
|
40
|
+
:helperText="errors[field.key] || ''" />
|
|
41
|
+
</div>
|
|
42
|
+
<NcButton type="submit"
|
|
43
|
+
variant="primary"
|
|
44
|
+
:disabled="busy !== ''"
|
|
45
|
+
data-testid="cn-field-list-submit">
|
|
46
|
+
{{ addLabel }}
|
|
47
|
+
</NcButton>
|
|
48
|
+
</form>
|
|
8
49
|
<p v-if="rows.length === 0" class="cn-field-list-widget__empty" data-testid="cn-field-list-empty">
|
|
9
50
|
{{ emptyLabel }}
|
|
10
51
|
</p>
|
|
52
|
+
<div v-else-if="isTable" class="cn-field-list-widget__table-wrap">
|
|
53
|
+
<table class="cn-field-list-widget__table" data-testid="cn-field-list-table">
|
|
54
|
+
<thead>
|
|
55
|
+
<tr>
|
|
56
|
+
<th
|
|
57
|
+
v-for="column in tableColumns"
|
|
58
|
+
:key="column.key"
|
|
59
|
+
scope="col"
|
|
60
|
+
class="cn-field-list-widget__th">
|
|
61
|
+
{{ column.header }}
|
|
62
|
+
</th>
|
|
63
|
+
<th v-if="hasMenu" scope="col" class="cn-field-list-widget__th cn-field-list-widget__th--menu">
|
|
64
|
+
<span class="cn-field-list-widget__sr">{{ tr('Actions') }}</span>
|
|
65
|
+
</th>
|
|
66
|
+
</tr>
|
|
67
|
+
</thead>
|
|
68
|
+
<tbody>
|
|
69
|
+
<tr
|
|
70
|
+
v-for="row in rows"
|
|
71
|
+
:key="row.key"
|
|
72
|
+
class="cn-field-list-widget__tr"
|
|
73
|
+
:data-testid="`cn-field-list-row-${row.key}`">
|
|
74
|
+
<td
|
|
75
|
+
v-for="(column, index) in tableColumns"
|
|
76
|
+
:key="column.key"
|
|
77
|
+
class="cn-field-list-widget__td">
|
|
78
|
+
<CnStatusBadge
|
|
79
|
+
v-if="column.pill && row.cells[index].pill"
|
|
80
|
+
:label="row.cells[index].pill.label"
|
|
81
|
+
:variant="row.cells[index].pill.variant"
|
|
82
|
+
size="small" />
|
|
83
|
+
<strong v-else-if="column.strong">{{ row.cells[index].text }}</strong>
|
|
84
|
+
<template v-else>
|
|
85
|
+
{{ row.cells[index].text }}
|
|
86
|
+
</template>
|
|
87
|
+
</td>
|
|
88
|
+
<td v-if="hasMenu" class="cn-field-list-widget__td cn-field-list-widget__td--menu">
|
|
89
|
+
<NcActions
|
|
90
|
+
v-if="menuItems(row).length > 0"
|
|
91
|
+
:forceMenu="true"
|
|
92
|
+
:disabled="busy !== ''"
|
|
93
|
+
:ariaLabel="`${tr('More actions')}: ${row.title}`"
|
|
94
|
+
:data-testid="`cn-field-list-menu-${row.key}`">
|
|
95
|
+
<NcActionButton
|
|
96
|
+
v-for="item in menuItems(row)"
|
|
97
|
+
:key="item.id"
|
|
98
|
+
:data-testid="`cn-field-list-menu-${item.id}-${row.key}`"
|
|
99
|
+
@click="item.run">
|
|
100
|
+
{{ item.label }}
|
|
101
|
+
</NcActionButton>
|
|
102
|
+
</NcActions>
|
|
103
|
+
</td>
|
|
104
|
+
</tr>
|
|
105
|
+
</tbody>
|
|
106
|
+
</table>
|
|
107
|
+
<div
|
|
108
|
+
v-for="row in bandRows"
|
|
109
|
+
:key="row.key"
|
|
110
|
+
class="cn-field-list-widget__band"
|
|
111
|
+
role="note"
|
|
112
|
+
:data-testid="`cn-field-list-band-${row.key}`">
|
|
113
|
+
<span class="cn-field-list-widget__band-text">{{ row.detail }}</span>
|
|
114
|
+
<NcButton
|
|
115
|
+
v-for="action in row.bandActions"
|
|
116
|
+
:key="action.id"
|
|
117
|
+
variant="secondary"
|
|
118
|
+
:disabled="busy !== ''"
|
|
119
|
+
:data-testid="`cn-field-list-band-action-${action.id}-${row.key}`"
|
|
120
|
+
@click="runAction(action, row)">
|
|
121
|
+
{{ action.label }}
|
|
122
|
+
</NcButton>
|
|
123
|
+
</div>
|
|
124
|
+
</div>
|
|
11
125
|
<ul v-else class="cn-field-list-widget__rows">
|
|
12
126
|
<li
|
|
13
127
|
v-for="row in rows"
|
|
@@ -55,8 +169,17 @@
|
|
|
55
169
|
{{ hint }}
|
|
56
170
|
</p>
|
|
57
171
|
|
|
172
|
+
<div v-if="canAdd && addTrigger && addPlacement !== 'header' && !adding" class="cn-field-list-widget__toolbar">
|
|
173
|
+
<NcButton
|
|
174
|
+
variant="secondary"
|
|
175
|
+
:disabled="busy !== ''"
|
|
176
|
+
data-testid="cn-field-list-open-add"
|
|
177
|
+
@click="adding = true">
|
|
178
|
+
+ {{ addLabel }}
|
|
179
|
+
</NcButton>
|
|
180
|
+
</div>
|
|
58
181
|
<form
|
|
59
|
-
v-if="canAdd"
|
|
182
|
+
v-if="canAdd && !(addTrigger && addPlacement === 'header') && (!addTrigger || adding)"
|
|
60
183
|
class="cn-field-list-widget__add"
|
|
61
184
|
data-testid="cn-field-list-add"
|
|
62
185
|
@submit.prevent="add">
|
|
@@ -95,7 +218,7 @@
|
|
|
95
218
|
</template>
|
|
96
219
|
|
|
97
220
|
<script>
|
|
98
|
-
import { NcButton, NcNoteCard, NcSelect, NcTextField } from '@nextcloud/vue'
|
|
221
|
+
import { NcActionButton, NcActions, NcButton, NcNoteCard, NcSelect, NcTextField } from '@nextcloud/vue'
|
|
99
222
|
import CnStatusBadge from '../CnStatusBadge/CnStatusBadge.vue'
|
|
100
223
|
import { isBadgeVariant } from '../../utils/badgeVariants.js'
|
|
101
224
|
import { formatBoardDate } from '../../utils/boardDate.js'
|
|
@@ -125,7 +248,7 @@ import { serverErrorMessage } from '../../utils/serverErrorMessage.js'
|
|
|
125
248
|
export default {
|
|
126
249
|
name: 'CnFieldListWidget',
|
|
127
250
|
|
|
128
|
-
components: { CnStatusBadge, NcButton, NcNoteCard, NcSelect, NcTextField },
|
|
251
|
+
components: { CnStatusBadge, NcActionButton, NcActions, NcButton, NcNoteCard, NcSelect, NcTextField },
|
|
129
252
|
|
|
130
253
|
inject: {
|
|
131
254
|
cnTranslate: { default: () => (key) => key },
|
|
@@ -137,11 +260,13 @@ export default {
|
|
|
137
260
|
*
|
|
138
261
|
* - `field` (required) — the object field holding the array.
|
|
139
262
|
* - `key` — the item field that identifies an entry (default: the item itself for strings).
|
|
140
|
-
* - `row` — `{ title, titleFallback?, avatar?, meta?: [paths|{ path, map?, format? }], pill?: { path, map?, variantMap? }, aside?: { path, format?, prefix? }, detail?: { template, when? } }`.
|
|
263
|
+
* - `row` — `{ title, titleFallback?, avatar?, meta?: [paths|{ path, map?, format? }], pill?: { path, map?, variantMap? }, aside?: { path, format?, prefix?, fallback? }, detail?: { template, when? } }`.
|
|
141
264
|
* - `add` — `{ label?, fields: [{ key, label, type?: 'text'|'select', options?, required?, pattern?, patternMessage? }], unique?, defaults? }`.
|
|
142
265
|
* - `remove` — `{ label? }`; omitted = no remove.
|
|
143
|
-
* - `rowActions` — `[{ id, label, when?, request: { method?, url, payload? } }]`; tokens `@object.<field>`, `@objectId`, `@row.<field>`.
|
|
266
|
+
* - `rowActions` — `[{ id, label, when?, placement?: 'band', request: { method?, url, payload? } }]`; tokens `@object.<field>`, `@objectId`, `@row.<field>`.
|
|
144
267
|
* - `rowSource` — `{ url, path?, key }`: live per-row state merged by key.
|
|
268
|
+
* - `variant: 'table'` + `columns` — `[{ header, path, map?, format?, strong?, pill?, variantMap? }]`: rows as a table; a per-row "..." menu holds the row actions and remove; `detail` lines become a warning band under the table, with the row actions that have `placement: 'band'`.
|
|
269
|
+
* - `add.trigger: 'button'`, `add.placement: 'header' | 'footer'` — the add form opens from a button.
|
|
145
270
|
* - `readOnly`, `hint`, `emptyText`.
|
|
146
271
|
*
|
|
147
272
|
* @type {object}
|
|
@@ -185,6 +310,8 @@ export default {
|
|
|
185
310
|
/** Live per-row state from `rowSource`, by key. */
|
|
186
311
|
live: {},
|
|
187
312
|
draft: {},
|
|
313
|
+
/** Whether the add form is open (only with `add.trigger: 'button'`). */
|
|
314
|
+
adding: false,
|
|
188
315
|
errors: {},
|
|
189
316
|
busy: '',
|
|
190
317
|
notice: '',
|
|
@@ -232,6 +359,7 @@ export default {
|
|
|
232
359
|
aside: spec.aside ? this.asideOf(entry, spec.aside) : '',
|
|
233
360
|
detail: spec.detail && this.matches(entry, spec.detail.when) ? this.fill(spec.detail.template, entry) : '',
|
|
234
361
|
actions: this.actionsFor(entry),
|
|
362
|
+
cells: this.isTable ? this.cellsOf(entry) : [],
|
|
235
363
|
}
|
|
236
364
|
})
|
|
237
365
|
},
|
|
@@ -269,6 +397,44 @@ export default {
|
|
|
269
397
|
}))
|
|
270
398
|
},
|
|
271
399
|
|
|
400
|
+
/** Whether the rows are drawn as a table (`variant: 'table'`). */
|
|
401
|
+
isTable() {
|
|
402
|
+
return this.content.variant === 'table' && this.tableColumns.length > 0
|
|
403
|
+
},
|
|
404
|
+
|
|
405
|
+
/**
|
|
406
|
+
* The table columns, headers translated.
|
|
407
|
+
*
|
|
408
|
+
* @return {Array<object>}
|
|
409
|
+
*/
|
|
410
|
+
tableColumns() {
|
|
411
|
+
return (Array.isArray(this.content.columns) ? this.content.columns : [])
|
|
412
|
+
.filter((column) => column && column.path)
|
|
413
|
+
.map((column, index) => ({ ...column, key: `${column.path}-${index}`, header: this.tr(column.header || '') }))
|
|
414
|
+
},
|
|
415
|
+
|
|
416
|
+
/** Whether each row has a "more actions" menu (row actions not placed in the band, and remove). */
|
|
417
|
+
hasMenu() {
|
|
418
|
+
return this.isTable && !this.readOnly && (this.canRemove || this.rows.some((row) => this.menuItems(row).length > 0))
|
|
419
|
+
},
|
|
420
|
+
|
|
421
|
+
/** Rows with a detail line: in the table variant it is a warning band under the table. */
|
|
422
|
+
bandRows() {
|
|
423
|
+
return this.rows
|
|
424
|
+
.filter((row) => row.detail !== '')
|
|
425
|
+
.map((row) => ({ ...row, bandActions: row.actions.filter((action) => action.placement === 'band') }))
|
|
426
|
+
},
|
|
427
|
+
|
|
428
|
+
/** Whether the add form opens from a button (`add.trigger: 'button'`). */
|
|
429
|
+
addTrigger() {
|
|
430
|
+
return Boolean(this.content.add && this.content.add.trigger === 'button')
|
|
431
|
+
},
|
|
432
|
+
|
|
433
|
+
/** Where the add button sits: `header` (above the rows) or `footer` (default). */
|
|
434
|
+
addPlacement() {
|
|
435
|
+
return this.content.add && this.content.add.placement === 'header' ? 'header' : 'footer'
|
|
436
|
+
},
|
|
437
|
+
|
|
272
438
|
addLabel() {
|
|
273
439
|
return this.tr((this.content.add && this.content.add.label) || 'Add')
|
|
274
440
|
},
|
|
@@ -315,6 +481,36 @@ export default {
|
|
|
315
481
|
return typeof this.cnTranslate === 'function' ? this.cnTranslate(text) : text
|
|
316
482
|
},
|
|
317
483
|
|
|
484
|
+
/**
|
|
485
|
+
* The cells of one table row, one per column.
|
|
486
|
+
*
|
|
487
|
+
* @param {object} entry The entry.
|
|
488
|
+
* @return {Array<{text: string, pill: object|null}>}
|
|
489
|
+
*/
|
|
490
|
+
cellsOf(entry) {
|
|
491
|
+
return this.tableColumns.map((column) => ({
|
|
492
|
+
text: this.text(entry, column),
|
|
493
|
+
pill: column.pill ? this.pillOf(entry, column) : null,
|
|
494
|
+
}))
|
|
495
|
+
},
|
|
496
|
+
|
|
497
|
+
/**
|
|
498
|
+
* The items of a row's menu in the table variant: the row actions not
|
|
499
|
+
* placed in the band, then remove.
|
|
500
|
+
*
|
|
501
|
+
* @param {object} row The row.
|
|
502
|
+
* @return {Array<{id: string, label: string, run: Function}>}
|
|
503
|
+
*/
|
|
504
|
+
menuItems(row) {
|
|
505
|
+
const items = row.actions
|
|
506
|
+
.filter((action) => action.placement !== 'band')
|
|
507
|
+
.map((action) => ({ id: action.id, label: action.label, run: () => this.runAction(action, row) }))
|
|
508
|
+
if (this.canRemove) {
|
|
509
|
+
items.push({ id: 'remove', label: this.removeLabel, run: () => this.remove(row) })
|
|
510
|
+
}
|
|
511
|
+
return items
|
|
512
|
+
},
|
|
513
|
+
|
|
318
514
|
/**
|
|
319
515
|
* The identity of an entry.
|
|
320
516
|
*
|
|
@@ -375,7 +571,8 @@ export default {
|
|
|
375
571
|
asideOf(entry, spec) {
|
|
376
572
|
const value = this.text(entry, spec)
|
|
377
573
|
if (value === '') {
|
|
378
|
-
|
|
574
|
+
// No value: the optional `fallback` label, translated, instead of an empty aside.
|
|
575
|
+
return this.tr(spec.fallback)
|
|
379
576
|
}
|
|
380
577
|
return spec.prefix ? `${this.tr(spec.prefix)} ${value}` : value
|
|
381
578
|
},
|
|
@@ -598,6 +795,7 @@ export default {
|
|
|
598
795
|
}, '*')
|
|
599
796
|
if (saved) {
|
|
600
797
|
this.resetDraft()
|
|
798
|
+
this.adding = false
|
|
601
799
|
this.loadLive()
|
|
602
800
|
}
|
|
603
801
|
},
|
|
@@ -743,4 +941,68 @@ export default {
|
|
|
743
941
|
.cn-field-list-widget__add > button {
|
|
744
942
|
flex: 0 0 auto;
|
|
745
943
|
}
|
|
944
|
+
|
|
945
|
+
.cn-field-list-widget__toolbar {
|
|
946
|
+
display: flex;
|
|
947
|
+
justify-content: flex-end;
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
.cn-field-list-widget__table-wrap {
|
|
951
|
+
display: flex;
|
|
952
|
+
flex-direction: column;
|
|
953
|
+
gap: 12px;
|
|
954
|
+
overflow-x: auto;
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
.cn-field-list-widget__table {
|
|
958
|
+
width: 100%;
|
|
959
|
+
border-collapse: collapse;
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
.cn-field-list-widget__th {
|
|
963
|
+
padding: 8px 12px;
|
|
964
|
+
text-align: start;
|
|
965
|
+
font-size: 13px;
|
|
966
|
+
font-weight: 600;
|
|
967
|
+
white-space: nowrap;
|
|
968
|
+
color: var(--color-text-maxcontrast);
|
|
969
|
+
background: var(--color-background-hover);
|
|
970
|
+
}
|
|
971
|
+
|
|
972
|
+
.cn-field-list-widget__th--menu,
|
|
973
|
+
.cn-field-list-widget__td--menu {
|
|
974
|
+
width: 1%;
|
|
975
|
+
text-align: end;
|
|
976
|
+
}
|
|
977
|
+
|
|
978
|
+
.cn-field-list-widget__tr {
|
|
979
|
+
border-top: 1px solid var(--cn-board-hairline, var(--color-border));
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
.cn-field-list-widget__td {
|
|
983
|
+
padding: 10px 12px;
|
|
984
|
+
vertical-align: middle;
|
|
985
|
+
overflow-wrap: anywhere;
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
.cn-field-list-widget__sr {
|
|
989
|
+
position: absolute;
|
|
990
|
+
width: 1px;
|
|
991
|
+
height: 1px;
|
|
992
|
+
overflow: hidden;
|
|
993
|
+
clip-path: inset(50%);
|
|
994
|
+
}
|
|
995
|
+
|
|
996
|
+
.cn-field-list-widget__band {
|
|
997
|
+
display: flex;
|
|
998
|
+
flex-wrap: wrap;
|
|
999
|
+
align-items: center;
|
|
1000
|
+
justify-content: space-between;
|
|
1001
|
+
gap: 8px 12px;
|
|
1002
|
+
padding: 12px 14px;
|
|
1003
|
+
border: 1px solid var(--color-warning);
|
|
1004
|
+
border-radius: 10px;
|
|
1005
|
+
background: color-mix(in srgb, var(--color-warning) 14%, var(--color-main-background));
|
|
1006
|
+
font-size: 14px;
|
|
1007
|
+
}
|
|
746
1008
|
</style>
|