@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,411 @@
|
|
|
1
|
+
import { subscribe, unsubscribe } from '@nextcloud/event-bus';
|
|
2
|
+
import { translate } from '@nextcloud/l10n';
|
|
3
|
+
import { NcLoadingIcon } from '@nextcloud/vue';
|
|
4
|
+
import ChevronRight from 'vue-material-design-icons/ChevronRight.vue';
|
|
5
|
+
import __sfc_main from '../CnIcon/CnIcon.vue.js';
|
|
6
|
+
import __sfc_main$1 from '../CnStatusBadge/CnStatusBadge.vue.js';
|
|
7
|
+
import { isBadgeVariant } from '../../utils/badgeVariants.js';
|
|
8
|
+
import { firstFilled, fillTemplate } from '../../utils/fillTemplate.js';
|
|
9
|
+
import { initialsOf } from '../../utils/initials.js';
|
|
10
|
+
import { pageFilter, pageSort } from '../../utils/pageControls.js';
|
|
11
|
+
import { readPath } from '../../utils/readPath.js';
|
|
12
|
+
import { dropOptionalUnresolved, resolveFilterTokens, hasUnresolvedTokens } from '../../utils/resolveFilterTokens.js';
|
|
13
|
+
|
|
14
|
+
const PAGE_REFRESH_CHANNEL = 'cn:page:refresh';
|
|
15
|
+
const PRESENTATIONS = ['rows', 'feed', 'inline'];
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Unwrap a value that may be a ref.
|
|
19
|
+
*
|
|
20
|
+
* @param {unknown} value The value.
|
|
21
|
+
* @return {unknown} The plain value.
|
|
22
|
+
*/
|
|
23
|
+
function unwrap(value) {
|
|
24
|
+
return value && typeof value === 'object' && 'value' in value ? value.value : value
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* CnRecordListWidget — the objects of another schema that point at this
|
|
29
|
+
* record, drawn as the boards draw them (screens-relation-pages).
|
|
30
|
+
*
|
|
31
|
+
* A person page lists its open cases ("Verlichting fietspad Lindelaan,
|
|
32
|
+
* 2026-0082 · Woo-verzoek, In behandeling, Termijn 1 nov"), its latest contact
|
|
33
|
+
* moments (an icon by channel, a meta line, the summary) and its relations
|
|
34
|
+
* ("Secretaris van Buurtvereniging Oost"). Each is a list of another schema's
|
|
35
|
+
* objects filtered on a reference to this record. The source keys are those of
|
|
36
|
+
* `object-list` (`register`, `schema`, `filter` with the `@objectId` /
|
|
37
|
+
* `@object.<field>` / `@workspace.<key>` tokens, `sort`, `limit`, `extend`,
|
|
38
|
+
* `rowRoute`, `pageControls`); `avatar` puts a circle with the initials of a name
|
|
39
|
+
* template before the title; what differs is the drawing: `presentation` is `rows`, `feed`
|
|
40
|
+
* or `inline`, and each line is a template (`"{identifier} · {caseTypeName}"`,
|
|
41
|
+
* `"Termijn {deadline|date}"`).
|
|
42
|
+
*
|
|
43
|
+
* A content-only catalog type: on a card surface the detail host draws the
|
|
44
|
+
* titled card. The widget emits `header` with `{ link, note }` (the
|
|
45
|
+
* `headerLink` and `headerNote` with `{total}` filled in) for that card's
|
|
46
|
+
* header.
|
|
47
|
+
*/
|
|
48
|
+
var script = {
|
|
49
|
+
name: 'CnRecordListWidget',
|
|
50
|
+
|
|
51
|
+
components: { ChevronRight, CnIcon: __sfc_main, CnStatusBadge: __sfc_main$1, NcLoadingIcon },
|
|
52
|
+
|
|
53
|
+
inject: {
|
|
54
|
+
/** Detail-page object context (`{ objectId, object, register, schema }`). */
|
|
55
|
+
cnObjectContext: { default: null },
|
|
56
|
+
/** Page workspace bag, for `@workspace.<key>` tokens. */
|
|
57
|
+
cnWorkspaceContext: { default: null },
|
|
58
|
+
/** The host app's translate function. */
|
|
59
|
+
cnTranslate: { default: () => (key) => key },
|
|
60
|
+
},
|
|
61
|
+
|
|
62
|
+
props: {
|
|
63
|
+
/**
|
|
64
|
+
* The list config: `{ register, schema, filter?, sort?, limit?, extend?,
|
|
65
|
+
* presentation?, title?, meta?, text?, label?, pill?, trailing?, icon?,
|
|
66
|
+
* rowRoute?, rowIdField?, headerLink?, headerNote?, emptyText?, errorText? }`.
|
|
67
|
+
*
|
|
68
|
+
* @type {object}
|
|
69
|
+
*/
|
|
70
|
+
content: {
|
|
71
|
+
type: Object,
|
|
72
|
+
default: () => ({}),
|
|
73
|
+
},
|
|
74
|
+
|
|
75
|
+
/** The current record's id, for the `@objectId` token. */
|
|
76
|
+
objectId: {
|
|
77
|
+
type: [String, Number],
|
|
78
|
+
default: null,
|
|
79
|
+
},
|
|
80
|
+
|
|
81
|
+
/** The current record, for `@object.<field>` tokens. */
|
|
82
|
+
objectData: {
|
|
83
|
+
type: Object,
|
|
84
|
+
default: null,
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
|
|
88
|
+
emits: ['header'],
|
|
89
|
+
|
|
90
|
+
data() {
|
|
91
|
+
return {
|
|
92
|
+
rows: [],
|
|
93
|
+
total: 0,
|
|
94
|
+
loading: false,
|
|
95
|
+
error: false,
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
|
|
99
|
+
computed: {
|
|
100
|
+
/** @return {string} `rows`, `feed` or `inline`. */
|
|
101
|
+
presentation() {
|
|
102
|
+
const value = this.content?.presentation;
|
|
103
|
+
return PRESENTATIONS.includes(value) ? value : 'rows'
|
|
104
|
+
},
|
|
105
|
+
|
|
106
|
+
/** @return {object} The token context: record, id and workspace. */
|
|
107
|
+
tokenCtx() {
|
|
108
|
+
const injected = unwrap(this.cnObjectContext) || {};
|
|
109
|
+
return {
|
|
110
|
+
...injected,
|
|
111
|
+
objectId: this.objectId ?? injected.objectId ?? this.objectData?.id ?? null,
|
|
112
|
+
object: this.objectData || injected.object || null,
|
|
113
|
+
workspace: unwrap(this.cnWorkspaceContext) || {},
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
|
|
117
|
+
/** @return {object} The filter with its tokens resolved. */
|
|
118
|
+
resolvedFilter() {
|
|
119
|
+
const filter = pageFilter(this.content?.pageControls, this.tokenCtx.workspace, this.content?.filter);
|
|
120
|
+
return dropOptionalUnresolved(resolveFilterTokens(filter, this.tokenCtx))
|
|
121
|
+
},
|
|
122
|
+
|
|
123
|
+
/** @return {boolean} A required token (the record id, say) has no value yet. */
|
|
124
|
+
waiting() {
|
|
125
|
+
return hasUnresolvedTokens(this.resolvedFilter)
|
|
126
|
+
},
|
|
127
|
+
|
|
128
|
+
/** @return {object|null} The sort: the page's sort control when the widget listens to one, else its own. */
|
|
129
|
+
effectiveSort() {
|
|
130
|
+
return pageSort(this.content?.pageControls, this.tokenCtx.workspace, this.content?.sort)
|
|
131
|
+
},
|
|
132
|
+
|
|
133
|
+
/** @return {number} The fetch cap. */
|
|
134
|
+
limit() {
|
|
135
|
+
const value = Number(this.content?.limit);
|
|
136
|
+
return Number.isFinite(value) && value > 0 ? Math.floor(value) : 5
|
|
137
|
+
},
|
|
138
|
+
|
|
139
|
+
/** @return {string} What a fetch depends on; a change fetches again. */
|
|
140
|
+
requestKey() {
|
|
141
|
+
const c = this.content || {};
|
|
142
|
+
return JSON.stringify([c.register, c.schema, this.resolvedFilter, this.effectiveSort, this.limit, c.extend, this.waiting])
|
|
143
|
+
},
|
|
144
|
+
|
|
145
|
+
/** @return {Array<object>} The rows ready to draw. */
|
|
146
|
+
items() {
|
|
147
|
+
const c = this.content || {};
|
|
148
|
+
return this.rows.slice(0, this.limit).map((row, index) => {
|
|
149
|
+
const link = this.rowLink(row);
|
|
150
|
+
return {
|
|
151
|
+
key: (row && (row.id || row['@self']?.id)) || `row-${index}`,
|
|
152
|
+
tag: link ? 'router-link' : 'div',
|
|
153
|
+
attrs: link ? { to: link } : {},
|
|
154
|
+
initials: this.initialsFor(row),
|
|
155
|
+
title: this.fill(c.title, row),
|
|
156
|
+
meta: this.fill(c.meta, row),
|
|
157
|
+
text: this.fill(c.text, row),
|
|
158
|
+
label: this.fill(c.label, row),
|
|
159
|
+
trailing: c.trailing ? firstFilled(c.trailing, row, this.translate) : '',
|
|
160
|
+
pill: this.pillOf(row),
|
|
161
|
+
icon: this.iconOf(row),
|
|
162
|
+
}
|
|
163
|
+
})
|
|
164
|
+
},
|
|
165
|
+
|
|
166
|
+
/** @return {object|null} The header link with `{total}` filled and tokens resolved. */
|
|
167
|
+
headerLink() {
|
|
168
|
+
const link = this.content?.headerLink;
|
|
169
|
+
if (!link || typeof link !== 'object' || typeof link.label !== 'string' || link.label === '') {
|
|
170
|
+
return null
|
|
171
|
+
}
|
|
172
|
+
const resolved = { label: this.withTotal(link.label) };
|
|
173
|
+
if (link.route) {
|
|
174
|
+
resolved.route = link.route;
|
|
175
|
+
if (link.params && typeof link.params === 'object') {
|
|
176
|
+
resolved.params = resolveFilterTokens(link.params, this.tokenCtx);
|
|
177
|
+
}
|
|
178
|
+
if (link.query && typeof link.query === 'object') {
|
|
179
|
+
resolved.query = resolveFilterTokens(link.query, this.tokenCtx);
|
|
180
|
+
}
|
|
181
|
+
} else if (typeof link.href === 'string') {
|
|
182
|
+
resolved.href = link.href;
|
|
183
|
+
}
|
|
184
|
+
return resolved
|
|
185
|
+
},
|
|
186
|
+
|
|
187
|
+
/** @return {string} The header note with `{total}` filled. */
|
|
188
|
+
headerNote() {
|
|
189
|
+
const note = this.content?.headerNote;
|
|
190
|
+
return typeof note === 'string' && note !== '' ? this.withTotal(note) : ''
|
|
191
|
+
},
|
|
192
|
+
|
|
193
|
+
/** @return {string} The empty line. */
|
|
194
|
+
emptyLabel() {
|
|
195
|
+
return this.content?.emptyText ? this.translate(this.content.emptyText) : translate('nextcloud-vue', 'Nothing here yet')
|
|
196
|
+
},
|
|
197
|
+
|
|
198
|
+
/** @return {string} The error line. */
|
|
199
|
+
errorLabel() {
|
|
200
|
+
return this.content?.errorText ? this.translate(this.content.errorText) : translate('nextcloud-vue', 'This list could not be loaded.')
|
|
201
|
+
},
|
|
202
|
+
|
|
203
|
+
/** @return {string} The spinner's accessible name. */
|
|
204
|
+
loadingLabel() {
|
|
205
|
+
return translate('nextcloud-vue', 'Loading …')
|
|
206
|
+
},
|
|
207
|
+
},
|
|
208
|
+
|
|
209
|
+
watch: {
|
|
210
|
+
requestKey() {
|
|
211
|
+
this.fetchRows();
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
|
|
215
|
+
mounted() {
|
|
216
|
+
this.onRefresh = () => this.fetchRows();
|
|
217
|
+
subscribe(PAGE_REFRESH_CHANNEL, this.onRefresh);
|
|
218
|
+
this.fetchRows();
|
|
219
|
+
},
|
|
220
|
+
|
|
221
|
+
beforeUnmount() {
|
|
222
|
+
unsubscribe(PAGE_REFRESH_CHANNEL, this.onRefresh);
|
|
223
|
+
},
|
|
224
|
+
|
|
225
|
+
methods: {
|
|
226
|
+
/**
|
|
227
|
+
* Translate a manifest string through the host app.
|
|
228
|
+
*
|
|
229
|
+
* @param {string} text The text.
|
|
230
|
+
* @return {string} The translation.
|
|
231
|
+
*/
|
|
232
|
+
translate(text) {
|
|
233
|
+
return typeof this.cnTranslate === 'function' ? this.cnTranslate(text) : text
|
|
234
|
+
},
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* The initials of the row's avatar (`avatar`: a name template such as
|
|
238
|
+
* `"{client.name}"`, or `{ text }`), or '' without one.
|
|
239
|
+
*
|
|
240
|
+
* @param {object} row The row.
|
|
241
|
+
* @return {string} One or two letters.
|
|
242
|
+
* @spec openspec/changes/screens-record-list-avatar/specs/record-list-avatar/spec.md#requirement-a-record-list-row-can-carry-an-avatar
|
|
243
|
+
*/
|
|
244
|
+
initialsFor(row) {
|
|
245
|
+
const avatar = this.content?.avatar;
|
|
246
|
+
const template = typeof avatar === 'string' ? avatar : (avatar && typeof avatar === 'object' ? avatar.text : '');
|
|
247
|
+
return initialsOf(this.fill(template, row))
|
|
248
|
+
},
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Fill a template from a row, after translating it.
|
|
252
|
+
*
|
|
253
|
+
* @param {string} template The template.
|
|
254
|
+
* @param {object} row The row.
|
|
255
|
+
* @return {string} The text, '' when a token is empty.
|
|
256
|
+
*/
|
|
257
|
+
fill(template, row) {
|
|
258
|
+
return typeof template === 'string' && template !== '' ? fillTemplate(this.translate(template), row) : ''
|
|
259
|
+
},
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* Replace `{total}` in a translated label.
|
|
263
|
+
*
|
|
264
|
+
* @param {string} label The label.
|
|
265
|
+
* @return {string} The text.
|
|
266
|
+
*/
|
|
267
|
+
withTotal(label) {
|
|
268
|
+
return this.translate(label).replace(/\{total\}/g, String(this.total))
|
|
269
|
+
},
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* The route a row opens: `rowRoute` with the id at `rowIdField`.
|
|
273
|
+
*
|
|
274
|
+
* @param {object} row The row.
|
|
275
|
+
* @return {object|null} The router location, or null.
|
|
276
|
+
*/
|
|
277
|
+
rowLink(row) {
|
|
278
|
+
const route = this.content?.rowRoute;
|
|
279
|
+
if (!route || !this.$router || !row) {
|
|
280
|
+
return null
|
|
281
|
+
}
|
|
282
|
+
const field = this.content?.rowIdField;
|
|
283
|
+
const id = field ? readPath(row, field) : (row.id || row['@self']?.id);
|
|
284
|
+
if (id === null || id === undefined || id === '' || typeof id === 'object') {
|
|
285
|
+
return null
|
|
286
|
+
}
|
|
287
|
+
return { name: route, params: { id: String(id) } }
|
|
288
|
+
},
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* The row's pill: `{ field, labels?, colorMap?, variant? }`.
|
|
292
|
+
*
|
|
293
|
+
* @param {object} row The row.
|
|
294
|
+
* @return {{label: string, variant: string}|null} The pill, or null.
|
|
295
|
+
*/
|
|
296
|
+
pillOf(row) {
|
|
297
|
+
const pill = this.content?.pill;
|
|
298
|
+
if (!pill || typeof pill !== 'object' || !pill.field) {
|
|
299
|
+
return null
|
|
300
|
+
}
|
|
301
|
+
const raw = readPath(row, pill.field);
|
|
302
|
+
if (raw === null || raw === undefined || raw === '' || typeof raw === 'object') {
|
|
303
|
+
return null
|
|
304
|
+
}
|
|
305
|
+
const key = String(raw);
|
|
306
|
+
const labels = pill.labels && typeof pill.labels === 'object' ? pill.labels : {};
|
|
307
|
+
const map = pill.colorMap && typeof pill.colorMap === 'object' ? pill.colorMap : {};
|
|
308
|
+
const found = Object.keys(map).find((k) => k.toLowerCase() === key.toLowerCase());
|
|
309
|
+
const variant = found ? map[found] : pill.variant;
|
|
310
|
+
return {
|
|
311
|
+
label: labels[key] ? this.translate(labels[key]) : key,
|
|
312
|
+
variant: isBadgeVariant(variant) ? variant : 'default',
|
|
313
|
+
}
|
|
314
|
+
},
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* The feed icon: an icon name, or `{ field, map, default }`.
|
|
318
|
+
*
|
|
319
|
+
* @param {object} row The row.
|
|
320
|
+
* @return {string} The MDI icon name.
|
|
321
|
+
*/
|
|
322
|
+
iconOf(row) {
|
|
323
|
+
const icon = this.content?.icon;
|
|
324
|
+
if (typeof icon === 'string' && icon !== '') {
|
|
325
|
+
return icon
|
|
326
|
+
}
|
|
327
|
+
if (icon && typeof icon === 'object') {
|
|
328
|
+
const raw = icon.field ? readPath(row, icon.field) : undefined;
|
|
329
|
+
const map = icon.map && typeof icon.map === 'object' ? icon.map : {};
|
|
330
|
+
if (raw !== null && raw !== undefined && map[String(raw)]) {
|
|
331
|
+
return map[String(raw)]
|
|
332
|
+
}
|
|
333
|
+
if (typeof icon.default === 'string' && icon.default !== '') {
|
|
334
|
+
return icon.default
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
return 'CircleSmall'
|
|
338
|
+
},
|
|
339
|
+
|
|
340
|
+
/** Tell the card around this list what its header shows. */
|
|
341
|
+
emitHeader() {
|
|
342
|
+
/**
|
|
343
|
+
* @event header Emitted after every read with the card header's parts.
|
|
344
|
+
* @type {{link: (object|null), note: string}} The header link (resolved, with `{total}` filled) and the note.
|
|
345
|
+
*/
|
|
346
|
+
this.$emit('header', { link: this.headerLink, note: this.headerNote });
|
|
347
|
+
},
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* Fetch the list. Sends nothing while a required token is unresolved
|
|
351
|
+
* or the source is incomplete.
|
|
352
|
+
*
|
|
353
|
+
* @return {Promise<void>}
|
|
354
|
+
*/
|
|
355
|
+
async fetchRows() {
|
|
356
|
+
const c = this.content || {};
|
|
357
|
+
if (!c.register || !c.schema || this.waiting) {
|
|
358
|
+
this.rows = [];
|
|
359
|
+
this.total = 0;
|
|
360
|
+
this.error = false;
|
|
361
|
+
this.emitHeader();
|
|
362
|
+
return
|
|
363
|
+
}
|
|
364
|
+
this.loading = true;
|
|
365
|
+
this.error = false;
|
|
366
|
+
try {
|
|
367
|
+
const [{ default: axios }, { generateUrl }] = await Promise.all([
|
|
368
|
+
import('@nextcloud/axios'),
|
|
369
|
+
import('@nextcloud/router'),
|
|
370
|
+
]);
|
|
371
|
+
const url = generateUrl('/apps/openregister/api/objects/{register}/{schema}', { register: c.register, schema: c.schema });
|
|
372
|
+
const params = { _limit: this.limit };
|
|
373
|
+
const sort = this.effectiveSort;
|
|
374
|
+
if (sort && typeof sort === 'object' && sort.field) {
|
|
375
|
+
params[`_order[${sort.field}]`] = sort.dir === 'desc' ? 'desc' : 'asc';
|
|
376
|
+
}
|
|
377
|
+
if (Array.isArray(c.extend)) {
|
|
378
|
+
const extend = c.extend.filter((e) => typeof e === 'string' && e !== '');
|
|
379
|
+
if (extend.length > 0) {
|
|
380
|
+
params._extend = extend;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
for (const [key, value] of Object.entries(this.resolvedFilter)) {
|
|
384
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
385
|
+
for (const [op, operand] of Object.entries(value)) {
|
|
386
|
+
params[`${key}[${op}]`] = operand;
|
|
387
|
+
}
|
|
388
|
+
} else if (value !== '' && value !== null && value !== undefined) {
|
|
389
|
+
params[key] = value;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
const response = await axios.get(url, { params });
|
|
393
|
+
const data = response && response.data ? response.data : {};
|
|
394
|
+
this.rows = Array.isArray(data.results) ? data.results : [];
|
|
395
|
+
this.total = typeof data.total === 'number' ? data.total : this.rows.length;
|
|
396
|
+
} catch (e) {
|
|
397
|
+
// eslint-disable-next-line no-console
|
|
398
|
+
console.warn('[CnRecordListWidget] failed to load objects:', e);
|
|
399
|
+
this.rows = [];
|
|
400
|
+
this.total = 0;
|
|
401
|
+
this.error = true;
|
|
402
|
+
} finally {
|
|
403
|
+
this.loading = false;
|
|
404
|
+
this.emitHeader();
|
|
405
|
+
}
|
|
406
|
+
},
|
|
407
|
+
},
|
|
408
|
+
};
|
|
409
|
+
|
|
410
|
+
export { script as default };
|
|
411
|
+
//# sourceMappingURL=CnRecordListWidget.vue2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CnRecordListWidget.vue2.js","sources":["../../../../src/components/CnRecordListWidget/CnRecordListWidget.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n\n<template>\n\t<div\n\t\tclass=\"cn-record-list\"\n\t\t:class=\"`cn-record-list--${presentation}`\"\n\t\tdata-testid=\"cn-record-list\">\n\t\t<p v-if=\"error\" class=\"cn-record-list__error\" data-testid=\"cn-record-list-error\">\n\t\t\t{{ errorLabel }}\n\t\t</p>\n\t\t<div v-else-if=\"loading && rows.length === 0\" class=\"cn-record-list__loading\">\n\t\t\t<NcLoadingIcon :size=\"20\" :name=\"loadingLabel\" />\n\t\t</div>\n\t\t<p v-else-if=\"rows.length === 0\" class=\"cn-record-list__empty\" data-testid=\"cn-record-list-empty\">\n\t\t\t{{ emptyLabel }}\n\t\t</p>\n\t\t<ul v-else class=\"cn-record-list__list\">\n\t\t\t<li\n\t\t\t\tv-for=\"item in items\"\n\t\t\t\t:key=\"item.key\"\n\t\t\t\tclass=\"cn-record-list__item\"\n\t\t\t\tdata-testid=\"cn-record-list-item\">\n\t\t\t\t<!-- rows: title and meta, then the pill, the date and a chevron. -->\n\t\t\t\t<component\n\t\t\t\t\t:is=\"item.tag\"\n\t\t\t\t\tv-if=\"presentation === 'rows'\"\n\t\t\t\t\tclass=\"cn-record-list__row\"\n\t\t\t\t\t:class=\"{ 'cn-record-list__row--link': item.tag !== 'div' }\"\n\t\t\t\t\tv-bind=\"item.attrs\">\n\t\t\t\t\t<span v-if=\"item.initials\"\n\t\t\t\t\t\tclass=\"cn-record-list__avatar\"\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tdata-testid=\"cn-record-list-avatar\">{{ item.initials }}</span>\n\t\t\t\t\t<span class=\"cn-record-list__main\">\n\t\t\t\t\t\t<span v-if=\"item.title\" class=\"cn-record-list__title\">{{ item.title }}</span>\n\t\t\t\t\t\t<span v-if=\"item.meta\" class=\"cn-record-list__meta\">{{ item.meta }}</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span v-if=\"item.pill || item.trailing\" class=\"cn-record-list__aside\">\n\t\t\t\t\t\t<CnStatusBadge\n\t\t\t\t\t\t\tv-if=\"item.pill\"\n\t\t\t\t\t\t\t:label=\"item.pill.label\"\n\t\t\t\t\t\t\t:variant=\"item.pill.variant\"\n\t\t\t\t\t\t\tsize=\"small\" />\n\t\t\t\t\t\t<span v-if=\"item.trailing\" class=\"cn-record-list__trailing\">{{ item.trailing }}</span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<ChevronRight\n\t\t\t\t\t\tv-if=\"item.tag !== 'div'\"\n\t\t\t\t\t\tclass=\"cn-record-list__chevron\"\n\t\t\t\t\t\t:size=\"18\"\n\t\t\t\t\t\taria-hidden=\"true\" />\n\t\t\t\t</component>\n\n\t\t\t\t<!-- feed: a round icon, a meta line and the text. -->\n\t\t\t\t<div v-else-if=\"presentation === 'feed'\" class=\"cn-record-list__feed-row\">\n\t\t\t\t\t<span class=\"cn-record-list__feed-icon\" aria-hidden=\"true\">\n\t\t\t\t\t\t<CnIcon :name=\"item.icon\" :size=\"18\" />\n\t\t\t\t\t</span>\n\t\t\t\t\t<component :is=\"item.tag\" class=\"cn-record-list__main\" v-bind=\"item.attrs\">\n\t\t\t\t\t\t<span v-if=\"item.meta\" class=\"cn-record-list__meta\">{{ item.meta }}</span>\n\t\t\t\t\t\t<span v-if=\"item.text\" class=\"cn-record-list__text\">{{ item.text }}</span>\n\t\t\t\t\t</component>\n\t\t\t\t</div>\n\n\t\t\t\t<!-- inline: a label and the title, the title a link. -->\n\t\t\t\t<div v-else class=\"cn-record-list__inline-row\">\n\t\t\t\t\t<span v-if=\"item.label\" class=\"cn-record-list__label\">{{ item.label }}</span>\n\t\t\t\t\t<component :is=\"item.tag\" class=\"cn-record-list__inline-title\" v-bind=\"item.attrs\">\n\t\t\t\t\t\t{{ item.title }}\n\t\t\t\t\t</component>\n\t\t\t\t</div>\n\t\t\t</li>\n\t\t</ul>\n\t</div>\n</template>\n\n<script>\nimport { subscribe, unsubscribe } from '@nextcloud/event-bus'\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcLoadingIcon } from '@nextcloud/vue'\nimport ChevronRight from 'vue-material-design-icons/ChevronRight.vue'\nimport CnIcon from '../CnIcon/CnIcon.vue'\nimport CnStatusBadge from '../CnStatusBadge/CnStatusBadge.vue'\nimport { isBadgeVariant } from '../../utils/badgeVariants.js'\nimport { fillTemplate, firstFilled } from '../../utils/fillTemplate.js'\nimport { initialsOf } from '../../utils/initials.js'\nimport { pageFilter, pageSort } from '../../utils/pageControls.js'\nimport { readPath } from '../../utils/readPath.js'\nimport { dropOptionalUnresolved, hasUnresolvedTokens, resolveFilterTokens } from '../../utils/resolveFilterTokens.js'\n\nconst PAGE_REFRESH_CHANNEL = 'cn:page:refresh'\nconst PRESENTATIONS = ['rows', 'feed', 'inline']\n\n/**\n * Unwrap a value that may be a ref.\n *\n * @param {unknown} value The value.\n * @return {unknown} The plain value.\n */\nfunction unwrap(value) {\n\treturn value && typeof value === 'object' && 'value' in value ? value.value : value\n}\n\n/**\n * CnRecordListWidget — the objects of another schema that point at this\n * record, drawn as the boards draw them (screens-relation-pages).\n *\n * A person page lists its open cases (\"Verlichting fietspad Lindelaan,\n * 2026-0082 · Woo-verzoek, In behandeling, Termijn 1 nov\"), its latest contact\n * moments (an icon by channel, a meta line, the summary) and its relations\n * (\"Secretaris van Buurtvereniging Oost\"). Each is a list of another schema's\n * objects filtered on a reference to this record. The source keys are those of\n * `object-list` (`register`, `schema`, `filter` with the `@objectId` /\n * `@object.<field>` / `@workspace.<key>` tokens, `sort`, `limit`, `extend`,\n * `rowRoute`, `pageControls`); `avatar` puts a circle with the initials of a name\n * template before the title; what differs is the drawing: `presentation` is `rows`, `feed`\n * or `inline`, and each line is a template (`\"{identifier} · {caseTypeName}\"`,\n * `\"Termijn {deadline|date}\"`).\n *\n * A content-only catalog type: on a card surface the detail host draws the\n * titled card. The widget emits `header` with `{ link, note }` (the\n * `headerLink` and `headerNote` with `{total}` filled in) for that card's\n * header.\n */\nexport default {\n\tname: 'CnRecordListWidget',\n\n\tcomponents: { ChevronRight, CnIcon, CnStatusBadge, NcLoadingIcon },\n\n\tinject: {\n\t\t/** Detail-page object context (`{ objectId, object, register, schema }`). */\n\t\tcnObjectContext: { default: null },\n\t\t/** Page workspace bag, for `@workspace.<key>` tokens. */\n\t\tcnWorkspaceContext: { default: null },\n\t\t/** The host app's translate function. */\n\t\tcnTranslate: { default: () => (key) => key },\n\t},\n\n\tprops: {\n\t\t/**\n\t\t * The list config: `{ register, schema, filter?, sort?, limit?, extend?,\n\t\t * presentation?, title?, meta?, text?, label?, pill?, trailing?, icon?,\n\t\t * rowRoute?, rowIdField?, headerLink?, headerNote?, emptyText?, errorText? }`.\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 record's id, for the `@objectId` token. */\n\t\tobjectId: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** The current record, for `@object.<field>` tokens. */\n\t\tobjectData: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\t},\n\n\temits: ['header'],\n\n\tdata() {\n\t\treturn {\n\t\t\trows: [],\n\t\t\ttotal: 0,\n\t\t\tloading: false,\n\t\t\terror: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** @return {string} `rows`, `feed` or `inline`. */\n\t\tpresentation() {\n\t\t\tconst value = this.content?.presentation\n\t\t\treturn PRESENTATIONS.includes(value) ? value : 'rows'\n\t\t},\n\n\t\t/** @return {object} The token context: record, id and workspace. */\n\t\ttokenCtx() {\n\t\t\tconst injected = unwrap(this.cnObjectContext) || {}\n\t\t\treturn {\n\t\t\t\t...injected,\n\t\t\t\tobjectId: this.objectId ?? injected.objectId ?? this.objectData?.id ?? null,\n\t\t\t\tobject: this.objectData || injected.object || null,\n\t\t\t\tworkspace: unwrap(this.cnWorkspaceContext) || {},\n\t\t\t}\n\t\t},\n\n\t\t/** @return {object} The filter with its tokens resolved. */\n\t\tresolvedFilter() {\n\t\t\tconst filter = pageFilter(this.content?.pageControls, this.tokenCtx.workspace, this.content?.filter)\n\t\t\treturn dropOptionalUnresolved(resolveFilterTokens(filter, this.tokenCtx))\n\t\t},\n\n\t\t/** @return {boolean} A required token (the record id, say) has no value yet. */\n\t\twaiting() {\n\t\t\treturn hasUnresolvedTokens(this.resolvedFilter)\n\t\t},\n\n\t\t/** @return {object|null} The sort: the page's sort control when the widget listens to one, else its own. */\n\t\teffectiveSort() {\n\t\t\treturn pageSort(this.content?.pageControls, this.tokenCtx.workspace, this.content?.sort)\n\t\t},\n\n\t\t/** @return {number} The fetch cap. */\n\t\tlimit() {\n\t\t\tconst value = Number(this.content?.limit)\n\t\t\treturn Number.isFinite(value) && value > 0 ? Math.floor(value) : 5\n\t\t},\n\n\t\t/** @return {string} What a fetch depends on; a change fetches again. */\n\t\trequestKey() {\n\t\t\tconst c = this.content || {}\n\t\t\treturn JSON.stringify([c.register, c.schema, this.resolvedFilter, this.effectiveSort, this.limit, c.extend, this.waiting])\n\t\t},\n\n\t\t/** @return {Array<object>} The rows ready to draw. */\n\t\titems() {\n\t\t\tconst c = this.content || {}\n\t\t\treturn this.rows.slice(0, this.limit).map((row, index) => {\n\t\t\t\tconst link = this.rowLink(row)\n\t\t\t\treturn {\n\t\t\t\t\tkey: (row && (row.id || row['@self']?.id)) || `row-${index}`,\n\t\t\t\t\ttag: link ? 'router-link' : 'div',\n\t\t\t\t\tattrs: link ? { to: link } : {},\n\t\t\t\t\tinitials: this.initialsFor(row),\n\t\t\t\t\ttitle: this.fill(c.title, row),\n\t\t\t\t\tmeta: this.fill(c.meta, row),\n\t\t\t\t\ttext: this.fill(c.text, row),\n\t\t\t\t\tlabel: this.fill(c.label, row),\n\t\t\t\t\ttrailing: c.trailing ? firstFilled(c.trailing, row, this.translate) : '',\n\t\t\t\t\tpill: this.pillOf(row),\n\t\t\t\t\ticon: this.iconOf(row),\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\n\t\t/** @return {object|null} The header link with `{total}` filled and tokens resolved. */\n\t\theaderLink() {\n\t\t\tconst link = this.content?.headerLink\n\t\t\tif (!link || typeof link !== 'object' || typeof link.label !== 'string' || link.label === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst resolved = { label: this.withTotal(link.label) }\n\t\t\tif (link.route) {\n\t\t\t\tresolved.route = link.route\n\t\t\t\tif (link.params && typeof link.params === 'object') {\n\t\t\t\t\tresolved.params = resolveFilterTokens(link.params, this.tokenCtx)\n\t\t\t\t}\n\t\t\t\tif (link.query && typeof link.query === 'object') {\n\t\t\t\t\tresolved.query = resolveFilterTokens(link.query, this.tokenCtx)\n\t\t\t\t}\n\t\t\t} else if (typeof link.href === 'string') {\n\t\t\t\tresolved.href = link.href\n\t\t\t}\n\t\t\treturn resolved\n\t\t},\n\n\t\t/** @return {string} The header note with `{total}` filled. */\n\t\theaderNote() {\n\t\t\tconst note = this.content?.headerNote\n\t\t\treturn typeof note === 'string' && note !== '' ? this.withTotal(note) : ''\n\t\t},\n\n\t\t/** @return {string} The empty line. */\n\t\temptyLabel() {\n\t\t\treturn this.content?.emptyText ? this.translate(this.content.emptyText) : t('nextcloud-vue', 'Nothing here yet')\n\t\t},\n\n\t\t/** @return {string} The error line. */\n\t\terrorLabel() {\n\t\t\treturn this.content?.errorText ? this.translate(this.content.errorText) : t('nextcloud-vue', 'This list could not be loaded.')\n\t\t},\n\n\t\t/** @return {string} The spinner's accessible name. */\n\t\tloadingLabel() {\n\t\t\treturn t('nextcloud-vue', 'Loading …')\n\t\t},\n\t},\n\n\twatch: {\n\t\trequestKey() {\n\t\t\tthis.fetchRows()\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.onRefresh = () => this.fetchRows()\n\t\tsubscribe(PAGE_REFRESH_CHANNEL, this.onRefresh)\n\t\tthis.fetchRows()\n\t},\n\n\tbeforeUnmount() {\n\t\tunsubscribe(PAGE_REFRESH_CHANNEL, this.onRefresh)\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Translate a manifest string through the host app.\n\t\t *\n\t\t * @param {string} text The text.\n\t\t * @return {string} The translation.\n\t\t */\n\t\ttranslate(text) {\n\t\t\treturn typeof this.cnTranslate === 'function' ? this.cnTranslate(text) : text\n\t\t},\n\n\t\t/**\n\t\t * The initials of the row's avatar (`avatar`: a name template such as\n\t\t * `\"{client.name}\"`, or `{ text }`), or '' without one.\n\t\t *\n\t\t * @param {object} row The row.\n\t\t * @return {string} One or two letters.\n\t\t * @spec openspec/changes/screens-record-list-avatar/specs/record-list-avatar/spec.md#requirement-a-record-list-row-can-carry-an-avatar\n\t\t */\n\t\tinitialsFor(row) {\n\t\t\tconst avatar = this.content?.avatar\n\t\t\tconst template = typeof avatar === 'string' ? avatar : (avatar && typeof avatar === 'object' ? avatar.text : '')\n\t\t\treturn initialsOf(this.fill(template, row))\n\t\t},\n\n\t\t/**\n\t\t * Fill a template from a row, after translating it.\n\t\t *\n\t\t * @param {string} template The template.\n\t\t * @param {object} row The row.\n\t\t * @return {string} The text, '' when a token is empty.\n\t\t */\n\t\tfill(template, row) {\n\t\t\treturn typeof template === 'string' && template !== '' ? fillTemplate(this.translate(template), row) : ''\n\t\t},\n\n\t\t/**\n\t\t * Replace `{total}` in a translated label.\n\t\t *\n\t\t * @param {string} label The label.\n\t\t * @return {string} The text.\n\t\t */\n\t\twithTotal(label) {\n\t\t\treturn this.translate(label).replace(/\\{total\\}/g, String(this.total))\n\t\t},\n\n\t\t/**\n\t\t * The route a row opens: `rowRoute` with the id at `rowIdField`.\n\t\t *\n\t\t * @param {object} row The row.\n\t\t * @return {object|null} The router location, or null.\n\t\t */\n\t\trowLink(row) {\n\t\t\tconst route = this.content?.rowRoute\n\t\t\tif (!route || !this.$router || !row) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst field = this.content?.rowIdField\n\t\t\tconst id = field ? readPath(row, field) : (row.id || row['@self']?.id)\n\t\t\tif (id === null || id === undefined || id === '' || typeof id === 'object') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn { name: route, params: { id: String(id) } }\n\t\t},\n\n\t\t/**\n\t\t * The row's pill: `{ field, labels?, colorMap?, variant? }`.\n\t\t *\n\t\t * @param {object} row The row.\n\t\t * @return {{label: string, variant: string}|null} The pill, or null.\n\t\t */\n\t\tpillOf(row) {\n\t\t\tconst pill = this.content?.pill\n\t\t\tif (!pill || typeof pill !== 'object' || !pill.field) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst raw = readPath(row, pill.field)\n\t\t\tif (raw === null || raw === undefined || raw === '' || typeof raw === 'object') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst key = String(raw)\n\t\t\tconst labels = pill.labels && typeof pill.labels === 'object' ? pill.labels : {}\n\t\t\tconst map = pill.colorMap && typeof pill.colorMap === 'object' ? pill.colorMap : {}\n\t\t\tconst found = Object.keys(map).find((k) => k.toLowerCase() === key.toLowerCase())\n\t\t\tconst variant = found ? map[found] : pill.variant\n\t\t\treturn {\n\t\t\t\tlabel: labels[key] ? this.translate(labels[key]) : key,\n\t\t\t\tvariant: isBadgeVariant(variant) ? variant : 'default',\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * The feed icon: an icon name, or `{ field, map, default }`.\n\t\t *\n\t\t * @param {object} row The row.\n\t\t * @return {string} The MDI icon name.\n\t\t */\n\t\ticonOf(row) {\n\t\t\tconst icon = this.content?.icon\n\t\t\tif (typeof icon === 'string' && icon !== '') {\n\t\t\t\treturn icon\n\t\t\t}\n\t\t\tif (icon && typeof icon === 'object') {\n\t\t\t\tconst raw = icon.field ? readPath(row, icon.field) : undefined\n\t\t\t\tconst map = icon.map && typeof icon.map === 'object' ? icon.map : {}\n\t\t\t\tif (raw !== null && raw !== undefined && map[String(raw)]) {\n\t\t\t\t\treturn map[String(raw)]\n\t\t\t\t}\n\t\t\t\tif (typeof icon.default === 'string' && icon.default !== '') {\n\t\t\t\t\treturn icon.default\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn 'CircleSmall'\n\t\t},\n\n\t\t/** Tell the card around this list what its header shows. */\n\t\temitHeader() {\n\t\t\t/**\n\t\t\t * @event header Emitted after every read with the card header's parts.\n\t\t\t * @type {{link: (object|null), note: string}} The header link (resolved, with `{total}` filled) and the note.\n\t\t\t */\n\t\t\tthis.$emit('header', { link: this.headerLink, note: this.headerNote })\n\t\t},\n\n\t\t/**\n\t\t * Fetch the list. Sends nothing while a required token is unresolved\n\t\t * or the source is incomplete.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync fetchRows() {\n\t\t\tconst c = this.content || {}\n\t\t\tif (!c.register || !c.schema || this.waiting) {\n\t\t\t\tthis.rows = []\n\t\t\t\tthis.total = 0\n\t\t\t\tthis.error = false\n\t\t\t\tthis.emitHeader()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.loading = true\n\t\t\tthis.error = false\n\t\t\ttry {\n\t\t\t\tconst [{ default: axios }, { generateUrl }] = await Promise.all([\n\t\t\t\t\timport('@nextcloud/axios'),\n\t\t\t\t\timport('@nextcloud/router'),\n\t\t\t\t])\n\t\t\t\tconst url = generateUrl('/apps/openregister/api/objects/{register}/{schema}', { register: c.register, schema: c.schema })\n\t\t\t\tconst params = { _limit: this.limit }\n\t\t\t\tconst sort = this.effectiveSort\n\t\t\t\tif (sort && typeof sort === 'object' && sort.field) {\n\t\t\t\t\tparams[`_order[${sort.field}]`] = sort.dir === 'desc' ? 'desc' : 'asc'\n\t\t\t\t}\n\t\t\t\tif (Array.isArray(c.extend)) {\n\t\t\t\t\tconst extend = c.extend.filter((e) => typeof e === 'string' && e !== '')\n\t\t\t\t\tif (extend.length > 0) {\n\t\t\t\t\t\tparams._extend = extend\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (const [key, value] of Object.entries(this.resolvedFilter)) {\n\t\t\t\t\tif (value && typeof value === 'object' && !Array.isArray(value)) {\n\t\t\t\t\t\tfor (const [op, operand] of Object.entries(value)) {\n\t\t\t\t\t\t\tparams[`${key}[${op}]`] = operand\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (value !== '' && value !== null && value !== undefined) {\n\t\t\t\t\t\tparams[key] = value\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst response = await axios.get(url, { params })\n\t\t\t\tconst data = response && response.data ? response.data : {}\n\t\t\t\tthis.rows = Array.isArray(data.results) ? data.results : []\n\t\t\t\tthis.total = typeof data.total === 'number' ? data.total : this.rows.length\n\t\t\t} catch (e) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.warn('[CnRecordListWidget] failed to load objects:', e)\n\t\t\t\tthis.rows = []\n\t\t\t\tthis.total = 0\n\t\t\t\tthis.error = true\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t\tthis.emitHeader()\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-record-list__list {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.cn-record-list__empty,\n.cn-record-list__error {\n\tcolor: var(--color-text-maxcontrast);\n\tmargin: 0;\n}\n\n.cn-record-list__loading {\n\tdisplay: flex;\n\tjustify-content: center;\n\tpadding: 8px 0;\n}\n\n/* rows */\n.cn-record-list--rows .cn-record-list__item + .cn-record-list__item {\n\tborder-top: 1px solid var(--color-border);\n}\n\n.cn-record-list__row {\n\talign-items: center;\n\tcolor: var(--color-main-text);\n\tdisplay: flex;\n\tgap: 16px;\n\tpadding: 12px 0;\n\ttext-decoration: none;\n}\n\n.cn-record-list__row--link:hover .cn-record-list__title,\n.cn-record-list__row--link:focus-visible .cn-record-list__title {\n\ttext-decoration: underline;\n}\n\n.cn-record-list__avatar {\n\talign-items: center;\n\tbackground: var(--color-background-hover);\n\tborder-radius: 50%;\n\tcolor: var(--color-main-text);\n\tdisplay: flex;\n\tflex: none;\n\tfont-size: 12px;\n\tfont-weight: 700;\n\theight: 36px;\n\tjustify-content: center;\n\twidth: 36px;\n}\n\n.cn-record-list__main {\n\tdisplay: flex;\n\tflex: 1 1 auto;\n\tflex-direction: column;\n\tgap: 2px;\n\tmin-width: 0;\n}\n\n.cn-record-list__title {\n\tfont-size: 15px;\n\tfont-weight: 700;\n}\n\n.cn-record-list__meta {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n}\n\n.cn-record-list__aside {\n\talign-items: center;\n\tdisplay: flex;\n\tflex: none;\n\tgap: 16px;\n}\n\n.cn-record-list__trailing {\n\tfont-size: 14px;\n\twhite-space: nowrap;\n}\n\n.cn-record-list__chevron {\n\tcolor: var(--color-text-maxcontrast);\n\tflex: none;\n}\n\n/* feed */\n.cn-record-list--feed .cn-record-list__item + .cn-record-list__item {\n\tborder-top: 1px solid var(--color-border);\n}\n\n.cn-record-list__feed-row {\n\talign-items: flex-start;\n\tdisplay: flex;\n\tgap: 14px;\n\tpadding: 12px 0;\n}\n\n.cn-record-list__feed-icon {\n\talign-items: center;\n\tbackground: var(--color-primary-element-light);\n\tborder-radius: 50%;\n\tcolor: var(--color-primary-element-light-text, var(--color-primary-element));\n\tdisplay: flex;\n\tflex: none;\n\theight: 36px;\n\tjustify-content: center;\n\twidth: 36px;\n}\n\n.cn-record-list__text {\n\tfont-size: 15px;\n}\n\n.cn-record-list--feed .cn-record-list__main {\n\tcolor: var(--color-main-text);\n\ttext-decoration: none;\n}\n\n/* inline */\n.cn-record-list__inline-row {\n\tpadding: 4px 0;\n}\n\n.cn-record-list__label {\n\tmargin-inline-end: 4px;\n}\n\n.cn-record-list__inline-title {\n\tcolor: var(--color-main-text);\n}\n\na.cn-record-list__inline-title {\n\tcolor: var(--color-primary-element);\n\ttext-decoration: underline;\n}\n</style>\n\n<style>\n/* In a narrow side column a row stacks: title, meta, then pill and date. */\n.cn-detail-page__side .cn-record-list__row {\n\talign-items: flex-start;\n\tflex-direction: column;\n\tgap: 6px;\n}\n\n.cn-detail-page__side .cn-record-list__row .cn-record-list__title {\n\tcolor: var(--color-primary-element);\n\ttext-decoration: underline;\n}\n\n.cn-detail-page__side .cn-record-list__chevron {\n\tdisplay: none;\n}\n\n/* A row is a touch target of at least 44px on a phone. */\n@media (max-width: 640px) {\n\t.cn-record-list__row {\n\t\tmin-height: 44px;\n\t}\n}\n</style>\n"],"names":["CnIcon","CnStatusBadge","t"],"mappings":"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"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { resolveComponent, openBlock, createElementBlock, normalizeClass, toDisplayString, createVNode, Fragment, renderList, createBlock, resolveDynamicComponent, mergeProps, withCtx, createCommentVNode, createElementVNode, createTextVNode } from 'vue';
|
|
2
|
+
|
|
3
|
+
const _hoisted_1 = {
|
|
4
|
+
key: 0,
|
|
5
|
+
class: "cn-record-list__error",
|
|
6
|
+
"data-testid": "cn-record-list-error"
|
|
7
|
+
};
|
|
8
|
+
const _hoisted_2 = {
|
|
9
|
+
key: 1,
|
|
10
|
+
class: "cn-record-list__loading"
|
|
11
|
+
};
|
|
12
|
+
const _hoisted_3 = {
|
|
13
|
+
key: 2,
|
|
14
|
+
class: "cn-record-list__empty",
|
|
15
|
+
"data-testid": "cn-record-list-empty"
|
|
16
|
+
};
|
|
17
|
+
const _hoisted_4 = {
|
|
18
|
+
key: 3,
|
|
19
|
+
class: "cn-record-list__list"
|
|
20
|
+
};
|
|
21
|
+
const _hoisted_5 = {
|
|
22
|
+
key: 0,
|
|
23
|
+
class: "cn-record-list__avatar",
|
|
24
|
+
"aria-hidden": "true",
|
|
25
|
+
"data-testid": "cn-record-list-avatar"
|
|
26
|
+
};
|
|
27
|
+
const _hoisted_6 = { class: "cn-record-list__main" };
|
|
28
|
+
const _hoisted_7 = {
|
|
29
|
+
key: 0,
|
|
30
|
+
class: "cn-record-list__title"
|
|
31
|
+
};
|
|
32
|
+
const _hoisted_8 = {
|
|
33
|
+
key: 1,
|
|
34
|
+
class: "cn-record-list__meta"
|
|
35
|
+
};
|
|
36
|
+
const _hoisted_9 = {
|
|
37
|
+
key: 1,
|
|
38
|
+
class: "cn-record-list__aside"
|
|
39
|
+
};
|
|
40
|
+
const _hoisted_10 = {
|
|
41
|
+
key: 1,
|
|
42
|
+
class: "cn-record-list__trailing"
|
|
43
|
+
};
|
|
44
|
+
const _hoisted_11 = {
|
|
45
|
+
key: 1,
|
|
46
|
+
class: "cn-record-list__feed-row"
|
|
47
|
+
};
|
|
48
|
+
const _hoisted_12 = {
|
|
49
|
+
class: "cn-record-list__feed-icon",
|
|
50
|
+
"aria-hidden": "true"
|
|
51
|
+
};
|
|
52
|
+
const _hoisted_13 = {
|
|
53
|
+
key: 0,
|
|
54
|
+
class: "cn-record-list__meta"
|
|
55
|
+
};
|
|
56
|
+
const _hoisted_14 = {
|
|
57
|
+
key: 1,
|
|
58
|
+
class: "cn-record-list__text"
|
|
59
|
+
};
|
|
60
|
+
const _hoisted_15 = {
|
|
61
|
+
key: 2,
|
|
62
|
+
class: "cn-record-list__inline-row"
|
|
63
|
+
};
|
|
64
|
+
const _hoisted_16 = {
|
|
65
|
+
key: 0,
|
|
66
|
+
class: "cn-record-list__label"
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
70
|
+
const _component_NcLoadingIcon = resolveComponent("NcLoadingIcon");
|
|
71
|
+
const _component_CnStatusBadge = resolveComponent("CnStatusBadge");
|
|
72
|
+
const _component_ChevronRight = resolveComponent("ChevronRight");
|
|
73
|
+
const _component_CnIcon = resolveComponent("CnIcon");
|
|
74
|
+
|
|
75
|
+
return (openBlock(), createElementBlock("div", {
|
|
76
|
+
class: normalizeClass(["cn-record-list", `cn-record-list--${$options.presentation}`]),
|
|
77
|
+
"data-testid": "cn-record-list"
|
|
78
|
+
}, [
|
|
79
|
+
($data.error)
|
|
80
|
+
? (openBlock(), createElementBlock("p", _hoisted_1, toDisplayString($options.errorLabel), 1 /* TEXT */))
|
|
81
|
+
: ($data.loading && $data.rows.length === 0)
|
|
82
|
+
? (openBlock(), createElementBlock("div", _hoisted_2, [
|
|
83
|
+
createVNode(_component_NcLoadingIcon, {
|
|
84
|
+
size: 20,
|
|
85
|
+
name: $options.loadingLabel
|
|
86
|
+
}, null, 8 /* PROPS */, ["name"])
|
|
87
|
+
]))
|
|
88
|
+
: ($data.rows.length === 0)
|
|
89
|
+
? (openBlock(), createElementBlock("p", _hoisted_3, toDisplayString($options.emptyLabel), 1 /* TEXT */))
|
|
90
|
+
: (openBlock(), createElementBlock("ul", _hoisted_4, [
|
|
91
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList($options.items, (item) => {
|
|
92
|
+
return (openBlock(), createElementBlock("li", {
|
|
93
|
+
key: item.key,
|
|
94
|
+
class: "cn-record-list__item",
|
|
95
|
+
"data-testid": "cn-record-list-item"
|
|
96
|
+
}, [
|
|
97
|
+
($options.presentation === 'rows')
|
|
98
|
+
? (openBlock(), createBlock(resolveDynamicComponent(item.tag), mergeProps({
|
|
99
|
+
key: 0,
|
|
100
|
+
class: ["cn-record-list__row", { 'cn-record-list__row--link': item.tag !== 'div' }]
|
|
101
|
+
}, { ref_for: true }, item.attrs), {
|
|
102
|
+
default: withCtx(() => [
|
|
103
|
+
(item.initials)
|
|
104
|
+
? (openBlock(), createElementBlock("span", _hoisted_5, toDisplayString(item.initials), 1 /* TEXT */))
|
|
105
|
+
: createCommentVNode("v-if", true),
|
|
106
|
+
createElementVNode("span", _hoisted_6, [
|
|
107
|
+
(item.title)
|
|
108
|
+
? (openBlock(), createElementBlock("span", _hoisted_7, toDisplayString(item.title), 1 /* TEXT */))
|
|
109
|
+
: createCommentVNode("v-if", true),
|
|
110
|
+
(item.meta)
|
|
111
|
+
? (openBlock(), createElementBlock("span", _hoisted_8, toDisplayString(item.meta), 1 /* TEXT */))
|
|
112
|
+
: createCommentVNode("v-if", true)
|
|
113
|
+
]),
|
|
114
|
+
(item.pill || item.trailing)
|
|
115
|
+
? (openBlock(), createElementBlock("span", _hoisted_9, [
|
|
116
|
+
(item.pill)
|
|
117
|
+
? (openBlock(), createBlock(_component_CnStatusBadge, {
|
|
118
|
+
key: 0,
|
|
119
|
+
label: item.pill.label,
|
|
120
|
+
variant: item.pill.variant,
|
|
121
|
+
size: "small"
|
|
122
|
+
}, null, 8 /* PROPS */, ["label", "variant"]))
|
|
123
|
+
: createCommentVNode("v-if", true),
|
|
124
|
+
(item.trailing)
|
|
125
|
+
? (openBlock(), createElementBlock("span", _hoisted_10, toDisplayString(item.trailing), 1 /* TEXT */))
|
|
126
|
+
: createCommentVNode("v-if", true)
|
|
127
|
+
]))
|
|
128
|
+
: createCommentVNode("v-if", true),
|
|
129
|
+
(item.tag !== 'div')
|
|
130
|
+
? (openBlock(), createBlock(_component_ChevronRight, {
|
|
131
|
+
key: 2,
|
|
132
|
+
class: "cn-record-list__chevron",
|
|
133
|
+
size: 18,
|
|
134
|
+
"aria-hidden": "true"
|
|
135
|
+
}))
|
|
136
|
+
: createCommentVNode("v-if", true)
|
|
137
|
+
]),
|
|
138
|
+
_: 2 /* DYNAMIC */
|
|
139
|
+
}, 1040 /* FULL_PROPS, DYNAMIC_SLOTS */, ["class"]))
|
|
140
|
+
: ($options.presentation === 'feed')
|
|
141
|
+
? (openBlock(), createElementBlock("div", _hoisted_11, [
|
|
142
|
+
createElementVNode("span", _hoisted_12, [
|
|
143
|
+
createVNode(_component_CnIcon, {
|
|
144
|
+
name: item.icon,
|
|
145
|
+
size: 18
|
|
146
|
+
}, null, 8 /* PROPS */, ["name"])
|
|
147
|
+
]),
|
|
148
|
+
(openBlock(), createBlock(resolveDynamicComponent(item.tag), mergeProps({ class: "cn-record-list__main" }, { ref_for: true }, item.attrs), {
|
|
149
|
+
default: withCtx(() => [
|
|
150
|
+
(item.meta)
|
|
151
|
+
? (openBlock(), createElementBlock("span", _hoisted_13, toDisplayString(item.meta), 1 /* TEXT */))
|
|
152
|
+
: createCommentVNode("v-if", true),
|
|
153
|
+
(item.text)
|
|
154
|
+
? (openBlock(), createElementBlock("span", _hoisted_14, toDisplayString(item.text), 1 /* TEXT */))
|
|
155
|
+
: createCommentVNode("v-if", true)
|
|
156
|
+
]),
|
|
157
|
+
_: 2 /* DYNAMIC */
|
|
158
|
+
}, 1040 /* FULL_PROPS, DYNAMIC_SLOTS */))
|
|
159
|
+
]))
|
|
160
|
+
: (openBlock(), createElementBlock("div", _hoisted_15, [
|
|
161
|
+
(item.label)
|
|
162
|
+
? (openBlock(), createElementBlock("span", _hoisted_16, toDisplayString(item.label), 1 /* TEXT */))
|
|
163
|
+
: createCommentVNode("v-if", true),
|
|
164
|
+
(openBlock(), createBlock(resolveDynamicComponent(item.tag), mergeProps({ class: "cn-record-list__inline-title" }, { ref_for: true }, item.attrs), {
|
|
165
|
+
default: withCtx(() => [
|
|
166
|
+
createTextVNode(toDisplayString(item.title), 1 /* TEXT */)
|
|
167
|
+
]),
|
|
168
|
+
_: 2 /* DYNAMIC */
|
|
169
|
+
}, 1040 /* FULL_PROPS, DYNAMIC_SLOTS */))
|
|
170
|
+
]))
|
|
171
|
+
]))
|
|
172
|
+
}), 128 /* KEYED_FRAGMENT */))
|
|
173
|
+
]))
|
|
174
|
+
], 2 /* CLASS */))
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export { render };
|
|
178
|
+
//# sourceMappingURL=CnRecordListWidget.vue3.js.map
|