@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,10 @@
|
|
|
1
|
+
import script from './CnChipsFieldWidget.vue2.js';
|
|
2
|
+
import { render } from './CnChipsFieldWidget.vue3.js';
|
|
3
|
+
|
|
4
|
+
script.render = render;
|
|
5
|
+
script.__scopeId = "data-v-43e5bfcf";
|
|
6
|
+
script.__file = "src/components/CnChipsFieldWidget/CnChipsFieldWidget.vue";
|
|
7
|
+
const __sfc_main = script;
|
|
8
|
+
|
|
9
|
+
export { __sfc_main as default };
|
|
10
|
+
//# sourceMappingURL=CnChipsFieldWidget.vue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CnChipsFieldWidget.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { NcButton } from '@nextcloud/vue';
|
|
2
|
+
import { objectUrlOf, patchObject } from '../../utils/objectWrite.js';
|
|
3
|
+
import { readPath } from '../../utils/readPath.js';
|
|
4
|
+
import { serverErrorMessage } from '../../utils/serverErrorMessage.js';
|
|
5
|
+
|
|
6
|
+
let uid = 0;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* CnChipsFieldWidget — the `chips-field` widget: a list of short strings in one
|
|
10
|
+
* array field of the CURRENT object, drawn as chips with a remove button and an
|
|
11
|
+
* add chip that opens a small input (or a choice of the remaining `options`).
|
|
12
|
+
* Every add and remove is ONE PATCH of that field with the full new list; each
|
|
13
|
+
* new entry is checked against `pattern` first, trimmed, optionally lowercased,
|
|
14
|
+
* and refused when it is already there.
|
|
15
|
+
*
|
|
16
|
+
* @spec openspec/changes/abstract-chips-field/specs/chips-field/spec.md
|
|
17
|
+
*/
|
|
18
|
+
var script = {
|
|
19
|
+
name: 'CnChipsFieldWidget',
|
|
20
|
+
|
|
21
|
+
components: { NcButton },
|
|
22
|
+
|
|
23
|
+
inject: {
|
|
24
|
+
cnTranslate: { default: () => (key) => key },
|
|
25
|
+
},
|
|
26
|
+
|
|
27
|
+
props: {
|
|
28
|
+
/**
|
|
29
|
+
* The widget configuration.
|
|
30
|
+
*
|
|
31
|
+
* - `field` (required) — the top-level array field of strings.
|
|
32
|
+
* - `label`, `hint`, `placeholder`.
|
|
33
|
+
* - `addLabel` — the add chip's text (default "Add").
|
|
34
|
+
* - `removeLabel`, `confirmLabel`.
|
|
35
|
+
* - `pattern`, `patternMessage` — checked on every new entry.
|
|
36
|
+
* - `lowercase` — store entries in lower case.
|
|
37
|
+
* - `options` — `[{ value, label }]`: add by choosing one of the remaining options instead of typing.
|
|
38
|
+
* - `readOnly`.
|
|
39
|
+
*
|
|
40
|
+
* @type {object}
|
|
41
|
+
*/
|
|
42
|
+
content: {
|
|
43
|
+
type: Object,
|
|
44
|
+
default: () => ({}),
|
|
45
|
+
},
|
|
46
|
+
|
|
47
|
+
/** The current detail-page object. */
|
|
48
|
+
objectData: {
|
|
49
|
+
type: Object,
|
|
50
|
+
default: null,
|
|
51
|
+
},
|
|
52
|
+
|
|
53
|
+
/** The current object id. */
|
|
54
|
+
objectId: {
|
|
55
|
+
type: [String, Number],
|
|
56
|
+
default: '',
|
|
57
|
+
},
|
|
58
|
+
|
|
59
|
+
/** OpenRegister register slug of the surface. */
|
|
60
|
+
register: {
|
|
61
|
+
type: [String, Object],
|
|
62
|
+
default: '',
|
|
63
|
+
},
|
|
64
|
+
|
|
65
|
+
/** OpenRegister schema slug of the surface. */
|
|
66
|
+
schema: {
|
|
67
|
+
type: [String, Object],
|
|
68
|
+
default: '',
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
|
|
72
|
+
emits: ['saved'],
|
|
73
|
+
|
|
74
|
+
data() {
|
|
75
|
+
uid += 1;
|
|
76
|
+
return {
|
|
77
|
+
labelId: `cn-chips-field-${uid}`,
|
|
78
|
+
saved: null,
|
|
79
|
+
adding: false,
|
|
80
|
+
draft: '',
|
|
81
|
+
error: '',
|
|
82
|
+
busy: false,
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
|
|
86
|
+
computed: {
|
|
87
|
+
/** The stored list. */
|
|
88
|
+
items() {
|
|
89
|
+
const list = this.saved !== null ? this.saved : readPath(this.objectData || {}, this.content.field);
|
|
90
|
+
return Array.isArray(list) ? list.map((item) => String(item)) : []
|
|
91
|
+
},
|
|
92
|
+
|
|
93
|
+
choices() {
|
|
94
|
+
const list = Array.isArray(this.content.options) ? this.content.options : [];
|
|
95
|
+
return list.map((option) => (typeof option === 'object' && option !== null
|
|
96
|
+
? { value: String(option.value), label: this.tr(String(option.label ?? option.value)) }
|
|
97
|
+
: { value: String(option), label: this.tr(String(option)) }))
|
|
98
|
+
},
|
|
99
|
+
|
|
100
|
+
available() {
|
|
101
|
+
return this.choices.filter((choice) => !this.items.includes(choice.value))
|
|
102
|
+
},
|
|
103
|
+
|
|
104
|
+
label() {
|
|
105
|
+
return this.tr(this.content.label || '')
|
|
106
|
+
},
|
|
107
|
+
|
|
108
|
+
hint() {
|
|
109
|
+
return this.tr(this.content.hint || '')
|
|
110
|
+
},
|
|
111
|
+
|
|
112
|
+
placeholder() {
|
|
113
|
+
return this.tr(this.content.placeholder || '')
|
|
114
|
+
},
|
|
115
|
+
|
|
116
|
+
addLabel() {
|
|
117
|
+
return this.tr(this.content.addLabel || 'Add')
|
|
118
|
+
},
|
|
119
|
+
|
|
120
|
+
removeLabel() {
|
|
121
|
+
return this.tr(this.content.removeLabel || 'Remove')
|
|
122
|
+
},
|
|
123
|
+
|
|
124
|
+
confirmLabel() {
|
|
125
|
+
return this.tr(this.content.confirmLabel || 'Add')
|
|
126
|
+
},
|
|
127
|
+
|
|
128
|
+
readOnly() {
|
|
129
|
+
return this.content.readOnly === true || !this.content.field
|
|
130
|
+
},
|
|
131
|
+
|
|
132
|
+
objectUrl() {
|
|
133
|
+
return objectUrlOf(this.register, this.schema, this.objectId || (this.objectData && this.objectData.id))
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
|
|
137
|
+
watch: {
|
|
138
|
+
objectData() {
|
|
139
|
+
this.saved = null;
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
|
|
143
|
+
methods: {
|
|
144
|
+
tr(text) {
|
|
145
|
+
if (typeof text !== 'string' || text === '') {
|
|
146
|
+
return ''
|
|
147
|
+
}
|
|
148
|
+
return typeof this.cnTranslate === 'function' ? this.cnTranslate(text) : text
|
|
149
|
+
},
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* The text on a chip: an option's label, else the value.
|
|
153
|
+
*
|
|
154
|
+
* @param {string} item The stored value.
|
|
155
|
+
* @return {string}
|
|
156
|
+
*/
|
|
157
|
+
itemLabel(item) {
|
|
158
|
+
const choice = this.choices.find((candidate) => candidate.value === item);
|
|
159
|
+
return choice ? choice.label : item
|
|
160
|
+
},
|
|
161
|
+
|
|
162
|
+
open() {
|
|
163
|
+
this.adding = true;
|
|
164
|
+
this.error = '';
|
|
165
|
+
this.draft = this.choices.length > 0 && this.available.length > 0 ? this.available[0].value : '';
|
|
166
|
+
this.$nextTick(() => {
|
|
167
|
+
const el = this.$refs.input;
|
|
168
|
+
if (el && typeof el.focus === 'function') {
|
|
169
|
+
el.focus();
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
},
|
|
173
|
+
|
|
174
|
+
cancel() {
|
|
175
|
+
this.adding = false;
|
|
176
|
+
this.draft = '';
|
|
177
|
+
this.error = '';
|
|
178
|
+
},
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Write the new list: ONE PATCH of the field.
|
|
182
|
+
*
|
|
183
|
+
* @param {string[]} next The new list.
|
|
184
|
+
* @return {Promise<boolean>} Whether it saved.
|
|
185
|
+
*/
|
|
186
|
+
async write(next) {
|
|
187
|
+
if (!this.objectUrl) {
|
|
188
|
+
this.error = this.tr('This list cannot be saved here.');
|
|
189
|
+
return false
|
|
190
|
+
}
|
|
191
|
+
this.busy = true;
|
|
192
|
+
this.error = '';
|
|
193
|
+
try {
|
|
194
|
+
const data = await patchObject(this.objectUrl, { [this.content.field]: next });
|
|
195
|
+
const written = readPath(data, this.content.field);
|
|
196
|
+
this.saved = Array.isArray(written) ? written.map((item) => String(item)) : next;
|
|
197
|
+
/**
|
|
198
|
+
* @event saved The list was written.
|
|
199
|
+
* @type {{field: string, value: string[]}}
|
|
200
|
+
*/
|
|
201
|
+
this.$emit('saved', { field: this.content.field, value: this.saved });
|
|
202
|
+
return true
|
|
203
|
+
} catch (e) {
|
|
204
|
+
this.error = serverErrorMessage(e);
|
|
205
|
+
return false
|
|
206
|
+
} finally {
|
|
207
|
+
this.busy = false;
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Check the draft and add it.
|
|
213
|
+
*
|
|
214
|
+
* @return {Promise<void>}
|
|
215
|
+
* @spec openspec/changes/abstract-chips-field/specs/chips-field/spec.md#requirement-an-entry-is-checked-before-it-is-added
|
|
216
|
+
*/
|
|
217
|
+
async add() {
|
|
218
|
+
let value = String(this.draft ?? '').trim();
|
|
219
|
+
if (this.content.lowercase === true) {
|
|
220
|
+
value = value.toLowerCase();
|
|
221
|
+
}
|
|
222
|
+
if (value === '') {
|
|
223
|
+
this.error = this.tr('Fill this in.');
|
|
224
|
+
return
|
|
225
|
+
}
|
|
226
|
+
if (this.choices.length === 0 && this.content.pattern && !new RegExp(this.content.pattern).test(value)) {
|
|
227
|
+
this.error = this.tr(this.content.patternMessage || 'This value is not valid.');
|
|
228
|
+
return
|
|
229
|
+
}
|
|
230
|
+
if (this.items.includes(value)) {
|
|
231
|
+
this.error = this.tr('This is already in the list.');
|
|
232
|
+
return
|
|
233
|
+
}
|
|
234
|
+
if (await this.write([...this.items, value])) {
|
|
235
|
+
this.cancel();
|
|
236
|
+
}
|
|
237
|
+
},
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Remove one entry.
|
|
241
|
+
*
|
|
242
|
+
* @param {string} item The entry.
|
|
243
|
+
* @return {Promise<void>}
|
|
244
|
+
*/
|
|
245
|
+
async remove(item) {
|
|
246
|
+
await this.write(this.items.filter((candidate) => candidate !== item));
|
|
247
|
+
},
|
|
248
|
+
},
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
export { script as default };
|
|
252
|
+
//# sourceMappingURL=CnChipsFieldWidget.vue2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CnChipsFieldWidget.vue2.js","sources":["../../../../src/components/CnChipsFieldWidget/CnChipsFieldWidget.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n\n<template>\n\t<div class=\"cn-chips-field\" data-testid=\"cn-chips-field\">\n\t\t<p v-if=\"label\" :id=\"labelId\" class=\"cn-chips-field__label\">\n\t\t\t{{ label }}\n\t\t</p>\n\t\t<ul class=\"cn-chips-field__chips\" :aria-labelledby=\"label ? labelId : null\">\n\t\t\t<li\n\t\t\t\tv-for=\"item in items\"\n\t\t\t\t:key=\"item\"\n\t\t\t\tclass=\"cn-chips-field__chip\"\n\t\t\t\t:data-testid=\"`cn-chips-field-chip-${item}`\">\n\t\t\t\t<span class=\"cn-chips-field__text\">{{ itemLabel(item) }}</span>\n\t\t\t\t<button\n\t\t\t\t\tv-if=\"!readOnly\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"cn-chips-field__remove\"\n\t\t\t\t\t:disabled=\"busy\"\n\t\t\t\t\t:aria-label=\"`${removeLabel}: ${itemLabel(item)}`\"\n\t\t\t\t\t:data-testid=\"`cn-chips-field-remove-${item}`\"\n\t\t\t\t\t@click=\"remove(item)\">\n\t\t\t\t\t<span aria-hidden=\"true\">×</span>\n\t\t\t\t</button>\n\t\t\t</li>\n\t\t\t<li v-if=\"!readOnly\" class=\"cn-chips-field__add-item\">\n\t\t\t\t<form v-if=\"adding\" class=\"cn-chips-field__form\" @submit.prevent=\"add\">\n\t\t\t\t\t<select\n\t\t\t\t\t\tv-if=\"choices.length > 0\"\n\t\t\t\t\t\tref=\"input\"\n\t\t\t\t\t\tv-model=\"draft\"\n\t\t\t\t\t\tclass=\"cn-chips-field__input\"\n\t\t\t\t\t\t:aria-label=\"addLabel\"\n\t\t\t\t\t\tdata-testid=\"cn-chips-field-input\">\n\t\t\t\t\t\t<option v-for=\"choice in available\" :key=\"choice.value\" :value=\"choice.value\">\n\t\t\t\t\t\t\t{{ choice.label }}\n\t\t\t\t\t\t</option>\n\t\t\t\t\t</select>\n\t\t\t\t\t<input\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\tref=\"input\"\n\t\t\t\t\t\tv-model=\"draft\"\n\t\t\t\t\t\tclass=\"cn-chips-field__input\"\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t:placeholder=\"placeholder\"\n\t\t\t\t\t\t:aria-label=\"addLabel\"\n\t\t\t\t\t\t:aria-invalid=\"error ? 'true' : null\"\n\t\t\t\t\t\tdata-testid=\"cn-chips-field-input\"\n\t\t\t\t\t\t@keydown.esc=\"cancel\">\n\t\t\t\t\t<NcButton type=\"submit\"\n\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t:disabled=\"busy\"\n\t\t\t\t\t\tdata-testid=\"cn-chips-field-submit\">\n\t\t\t\t\t\t{{ confirmLabel }}\n\t\t\t\t\t</NcButton>\n\t\t\t\t</form>\n\t\t\t\t<button\n\t\t\t\t\tv-else\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"cn-chips-field__add\"\n\t\t\t\t\t:disabled=\"busy || (choices.length > 0 && available.length === 0)\"\n\t\t\t\t\tdata-testid=\"cn-chips-field-add\"\n\t\t\t\t\t@click=\"open\">\n\t\t\t\t\t+ {{ addLabel }}\n\t\t\t\t</button>\n\t\t\t</li>\n\t\t</ul>\n\t\t<p v-if=\"error\"\n\t\t\tclass=\"cn-chips-field__error\"\n\t\t\trole=\"alert\"\n\t\t\tdata-testid=\"cn-chips-field-error\">\n\t\t\t{{ error }}\n\t\t</p>\n\t\t<p v-else-if=\"hint\" class=\"cn-chips-field__hint\">\n\t\t\t{{ hint }}\n\t\t</p>\n\t</div>\n</template>\n\n<script>\nimport { NcButton } from '@nextcloud/vue'\nimport { objectUrlOf, patchObject } from '../../utils/objectWrite.js'\nimport { readPath } from '../../utils/readPath.js'\nimport { serverErrorMessage } from '../../utils/serverErrorMessage.js'\n\nlet uid = 0\n\n/**\n * CnChipsFieldWidget — the `chips-field` widget: a list of short strings in one\n * array field of the CURRENT object, drawn as chips with a remove button and an\n * add chip that opens a small input (or a choice of the remaining `options`).\n * Every add and remove is ONE PATCH of that field with the full new list; each\n * new entry is checked against `pattern` first, trimmed, optionally lowercased,\n * and refused when it is already there.\n *\n * @spec openspec/changes/abstract-chips-field/specs/chips-field/spec.md\n */\nexport default {\n\tname: 'CnChipsFieldWidget',\n\n\tcomponents: { NcButton },\n\n\tinject: {\n\t\tcnTranslate: { default: () => (key) => key },\n\t},\n\n\tprops: {\n\t\t/**\n\t\t * The widget configuration.\n\t\t *\n\t\t * - `field` (required) — the top-level array field of strings.\n\t\t * - `label`, `hint`, `placeholder`.\n\t\t * - `addLabel` — the add chip's text (default \"Add\").\n\t\t * - `removeLabel`, `confirmLabel`.\n\t\t * - `pattern`, `patternMessage` — checked on every new entry.\n\t\t * - `lowercase` — store entries in lower case.\n\t\t * - `options` — `[{ value, label }]`: add by choosing one of the remaining options instead of typing.\n\t\t * - `readOnly`.\n\t\t *\n\t\t * @type {object}\n\t\t */\n\t\tcontent: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/** The current detail-page object. */\n\t\tobjectData: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** The current object id. */\n\t\tobjectId: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** OpenRegister register slug of the surface. */\n\t\tregister: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** OpenRegister schema slug of the surface. */\n\t\tschema: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: '',\n\t\t},\n\t},\n\n\temits: ['saved'],\n\n\tdata() {\n\t\tuid += 1\n\t\treturn {\n\t\t\tlabelId: `cn-chips-field-${uid}`,\n\t\t\tsaved: null,\n\t\t\tadding: false,\n\t\t\tdraft: '',\n\t\t\terror: '',\n\t\t\tbusy: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** The stored list. */\n\t\titems() {\n\t\t\tconst list = this.saved !== null ? this.saved : readPath(this.objectData || {}, this.content.field)\n\t\t\treturn Array.isArray(list) ? list.map((item) => String(item)) : []\n\t\t},\n\n\t\tchoices() {\n\t\t\tconst list = Array.isArray(this.content.options) ? this.content.options : []\n\t\t\treturn list.map((option) => (typeof option === 'object' && option !== null\n\t\t\t\t? { value: String(option.value), label: this.tr(String(option.label ?? option.value)) }\n\t\t\t\t: { value: String(option), label: this.tr(String(option)) }))\n\t\t},\n\n\t\tavailable() {\n\t\t\treturn this.choices.filter((choice) => !this.items.includes(choice.value))\n\t\t},\n\n\t\tlabel() {\n\t\t\treturn this.tr(this.content.label || '')\n\t\t},\n\n\t\thint() {\n\t\t\treturn this.tr(this.content.hint || '')\n\t\t},\n\n\t\tplaceholder() {\n\t\t\treturn this.tr(this.content.placeholder || '')\n\t\t},\n\n\t\taddLabel() {\n\t\t\treturn this.tr(this.content.addLabel || 'Add')\n\t\t},\n\n\t\tremoveLabel() {\n\t\t\treturn this.tr(this.content.removeLabel || 'Remove')\n\t\t},\n\n\t\tconfirmLabel() {\n\t\t\treturn this.tr(this.content.confirmLabel || 'Add')\n\t\t},\n\n\t\treadOnly() {\n\t\t\treturn this.content.readOnly === true || !this.content.field\n\t\t},\n\n\t\tobjectUrl() {\n\t\t\treturn objectUrlOf(this.register, this.schema, this.objectId || (this.objectData && this.objectData.id))\n\t\t},\n\t},\n\n\twatch: {\n\t\tobjectData() {\n\t\t\tthis.saved = null\n\t\t},\n\t},\n\n\tmethods: {\n\t\ttr(text) {\n\t\t\tif (typeof text !== 'string' || text === '') {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn typeof this.cnTranslate === 'function' ? this.cnTranslate(text) : text\n\t\t},\n\n\t\t/**\n\t\t * The text on a chip: an option's label, else the value.\n\t\t *\n\t\t * @param {string} item The stored value.\n\t\t * @return {string}\n\t\t */\n\t\titemLabel(item) {\n\t\t\tconst choice = this.choices.find((candidate) => candidate.value === item)\n\t\t\treturn choice ? choice.label : item\n\t\t},\n\n\t\topen() {\n\t\t\tthis.adding = true\n\t\t\tthis.error = ''\n\t\t\tthis.draft = this.choices.length > 0 && this.available.length > 0 ? this.available[0].value : ''\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tconst el = this.$refs.input\n\t\t\t\tif (el && typeof el.focus === 'function') {\n\t\t\t\t\tel.focus()\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\n\t\tcancel() {\n\t\t\tthis.adding = false\n\t\t\tthis.draft = ''\n\t\t\tthis.error = ''\n\t\t},\n\n\t\t/**\n\t\t * Write the new list: ONE PATCH of the field.\n\t\t *\n\t\t * @param {string[]} next The new list.\n\t\t * @return {Promise<boolean>} Whether it saved.\n\t\t */\n\t\tasync write(next) {\n\t\t\tif (!this.objectUrl) {\n\t\t\t\tthis.error = this.tr('This list cannot be saved here.')\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tthis.busy = true\n\t\t\tthis.error = ''\n\t\t\ttry {\n\t\t\t\tconst data = await patchObject(this.objectUrl, { [this.content.field]: next })\n\t\t\t\tconst written = readPath(data, this.content.field)\n\t\t\t\tthis.saved = Array.isArray(written) ? written.map((item) => String(item)) : next\n\t\t\t\t/**\n\t\t\t\t * @event saved The list was written.\n\t\t\t\t * @type {{field: string, value: string[]}}\n\t\t\t\t */\n\t\t\t\tthis.$emit('saved', { field: this.content.field, value: this.saved })\n\t\t\t\treturn true\n\t\t\t} catch (e) {\n\t\t\t\tthis.error = serverErrorMessage(e)\n\t\t\t\treturn false\n\t\t\t} finally {\n\t\t\t\tthis.busy = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Check the draft and add it.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t * @spec openspec/changes/abstract-chips-field/specs/chips-field/spec.md#requirement-an-entry-is-checked-before-it-is-added\n\t\t */\n\t\tasync add() {\n\t\t\tlet value = String(this.draft ?? '').trim()\n\t\t\tif (this.content.lowercase === true) {\n\t\t\t\tvalue = value.toLowerCase()\n\t\t\t}\n\t\t\tif (value === '') {\n\t\t\t\tthis.error = this.tr('Fill this in.')\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (this.choices.length === 0 && this.content.pattern && !new RegExp(this.content.pattern).test(value)) {\n\t\t\t\tthis.error = this.tr(this.content.patternMessage || 'This value is not valid.')\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (this.items.includes(value)) {\n\t\t\t\tthis.error = this.tr('This is already in the list.')\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (await this.write([...this.items, value])) {\n\t\t\t\tthis.cancel()\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Remove one entry.\n\t\t *\n\t\t * @param {string} item The entry.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync remove(item) {\n\t\t\tawait this.write(this.items.filter((candidate) => candidate !== item))\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-chips-field {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n\tmin-width: 0;\n}\n\n.cn-chips-field__label {\n\tmargin: 0;\n\tfont-size: 13px;\n\tfont-weight: 600;\n}\n\n.cn-chips-field__chips {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 8px;\n}\n\n.cn-chips-field__chip {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tpadding: 4px 6px 4px 12px;\n\tborder-radius: 999px;\n\tbackground: var(--color-primary-element-light);\n\tcolor: var(--color-primary-element-light-text, var(--color-main-text));\n\tfont-weight: 600;\n\toverflow-wrap: anywhere;\n}\n\n.cn-chips-field__remove {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 20px;\n\theight: 20px;\n\tpadding: 0;\n\tborder: 0;\n\tborder-radius: 50%;\n\tbackground: transparent;\n\tcolor: inherit;\n\tfont-size: 16px;\n\tline-height: 1;\n\tcursor: pointer;\n}\n\n.cn-chips-field__remove:hover:not(:disabled),\n.cn-chips-field__remove:focus-visible {\n\tbackground: var(--color-primary-element-light-hover, var(--color-background-hover));\n}\n\n.cn-chips-field__add {\n\tpadding: 4px 12px;\n\tborder: 1px dashed var(--color-border-maxcontrast);\n\tborder-radius: 999px;\n\tbackground: transparent;\n\tcolor: var(--color-main-text);\n\tfont-weight: 600;\n\tcursor: pointer;\n}\n\n.cn-chips-field__add:hover:not(:disabled) {\n\tbackground: var(--color-background-hover);\n}\n\n.cn-chips-field__form {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n}\n\n.cn-chips-field__input {\n\theight: var(--cn-board-control-height, 40px);\n\tbox-sizing: border-box;\n\tpadding: 0 12px;\n\tborder: 1px solid var(--color-border-maxcontrast);\n\tborder-radius: var(--cn-board-control-radius, 8px);\n\tbackground: var(--color-main-background);\n\tcolor: var(--color-main-text);\n\tfont: inherit;\n}\n\n.cn-chips-field__hint,\n.cn-chips-field__error {\n\tmargin: 0;\n\tfont-size: 12px;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-chips-field__error {\n\tcolor: var(--color-error-text);\n}\n</style>\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { resolveComponent, openBlock, createElementBlock, toDisplayString, createCommentVNode, createElementVNode, Fragment, renderList, withModifiers, withDirectives, vModelSelect, withKeys, vModelText, createVNode, withCtx, createTextVNode } from 'vue';
|
|
2
|
+
|
|
3
|
+
const _hoisted_1 = {
|
|
4
|
+
class: "cn-chips-field",
|
|
5
|
+
"data-testid": "cn-chips-field"
|
|
6
|
+
};
|
|
7
|
+
const _hoisted_2 = ["id"];
|
|
8
|
+
const _hoisted_3 = ["aria-labelledby"];
|
|
9
|
+
const _hoisted_4 = ["data-testid"];
|
|
10
|
+
const _hoisted_5 = { class: "cn-chips-field__text" };
|
|
11
|
+
const _hoisted_6 = ["disabled", "aria-label", "data-testid", "onClick"];
|
|
12
|
+
const _hoisted_7 = {
|
|
13
|
+
key: 0,
|
|
14
|
+
class: "cn-chips-field__add-item"
|
|
15
|
+
};
|
|
16
|
+
const _hoisted_8 = ["aria-label"];
|
|
17
|
+
const _hoisted_9 = ["value"];
|
|
18
|
+
const _hoisted_10 = ["placeholder", "aria-label", "aria-invalid"];
|
|
19
|
+
const _hoisted_11 = ["disabled"];
|
|
20
|
+
const _hoisted_12 = {
|
|
21
|
+
key: 1,
|
|
22
|
+
class: "cn-chips-field__error",
|
|
23
|
+
role: "alert",
|
|
24
|
+
"data-testid": "cn-chips-field-error"
|
|
25
|
+
};
|
|
26
|
+
const _hoisted_13 = {
|
|
27
|
+
key: 2,
|
|
28
|
+
class: "cn-chips-field__hint"
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
32
|
+
const _component_NcButton = resolveComponent("NcButton");
|
|
33
|
+
|
|
34
|
+
return (openBlock(), createElementBlock("div", _hoisted_1, [
|
|
35
|
+
($options.label)
|
|
36
|
+
? (openBlock(), createElementBlock("p", {
|
|
37
|
+
key: 0,
|
|
38
|
+
id: $data.labelId,
|
|
39
|
+
class: "cn-chips-field__label"
|
|
40
|
+
}, toDisplayString($options.label), 9 /* TEXT, PROPS */, _hoisted_2))
|
|
41
|
+
: createCommentVNode("v-if", true),
|
|
42
|
+
createElementVNode("ul", {
|
|
43
|
+
class: "cn-chips-field__chips",
|
|
44
|
+
"aria-labelledby": $options.label ? $data.labelId : null
|
|
45
|
+
}, [
|
|
46
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList($options.items, (item) => {
|
|
47
|
+
return (openBlock(), createElementBlock("li", {
|
|
48
|
+
key: item,
|
|
49
|
+
class: "cn-chips-field__chip",
|
|
50
|
+
"data-testid": `cn-chips-field-chip-${item}`
|
|
51
|
+
}, [
|
|
52
|
+
createElementVNode("span", _hoisted_5, toDisplayString($options.itemLabel(item)), 1 /* TEXT */),
|
|
53
|
+
(!$options.readOnly)
|
|
54
|
+
? (openBlock(), createElementBlock("button", {
|
|
55
|
+
key: 0,
|
|
56
|
+
type: "button",
|
|
57
|
+
class: "cn-chips-field__remove",
|
|
58
|
+
disabled: $data.busy,
|
|
59
|
+
"aria-label": `${$options.removeLabel}: ${$options.itemLabel(item)}`,
|
|
60
|
+
"data-testid": `cn-chips-field-remove-${item}`,
|
|
61
|
+
onClick: $event => ($options.remove(item))
|
|
62
|
+
}, [...(_cache[5] || (_cache[5] = [
|
|
63
|
+
createElementVNode("span", { "aria-hidden": "true" }, "×", -1 /* CACHED */)
|
|
64
|
+
]))], 8 /* PROPS */, _hoisted_6))
|
|
65
|
+
: createCommentVNode("v-if", true)
|
|
66
|
+
], 8 /* PROPS */, _hoisted_4))
|
|
67
|
+
}), 128 /* KEYED_FRAGMENT */)),
|
|
68
|
+
(!$options.readOnly)
|
|
69
|
+
? (openBlock(), createElementBlock("li", _hoisted_7, [
|
|
70
|
+
($data.adding)
|
|
71
|
+
? (openBlock(), createElementBlock("form", {
|
|
72
|
+
key: 0,
|
|
73
|
+
class: "cn-chips-field__form",
|
|
74
|
+
onSubmit: _cache[3] || (_cache[3] = withModifiers((...args) => ($options.add && $options.add(...args)), ["prevent"]))
|
|
75
|
+
}, [
|
|
76
|
+
($options.choices.length > 0)
|
|
77
|
+
? withDirectives((openBlock(), createElementBlock("select", {
|
|
78
|
+
key: 0,
|
|
79
|
+
ref: "input",
|
|
80
|
+
"onUpdate:modelValue": _cache[0] || (_cache[0] = $event => (($data.draft) = $event)),
|
|
81
|
+
class: "cn-chips-field__input",
|
|
82
|
+
"aria-label": $options.addLabel,
|
|
83
|
+
"data-testid": "cn-chips-field-input"
|
|
84
|
+
}, [
|
|
85
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList($options.available, (choice) => {
|
|
86
|
+
return (openBlock(), createElementBlock("option", {
|
|
87
|
+
key: choice.value,
|
|
88
|
+
value: choice.value
|
|
89
|
+
}, toDisplayString(choice.label), 9 /* TEXT, PROPS */, _hoisted_9))
|
|
90
|
+
}), 128 /* KEYED_FRAGMENT */))
|
|
91
|
+
], 8 /* PROPS */, _hoisted_8)), [
|
|
92
|
+
[vModelSelect, $data.draft]
|
|
93
|
+
])
|
|
94
|
+
: withDirectives((openBlock(), createElementBlock("input", {
|
|
95
|
+
key: 1,
|
|
96
|
+
ref: "input",
|
|
97
|
+
"onUpdate:modelValue": _cache[1] || (_cache[1] = $event => (($data.draft) = $event)),
|
|
98
|
+
class: "cn-chips-field__input",
|
|
99
|
+
type: "text",
|
|
100
|
+
placeholder: $options.placeholder,
|
|
101
|
+
"aria-label": $options.addLabel,
|
|
102
|
+
"aria-invalid": $data.error ? 'true' : null,
|
|
103
|
+
"data-testid": "cn-chips-field-input",
|
|
104
|
+
onKeydown: _cache[2] || (_cache[2] = withKeys((...args) => ($options.cancel && $options.cancel(...args)), ["esc"]))
|
|
105
|
+
}, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_10)), [
|
|
106
|
+
[vModelText, $data.draft]
|
|
107
|
+
]),
|
|
108
|
+
createVNode(_component_NcButton, {
|
|
109
|
+
type: "submit",
|
|
110
|
+
variant: "secondary",
|
|
111
|
+
disabled: $data.busy,
|
|
112
|
+
"data-testid": "cn-chips-field-submit"
|
|
113
|
+
}, {
|
|
114
|
+
default: withCtx(() => [
|
|
115
|
+
createTextVNode(toDisplayString($options.confirmLabel), 1 /* TEXT */)
|
|
116
|
+
]),
|
|
117
|
+
_: 1 /* STABLE */
|
|
118
|
+
}, 8 /* PROPS */, ["disabled"])
|
|
119
|
+
], 32 /* NEED_HYDRATION */))
|
|
120
|
+
: (openBlock(), createElementBlock("button", {
|
|
121
|
+
key: 1,
|
|
122
|
+
type: "button",
|
|
123
|
+
class: "cn-chips-field__add",
|
|
124
|
+
disabled: $data.busy || ($options.choices.length > 0 && $options.available.length === 0),
|
|
125
|
+
"data-testid": "cn-chips-field-add",
|
|
126
|
+
onClick: _cache[4] || (_cache[4] = (...args) => ($options.open && $options.open(...args)))
|
|
127
|
+
}, " + " + toDisplayString($options.addLabel), 9 /* TEXT, PROPS */, _hoisted_11))
|
|
128
|
+
]))
|
|
129
|
+
: createCommentVNode("v-if", true)
|
|
130
|
+
], 8 /* PROPS */, _hoisted_3),
|
|
131
|
+
($data.error)
|
|
132
|
+
? (openBlock(), createElementBlock("p", _hoisted_12, toDisplayString($data.error), 1 /* TEXT */))
|
|
133
|
+
: ($options.hint)
|
|
134
|
+
? (openBlock(), createElementBlock("p", _hoisted_13, toDisplayString($options.hint), 1 /* TEXT */))
|
|
135
|
+
: createCommentVNode("v-if", true)
|
|
136
|
+
]))
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export { render };
|
|
140
|
+
//# sourceMappingURL=CnChipsFieldWidget.vue3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CnChipsFieldWidget.vue3.js","sources":["../../../../src/components/CnChipsFieldWidget/CnChipsFieldWidget.vue?vue&type=template&id=43e5bfcf&lang.js"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n\n<template>\n\t<div class=\"cn-chips-field\" data-testid=\"cn-chips-field\">\n\t\t<p v-if=\"label\" :id=\"labelId\" class=\"cn-chips-field__label\">\n\t\t\t{{ label }}\n\t\t</p>\n\t\t<ul class=\"cn-chips-field__chips\" :aria-labelledby=\"label ? labelId : null\">\n\t\t\t<li\n\t\t\t\tv-for=\"item in items\"\n\t\t\t\t:key=\"item\"\n\t\t\t\tclass=\"cn-chips-field__chip\"\n\t\t\t\t:data-testid=\"`cn-chips-field-chip-${item}`\">\n\t\t\t\t<span class=\"cn-chips-field__text\">{{ itemLabel(item) }}</span>\n\t\t\t\t<button\n\t\t\t\t\tv-if=\"!readOnly\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"cn-chips-field__remove\"\n\t\t\t\t\t:disabled=\"busy\"\n\t\t\t\t\t:aria-label=\"`${removeLabel}: ${itemLabel(item)}`\"\n\t\t\t\t\t:data-testid=\"`cn-chips-field-remove-${item}`\"\n\t\t\t\t\t@click=\"remove(item)\">\n\t\t\t\t\t<span aria-hidden=\"true\">×</span>\n\t\t\t\t</button>\n\t\t\t</li>\n\t\t\t<li v-if=\"!readOnly\" class=\"cn-chips-field__add-item\">\n\t\t\t\t<form v-if=\"adding\" class=\"cn-chips-field__form\" @submit.prevent=\"add\">\n\t\t\t\t\t<select\n\t\t\t\t\t\tv-if=\"choices.length > 0\"\n\t\t\t\t\t\tref=\"input\"\n\t\t\t\t\t\tv-model=\"draft\"\n\t\t\t\t\t\tclass=\"cn-chips-field__input\"\n\t\t\t\t\t\t:aria-label=\"addLabel\"\n\t\t\t\t\t\tdata-testid=\"cn-chips-field-input\">\n\t\t\t\t\t\t<option v-for=\"choice in available\" :key=\"choice.value\" :value=\"choice.value\">\n\t\t\t\t\t\t\t{{ choice.label }}\n\t\t\t\t\t\t</option>\n\t\t\t\t\t</select>\n\t\t\t\t\t<input\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\tref=\"input\"\n\t\t\t\t\t\tv-model=\"draft\"\n\t\t\t\t\t\tclass=\"cn-chips-field__input\"\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t:placeholder=\"placeholder\"\n\t\t\t\t\t\t:aria-label=\"addLabel\"\n\t\t\t\t\t\t:aria-invalid=\"error ? 'true' : null\"\n\t\t\t\t\t\tdata-testid=\"cn-chips-field-input\"\n\t\t\t\t\t\t@keydown.esc=\"cancel\">\n\t\t\t\t\t<NcButton type=\"submit\"\n\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t:disabled=\"busy\"\n\t\t\t\t\t\tdata-testid=\"cn-chips-field-submit\">\n\t\t\t\t\t\t{{ confirmLabel }}\n\t\t\t\t\t</NcButton>\n\t\t\t\t</form>\n\t\t\t\t<button\n\t\t\t\t\tv-else\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"cn-chips-field__add\"\n\t\t\t\t\t:disabled=\"busy || (choices.length > 0 && available.length === 0)\"\n\t\t\t\t\tdata-testid=\"cn-chips-field-add\"\n\t\t\t\t\t@click=\"open\">\n\t\t\t\t\t+ {{ addLabel }}\n\t\t\t\t</button>\n\t\t\t</li>\n\t\t</ul>\n\t\t<p v-if=\"error\"\n\t\t\tclass=\"cn-chips-field__error\"\n\t\t\trole=\"alert\"\n\t\t\tdata-testid=\"cn-chips-field-error\">\n\t\t\t{{ error }}\n\t\t</p>\n\t\t<p v-else-if=\"hint\" class=\"cn-chips-field__hint\">\n\t\t\t{{ hint }}\n\t\t</p>\n\t</div>\n</template>\n\n<script>\nimport { NcButton } from '@nextcloud/vue'\nimport { objectUrlOf, patchObject } from '../../utils/objectWrite.js'\nimport { readPath } from '../../utils/readPath.js'\nimport { serverErrorMessage } from '../../utils/serverErrorMessage.js'\n\nlet uid = 0\n\n/**\n * CnChipsFieldWidget — the `chips-field` widget: a list of short strings in one\n * array field of the CURRENT object, drawn as chips with a remove button and an\n * add chip that opens a small input (or a choice of the remaining `options`).\n * Every add and remove is ONE PATCH of that field with the full new list; each\n * new entry is checked against `pattern` first, trimmed, optionally lowercased,\n * and refused when it is already there.\n *\n * @spec openspec/changes/abstract-chips-field/specs/chips-field/spec.md\n */\nexport default {\n\tname: 'CnChipsFieldWidget',\n\n\tcomponents: { NcButton },\n\n\tinject: {\n\t\tcnTranslate: { default: () => (key) => key },\n\t},\n\n\tprops: {\n\t\t/**\n\t\t * The widget configuration.\n\t\t *\n\t\t * - `field` (required) — the top-level array field of strings.\n\t\t * - `label`, `hint`, `placeholder`.\n\t\t * - `addLabel` — the add chip's text (default \"Add\").\n\t\t * - `removeLabel`, `confirmLabel`.\n\t\t * - `pattern`, `patternMessage` — checked on every new entry.\n\t\t * - `lowercase` — store entries in lower case.\n\t\t * - `options` — `[{ value, label }]`: add by choosing one of the remaining options instead of typing.\n\t\t * - `readOnly`.\n\t\t *\n\t\t * @type {object}\n\t\t */\n\t\tcontent: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/** The current detail-page object. */\n\t\tobjectData: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** The current object id. */\n\t\tobjectId: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** OpenRegister register slug of the surface. */\n\t\tregister: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** OpenRegister schema slug of the surface. */\n\t\tschema: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: '',\n\t\t},\n\t},\n\n\temits: ['saved'],\n\n\tdata() {\n\t\tuid += 1\n\t\treturn {\n\t\t\tlabelId: `cn-chips-field-${uid}`,\n\t\t\tsaved: null,\n\t\t\tadding: false,\n\t\t\tdraft: '',\n\t\t\terror: '',\n\t\t\tbusy: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** The stored list. */\n\t\titems() {\n\t\t\tconst list = this.saved !== null ? this.saved : readPath(this.objectData || {}, this.content.field)\n\t\t\treturn Array.isArray(list) ? list.map((item) => String(item)) : []\n\t\t},\n\n\t\tchoices() {\n\t\t\tconst list = Array.isArray(this.content.options) ? this.content.options : []\n\t\t\treturn list.map((option) => (typeof option === 'object' && option !== null\n\t\t\t\t? { value: String(option.value), label: this.tr(String(option.label ?? option.value)) }\n\t\t\t\t: { value: String(option), label: this.tr(String(option)) }))\n\t\t},\n\n\t\tavailable() {\n\t\t\treturn this.choices.filter((choice) => !this.items.includes(choice.value))\n\t\t},\n\n\t\tlabel() {\n\t\t\treturn this.tr(this.content.label || '')\n\t\t},\n\n\t\thint() {\n\t\t\treturn this.tr(this.content.hint || '')\n\t\t},\n\n\t\tplaceholder() {\n\t\t\treturn this.tr(this.content.placeholder || '')\n\t\t},\n\n\t\taddLabel() {\n\t\t\treturn this.tr(this.content.addLabel || 'Add')\n\t\t},\n\n\t\tremoveLabel() {\n\t\t\treturn this.tr(this.content.removeLabel || 'Remove')\n\t\t},\n\n\t\tconfirmLabel() {\n\t\t\treturn this.tr(this.content.confirmLabel || 'Add')\n\t\t},\n\n\t\treadOnly() {\n\t\t\treturn this.content.readOnly === true || !this.content.field\n\t\t},\n\n\t\tobjectUrl() {\n\t\t\treturn objectUrlOf(this.register, this.schema, this.objectId || (this.objectData && this.objectData.id))\n\t\t},\n\t},\n\n\twatch: {\n\t\tobjectData() {\n\t\t\tthis.saved = null\n\t\t},\n\t},\n\n\tmethods: {\n\t\ttr(text) {\n\t\t\tif (typeof text !== 'string' || text === '') {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn typeof this.cnTranslate === 'function' ? this.cnTranslate(text) : text\n\t\t},\n\n\t\t/**\n\t\t * The text on a chip: an option's label, else the value.\n\t\t *\n\t\t * @param {string} item The stored value.\n\t\t * @return {string}\n\t\t */\n\t\titemLabel(item) {\n\t\t\tconst choice = this.choices.find((candidate) => candidate.value === item)\n\t\t\treturn choice ? choice.label : item\n\t\t},\n\n\t\topen() {\n\t\t\tthis.adding = true\n\t\t\tthis.error = ''\n\t\t\tthis.draft = this.choices.length > 0 && this.available.length > 0 ? this.available[0].value : ''\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tconst el = this.$refs.input\n\t\t\t\tif (el && typeof el.focus === 'function') {\n\t\t\t\t\tel.focus()\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\n\t\tcancel() {\n\t\t\tthis.adding = false\n\t\t\tthis.draft = ''\n\t\t\tthis.error = ''\n\t\t},\n\n\t\t/**\n\t\t * Write the new list: ONE PATCH of the field.\n\t\t *\n\t\t * @param {string[]} next The new list.\n\t\t * @return {Promise<boolean>} Whether it saved.\n\t\t */\n\t\tasync write(next) {\n\t\t\tif (!this.objectUrl) {\n\t\t\t\tthis.error = this.tr('This list cannot be saved here.')\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tthis.busy = true\n\t\t\tthis.error = ''\n\t\t\ttry {\n\t\t\t\tconst data = await patchObject(this.objectUrl, { [this.content.field]: next })\n\t\t\t\tconst written = readPath(data, this.content.field)\n\t\t\t\tthis.saved = Array.isArray(written) ? written.map((item) => String(item)) : next\n\t\t\t\t/**\n\t\t\t\t * @event saved The list was written.\n\t\t\t\t * @type {{field: string, value: string[]}}\n\t\t\t\t */\n\t\t\t\tthis.$emit('saved', { field: this.content.field, value: this.saved })\n\t\t\t\treturn true\n\t\t\t} catch (e) {\n\t\t\t\tthis.error = serverErrorMessage(e)\n\t\t\t\treturn false\n\t\t\t} finally {\n\t\t\t\tthis.busy = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Check the draft and add it.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t * @spec openspec/changes/abstract-chips-field/specs/chips-field/spec.md#requirement-an-entry-is-checked-before-it-is-added\n\t\t */\n\t\tasync add() {\n\t\t\tlet value = String(this.draft ?? '').trim()\n\t\t\tif (this.content.lowercase === true) {\n\t\t\t\tvalue = value.toLowerCase()\n\t\t\t}\n\t\t\tif (value === '') {\n\t\t\t\tthis.error = this.tr('Fill this in.')\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (this.choices.length === 0 && this.content.pattern && !new RegExp(this.content.pattern).test(value)) {\n\t\t\t\tthis.error = this.tr(this.content.patternMessage || 'This value is not valid.')\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (this.items.includes(value)) {\n\t\t\t\tthis.error = this.tr('This is already in the list.')\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (await this.write([...this.items, value])) {\n\t\t\t\tthis.cancel()\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Remove one entry.\n\t\t *\n\t\t * @param {string} item The entry.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync remove(item) {\n\t\t\tawait this.write(this.items.filter((candidate) => candidate !== item))\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-chips-field {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 6px;\n\tmin-width: 0;\n}\n\n.cn-chips-field__label {\n\tmargin: 0;\n\tfont-size: 13px;\n\tfont-weight: 600;\n}\n\n.cn-chips-field__chips {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 8px;\n}\n\n.cn-chips-field__chip {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tpadding: 4px 6px 4px 12px;\n\tborder-radius: 999px;\n\tbackground: var(--color-primary-element-light);\n\tcolor: var(--color-primary-element-light-text, var(--color-main-text));\n\tfont-weight: 600;\n\toverflow-wrap: anywhere;\n}\n\n.cn-chips-field__remove {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 20px;\n\theight: 20px;\n\tpadding: 0;\n\tborder: 0;\n\tborder-radius: 50%;\n\tbackground: transparent;\n\tcolor: inherit;\n\tfont-size: 16px;\n\tline-height: 1;\n\tcursor: pointer;\n}\n\n.cn-chips-field__remove:hover:not(:disabled),\n.cn-chips-field__remove:focus-visible {\n\tbackground: var(--color-primary-element-light-hover, var(--color-background-hover));\n}\n\n.cn-chips-field__add {\n\tpadding: 4px 12px;\n\tborder: 1px dashed var(--color-border-maxcontrast);\n\tborder-radius: 999px;\n\tbackground: transparent;\n\tcolor: var(--color-main-text);\n\tfont-weight: 600;\n\tcursor: pointer;\n}\n\n.cn-chips-field__add:hover:not(:disabled) {\n\tbackground: var(--color-background-hover);\n}\n\n.cn-chips-field__form {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n}\n\n.cn-chips-field__input {\n\theight: var(--cn-board-control-height, 40px);\n\tbox-sizing: border-box;\n\tpadding: 0 12px;\n\tborder: 1px solid var(--color-border-maxcontrast);\n\tborder-radius: var(--cn-board-control-radius, 8px);\n\tbackground: var(--color-main-background);\n\tcolor: var(--color-main-text);\n\tfont: inherit;\n}\n\n.cn-chips-field__hint,\n.cn-chips-field__error {\n\tmargin: 0;\n\tfont-size: 12px;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-chips-field__error {\n\tcolor: var(--color-error-text);\n}\n</style>\n"],"names":["_openBlock","_createElementBlock","_createElementVNode","_Fragment","_renderList","_toDisplayString","_createVNode"],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import __sfc_main from './CnChipsFieldWidget.vue.js';
|
|
2
|
+
import { registerDashboardWidget } from '../CnWidgetGrid/dashboardWidgetRegistry.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* SPDX-FileCopyrightText: 2026 Conduction B.V.
|
|
6
|
+
* SPDX-License-Identifier: EUPL-1.2
|
|
7
|
+
*
|
|
8
|
+
* CnChipsFieldWidget — self-registers the `chips-field` widget type (a list of
|
|
9
|
+
* short strings in one array field of the current object, added and removed as
|
|
10
|
+
* chips, saved on each change) into the shared dashboardWidgetRegistry.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
registerDashboardWidget('chips-field', {
|
|
15
|
+
renderer: __sfc_main,
|
|
16
|
+
form: null,
|
|
17
|
+
defaultContent: {
|
|
18
|
+
field: '',
|
|
19
|
+
},
|
|
20
|
+
displayName: 'Chips field',
|
|
21
|
+
icon: 'TagMultiple',
|
|
22
|
+
surfaces: ['detail-page'],
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
export { __sfc_main as CnChipsFieldWidget, __sfc_main as default };
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/CnChipsFieldWidget/index.js"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2026 Conduction B.V.\n * SPDX-License-Identifier: EUPL-1.2\n *\n * CnChipsFieldWidget — self-registers the `chips-field` widget type (a list of\n * short strings in one array field of the current object, added and removed as\n * chips, saved on each change) into the shared dashboardWidgetRegistry.\n */\n\nimport CnChipsFieldWidget from './CnChipsFieldWidget.vue'\nimport { registerDashboardWidget } from '../CnWidgetGrid/dashboardWidgetRegistry.js'\n\nregisterDashboardWidget('chips-field', {\n\trenderer: CnChipsFieldWidget,\n\tform: null,\n\tdefaultContent: {\n\t\tfield: '',\n\t},\n\tdisplayName: 'Chips field',\n\ticon: 'TagMultiple',\n\tsurfaces: ['detail-page'],\n})\n\nexport { CnChipsFieldWidget }\nexport default CnChipsFieldWidget\n"],"names":["CnChipsFieldWidget"],"mappings":";;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA,uBAAuB,CAAC,aAAa,EAAE;AACvC,CAAC,QAAQ,EAAEA,UAAkB;AAC7B,CAAC,IAAI,EAAE,IAAI;AACX,CAAC,cAAc,EAAE;AACjB,EAAE,KAAK,EAAE,EAAE;AACX,EAAE;AACF,CAAC,WAAW,EAAE,aAAa;AAC3B,CAAC,IAAI,EAAE,aAAa;AACpB,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC;AAC1B,CAAC;;;;"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import script from './CnChoicePickerWidget.vue2.js';
|
|
2
|
+
import { render } from './CnChoicePickerWidget.vue3.js';
|
|
3
|
+
|
|
4
|
+
script.render = render;
|
|
5
|
+
script.__scopeId = "data-v-7075cbe2";
|
|
6
|
+
script.__file = "src/components/CnChoicePickerWidget/CnChoicePickerWidget.vue";
|
|
7
|
+
const __sfc_main = script;
|
|
8
|
+
|
|
9
|
+
export { __sfc_main as default };
|
|
10
|
+
//# sourceMappingURL=CnChoicePickerWidget.vue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CnChoicePickerWidget.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
|