@conduction/nextcloud-vue 2.79.0 → 2.81.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/components/CnActionButtons/CnActionButtons.vue2.js.map +1 -1
- package/dist/esm/components/CnActionButtons/CnActionButtons.vue3.js +3 -1
- package/dist/esm/components/CnActionButtons/CnActionButtons.vue3.js.map +1 -1
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js +32 -3
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js.map +1 -1
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js +13 -11
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js.map +1 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +80 -4
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js +95 -91
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js +179 -13
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js +52 -16
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +96 -4
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +158 -110
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
- package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue.js +10 -0
- package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue.js.map +1 -0
- package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue2.js +252 -0
- package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue3.js +140 -0
- package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnChipsFieldWidget/index.js +26 -0
- package/dist/esm/components/CnChipsFieldWidget/index.js.map +1 -0
- package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue.js +10 -0
- package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue.js.map +1 -0
- package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue2.js +354 -0
- package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue3.js +172 -0
- package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnChoicePickerWidget/index.js +27 -0
- package/dist/esm/components/CnChoicePickerWidget/index.js.map +1 -0
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js +1 -1
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js +2 -2
- package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js.map +1 -1
- package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue3.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +65 -5
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +2 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +19 -11
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +4 -2
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +134 -4
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +21 -4
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +24 -0
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js +43 -4
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue2.js +1 -1
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnFacetSidebar/CnFacetSidebar.vue2.js +7 -7
- package/dist/esm/components/CnFacetSidebar/CnFacetSidebar.vue2.js.map +1 -1
- package/dist/esm/components/CnFacetSidebar/CnFacetSidebar.vue3.js.map +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +11 -0
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js.map +1 -0
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +867 -0
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js +238 -0
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnFactsWidget/index.js +30 -0
- package/dist/esm/components/CnFactsWidget/index.js.map +1 -0
- package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue.js +10 -0
- package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue.js.map +1 -0
- package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js +626 -0
- package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js +396 -0
- package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnFieldListWidget/index.js +29 -0
- package/dist/esm/components/CnFieldListWidget/index.js.map +1 -0
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +302 -4
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +417 -244
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/filesBrowser.js +101 -1
- package/dist/esm/components/CnFilesBrowser/filesBrowser.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/filesBrowserColumns.js +141 -1
- package/dist/esm/components/CnFilesBrowser/filesBrowserColumns.js.map +1 -1
- package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js +65 -17
- package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js.map +1 -1
- package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js +4 -4
- package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js.map +1 -1
- package/dist/esm/components/CnFormPage/CnFormPage.vue2.js +78 -3
- package/dist/esm/components/CnFormPage/CnFormPage.vue2.js.map +1 -1
- package/dist/esm/components/CnFormPage/CnFormPage.vue3.js +74 -49
- package/dist/esm/components/CnFormPage/CnFormPage.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +333 -73
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +79 -17
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue.js +10 -0
- package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue.js.map +1 -0
- package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue2.js +99 -0
- package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue2.js.map +1 -0
- package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue3.js +48 -0
- package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue3.js.map +1 -0
- package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js +7 -7
- package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js.map +1 -1
- package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue2.js +1 -1
- package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +65 -2
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js +6 -2
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js +63 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +8 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue2.js +14 -0
- package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue3.js +5 -1
- package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue3.js.map +1 -1
- package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue2.js +29 -1
- package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue2.js.map +1 -1
- package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue3.js.map +1 -1
- package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue.js +10 -0
- package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue.js.map +1 -0
- package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue2.js +174 -0
- package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue3.js +75 -0
- package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnRadioCardsWidget/index.js +28 -0
- package/dist/esm/components/CnRadioCardsWidget/index.js.map +1 -0
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +10 -0
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js.map +1 -0
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +411 -0
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +178 -0
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnRecordListWidget/index.js +31 -0
- package/dist/esm/components/CnRecordListWidget/index.js.map +1 -0
- package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue.js +10 -0
- package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue.js.map +1 -0
- package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue2.js +222 -0
- package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue3.js +64 -0
- package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnSavedViewsWidget/index.js +30 -0
- package/dist/esm/components/CnSavedViewsWidget/index.js.map +1 -0
- package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue.js +10 -0
- package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue.js.map +1 -0
- package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue2.js +351 -0
- package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue3.js +71 -0
- package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnSectionsWidget/index.js +35 -0
- package/dist/esm/components/CnSectionsWidget/index.js.map +1 -0
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js.map +1 -1
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js.map +1 -1
- package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue.js +10 -0
- package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue.js.map +1 -0
- package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue2.js +347 -0
- package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue3.js +184 -0
- package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnSettingsFormWidget/index.js +27 -0
- package/dist/esm/components/CnSettingsFormWidget/index.js.map +1 -0
- package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js +81 -2
- package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js +87 -6
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js +1 -0
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue2.js +84 -1
- package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue3.js +85 -41
- package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue.js +10 -0
- package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue.js.map +1 -0
- package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue2.js +159 -0
- package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue3.js +60 -0
- package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnSwitchRowsWidget/index.js +26 -0
- package/dist/esm/components/CnSwitchRowsWidget/index.js.map +1 -0
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +168 -7
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +86 -23
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js +80 -1
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js +75 -32
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue.js +10 -0
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue.js.map +1 -0
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue2.js +269 -0
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue3.js +106 -0
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnToggleTableWidget/index.js +27 -0
- package/dist/esm/components/CnToggleTableWidget/index.js.map +1 -0
- package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +11 -0
- package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js +7 -2
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js.map +1 -1
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue3.js.map +1 -1
- package/dist/esm/components/CnWidgetObjectTable/dashboardRegistration.js +5 -0
- package/dist/esm/components/CnWidgetObjectTable/dashboardRegistration.js.map +1 -1
- package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js +301 -6
- package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue3.js +153 -55
- package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue3.js.map +1 -1
- package/dist/esm/composables/useFormDraft.js +140 -9
- package/dist/esm/composables/useFormDraft.js.map +1 -1
- package/dist/esm/composables/useListView.js +4 -4
- package/dist/esm/composables/useListView.js.map +1 -1
- package/dist/esm/index.js +21 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue2.js +28 -20
- package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue3.js +9 -0
- package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/field-inspection.js +21 -0
- package/dist/esm/integrations/builtin/field-inspection.js.map +1 -1
- package/dist/esm/integrations/offline/checklistSubmission.js +141 -0
- package/dist/esm/integrations/offline/checklistSubmission.js.map +1 -0
- package/dist/esm/integrations/offline/fieldCollectionHelpers.js +70 -5
- package/dist/esm/integrations/offline/fieldCollectionHelpers.js.map +1 -1
- package/dist/esm/integrations/offline/index.js +2 -1
- package/dist/esm/integrations/offline/index.js.map +1 -1
- package/dist/esm/integrations/offline/offlineDb.js +6 -1
- package/dist/esm/integrations/offline/offlineDb.js.map +1 -1
- package/dist/esm/integrations/offline/syncReplayService.js +8 -2
- package/dist/esm/integrations/offline/syncReplayService.js.map +1 -1
- package/dist/esm/l10n/en.json.js +20 -1
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +70 -2
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/nextcloud-vue.css +2192 -222
- package/dist/esm/utils/contentHeaderLink.js +51 -0
- package/dist/esm/utils/contentHeaderLink.js.map +1 -0
- package/dist/esm/utils/detailActionModel.js +60 -3
- package/dist/esm/utils/detailActionModel.js.map +1 -1
- package/dist/esm/utils/facets.js +75 -3
- package/dist/esm/utils/facets.js.map +1 -1
- package/dist/esm/utils/fetchFilterCounts.js +40 -5
- package/dist/esm/utils/fetchFilterCounts.js.map +1 -1
- package/dist/esm/utils/fillTemplate.js +120 -0
- package/dist/esm/utils/fillTemplate.js.map +1 -0
- package/dist/esm/utils/initials.js +32 -0
- package/dist/esm/utils/initials.js.map +1 -0
- package/dist/esm/utils/libraryWidgetKeys.js +11 -0
- package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
- package/dist/esm/utils/objectWrite.js +59 -0
- package/dist/esm/utils/objectWrite.js.map +1 -0
- package/dist/esm/utils/pageControls.js +81 -0
- package/dist/esm/utils/pageControls.js.map +1 -0
- package/dist/esm/utils/personalLenses.js +40 -3
- package/dist/esm/utils/personalLenses.js.map +1 -1
- package/dist/esm/utils/queryPresets.js +96 -0
- package/dist/esm/utils/queryPresets.js.map +1 -0
- package/dist/esm/utils/resolveFilterTokens.js +12 -1
- package/dist/esm/utils/resolveFilterTokens.js.map +1 -1
- package/dist/esm/utils/resolveManifestTokens.js +2 -0
- package/dist/esm/utils/resolveManifestTokens.js.map +1 -1
- package/dist/esm/utils/schema.js +21 -0
- package/dist/esm/utils/schema.js.map +1 -1
- package/dist/esm/utils/sentinelTokens.js +22 -4
- package/dist/esm/utils/sentinelTokens.js.map +1 -1
- package/dist/esm/utils/userGroupsPeek.js +91 -0
- package/dist/esm/utils/userGroupsPeek.js.map +1 -0
- package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
- package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
- package/dist/esm/utils/visibleWhen.js +57 -5
- package/dist/esm/utils/visibleWhen.js.map +1 -1
- package/dist/esm/utils/widgetDispatch.js +7 -1
- package/dist/esm/utils/widgetDispatch.js.map +1 -1
- package/dist/esm/utils/widgetVisibility.js +4 -57
- package/dist/esm/utils/widgetVisibility.js.map +1 -1
- package/dist/nextcloud-vue.cjs.js +19708 -9301
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +2192 -222
- package/l10n/en.json +20 -1
- package/l10n/nl.json +70 -2
- package/package.json +2 -1
- package/scripts/check-docs-mdx.mjs +108 -0
- package/src/components/CnActionButtons/CnActionButtons.vue +2 -0
- package/src/components/CnActionsBar/CnActionsBar.md +4 -0
- package/src/components/CnActionsBar/CnActionsBar.vue +48 -11
- package/src/components/CnAppRoot/CnAppRoot.md +4 -2
- package/src/components/CnAppRoot/CnAppRoot.vue +151 -59
- package/src/components/CnBannerWidget/CnBannerWidget.vue +244 -23
- package/src/components/CnCellRenderer/CnCellRenderer.md +2 -0
- package/src/components/CnCellRenderer/CnCellRenderer.vue +235 -5
- package/src/components/CnChipsFieldWidget/CnChipsFieldWidget.vue +433 -0
- package/src/components/CnChipsFieldWidget/index.js +25 -0
- package/src/components/CnChoicePickerWidget/CnChoicePickerWidget.vue +556 -0
- package/src/components/CnChoicePickerWidget/index.js +26 -0
- package/src/components/CnConversationThread/CnConversationWidget.vue +1 -1
- package/src/components/CnDashboardGrid/CnDashboardGrid.vue +2 -2
- package/src/components/CnDashboardPage/CnDashboardPage.vue +78 -5
- package/src/components/CnDataTable/CnDataTable.vue +22 -12
- package/src/components/CnDetailPage/CnDetailPage.md +1 -1
- package/src/components/CnDetailPage/CnDetailPage.vue +152 -6
- package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +66 -0
- package/src/components/CnDocumentReviewList/CnDocumentReviewWidget.vue +1 -1
- package/src/components/CnFacetSidebar/CnFacetSidebar.vue +7 -7
- package/src/components/CnFactsWidget/CnFactsWidget.vue +1190 -0
- package/src/components/CnFactsWidget/index.js +29 -0
- package/src/components/CnFieldListWidget/CnFieldListWidget.vue +1008 -0
- package/src/components/CnFieldListWidget/index.js +28 -0
- package/src/components/CnFilesBrowser/CnFilesBrowser.vue +588 -117
- package/src/components/CnFilesBrowser/filesBrowser.js +100 -0
- package/src/components/CnFilesBrowser/filesBrowserColumns.js +140 -0
- package/src/components/CnFormDialog/CnFormDialog.md +9 -3
- package/src/components/CnFormDialog/CnFormDialog.vue +69 -21
- package/src/components/CnFormPage/CnFormPage.vue +99 -3
- package/src/components/CnIndexPage/CnIndexPage.vue +309 -9
- package/src/components/CnIndexPage/CnIndexPageWidgets.vue +169 -0
- package/src/components/CnIndexSidebar/CnIndexSidebar.vue +7 -7
- package/src/components/CnNextStepCard/CnNextStepWidget.vue +1 -1
- package/src/components/CnObjectListWidget/CnObjectListWidget.vue +69 -2
- package/src/components/CnObjectSidebar/CnFilesTab.vue +70 -1
- package/src/components/CnObjectSidebar/CnNotesTab.vue +16 -0
- package/src/components/CnPageRenderer/CnPageRenderer.vue +29 -1
- package/src/components/CnRadioCardsWidget/CnRadioCardsWidget.vue +313 -0
- package/src/components/CnRadioCardsWidget/index.js +27 -0
- package/src/components/CnRecordListWidget/CnRecordListWidget.vue +652 -0
- package/src/components/CnRecordListWidget/index.js +30 -0
- package/src/components/CnSavedViewsWidget/CnSavedViewsWidget.vue +296 -0
- package/src/components/CnSavedViewsWidget/index.js +29 -0
- package/src/components/CnSectionsWidget/CnSectionsWidget.vue +489 -0
- package/src/components/CnSectionsWidget/index.js +34 -0
- package/src/components/CnSegmentedControl/CnSegmentedControl.vue +13 -0
- package/src/components/CnSettingsFormWidget/CnSettingsFormWidget.vue +555 -0
- package/src/components/CnSettingsFormWidget/index.js +26 -0
- package/src/components/CnStagesWidget/CnStagesWidget.vue +81 -2
- package/src/components/CnStatWidget/CnStatWidget.vue +88 -7
- package/src/components/CnStatsBlockWidget/CnStatsBlockWidget.vue +180 -3
- package/src/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue +226 -0
- package/src/components/CnSwitchRowsWidget/index.js +25 -0
- package/src/components/CnTabsWidget/CnTabsWidget.vue +263 -8
- package/src/components/CnTasksWidget/CnTasksWidget.vue +175 -15
- package/src/components/CnToggleTableWidget/CnToggleTableWidget.vue +386 -0
- package/src/components/CnToggleTableWidget/index.js +26 -0
- package/src/components/CnWidgetGrid/registerDashboardWidgets.js +11 -0
- package/src/components/CnWidgetObjectTable/CnWidgetObjectTable.vue +7 -2
- package/src/components/CnWidgetObjectTable/dashboardRegistration.js +5 -0
- package/src/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue +493 -11
- package/src/components/index.js +19 -0
- package/src/composables/__tests__/useFormDraft.spec.js +69 -0
- package/src/composables/useFormDraft.js +139 -8
- package/src/composables/useListView.js +4 -4
- package/src/css/form-field.css +14 -0
- package/src/css/index-page.css +71 -0
- package/src/css/kpi-card.css +32 -0
- package/src/css/look-board-detail.css +113 -2
- package/src/css/look-board-index.css +90 -8
- package/src/css/look-board.css +109 -2
- package/src/css/table.css +19 -0
- package/src/index.js +19 -0
- package/src/integrations/builtin/field-inspection/CnFieldInspectionCard.vue +35 -20
- package/src/integrations/builtin/field-inspection.js +21 -0
- package/src/integrations/offline/checklistSubmission.js +137 -0
- package/src/integrations/offline/fieldCollectionHelpers.js +69 -4
- package/src/integrations/offline/index.js +3 -0
- package/src/integrations/offline/offlineDb.js +6 -1
- package/src/integrations/offline/syncReplayService.js +8 -2
- package/src/schemas/app-manifest-v2.schema.json +196 -13
- package/src/utils/contentHeaderLink.js +48 -0
- package/src/utils/detailActionModel.js +59 -2
- package/src/utils/facets.js +74 -2
- package/src/utils/fetchFilterCounts.js +39 -4
- package/src/utils/fillTemplate.js +116 -0
- package/src/utils/initials.js +29 -0
- package/src/utils/libraryWidgetKeys.js +11 -0
- package/src/utils/objectWrite.js +55 -0
- package/src/utils/pageControls.js +78 -0
- package/src/utils/personalLenses.js +39 -2
- package/src/utils/queryPresets.js +93 -0
- package/src/utils/resolveFilterTokens.js +14 -1
- package/src/utils/resolveManifestTokens.js +2 -0
- package/src/utils/schema.js +21 -0
- package/src/utils/sentinelTokens.js +22 -4
- package/src/utils/userGroupsPeek.js +87 -0
- package/src/utils/validateManifestV2.compiled.js +3 -3
- package/src/utils/visibleWhen.js +56 -4
- package/src/utils/widgetDispatch.js +7 -1
- package/src/utils/widgetVisibility.js +7 -56
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { NcNoteCard } 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
|
+
* CnRadioCardsWidget — the `radio-cards` widget: one choice out of a few cards,
|
|
10
|
+
* each with a title and a description, bound to an enum field of the CURRENT
|
|
11
|
+
* object. Choosing a card saves at once with ONE PATCH of that field; a refused
|
|
12
|
+
* PATCH puts the choice back and shows the server's words. Real radio inputs
|
|
13
|
+
* underneath, so the choice is perceivable without colour and works from the
|
|
14
|
+
* keyboard.
|
|
15
|
+
*
|
|
16
|
+
* @spec openspec/changes/abstract-radio-cards/specs/radio-cards/spec.md
|
|
17
|
+
*/
|
|
18
|
+
var script = {
|
|
19
|
+
name: 'CnRadioCardsWidget',
|
|
20
|
+
|
|
21
|
+
components: { NcNoteCard },
|
|
22
|
+
|
|
23
|
+
inject: {
|
|
24
|
+
cnTranslate: { default: () => (key) => key },
|
|
25
|
+
},
|
|
26
|
+
|
|
27
|
+
props: {
|
|
28
|
+
/**
|
|
29
|
+
* The widget configuration.
|
|
30
|
+
*
|
|
31
|
+
* - `field` (required) — the top-level enum field.
|
|
32
|
+
* - `options` (required) — `[{ value, label, description? }]`.
|
|
33
|
+
* - `label` — a legend over the cards (visually shown).
|
|
34
|
+
* - `columns` — 1, 2 or 3 (default 2).
|
|
35
|
+
* - `readOnly`.
|
|
36
|
+
*
|
|
37
|
+
* @type {object}
|
|
38
|
+
*/
|
|
39
|
+
content: {
|
|
40
|
+
type: Object,
|
|
41
|
+
default: () => ({}),
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
/** The current detail-page object. */
|
|
45
|
+
objectData: {
|
|
46
|
+
type: Object,
|
|
47
|
+
default: null,
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
/** The current object id. */
|
|
51
|
+
objectId: {
|
|
52
|
+
type: [String, Number],
|
|
53
|
+
default: '',
|
|
54
|
+
},
|
|
55
|
+
|
|
56
|
+
/** OpenRegister register slug of the surface. */
|
|
57
|
+
register: {
|
|
58
|
+
type: [String, Object],
|
|
59
|
+
default: '',
|
|
60
|
+
},
|
|
61
|
+
|
|
62
|
+
/** OpenRegister schema slug of the surface. */
|
|
63
|
+
schema: {
|
|
64
|
+
type: [String, Object],
|
|
65
|
+
default: '',
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
|
|
69
|
+
emits: ['saved'],
|
|
70
|
+
|
|
71
|
+
data() {
|
|
72
|
+
uid += 1;
|
|
73
|
+
return {
|
|
74
|
+
groupName: `cn-radio-cards-${uid}`,
|
|
75
|
+
saved: '',
|
|
76
|
+
value: '',
|
|
77
|
+
busy: false,
|
|
78
|
+
notice: '',
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
|
|
82
|
+
computed: {
|
|
83
|
+
options() {
|
|
84
|
+
const list = Array.isArray(this.content.options) ? this.content.options : [];
|
|
85
|
+
return list
|
|
86
|
+
.filter((option) => option !== null && option !== undefined)
|
|
87
|
+
.map((option) => (typeof option === 'object'
|
|
88
|
+
? { value: option.value, label: this.tr(String(option.label ?? option.value)), description: this.tr(option.description || '') }
|
|
89
|
+
: { value: option, label: this.tr(String(option)), description: '' }))
|
|
90
|
+
},
|
|
91
|
+
|
|
92
|
+
label() {
|
|
93
|
+
return this.tr(this.content.label || '')
|
|
94
|
+
},
|
|
95
|
+
|
|
96
|
+
columns() {
|
|
97
|
+
return [1, 3].includes(this.content.columns) ? this.content.columns : 2
|
|
98
|
+
},
|
|
99
|
+
|
|
100
|
+
readOnly() {
|
|
101
|
+
return this.content.readOnly === true
|
|
102
|
+
},
|
|
103
|
+
|
|
104
|
+
objectUrl() {
|
|
105
|
+
return objectUrlOf(this.register, this.schema, this.objectId || (this.objectData && this.objectData.id))
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
|
|
109
|
+
watch: {
|
|
110
|
+
objectData() {
|
|
111
|
+
this.adopt();
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
|
|
115
|
+
created() {
|
|
116
|
+
this.adopt();
|
|
117
|
+
},
|
|
118
|
+
|
|
119
|
+
methods: {
|
|
120
|
+
tr(text) {
|
|
121
|
+
if (typeof text !== 'string' || text === '') {
|
|
122
|
+
return ''
|
|
123
|
+
}
|
|
124
|
+
return typeof this.cnTranslate === 'function' ? this.cnTranslate(text) : text
|
|
125
|
+
},
|
|
126
|
+
|
|
127
|
+
/** Read the choice off the object. */
|
|
128
|
+
adopt() {
|
|
129
|
+
const stored = readPath(this.objectData || {}, this.content.field);
|
|
130
|
+
this.saved = stored === undefined || stored === null ? '' : String(stored);
|
|
131
|
+
this.value = this.saved;
|
|
132
|
+
},
|
|
133
|
+
|
|
134
|
+
isSelected(option) {
|
|
135
|
+
return this.value === String(option.value)
|
|
136
|
+
},
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Choose a card and save that one field.
|
|
140
|
+
*
|
|
141
|
+
* @param {object} option The chosen option.
|
|
142
|
+
* @return {Promise<void>}
|
|
143
|
+
* @spec openspec/changes/abstract-radio-cards/specs/radio-cards/spec.md#requirement-choosing-a-card-saves-that-one-field
|
|
144
|
+
*/
|
|
145
|
+
async choose(option) {
|
|
146
|
+
if (!this.objectUrl || !this.content.field) {
|
|
147
|
+
this.notice = this.tr('This choice cannot be saved here.');
|
|
148
|
+
return
|
|
149
|
+
}
|
|
150
|
+
this.notice = '';
|
|
151
|
+
this.busy = true;
|
|
152
|
+
this.value = String(option.value);
|
|
153
|
+
try {
|
|
154
|
+
const data = await patchObject(this.objectUrl, { [this.content.field]: option.value });
|
|
155
|
+
const written = readPath(data, this.content.field);
|
|
156
|
+
this.saved = String(written !== undefined && written !== null ? written : option.value);
|
|
157
|
+
this.value = this.saved;
|
|
158
|
+
/**
|
|
159
|
+
* @event saved The choice was written.
|
|
160
|
+
* @type {{field: string, value: unknown}}
|
|
161
|
+
*/
|
|
162
|
+
this.$emit('saved', { field: this.content.field, value: option.value });
|
|
163
|
+
} catch (e) {
|
|
164
|
+
this.value = this.saved;
|
|
165
|
+
this.notice = serverErrorMessage(e);
|
|
166
|
+
} finally {
|
|
167
|
+
this.busy = false;
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
},
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
export { script as default };
|
|
174
|
+
//# sourceMappingURL=CnRadioCardsWidget.vue2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CnRadioCardsWidget.vue2.js","sources":["../../../../src/components/CnRadioCardsWidget/CnRadioCardsWidget.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n\n<template>\n\t<fieldset class=\"cn-radio-cards\" data-testid=\"cn-radio-cards\" :aria-busy=\"busy ? 'true' : 'false'\">\n\t\t<legend v-if=\"label\" class=\"cn-radio-cards__legend\">\n\t\t\t{{ label }}\n\t\t</legend>\n\t\t<div class=\"cn-radio-cards__grid\" :class=\"`cn-radio-cards__grid--${columns}`\">\n\t\t\t<label\n\t\t\t\tv-for=\"option in options\"\n\t\t\t\t:key=\"String(option.value)\"\n\t\t\t\tclass=\"cn-radio-cards__card\"\n\t\t\t\t:class=\"{ 'cn-radio-cards__card--selected': isSelected(option) }\"\n\t\t\t\t:data-testid=\"`cn-radio-cards-option-${option.value}`\">\n\t\t\t\t<input\n\t\t\t\t\tclass=\"cn-radio-cards__input\"\n\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t:name=\"groupName\"\n\t\t\t\t\t:value=\"String(option.value)\"\n\t\t\t\t\t:checked=\"isSelected(option)\"\n\t\t\t\t\t:disabled=\"readOnly || busy\"\n\t\t\t\t\t@change=\"choose(option)\">\n\t\t\t\t<span class=\"cn-radio-cards__dot\" aria-hidden=\"true\" />\n\t\t\t\t<span class=\"cn-radio-cards__text\">\n\t\t\t\t\t<span class=\"cn-radio-cards__title\">{{ option.label }}</span>\n\t\t\t\t\t<span v-if=\"option.description\" class=\"cn-radio-cards__description\">{{ option.description }}</span>\n\t\t\t\t</span>\n\t\t\t</label>\n\t\t</div>\n\t\t<NcNoteCard v-if=\"notice\" type=\"error\" data-testid=\"cn-radio-cards-notice\">\n\t\t\t{{ notice }}\n\t\t</NcNoteCard>\n\t</fieldset>\n</template>\n\n<script>\nimport { NcNoteCard } 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 * CnRadioCardsWidget — the `radio-cards` widget: one choice out of a few cards,\n * each with a title and a description, bound to an enum field of the CURRENT\n * object. Choosing a card saves at once with ONE PATCH of that field; a refused\n * PATCH puts the choice back and shows the server's words. Real radio inputs\n * underneath, so the choice is perceivable without colour and works from the\n * keyboard.\n *\n * @spec openspec/changes/abstract-radio-cards/specs/radio-cards/spec.md\n */\nexport default {\n\tname: 'CnRadioCardsWidget',\n\n\tcomponents: { NcNoteCard },\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 enum field.\n\t\t * - `options` (required) — `[{ value, label, description? }]`.\n\t\t * - `label` — a legend over the cards (visually shown).\n\t\t * - `columns` — 1, 2 or 3 (default 2).\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\tgroupName: `cn-radio-cards-${uid}`,\n\t\t\tsaved: '',\n\t\t\tvalue: '',\n\t\t\tbusy: false,\n\t\t\tnotice: '',\n\t\t}\n\t},\n\n\tcomputed: {\n\t\toptions() {\n\t\t\tconst list = Array.isArray(this.content.options) ? this.content.options : []\n\t\t\treturn list\n\t\t\t\t.filter((option) => option !== null && option !== undefined)\n\t\t\t\t.map((option) => (typeof option === 'object'\n\t\t\t\t\t? { value: option.value, label: this.tr(String(option.label ?? option.value)), description: this.tr(option.description || '') }\n\t\t\t\t\t: { value: option, label: this.tr(String(option)), description: '' }))\n\t\t},\n\n\t\tlabel() {\n\t\t\treturn this.tr(this.content.label || '')\n\t\t},\n\n\t\tcolumns() {\n\t\t\treturn [1, 3].includes(this.content.columns) ? this.content.columns : 2\n\t\t},\n\n\t\treadOnly() {\n\t\t\treturn this.content.readOnly === true\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.adopt()\n\t\t},\n\t},\n\n\tcreated() {\n\t\tthis.adopt()\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/** Read the choice off the object. */\n\t\tadopt() {\n\t\t\tconst stored = readPath(this.objectData || {}, this.content.field)\n\t\t\tthis.saved = stored === undefined || stored === null ? '' : String(stored)\n\t\t\tthis.value = this.saved\n\t\t},\n\n\t\tisSelected(option) {\n\t\t\treturn this.value === String(option.value)\n\t\t},\n\n\t\t/**\n\t\t * Choose a card and save that one field.\n\t\t *\n\t\t * @param {object} option The chosen option.\n\t\t * @return {Promise<void>}\n\t\t * @spec openspec/changes/abstract-radio-cards/specs/radio-cards/spec.md#requirement-choosing-a-card-saves-that-one-field\n\t\t */\n\t\tasync choose(option) {\n\t\t\tif (!this.objectUrl || !this.content.field) {\n\t\t\t\tthis.notice = this.tr('This choice cannot be saved here.')\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.notice = ''\n\t\t\tthis.busy = true\n\t\t\tthis.value = String(option.value)\n\t\t\ttry {\n\t\t\t\tconst data = await patchObject(this.objectUrl, { [this.content.field]: option.value })\n\t\t\t\tconst written = readPath(data, this.content.field)\n\t\t\t\tthis.saved = String(written !== undefined && written !== null ? written : option.value)\n\t\t\t\tthis.value = this.saved\n\t\t\t\t/**\n\t\t\t\t * @event saved The choice was written.\n\t\t\t\t * @type {{field: string, value: unknown}}\n\t\t\t\t */\n\t\t\t\tthis.$emit('saved', { field: this.content.field, value: option.value })\n\t\t\t} catch (e) {\n\t\t\t\tthis.value = this.saved\n\t\t\t\tthis.notice = serverErrorMessage(e)\n\t\t\t} finally {\n\t\t\t\tthis.busy = false\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-radio-cards {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n\tmin-width: 0;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n}\n\n.cn-radio-cards__legend {\n\tpadding: 0;\n\tmargin-bottom: 6px;\n\tfont-weight: 600;\n}\n\n.cn-radio-cards__grid {\n\tdisplay: grid;\n\tgap: 10px;\n\tgrid-template-columns: minmax(0, 1fr);\n}\n\n.cn-radio-cards__grid--2 {\n\tgrid-template-columns: repeat(2, minmax(0, 1fr));\n}\n\n.cn-radio-cards__grid--3 {\n\tgrid-template-columns: repeat(3, minmax(0, 1fr));\n}\n\n.cn-radio-cards__card {\n\tposition: relative;\n\tdisplay: flex;\n\talign-items: flex-start;\n\tgap: 10px;\n\tpadding: 12px 14px;\n\tborder: 1px solid var(--color-border-maxcontrast);\n\tborder-radius: var(--cn-board-control-radius, 8px);\n\tbackground: var(--color-main-background);\n\tcursor: pointer;\n}\n\n.cn-radio-cards__card--selected {\n\tborder-color: var(--color-primary-element);\n\tbackground: var(--color-primary-element-light);\n\tbox-shadow: 0 0 0 1px var(--color-primary-element);\n}\n\n.cn-radio-cards__card:focus-within {\n\toutline: 2px solid var(--color-primary-element);\n\toutline-offset: 2px;\n}\n\n/* The real input stays in the DOM and in the accessibility tree; the dot is its picture. */\n.cn-radio-cards__input {\n\tposition: absolute;\n\topacity: 0;\n\tinset: 0;\n\tmargin: 0;\n\tcursor: pointer;\n}\n\n.cn-radio-cards__dot {\n\tflex: 0 0 auto;\n\twidth: 14px;\n\theight: 14px;\n\tmargin-top: 3px;\n\tbox-sizing: border-box;\n\tborder: 1px solid var(--color-border-maxcontrast);\n\tborder-radius: 50%;\n\tbackground: var(--color-main-background);\n}\n\n.cn-radio-cards__card--selected .cn-radio-cards__dot {\n\tborder: 4px solid var(--color-primary-element);\n}\n\n.cn-radio-cards__text {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n\tmin-width: 0;\n}\n\n.cn-radio-cards__title {\n\tfont-weight: 600;\n}\n\n.cn-radio-cards__description {\n\tfont-size: 12px;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n@media (max-width: 640px) {\n\t.cn-radio-cards__grid--2,\n\t.cn-radio-cards__grid--3 {\n\t\tgrid-template-columns: minmax(0, 1fr);\n\t}\n}\n</style>\n"],"names":[],"mappings":";;;;;AA4CA,IAAI,MAAM,EAAA;;AAEV;AACC;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAED,aAAe;CACd,IAAI,EAAE,oBAAoB;;CAE1B,UAAU,EAAE,EAAE,UAAS,EAAG;;AAE1B,CAAA,MAAM,EAAE;AACP,EAAA,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,KAAK,KAAK;EAC5C;;AAED,CAAA,KAAK,EAAE;AACN;;AAEC;AACA;;AAEA;;;AAGA;;;AAGD,EAAA,OAAO,EAAE;GACR,IAAI,EAAE,MAAM;AACZ,GAAA,OAAO,EAAE,OAAO,EAAE,CAAC;GACnB;;AAED;EACA,UAAU,EAAE;GACX,IAAI,EAAE,MAAM;GACZ,OAAO,EAAE,IAAI;GACb;;;AAGD,EAAA,QAAQ,EAAE;AACT,GAAA,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;GACtB,OAAO,EAAE,EAAE;GACX;;AAED;AACA,EAAA,QAAQ,EAAE;AACT,GAAA,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;GACtB,OAAO,EAAE,EAAE;GACX;;AAED;AACA,EAAA,MAAM,EAAE;AACP,GAAA,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;GACtB,OAAO,EAAE,EAAE;GACX;EACD;;AAED,CAAA,KAAK,EAAE,CAAC,OAAO,CAAC;;AAEhB,CAAA,IAAI,GAAG;EACN,GAAI,IAAG,EAAA;AACP,EAAA,OAAO;AACN,GAAA,SAAS,EAAE,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;AAClC,GAAA,KAAK,EAAE,EAAE;AACT,GAAA,KAAK,EAAE,EAAE;GACT,IAAI,EAAE,KAAK;AACX,GAAA,MAAM,EAAE,EAAE;AACX,GAAA;EACA;;AAED,CAAA,QAAQ,EAAE;AACT,EAAA,OAAO,GAAG;AACT,GAAA,MAAM,IAAG,GAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAE,GAAE,IAAI,CAAC,OAAO,CAAC,OAAM,GAAI,GAAC;AAC3E,GAAA,OAAO,IAAG;KACR,MAAM,CAAC,CAAC,MAAM,KAAK,MAAO,KAAI,IAAG,IAAK,WAAW,SAAS,CAAA;AAC3D,KAAC,GAAG,CAAC,CAAC,MAAM,MAAM,OAAO,MAAO,KAAI,QAAO;OACxC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAM,IAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,WAAU,IAAK,EAAE,CAAE,EAAA;OAC5H,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,EAAG,EAAC,CAAC,CAAA;GACvE;;AAED,EAAA,KAAK,GAAG;AACP,GAAA,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAI,IAAK,EAAE,CAAA;GACvC;;AAED,EAAA,OAAO,GAAG;AACT,GAAA,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAA,GAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAA;GACtE;;EAED,QAAQ,GAAG;AACV,GAAA,OAAO,IAAI,CAAC,OAAO,CAAC,QAAO,KAAM,IAAG;GACpC;;EAED,SAAS,GAAG;GACX,OAAO,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAO,KAAM,IAAI,CAAC,UAAS,IAAK,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;GACvG;EACD;;AAED,CAAA,KAAK,EAAE;EACN,UAAU,GAAG;GACZ,IAAI,CAAC,KAAK,GAAC;GACX;EACD;;AAED,CAAA,OAAO,GAAG;EACT,IAAI,CAAC,KAAK,GAAC;EACX;;AAED,CAAA,OAAO,EAAE;AACR,EAAA,EAAE,CAAC,IAAI,EAAE;AACR,GAAA,IAAI,OAAO,IAAG,KAAM,QAAO,IAAK,SAAS,EAAE,EAAE;AAC5C,IAAA,OAAO,EAAC;AACT,IAAA;AACA,GAAA,OAAO,OAAO,IAAI,CAAC,WAAY,KAAI,UAAW,GAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAA,GAAI,IAAG;GAC5E;;AAED;AACA,EAAA,KAAK,GAAG;GACP,MAAM,MAAO,GAAE,QAAQ,CAAC,IAAI,CAAC,UAAS,IAAK,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAA;GACjE,IAAI,CAAC,KAAI,GAAI,MAAO,KAAI,SAAU,IAAG,MAAO,KAAI,IAAG,GAAI,EAAG,GAAE,MAAM,CAAC,MAAM,EAAA;AACzE,GAAA,IAAI,CAAC,KAAI,GAAI,IAAI,CAAC,MAAI;GACtB;;AAED,EAAA,UAAU,CAAC,MAAM,EAAE;AAClB,GAAA,OAAO,IAAI,CAAC,KAAI,KAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAA;GACzC;;AAED;AACC;AACA;AACA;;;;AAID,EAAA,MAAM,MAAM,CAAC,MAAM,EAAE;AACpB,GAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;IAC3C,IAAI,CAAC,MAAO,GAAE,IAAI,CAAC,EAAE,CAAC,mCAAmC,EAAA;IACzD,MAAK;AACN,IAAA;GACA,IAAI,CAAC,MAAO,GAAE,GAAC;GACf,IAAI,CAAC,IAAK,GAAE,KAAG;AACf,GAAA,IAAI,CAAC,KAAM,GAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAA;AAChC,GAAA,IAAI;AACH,IAAA,MAAM,IAAK,GAAE,MAAM,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,OAAO,EAAA;AACrF,IAAA,MAAM,OAAQ,GAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAA;AACjD,IAAA,IAAI,CAAC,KAAI,GAAI,MAAM,CAAC,YAAY,SAAQ,IAAK,OAAM,KAAM,IAAG,GAAI,OAAQ,GAAE,MAAM,CAAC,KAAK,EAAA;AACtF,IAAA,IAAI,CAAC,KAAI,GAAI,IAAI,CAAC,MAAI;AACtB;AACC;AACA;;AAED,IAAA,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAA;AACvE,IAAA,CAAE,OAAO,CAAC,EAAE;AACX,IAAA,IAAI,CAAC,KAAI,GAAI,IAAI,CAAC,MAAI;AACtB,IAAA,IAAI,CAAC,MAAK,GAAI,kBAAkB,CAAC,CAAC,EAAA;AACnC,IAAA,SAAU;AACT,IAAA,IAAI,CAAC,IAAG,GAAI,MAAI;AACjB,IAAA;GACA;EACD;AACF;;;;"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { resolveComponent, openBlock, createElementBlock, toDisplayString, createCommentVNode, createElementVNode, normalizeClass, Fragment, renderList, createBlock, withCtx, createTextVNode } from 'vue';
|
|
2
|
+
|
|
3
|
+
const _hoisted_1 = ["aria-busy"];
|
|
4
|
+
const _hoisted_2 = {
|
|
5
|
+
key: 0,
|
|
6
|
+
class: "cn-radio-cards__legend"
|
|
7
|
+
};
|
|
8
|
+
const _hoisted_3 = ["data-testid"];
|
|
9
|
+
const _hoisted_4 = ["name", "value", "checked", "disabled", "onChange"];
|
|
10
|
+
const _hoisted_5 = { class: "cn-radio-cards__text" };
|
|
11
|
+
const _hoisted_6 = { class: "cn-radio-cards__title" };
|
|
12
|
+
const _hoisted_7 = {
|
|
13
|
+
key: 0,
|
|
14
|
+
class: "cn-radio-cards__description"
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
18
|
+
const _component_NcNoteCard = resolveComponent("NcNoteCard");
|
|
19
|
+
|
|
20
|
+
return (openBlock(), createElementBlock("fieldset", {
|
|
21
|
+
class: "cn-radio-cards",
|
|
22
|
+
"data-testid": "cn-radio-cards",
|
|
23
|
+
"aria-busy": $data.busy ? 'true' : 'false'
|
|
24
|
+
}, [
|
|
25
|
+
($options.label)
|
|
26
|
+
? (openBlock(), createElementBlock("legend", _hoisted_2, toDisplayString($options.label), 1 /* TEXT */))
|
|
27
|
+
: createCommentVNode("v-if", true),
|
|
28
|
+
createElementVNode("div", {
|
|
29
|
+
class: normalizeClass(["cn-radio-cards__grid", `cn-radio-cards__grid--${$options.columns}`])
|
|
30
|
+
}, [
|
|
31
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList($options.options, (option) => {
|
|
32
|
+
return (openBlock(), createElementBlock("label", {
|
|
33
|
+
key: String(option.value),
|
|
34
|
+
class: normalizeClass(["cn-radio-cards__card", { 'cn-radio-cards__card--selected': $options.isSelected(option) }]),
|
|
35
|
+
"data-testid": `cn-radio-cards-option-${option.value}`
|
|
36
|
+
}, [
|
|
37
|
+
createElementVNode("input", {
|
|
38
|
+
class: "cn-radio-cards__input",
|
|
39
|
+
type: "radio",
|
|
40
|
+
name: $data.groupName,
|
|
41
|
+
value: String(option.value),
|
|
42
|
+
checked: $options.isSelected(option),
|
|
43
|
+
disabled: $options.readOnly || $data.busy,
|
|
44
|
+
onChange: $event => ($options.choose(option))
|
|
45
|
+
}, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_4),
|
|
46
|
+
_cache[0] || (_cache[0] = createElementVNode("span", {
|
|
47
|
+
class: "cn-radio-cards__dot",
|
|
48
|
+
"aria-hidden": "true"
|
|
49
|
+
}, null, -1 /* CACHED */)),
|
|
50
|
+
createElementVNode("span", _hoisted_5, [
|
|
51
|
+
createElementVNode("span", _hoisted_6, toDisplayString(option.label), 1 /* TEXT */),
|
|
52
|
+
(option.description)
|
|
53
|
+
? (openBlock(), createElementBlock("span", _hoisted_7, toDisplayString(option.description), 1 /* TEXT */))
|
|
54
|
+
: createCommentVNode("v-if", true)
|
|
55
|
+
])
|
|
56
|
+
], 10 /* CLASS, PROPS */, _hoisted_3))
|
|
57
|
+
}), 128 /* KEYED_FRAGMENT */))
|
|
58
|
+
], 2 /* CLASS */),
|
|
59
|
+
($data.notice)
|
|
60
|
+
? (openBlock(), createBlock(_component_NcNoteCard, {
|
|
61
|
+
key: 1,
|
|
62
|
+
type: "error",
|
|
63
|
+
"data-testid": "cn-radio-cards-notice"
|
|
64
|
+
}, {
|
|
65
|
+
default: withCtx(() => [
|
|
66
|
+
createTextVNode(toDisplayString($data.notice), 1 /* TEXT */)
|
|
67
|
+
]),
|
|
68
|
+
_: 1 /* STABLE */
|
|
69
|
+
}))
|
|
70
|
+
: createCommentVNode("v-if", true)
|
|
71
|
+
], 8 /* PROPS */, _hoisted_1))
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export { render };
|
|
75
|
+
//# sourceMappingURL=CnRadioCardsWidget.vue3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CnRadioCardsWidget.vue3.js","sources":["../../../../src/components/CnRadioCardsWidget/CnRadioCardsWidget.vue?vue&type=template&id=8aefa4a2&lang.js"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n\n<template>\n\t<fieldset class=\"cn-radio-cards\" data-testid=\"cn-radio-cards\" :aria-busy=\"busy ? 'true' : 'false'\">\n\t\t<legend v-if=\"label\" class=\"cn-radio-cards__legend\">\n\t\t\t{{ label }}\n\t\t</legend>\n\t\t<div class=\"cn-radio-cards__grid\" :class=\"`cn-radio-cards__grid--${columns}`\">\n\t\t\t<label\n\t\t\t\tv-for=\"option in options\"\n\t\t\t\t:key=\"String(option.value)\"\n\t\t\t\tclass=\"cn-radio-cards__card\"\n\t\t\t\t:class=\"{ 'cn-radio-cards__card--selected': isSelected(option) }\"\n\t\t\t\t:data-testid=\"`cn-radio-cards-option-${option.value}`\">\n\t\t\t\t<input\n\t\t\t\t\tclass=\"cn-radio-cards__input\"\n\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t:name=\"groupName\"\n\t\t\t\t\t:value=\"String(option.value)\"\n\t\t\t\t\t:checked=\"isSelected(option)\"\n\t\t\t\t\t:disabled=\"readOnly || busy\"\n\t\t\t\t\t@change=\"choose(option)\">\n\t\t\t\t<span class=\"cn-radio-cards__dot\" aria-hidden=\"true\" />\n\t\t\t\t<span class=\"cn-radio-cards__text\">\n\t\t\t\t\t<span class=\"cn-radio-cards__title\">{{ option.label }}</span>\n\t\t\t\t\t<span v-if=\"option.description\" class=\"cn-radio-cards__description\">{{ option.description }}</span>\n\t\t\t\t</span>\n\t\t\t</label>\n\t\t</div>\n\t\t<NcNoteCard v-if=\"notice\" type=\"error\" data-testid=\"cn-radio-cards-notice\">\n\t\t\t{{ notice }}\n\t\t</NcNoteCard>\n\t</fieldset>\n</template>\n\n<script>\nimport { NcNoteCard } 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 * CnRadioCardsWidget — the `radio-cards` widget: one choice out of a few cards,\n * each with a title and a description, bound to an enum field of the CURRENT\n * object. Choosing a card saves at once with ONE PATCH of that field; a refused\n * PATCH puts the choice back and shows the server's words. Real radio inputs\n * underneath, so the choice is perceivable without colour and works from the\n * keyboard.\n *\n * @spec openspec/changes/abstract-radio-cards/specs/radio-cards/spec.md\n */\nexport default {\n\tname: 'CnRadioCardsWidget',\n\n\tcomponents: { NcNoteCard },\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 enum field.\n\t\t * - `options` (required) — `[{ value, label, description? }]`.\n\t\t * - `label` — a legend over the cards (visually shown).\n\t\t * - `columns` — 1, 2 or 3 (default 2).\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\tgroupName: `cn-radio-cards-${uid}`,\n\t\t\tsaved: '',\n\t\t\tvalue: '',\n\t\t\tbusy: false,\n\t\t\tnotice: '',\n\t\t}\n\t},\n\n\tcomputed: {\n\t\toptions() {\n\t\t\tconst list = Array.isArray(this.content.options) ? this.content.options : []\n\t\t\treturn list\n\t\t\t\t.filter((option) => option !== null && option !== undefined)\n\t\t\t\t.map((option) => (typeof option === 'object'\n\t\t\t\t\t? { value: option.value, label: this.tr(String(option.label ?? option.value)), description: this.tr(option.description || '') }\n\t\t\t\t\t: { value: option, label: this.tr(String(option)), description: '' }))\n\t\t},\n\n\t\tlabel() {\n\t\t\treturn this.tr(this.content.label || '')\n\t\t},\n\n\t\tcolumns() {\n\t\t\treturn [1, 3].includes(this.content.columns) ? this.content.columns : 2\n\t\t},\n\n\t\treadOnly() {\n\t\t\treturn this.content.readOnly === true\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.adopt()\n\t\t},\n\t},\n\n\tcreated() {\n\t\tthis.adopt()\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/** Read the choice off the object. */\n\t\tadopt() {\n\t\t\tconst stored = readPath(this.objectData || {}, this.content.field)\n\t\t\tthis.saved = stored === undefined || stored === null ? '' : String(stored)\n\t\t\tthis.value = this.saved\n\t\t},\n\n\t\tisSelected(option) {\n\t\t\treturn this.value === String(option.value)\n\t\t},\n\n\t\t/**\n\t\t * Choose a card and save that one field.\n\t\t *\n\t\t * @param {object} option The chosen option.\n\t\t * @return {Promise<void>}\n\t\t * @spec openspec/changes/abstract-radio-cards/specs/radio-cards/spec.md#requirement-choosing-a-card-saves-that-one-field\n\t\t */\n\t\tasync choose(option) {\n\t\t\tif (!this.objectUrl || !this.content.field) {\n\t\t\t\tthis.notice = this.tr('This choice cannot be saved here.')\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.notice = ''\n\t\t\tthis.busy = true\n\t\t\tthis.value = String(option.value)\n\t\t\ttry {\n\t\t\t\tconst data = await patchObject(this.objectUrl, { [this.content.field]: option.value })\n\t\t\t\tconst written = readPath(data, this.content.field)\n\t\t\t\tthis.saved = String(written !== undefined && written !== null ? written : option.value)\n\t\t\t\tthis.value = this.saved\n\t\t\t\t/**\n\t\t\t\t * @event saved The choice was written.\n\t\t\t\t * @type {{field: string, value: unknown}}\n\t\t\t\t */\n\t\t\t\tthis.$emit('saved', { field: this.content.field, value: option.value })\n\t\t\t} catch (e) {\n\t\t\t\tthis.value = this.saved\n\t\t\t\tthis.notice = serverErrorMessage(e)\n\t\t\t} finally {\n\t\t\t\tthis.busy = false\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-radio-cards {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n\tmin-width: 0;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n}\n\n.cn-radio-cards__legend {\n\tpadding: 0;\n\tmargin-bottom: 6px;\n\tfont-weight: 600;\n}\n\n.cn-radio-cards__grid {\n\tdisplay: grid;\n\tgap: 10px;\n\tgrid-template-columns: minmax(0, 1fr);\n}\n\n.cn-radio-cards__grid--2 {\n\tgrid-template-columns: repeat(2, minmax(0, 1fr));\n}\n\n.cn-radio-cards__grid--3 {\n\tgrid-template-columns: repeat(3, minmax(0, 1fr));\n}\n\n.cn-radio-cards__card {\n\tposition: relative;\n\tdisplay: flex;\n\talign-items: flex-start;\n\tgap: 10px;\n\tpadding: 12px 14px;\n\tborder: 1px solid var(--color-border-maxcontrast);\n\tborder-radius: var(--cn-board-control-radius, 8px);\n\tbackground: var(--color-main-background);\n\tcursor: pointer;\n}\n\n.cn-radio-cards__card--selected {\n\tborder-color: var(--color-primary-element);\n\tbackground: var(--color-primary-element-light);\n\tbox-shadow: 0 0 0 1px var(--color-primary-element);\n}\n\n.cn-radio-cards__card:focus-within {\n\toutline: 2px solid var(--color-primary-element);\n\toutline-offset: 2px;\n}\n\n/* The real input stays in the DOM and in the accessibility tree; the dot is its picture. */\n.cn-radio-cards__input {\n\tposition: absolute;\n\topacity: 0;\n\tinset: 0;\n\tmargin: 0;\n\tcursor: pointer;\n}\n\n.cn-radio-cards__dot {\n\tflex: 0 0 auto;\n\twidth: 14px;\n\theight: 14px;\n\tmargin-top: 3px;\n\tbox-sizing: border-box;\n\tborder: 1px solid var(--color-border-maxcontrast);\n\tborder-radius: 50%;\n\tbackground: var(--color-main-background);\n}\n\n.cn-radio-cards__card--selected .cn-radio-cards__dot {\n\tborder: 4px solid var(--color-primary-element);\n}\n\n.cn-radio-cards__text {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n\tmin-width: 0;\n}\n\n.cn-radio-cards__title {\n\tfont-weight: 600;\n}\n\n.cn-radio-cards__description {\n\tfont-size: 12px;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n@media (max-width: 640px) {\n\t.cn-radio-cards__grid--2,\n\t.cn-radio-cards__grid--3 {\n\t\tgrid-template-columns: minmax(0, 1fr);\n\t}\n}\n</style>\n"],"names":["_toDisplayString","_normalizeClass","_Fragment","_renderList","_createElementVNode"],"mappings":";;;;;AAYuB,EAAA,KAAK,EAAA,wBAAA;;;;AAmBrB,MAAA,UAAA,GAAA,EAAA,KAAA,EAAA,sBAAA,GAAA;AACI,MAAA,UAAA,GAAA,EAAA,KAAK,EAAC,uBAAwB,GAAA;;;AAC3B,EAAA,KAAA,EAAA,6BAAA;;;;;;;AAtBN,IAAA,KAAA,EAAA,gBAAA;AAAA,IAAA,aAAA,EAAA,gBAAA;AAAA,IAAA,WAAA,EAAA,KAAA,CAAA,IAAA,GAAA,MAAA,GAAA,OAAA;;KACQ,QAAK,CAAA,KAAA;wCAEV,CAAA,QAAA,YAAA,EAAAA,eAAA,CADL,QAAK,CAAA,KAAA,CAAA,EAAA,CAAA,YAAA;;;MAEJ,KAAK,EAAAC,cAAA,CAAA,CAAE,sBAAqB,EAAA,CAAA,sBAAA,EAAiC,QAAA,CAAA,OAAA,CAAA,CAAA,CAAA,CAAA;;0CAoBzD,CAAAC,QAAA,EAAA,IAAA,EAAAC,UAAA,CAlBF,QAAA,CAAA,OAAA,EAAA,CAAA,MAAA,KAAA;+CAkBE,CAAA,OAAA,EAAA;AAjBN,UAAA,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAA;eACpB,EAACF,cAAA,CAAA,CAAA,sBAAM,EACK,EAAA,gCAAA,EAAA,QAAA,CAAA,UAAA,CAAA,MAAA,CAAA,EAAA,CAAA,CAAA;UAChB,aAAW,EAAA,CAAA,sBAAA,EAAiB,MAAA,CAAA,KAAA,CAAA,CAAA;;4BAQvB,CAAA,OAAA,EAAA;AANL,YAAA,KAAK,EAAC,uBAAqB;AAC3B,YAAA,IAAI,EAAC,OAAO;AACX,YAAA,IAAI,EAAE,KAAS,CAAA,SAAA;AACf,YAAA,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAA;YAC1B,OAAO,EAAE,QAAU,CAAA,UAAA,CAAC,MAAM,CAAA;YAC1B,QAAQ,EAAE,QAAQ,CAAA,QAAA,IAAI,KAAI,CAAA,IAAA;YAC1B,QAAI,EAAA,MAAA,KAAA,QAAA,CAAA,MAAA,CAAA,MAAA,CAAA,CAAA;;oCACNG,kBAAM,CAAA,MAAA,EAAA;AAAA,YAAA,KAAA,EAAA,qBAAA;AAAA,YAAA,aAAA,EAAA,MAAA;;AACN,UAAAA,kBAAA,CAGO,QAHP,UAGO,EAAA;AAFN,YAAAA,kBAAA,CAA6D,MAA7D,EAAA,UAA6D,EAAtBJ,eAAA,CAAA,MAAM,CAAC,KAAK,CAAA,EAAA,CAAA,YAAA;AAC1C,YAAA,CAAA,MAAA,CAAA,WAAA;iDAAA,kBAAA,EAAAA,eAAA,CAAA,MAAA,CAAA,WAAA,CAAA,EAAA,CAAA,YAAA;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import __sfc_main from './CnRadioCardsWidget.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
|
+
* CnRadioCardsWidget — self-registers the `radio-cards` widget type (one
|
|
9
|
+
* choice out of a few cards with a title and a description, bound to an enum
|
|
10
|
+
* field of the current object and saved on selection) into the shared
|
|
11
|
+
* dashboardWidgetRegistry at module load.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
registerDashboardWidget('radio-cards', {
|
|
16
|
+
renderer: __sfc_main,
|
|
17
|
+
form: null,
|
|
18
|
+
defaultContent: {
|
|
19
|
+
field: '',
|
|
20
|
+
options: [],
|
|
21
|
+
},
|
|
22
|
+
displayName: 'Radio cards',
|
|
23
|
+
icon: 'RadioboxMarked',
|
|
24
|
+
surfaces: ['detail-page'],
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
export { __sfc_main as CnRadioCardsWidget, __sfc_main as default };
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/CnRadioCardsWidget/index.js"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2026 Conduction B.V.\n * SPDX-License-Identifier: EUPL-1.2\n *\n * CnRadioCardsWidget — self-registers the `radio-cards` widget type (one\n * choice out of a few cards with a title and a description, bound to an enum\n * field of the current object and saved on selection) into the shared\n * dashboardWidgetRegistry at module load.\n */\n\nimport CnRadioCardsWidget from './CnRadioCardsWidget.vue'\nimport { registerDashboardWidget } from '../CnWidgetGrid/dashboardWidgetRegistry.js'\n\nregisterDashboardWidget('radio-cards', {\n\trenderer: CnRadioCardsWidget,\n\tform: null,\n\tdefaultContent: {\n\t\tfield: '',\n\t\toptions: [],\n\t},\n\tdisplayName: 'Radio cards',\n\ticon: 'RadioboxMarked',\n\tsurfaces: ['detail-page'],\n})\n\nexport { CnRadioCardsWidget }\nexport default CnRadioCardsWidget\n"],"names":["CnRadioCardsWidget"],"mappings":";;;AAAA;AACA;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,OAAO,EAAE,EAAE;AACb,EAAE;AACF,CAAC,WAAW,EAAE,aAAa;AAC3B,CAAC,IAAI,EAAE,gBAAgB;AACvB,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC;AAC1B,CAAC;;;;"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import script from './CnRecordListWidget.vue2.js';
|
|
2
|
+
import { render } from './CnRecordListWidget.vue3.js';
|
|
3
|
+
|
|
4
|
+
script.render = render;
|
|
5
|
+
script.__scopeId = "data-v-7073b362";
|
|
6
|
+
script.__file = "src/components/CnRecordListWidget/CnRecordListWidget.vue";
|
|
7
|
+
const __sfc_main = script;
|
|
8
|
+
|
|
9
|
+
export { __sfc_main as default };
|
|
10
|
+
//# sourceMappingURL=CnRecordListWidget.vue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CnRecordListWidget.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
|