@conduction/nextcloud-vue 2.58.0 → 2.60.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js +12 -2
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js.map +1 -1
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js +1 -2
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js.map +1 -1
- package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue2.js +14 -1
- package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue2.js.map +1 -1
- package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue3.js +0 -3
- package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue3.js.map +1 -1
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js.map +1 -1
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js +1 -2
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js.map +1 -1
- package/dist/esm/components/CnAppNav/CnAppNav.vue2.js +39 -0
- package/dist/esm/components/CnAppNav/CnAppNav.vue2.js.map +1 -1
- package/dist/esm/components/CnAppNav/CnAppNav.vue3.js +46 -4
- package/dist/esm/components/CnAppNav/CnAppNav.vue3.js.map +1 -1
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js +224 -9
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js +79 -25
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnBannerWidgetForm/CnBannerWidgetForm.vue2.js +42 -3
- package/dist/esm/components/CnBannerWidgetForm/CnBannerWidgetForm.vue2.js.map +1 -1
- package/dist/esm/components/CnBannerWidgetForm/CnBannerWidgetForm.vue3.js +39 -6
- package/dist/esm/components/CnBannerWidgetForm/CnBannerWidgetForm.vue3.js.map +1 -1
- package/dist/esm/components/CnBoardView/CnBoardView.vue2.js +58 -5
- package/dist/esm/components/CnBoardView/CnBoardView.vue2.js.map +1 -1
- package/dist/esm/components/CnBoardView/CnBoardView.vue3.js +13 -5
- package/dist/esm/components/CnBoardView/CnBoardView.vue3.js.map +1 -1
- package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue.js +10 -0
- package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue.js.map +1 -0
- package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue2.js +39 -0
- package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue2.js.map +1 -0
- package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue3.js +16 -0
- package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue3.js.map +1 -0
- package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js +9 -1
- package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js.map +1 -1
- package/dist/esm/components/CnCardGrid/CnCardGrid.vue3.js.map +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +117 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +147 -89
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
- package/dist/esm/components/CnContextMenu/CnContextMenu.vue2.js +6 -1
- package/dist/esm/components/CnContextMenu/CnContextMenu.vue2.js.map +1 -1
- package/dist/esm/components/CnContextMenu/CnContextMenu.vue3.js.map +1 -1
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue.js +10 -0
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue.js.map +1 -0
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue2.js +259 -0
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue2.js.map +1 -0
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue3.js +131 -0
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue3.js.map +1 -0
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue.js +10 -0
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue.js.map +1 -0
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js +116 -0
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js +24 -0
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +116 -15
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +27 -14
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
- package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue2.js +13 -6
- package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue2.js.map +1 -1
- package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue3.js +2 -0
- package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +532 -29
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +300 -142
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue.js +10 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue.js.map +1 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue2.js +237 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue2.js.map +1 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue3.js +120 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue3.js.map +1 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue.js +10 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue.js.map +1 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue2.js +77 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue3.js +27 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue2.js.map +1 -1
- package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue3.js +1 -2
- package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue3.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +3 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +17 -17
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
- package/dist/esm/components/CnFilesWidget/CnFilesWidget.vue2.js +4 -21
- package/dist/esm/components/CnFilesWidget/CnFilesWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnFilesWidget/CnFilesWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue2.js +0 -13
- package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue3.js +8 -8
- package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnFlowsPage/CnFlowsPage.vue2.js.map +1 -1
- package/dist/esm/components/CnFlowsPage/CnFlowsPage.vue3.js +3 -2
- package/dist/esm/components/CnFlowsPage/CnFlowsPage.vue3.js.map +1 -1
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js +169 -12
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js +15 -7
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue2.js +37 -3
- package/dist/esm/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue2.js.map +1 -1
- package/dist/esm/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue3.js +44 -16
- package/dist/esm/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +199 -16
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +20 -10
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/manifestActionDispatch.js +31 -11
- package/dist/esm/components/CnIndexPage/manifestActionDispatch.js.map +1 -1
- package/dist/esm/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue2.js.map +1 -1
- package/dist/esm/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue3.js +1 -2
- package/dist/esm/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue3.js.map +1 -1
- package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue3.js +0 -1
- package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnLinkButtonWidget/CnLinkButtonWidget.vue2.js +2 -17
- package/dist/esm/components/CnLinkButtonWidget/CnLinkButtonWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnLinkButtonWidget/CnLinkButtonWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnLogsPage/CnLogsPage.vue2.js +35 -11
- package/dist/esm/components/CnLogsPage/CnLogsPage.vue2.js.map +1 -1
- package/dist/esm/components/CnLogsPage/CnLogsPage.vue3.js +3 -2
- package/dist/esm/components/CnLogsPage/CnLogsPage.vue3.js.map +1 -1
- package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue.js +10 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue.js.map +1 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue2.js +150 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue2.js.map +1 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue3.js +106 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue3.js.map +1 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue.js +9 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue.js.map +1 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue2.js +47 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue3.js +17 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js +23 -5
- package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js +1 -1
- package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js +49 -0
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectDataWidgetForm/CnObjectDataWidgetForm.vue2.js +6 -0
- package/dist/esm/components/CnObjectDataWidgetForm/CnObjectDataWidgetForm.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectDataWidgetForm/CnObjectDataWidgetForm.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectKanban/CnObjectKanban.vue2.js +46 -0
- package/dist/esm/components/CnObjectKanban/CnObjectKanban.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectKanban/CnObjectKanban.vue3.js +15 -3
- package/dist/esm/components/CnObjectKanban/CnObjectKanban.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectList/CnObjectList.vue2.js +19 -3
- package/dist/esm/components/CnObjectList/CnObjectList.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectList/CnObjectList.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +45 -15
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js +4 -2
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectRow/CnObjectRow.vue2.js +24 -6
- package/dist/esm/components/CnObjectRow/CnObjectRow.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectRow/CnObjectRow.vue3.js +1 -1
- package/dist/esm/components/CnObjectRow/CnObjectRow.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +0 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
- package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue2.js.map +1 -1
- package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue3.js +4 -2
- package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue3.js.map +1 -1
- package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue2.js +37 -1
- package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue2.js.map +1 -1
- package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue3.js +29 -13
- package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue3.js.map +1 -1
- package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue2.js +100 -3
- package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnRowActions/CnRowActions.vue2.js +7 -2
- package/dist/esm/components/CnRowActions/CnRowActions.vue2.js.map +1 -1
- package/dist/esm/components/CnRowActions/CnRowActions.vue3.js.map +1 -1
- package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue2.js +50 -3
- package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue2.js.map +1 -1
- package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue3.js.map +1 -1
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue.js +10 -0
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue.js.map +1 -0
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js +186 -0
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js.map +1 -0
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js +46 -0
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js.map +1 -0
- package/dist/esm/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue2.js +5 -3
- package/dist/esm/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue.js +11 -0
- package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue.js.map +1 -0
- package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue2.js +298 -0
- package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue3.js +77 -0
- package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue.js +10 -0
- package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue.js.map +1 -0
- package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue2.js +169 -0
- package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue2.js.map +1 -0
- package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue3.js +48 -0
- package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue3.js.map +1 -0
- package/dist/esm/components/CnTabs/CnTab.vue2.js +35 -0
- package/dist/esm/components/CnTabs/CnTab.vue2.js.map +1 -1
- package/dist/esm/components/CnTabs/CnTab.vue3.js.map +1 -1
- package/dist/esm/components/CnTabs/CnTabs.vue2.js +120 -7
- package/dist/esm/components/CnTabs/CnTabs.vue2.js.map +1 -1
- package/dist/esm/components/CnTabs/CnTabs.vue3.js +57 -5
- package/dist/esm/components/CnTabs/CnTabs.vue3.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +59 -4
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +6 -2
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js +3 -1
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js +1 -0
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue.js +10 -0
- package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue.js.map +1 -0
- package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue2.js +484 -0
- package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue3.js +115 -0
- package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue.js +10 -0
- package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue.js.map +1 -0
- package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue2.js +189 -0
- package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue2.js.map +1 -0
- package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue3.js +74 -0
- package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue3.js.map +1 -0
- package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +82 -8
- package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
- package/dist/esm/index.js +10 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/integrations/builtin/analytics/CnAnalyticsCard.vue2.js +3 -1
- package/dist/esm/integrations/builtin/analytics/CnAnalyticsCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/analytics/CnAnalyticsCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue2.js +3 -1
- package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue3.js +2 -4
- package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue2.js +6 -0
- package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue3.js +68 -53
- package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue2.js +17 -0
- package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue3.js +21 -19
- package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/collectives/CnCollectivesCard.vue2.js +3 -1
- package/dist/esm/integrations/builtin/collectives/CnCollectivesCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/collectives/CnCollectivesCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue2.js +3 -1
- package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue3.js +2 -4
- package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/cospend/CnCospendCard.vue2.js +2 -1
- package/dist/esm/integrations/builtin/cospend/CnCospendCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/cospend/CnCospendCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue2.js +2 -1
- package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue3.js +1 -2
- package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/deck/CnDeckCard.vue2.js +2 -1
- package/dist/esm/integrations/builtin/deck/CnDeckCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/deck/CnDeckCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/deck/CnDeckTab.vue2.js +2 -1
- package/dist/esm/integrations/builtin/deck/CnDeckTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/deck/CnDeckTab.vue3.js +1 -2
- package/dist/esm/integrations/builtin/deck/CnDeckTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/email/CnEmailCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/email/CnEmailCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/email/CnEmailTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/email/CnEmailTab.vue3.js +1 -2
- package/dist/esm/integrations/builtin/email/CnEmailTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/flow/CnFlowCard.vue2.js +2 -1
- package/dist/esm/integrations/builtin/flow/CnFlowCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/flow/CnFlowCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/flow/CnFlowTab.vue2.js +2 -1
- package/dist/esm/integrations/builtin/flow/CnFlowTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/flow/CnFlowTab.vue3.js +1 -2
- package/dist/esm/integrations/builtin/flow/CnFlowTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/forms/CnFormsCard.vue2.js +3 -1
- package/dist/esm/integrations/builtin/forms/CnFormsCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/forms/CnFormsCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/forms/CnFormsTab.vue2.js +3 -1
- package/dist/esm/integrations/builtin/forms/CnFormsTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/forms/CnFormsTab.vue3.js +2 -4
- package/dist/esm/integrations/builtin/forms/CnFormsTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/maps/CnMapsCard.vue2.js +3 -1
- package/dist/esm/integrations/builtin/maps/CnMapsCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/maps/CnMapsCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/maps/CnMapsTab.vue2.js +3 -1
- package/dist/esm/integrations/builtin/maps/CnMapsTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/maps/CnMapsTab.vue3.js +2 -4
- package/dist/esm/integrations/builtin/maps/CnMapsTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/openproject/CnOpenprojectCard.vue2.js +3 -1
- package/dist/esm/integrations/builtin/openproject/CnOpenprojectCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/openproject/CnOpenprojectCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue2.js +3 -1
- package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue3.js +2 -4
- package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/photos/CnPhotosCard.vue2.js +2 -1
- package/dist/esm/integrations/builtin/photos/CnPhotosCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/photos/CnPhotosCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue2.js +2 -1
- package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue3.js +1 -2
- package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/polls/CnPollsCard.vue2.js +2 -1
- package/dist/esm/integrations/builtin/polls/CnPollsCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/polls/CnPollsCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/polls/CnPollsTab.vue2.js +2 -1
- package/dist/esm/integrations/builtin/polls/CnPollsTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/polls/CnPollsTab.vue3.js +1 -2
- package/dist/esm/integrations/builtin/polls/CnPollsTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/shares/CnSharesTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/shares/CnSharesTab.vue3.js +3 -6
- package/dist/esm/integrations/builtin/shares/CnSharesTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/talk/CnTalkCard.vue2.js +3 -1
- package/dist/esm/integrations/builtin/talk/CnTalkCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/talk/CnTalkCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/talk/CnTalkTab.vue2.js +3 -1
- package/dist/esm/integrations/builtin/talk/CnTalkTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/talk/CnTalkTab.vue3.js +2 -4
- package/dist/esm/integrations/builtin/talk/CnTalkTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerCard.vue2.js +2 -1
- package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue2.js +2 -1
- package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue3.js +1 -2
- package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/xwiki/CnXwikiCard.vue2.js +4 -1
- package/dist/esm/integrations/builtin/xwiki/CnXwikiCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/xwiki/CnXwikiCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue2.js +6 -3
- package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue3.js +2 -4
- package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue3.js.map +1 -1
- package/dist/esm/l10n/en.json.js +55 -1
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +55 -1
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/nextcloud-vue.css +998 -7
- package/dist/esm/utils/actionLink.js +5 -0
- package/dist/esm/utils/actionLink.js.map +1 -1
- package/dist/esm/utils/actionsDispatcher.js +16 -1
- package/dist/esm/utils/actionsDispatcher.js.map +1 -1
- package/dist/esm/utils/dateVariant.js +124 -0
- package/dist/esm/utils/dateVariant.js.map +1 -0
- package/dist/esm/utils/detailActionModel.js +260 -0
- package/dist/esm/utils/detailActionModel.js.map +1 -0
- package/dist/esm/utils/dueRule.js +84 -0
- package/dist/esm/utils/dueRule.js.map +1 -0
- package/dist/esm/utils/fetchAggregate.js +37 -1
- package/dist/esm/utils/fetchAggregate.js.map +1 -1
- package/dist/esm/utils/fetchFilterCounts.js +186 -0
- package/dist/esm/utils/fetchFilterCounts.js.map +1 -0
- package/dist/esm/utils/libraryWidgetKeys.js +5 -0
- package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
- package/dist/esm/utils/linkNavigation.js +6 -3
- package/dist/esm/utils/linkNavigation.js.map +1 -1
- package/dist/esm/utils/readPath.js +30 -0
- package/dist/esm/utils/readPath.js.map +1 -0
- package/dist/esm/utils/rowAuxClick.js +30 -5
- package/dist/esm/utils/rowAuxClick.js.map +1 -1
- package/dist/esm/utils/safeHref.js +18 -3
- package/dist/esm/utils/safeHref.js.map +1 -1
- package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
- package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
- package/dist/nextcloud-vue.cjs.js +15855 -9353
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +998 -7
- package/l10n/en.json +55 -1
- package/l10n/nl.json +55 -1
- package/package.json +1 -1
- package/scripts/.jsdoc-baselines.json +3 -0
- package/src/components/CnActionsBar/CnActionsBar.vue +14 -5
- package/src/components/CnActionsMenu/CnActionsMenu.vue +14 -4
- package/src/components/CnAdminSettingsShell/CnAdminSettingsShell.vue +1 -2
- package/src/components/CnAppNav/CnAppNav.md +26 -0
- package/src/components/CnAppNav/CnAppNav.vue +104 -1
- package/src/components/CnBannerWidget/CnBannerWidget.vue +365 -10
- package/src/components/CnBannerWidgetForm/CnBannerWidgetForm.vue +65 -3
- package/src/components/CnBoardView/CnBoardView.vue +90 -5
- package/src/components/CnBrandStripe/CnBrandStripe.md +22 -0
- package/src/components/CnBrandStripe/CnBrandStripe.vue +100 -0
- package/src/components/CnBrandStripe/index.js +4 -0
- package/src/components/CnCardGrid/CnCardGrid.vue +9 -1
- package/src/components/CnCellRenderer/CnCellRenderer.vue +207 -1
- package/src/components/CnContextMenu/CnContextMenu.vue +6 -1
- package/src/components/CnConversationThread/CnConversationThread.md +51 -0
- package/src/components/CnConversationThread/CnConversationThread.vue +457 -0
- package/src/components/CnConversationThread/CnConversationWidget.vue +144 -0
- package/src/components/CnConversationThread/index.js +4 -0
- package/src/components/CnDataTable/CnDataTable.md +1 -1
- package/src/components/CnDataTable/CnDataTable.vue +131 -17
- package/src/components/CnDateAxisView/CnDateAxisView.vue +15 -6
- package/src/components/CnDetailPage/CnDetailPage.md +17 -1
- package/src/components/CnDetailPage/CnDetailPage.vue +712 -49
- package/src/components/CnDocumentReviewList/CnDocumentReviewList.md +55 -0
- package/src/components/CnDocumentReviewList/CnDocumentReviewList.vue +384 -0
- package/src/components/CnDocumentReviewList/CnDocumentReviewWidget.vue +108 -0
- package/src/components/CnDocumentReviewList/index.js +4 -0
- package/src/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue +1 -2
- package/src/components/CnFilesBrowser/CnFilesBrowser.vue +5 -3
- package/src/components/CnFilesWidget/CnFilesWidget.vue +4 -21
- package/src/components/CnFlowRunsWidget/CnFlowRunsWidget.vue +8 -21
- package/src/components/CnFlowsPage/CnFlowsPage.vue +2 -1
- package/src/components/CnHeaderWidget/CnHeaderWidget.vue +189 -14
- package/src/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue +53 -3
- package/src/components/CnIndexPage/CnIndexPage.vue +210 -17
- package/src/components/CnIndexPage/manifestActionDispatch.js +31 -11
- package/src/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue +1 -2
- package/src/components/CnInteractionFormWidget/CnInteractionFormWidget.vue +0 -1
- package/src/components/CnLinkButtonWidget/CnLinkButtonWidget.vue +2 -17
- package/src/components/CnLogsPage/CnLogsPage.vue +37 -12
- package/src/components/CnNextStepCard/CnNextStepCard.md +40 -0
- package/src/components/CnNextStepCard/CnNextStepCard.vue +319 -0
- package/src/components/CnNextStepCard/CnNextStepWidget.vue +59 -0
- package/src/components/CnNextStepCard/index.js +4 -0
- package/src/components/CnObjectCard/CnObjectCard.vue +24 -6
- package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +49 -0
- package/src/components/CnObjectDataWidgetForm/CnObjectDataWidgetForm.vue +6 -0
- package/src/components/CnObjectKanban/CnObjectKanban.vue +86 -2
- package/src/components/CnObjectList/CnObjectList.vue +19 -3
- package/src/components/CnObjectListWidget/CnObjectListWidget.vue +47 -15
- package/src/components/CnObjectRow/CnObjectRow.vue +25 -7
- package/src/components/CnObjectSidebar/CnFilesTab.vue +0 -1
- package/src/components/CnPageRenderer/CnPageRenderer.vue +2 -0
- package/src/components/CnQuickFilterBar/CnQuickFilterBar.md +3 -0
- package/src/components/CnQuickFilterBar/CnQuickFilterBar.vue +60 -1
- package/src/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue +100 -3
- package/src/components/CnRowActions/CnRowActions.vue +7 -2
- package/src/components/CnSavedViewsControl/CnSavedViewsControl.vue +50 -3
- package/src/components/CnSegmentedControl/CnSegmentedControl.md +46 -0
- package/src/components/CnSegmentedControl/CnSegmentedControl.vue +291 -0
- package/src/components/CnSegmentedControl/index.js +4 -0
- package/src/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue +5 -3
- package/src/components/CnStackedBarWidget/CnStackedBarWidget.md +15 -0
- package/src/components/CnStackedBarWidget/CnStackedBarWidget.vue +414 -0
- package/src/components/CnStackedBarWidget/index.js +14 -0
- package/src/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue +224 -0
- package/src/components/CnStackedBarWidgetForm/index.js +4 -0
- package/src/components/CnTabs/CnTab.vue +35 -0
- package/src/components/CnTabs/CnTabs.vue +251 -13
- package/src/components/CnTabsWidget/CnTabsWidget.vue +63 -4
- package/src/components/CnTasksWidget/CnTasksWidget.vue +4 -1
- package/src/components/CnWeekStripWidget/CnWeekStripWidget.md +31 -0
- package/src/components/CnWeekStripWidget/CnWeekStripWidget.vue +668 -0
- package/src/components/CnWeekStripWidget/index.js +14 -0
- package/src/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue +265 -0
- package/src/components/CnWeekStripWidgetForm/index.js +4 -0
- package/src/components/CnWidgetGrid/registerDashboardWidgets.js +74 -0
- package/src/components/index.js +11 -0
- package/src/css/detail-page.css +47 -0
- package/src/css/table.css +26 -0
- package/src/index.js +9 -0
- package/src/integrations/builtin/analytics/CnAnalyticsCard.vue +3 -2
- package/src/integrations/builtin/analytics/CnAnalyticsTab.vue +5 -6
- package/src/integrations/builtin/bookmarks/CnBookmarksCard.vue +12 -1
- package/src/integrations/builtin/bookmarks/CnBookmarksTab.vue +23 -6
- package/src/integrations/builtin/bookmarks/__tests__/CnBookmarksTab.spec.js +7 -2
- package/src/integrations/builtin/collectives/CnCollectivesCard.vue +3 -2
- package/src/integrations/builtin/collectives/CnCollectivesTab.vue +5 -6
- package/src/integrations/builtin/cospend/CnCospendCard.vue +2 -2
- package/src/integrations/builtin/cospend/CnCospendTab.vue +3 -4
- package/src/integrations/builtin/deck/CnDeckCard.vue +2 -2
- package/src/integrations/builtin/deck/CnDeckTab.vue +3 -4
- package/src/integrations/builtin/email/CnEmailCard.vue +6 -2
- package/src/integrations/builtin/email/CnEmailTab.vue +7 -4
- package/src/integrations/builtin/flow/CnFlowCard.vue +2 -2
- package/src/integrations/builtin/flow/CnFlowTab.vue +3 -4
- package/src/integrations/builtin/forms/CnFormsCard.vue +3 -2
- package/src/integrations/builtin/forms/CnFormsTab.vue +5 -6
- package/src/integrations/builtin/maps/CnMapsCard.vue +3 -2
- package/src/integrations/builtin/maps/CnMapsTab.vue +5 -6
- package/src/integrations/builtin/maps/__tests__/CnMapsTab.spec.js +9 -0
- package/src/integrations/builtin/openproject/CnOpenprojectCard.vue +3 -2
- package/src/integrations/builtin/openproject/CnOpenprojectTab.vue +5 -6
- package/src/integrations/builtin/photos/CnPhotosCard.vue +2 -2
- package/src/integrations/builtin/photos/CnPhotosTab.vue +3 -4
- package/src/integrations/builtin/polls/CnPollsCard.vue +2 -2
- package/src/integrations/builtin/polls/CnPollsTab.vue +3 -4
- package/src/integrations/builtin/shares/CnSharesTab.vue +3 -6
- package/src/integrations/builtin/talk/CnTalkCard.vue +3 -2
- package/src/integrations/builtin/talk/CnTalkTab.vue +5 -6
- package/src/integrations/builtin/time-tracker/CnTimeTrackerCard.vue +2 -2
- package/src/integrations/builtin/time-tracker/CnTimeTrackerTab.vue +3 -4
- package/src/integrations/builtin/xwiki/CnXwikiCard.vue +4 -2
- package/src/integrations/builtin/xwiki/CnXwikiTab.vue +7 -7
- package/src/integrations/builtin/xwiki/__tests__/CnXwikiTab.spec.js +9 -0
- package/src/schemas/app-manifest-v2.schema.json +389 -1
- package/src/schemas/app-manifest.schema.json +2 -1
- package/src/utils/actionLink.js +5 -0
- package/src/utils/actionsDispatcher.js +15 -0
- package/src/utils/dateVariant.js +120 -0
- package/src/utils/detailActionModel.js +256 -0
- package/src/utils/dueRule.js +94 -0
- package/src/utils/fetchAggregate.js +36 -0
- package/src/utils/fetchFilterCounts.js +182 -0
- package/src/utils/index.js +1 -0
- package/src/utils/libraryWidgetKeys.js +5 -0
- package/src/utils/linkNavigation.js +6 -3
- package/src/utils/readPath.js +27 -0
- package/src/utils/rowAuxClick.js +29 -4
- package/src/utils/safeHref.js +18 -3
- package/src/utils/validateManifestV2.compiled.js +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CnXwikiTab.vue2.js","sources":["../../../../../src/integrations/builtin/xwiki/CnXwikiTab.vue"],"sourcesContent":["<!--\n CnXwikiTab — bespoke sidebar tab for the `xwiki` integration.\n\n Replaces the generic CnIntegrationTab for the `xwiki` leaf: renders\n linked XWiki pages as an XWiki-style document list. Each row mirrors\n an XWiki page-index entry — a document icon, the bold page title, a\n space breadcrumb subline (\"Space › Subspace\"), a relative last-\n modified hint (NcDateTime), and a one-line plain-text excerpt of the\n page body. Each row deep-links to the page on the external XWiki host\n (target=_blank rel=noopener).\n\n Talks to the same OpenRegister pluggable-integration sub-resource\n `/api/objects/{register}/{schema}/{objectId}/integrations/xwiki`\n served by `OCA\\OpenRegister\\Service\\Integration\\Providers\\XwikiProvider`\n (storage strategy `external` — routed through `ExternalIntegrationRouter`\n → Integriq `xwiki` source → remote XWiki REST API). Provider\n payload shape per `normalizeRow()`:\n { id, reference, title, space, page, breadcrumb, url, content, ... }\n where `breadcrumb` is an array (the UI joins it with \" › \"), and\n `content` (when present, e.g. on the detail-page surface) is the\n HTML-rendered body — the excerpt strips HTML/macros to inert text and\n is bound via {{ }} interpolation, never injected.\n\n Surface behaviour:\n - Empty state (\"No XWiki pages linked yet\") when the provider\n returns zero rows.\n - **Unconfigured state**: 503 + cause `openconnector-down` or\n `openconnector-source-missing` → prominent \"Configure XWiki\n connection\" CTA pointing at Integriq's source admin page.\n - **Auth-expired state**: 503 + cause `provider-auth` → \"XWiki\n returned 401 — check the Integriq source credentials\" with\n a Reconnect CTA pointing at Integriq.\n - **Upstream-down state**: 503 + cause `upstream-service-down` →\n \"XWiki is currently unavailable\" + Retry CTA.\n - **Generic-error state**: fetch throws or non-OK non-503 → \"Could\n not load XWiki pages\" + Retry CTA.\n - Loading state via NcLoadingIcon for the full-tab spin.\n\n XWiki calls go through Integriq → external HTTP, so latency can\n spike on cold caches. The fetch carries no client-side timeout (the\n router enforces an upstream timeout server-side and surfaces\n upstream-down on expiry), but the loading state is shown for the\n whole round-trip so the sidebar never appears hung.\n\n See `openregister/openspec/changes/integration-xwiki/` for the spec\n delta and ADR-019 (registry mechanism) / ADR-022 (consumption).\n-->\n<template>\n\t<div class=\"cn-sidebar-tab cn-xwiki-tab\">\n\t\t<!-- Banner state: surface auth + config + upstream failures prominently -->\n\t\t<div\n\t\t\tv-if=\"banner.kind !== 'none'\"\n\t\t\tclass=\"cn-xwiki-tab__banner\"\n\t\t\t:class=\"`cn-xwiki-tab__banner--${banner.kind}`\"\n\t\t\trole=\"alert\">\n\t\t\t<AlertCircleOutline :size=\"18\" class=\"cn-xwiki-tab__banner-icon\" />\n\t\t\t<div class=\"cn-xwiki-tab__banner-body\">\n\t\t\t\t<strong>{{ banner.title }}</strong>\n\t\t\t\t<p>{{ banner.message }}</p>\n\t\t\t</div>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"banner.ctaLabel\"\n\t\t\t\tvariant=\"primary\"\n\t\t\t\tclass=\"cn-xwiki-tab__banner-cta\"\n\t\t\t\t:href=\"banner.ctaHref || undefined\"\n\t\t\t\t:target=\"banner.ctaHref ? '_blank' : undefined\"\n\t\t\t\t:rel=\"banner.ctaHref ? 'noopener noreferrer' : undefined\"\n\t\t\t\t@click=\"banner.ctaHandler\">\n\t\t\t\t{{ banner.ctaLabel }}\n\t\t\t</NcButton>\n\t\t</div>\n\n\t\t<!-- Link / Create actions. Disabled when the source is unconfigured;\n\t\t the banner above already carries the Configure CTA. -->\n\t\t<div v-if=\"banner.kind === 'none' || banner.kind === 'unconfigured'\" class=\"cn-xwiki-tab__actions\">\n\t\t\t<NcButton variant=\"secondary\" :disabled=\"banner.kind === 'unconfigured'\" @click=\"openPicker\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<LinkVariant :size=\"18\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Link existing page') }}\n\t\t\t</NcButton>\n\t\t\t<NcButton variant=\"primary\" :disabled=\"banner.kind === 'unconfigured'\" @click=\"openCreate\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Plus :size=\"18\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Create new page') }}\n\t\t\t</NcButton>\n\t\t</div>\n\n\t\t<NcLoadingIcon v-if=\"loading\" />\n\n\t\t<div\n\t\t\tv-else-if=\"pages.length === 0 && banner.kind === 'none'\"\n\t\t\tclass=\"cn-sidebar-tab__empty cn-xwiki-tab__empty\">\n\t\t\t<FileDocumentMultiple :size=\"32\" class=\"cn-xwiki-tab__empty-icon\" />\n\t\t\t<p>{{ emptyLabel }}</p>\n\t\t</div>\n\n\t\t<ul v-else-if=\"pages.length > 0\" class=\"cn-xwiki-tab__list\">\n\t\t\t<NcListItem\n\t\t\t\tv-for=\"page in pages\"\n\t\t\t\t:key=\"pageKey(page)\"\n\t\t\t\tclass=\"cn-xwiki-tab__row\"\n\t\t\t\t:name=\"pageTitle(page)\"\n\t\t\t\t:bold=\"true\"\n\t\t\t\t:href=\"pageHref(page)\"\n\t\t\t\t:target=\"pageHref(page) ? '_blank' : undefined\"\n\t\t\t\t:forceDisplayActions=\"true\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<span class=\"cn-xwiki-tab__row-icon\">\n\t\t\t\t\t\t<FileDocumentOutline :size=\"22\" />\n\t\t\t\t\t</span>\n\t\t\t\t</template>\n\t\t\t\t<template #subname>\n\t\t\t\t\t<span class=\"cn-xwiki-tab__subline\">\n\t\t\t\t\t\t<span v-if=\"breadcrumbLabel(page)\" class=\"cn-xwiki-tab__breadcrumb\">\n\t\t\t\t\t\t\t{{ breadcrumbLabel(page) }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<NcDateTime\n\t\t\t\t\t\t\tv-if=\"modifiedMs(page) !== null\"\n\t\t\t\t\t\t\tclass=\"cn-xwiki-tab__date\"\n\t\t\t\t\t\t\t:timestamp=\"modifiedMs(page)\"\n\t\t\t\t\t\t\trelativeTime=\"short\" />\n\t\t\t\t\t</span>\n\t\t\t\t</template>\n\t\t\t\t<template v-if=\"excerpt(page)\" #extra>\n\t\t\t\t\t<span class=\"cn-xwiki-tab__excerpt\">{{ excerpt(page) }}</span>\n\t\t\t\t</template>\n\t\t\t\t<template #actions>\n\t\t\t\t\t<NcActionLink\n\t\t\t\t\t\tv-if=\"pageHref(page)\"\n\t\t\t\t\t\tclass=\"cn-xwiki-tab__open\"\n\t\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t\t:href=\"pageHref(page)\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\trel=\"noopener noreferrer\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<OpenInNew :size=\"20\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ t('nextcloud-vue', 'Open in XWiki') }}\n\t\t\t\t\t</NcActionLink>\n\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\tclass=\"cn-xwiki-tab__unlink\"\n\t\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t\t@click=\"unlinkPage(page)\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<LinkOff :size=\"20\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ t('nextcloud-vue', 'Unlink page') }}\n\t\t\t\t\t</NcActionButton>\n\t\t\t\t</template>\n\t\t\t</NcListItem>\n\t\t</ul>\n\n\t\t<CnXwikiPagePicker\n\t\t\tv-if=\"pickerOpen\"\n\t\t\t:apiBase=\"apiBase\"\n\t\t\t:openConnectorSourcesUrl=\"openConnectorSourcesUrl\"\n\t\t\t@close=\"pickerOpen = false\"\n\t\t\t@link=\"onLinkPick\" />\n\n\t\t<CnXwikiPageCreate\n\t\t\tv-if=\"createOpen\"\n\t\t\t:apiBase=\"apiBase\"\n\t\t\t:unavailable=\"banner.kind === 'unconfigured'\"\n\t\t\t:openConnectorSourcesUrl=\"openConnectorSourcesUrl\"\n\t\t\t@close=\"createOpen = false\"\n\t\t\t@create=\"onCreatePick\" />\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcActionButton, NcActionLink, NcButton, NcDateTime, NcListItem, NcLoadingIcon } from '@nextcloud/vue'\nimport AlertCircleOutline from 'vue-material-design-icons/AlertCircleOutline.vue'\nimport FileDocumentMultiple from 'vue-material-design-icons/FileDocumentMultiple.vue'\nimport FileDocumentOutline from 'vue-material-design-icons/FileDocumentOutline.vue'\nimport LinkOff from 'vue-material-design-icons/LinkOff.vue'\nimport LinkVariant from 'vue-material-design-icons/LinkVariant.vue'\nimport OpenInNew from 'vue-material-design-icons/OpenInNew.vue'\nimport Plus from 'vue-material-design-icons/Plus.vue'\nimport CnXwikiPageCreate from '../../../components/CnXwikiPageCreate/CnXwikiPageCreate.vue'\nimport CnXwikiPagePicker from '../../../components/CnXwikiPagePicker/CnXwikiPagePicker.vue'\nimport { buildHeaders, prefixUrl } from '../../../utils/index.js'\n\nconst EXCERPT_MAX_CHARS = 140\n\n/**\n * CnXwikiTab — bespoke sidebar list for the `xwiki` external integration.\n *\n * Renders linked XWiki pages as an XWiki-style document index: document\n * icon, bold title, space breadcrumb, relative last-modified, and a\n * one-line plain-text excerpt — plus prominent auth/config banners when\n * the Integriq source is missing/unhealthy.\n */\nexport default {\n\tname: 'CnXwikiTab',\n\n\tcomponents: {\n\t\tNcActionButton,\n\t\tNcActionLink,\n\t\tNcButton,\n\t\tNcDateTime,\n\t\tNcListItem,\n\t\tNcLoadingIcon,\n\t\tAlertCircleOutline,\n\t\tFileDocumentMultiple,\n\t\tFileDocumentOutline,\n\t\tLinkOff,\n\t\tLinkVariant,\n\t\tOpenInNew,\n\t\tPlus,\n\t\tCnXwikiPagePicker,\n\t\tCnXwikiPageCreate,\n\t},\n\n\tprops: {\n\t\t/** Stable integration id (forwarded from the registry — always `'xwiki'`). */\n\t\tintegrationId: { type: String, default: 'xwiki' },\n\t\t/** Parent object id. */\n\t\tobjectId: { type: String, required: true },\n\t\t/** OpenRegister register id (slug or uuid). */\n\t\tregister: { type: String, default: '' },\n\t\t/** OpenRegister schema id (slug or uuid). */\n\t\tschema: { type: String, default: '' },\n\t\t/** Base API URL. */\n\t\tapiBase: { type: String, default: '/apps/openregister/api' },\n\t\t/** Pre-translated empty-state label. */\n\t\temptyLabel: { type: String, default: () => t('nextcloud-vue', 'No XWiki pages linked yet') },\n\t\t/** URL of Integriq's sources admin page (deep-link target for the configure CTA). */\n\t\topenConnectorSourcesUrl: { type: String, default: '/index.php/apps/openconnector/sources' },\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tpages: [],\n\t\t\tloading: false,\n\t\t\t/** One of: 'none' | 'unconfigured' | 'auth' | 'upstream' | 'error'. */\n\t\t\tbannerKind: 'none',\n\t\t\tpickerOpen: false,\n\t\t\tcreateOpen: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tbanner() {\n\t\t\tswitch (this.bannerKind) {\n\t\t\t\tcase 'unconfigured':\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: 'unconfigured',\n\t\t\t\t\t\ttitle: t('nextcloud-vue', 'XWiki connection not configured'),\n\t\t\t\t\t\tmessage: t('nextcloud-vue', 'Add an XWiki source in Integriq with the upstream URL and credentials so OpenRegister can link pages.'),\n\t\t\t\t\t\tctaLabel: t('nextcloud-vue', 'Configure XWiki connection'),\n\t\t\t\t\t\tctaHref: this.openConnectorSourcesUrl,\n\t\t\t\t\t}\n\t\t\t\tcase 'auth':\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: 'auth',\n\t\t\t\t\t\ttitle: t('nextcloud-vue', 'XWiki authentication failed'),\n\t\t\t\t\t\tmessage: t('nextcloud-vue', 'XWiki returned 401 — check the Integriq source credentials.'),\n\t\t\t\t\t\tctaLabel: t('nextcloud-vue', 'Reconnect'),\n\t\t\t\t\t\tctaHref: this.openConnectorSourcesUrl,\n\t\t\t\t\t}\n\t\t\t\tcase 'upstream':\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: 'upstream',\n\t\t\t\t\t\ttitle: t('nextcloud-vue', 'XWiki is currently unavailable'),\n\t\t\t\t\t\tmessage: t('nextcloud-vue', 'The upstream XWiki host did not respond. Try again in a moment.'),\n\t\t\t\t\t\tctaLabel: t('nextcloud-vue', 'Retry'),\n\t\t\t\t\t\tctaHandler: this.fetchPages,\n\t\t\t\t\t}\n\t\t\t\tcase 'error':\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: 'error',\n\t\t\t\t\t\ttitle: t('nextcloud-vue', 'Could not load XWiki pages'),\n\t\t\t\t\t\tmessage: t('nextcloud-vue', 'Something went wrong while loading the linked pages.'),\n\t\t\t\t\t\tctaLabel: t('nextcloud-vue', 'Retry'),\n\t\t\t\t\t\tctaHandler: this.fetchPages,\n\t\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\treturn { kind: 'none', title: '', message: '', ctaLabel: '', ctaHandler: () => {} }\n\t\t\t}\n\t\t},\n\t},\n\n\twatch: {\n\t\tobjectId: { immediate: true, handler(id) {\n\t\t\tif (id) {\n\t\t\t\tthis.fetchPages()\n\t\t\t}\n\t\t} },\n\n\t\tregister() {\n\t\t\tthis.fetchPages()\n\t\t},\n\n\t\tschema() {\n\t\t\tthis.fetchPages()\n\t\t},\n\t},\n\n\tmethods: {\n\t\tt,\n\n\t\tbaseUrl() {\n\t\t\treturn `${this.apiBase}/objects/${this.register}/${this.schema}/${this.objectId}/integrations/${this.integrationId}`\n\t\t},\n\n\t\t/**\n\t\t * Base for the Tier-2 xwiki endpoints (link/new/destroy).\n\t\t *\n\t\t * @return {string} The endpoint URL.\n\t\t */\n\t\txwikiEndpoint() {\n\t\t\treturn `${this.apiBase}/objects/${this.register}/${this.schema}/${this.objectId}/xwiki`\n\t\t},\n\n\t\topenPicker() {\n\t\t\tthis.pickerOpen = true\n\t\t},\n\n\t\topenCreate() {\n\t\t\tthis.createOpen = true\n\t\t},\n\n\t\tasync onLinkPick(payload) {\n\t\t\tthis.pickerOpen = false\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(this.xwikiEndpoint()), {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { ...buildHeaders(), 'Content-Type': 'application/json' },\n\t\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\t})\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tawait this.fetchPages()\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[CnXwikiTab] link failed', err)\n\t\t\t}\n\t\t},\n\n\t\tasync onCreatePick(payload) {\n\t\t\tthis.createOpen = false\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(`${this.xwikiEndpoint()}/new`), {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { ...buildHeaders(), 'Content-Type': 'application/json' },\n\t\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\t})\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tawait this.fetchPages()\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[CnXwikiTab] create failed', err)\n\t\t\t}\n\t\t},\n\n\t\tasync unlinkPage(page) {\n\t\t\tconst ref = this.pageKey(page)\n\t\t\tif (!ref) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(`${this.xwikiEndpoint()}/${encodeURIComponent(ref)}`), {\n\t\t\t\t\tmethod: 'DELETE',\n\t\t\t\t\theaders: buildHeaders(),\n\t\t\t\t})\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tawait this.fetchPages()\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[CnXwikiTab] unlink failed', err)\n\t\t\t}\n\t\t},\n\n\t\tpageKey(page) {\n\t\t\treturn page.id ?? page.reference ?? ''\n\t\t},\n\n\t\tpageTitle(page) {\n\t\t\treturn String(page.title ?? page.page ?? page.reference ?? this.pageKey(page))\n\t\t},\n\n\t\t/**\n\t\t * External XWiki deep-link for the page. Empty string when the\n\t\t * provider didn't surface a `url`, so the row renders as a plain\n\t\t * (non-anchored) NcListItem rather than a dead link.\n\t\t *\n\t\t * @param {object} page Provider row.\n\t\t *\n\t\t * @return {string} Absolute XWiki URL or ''.\n\t\t */\n\t\tpageHref(page) {\n\t\t\treturn String(page.url ?? '')\n\t\t},\n\n\t\tbreadcrumbLabel(page) {\n\t\t\tconst crumb = page.breadcrumb\n\t\t\tif (Array.isArray(crumb) === false || crumb.length === 0) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\t// Drop the last element (the title) per AC — show only the ancestor path.\n\t\t\tconst ancestors = crumb.slice(0, -1)\n\t\t\tif (ancestors.length === 0) {\n\t\t\t\t// Single-element breadcrumb (root page) — fall back to the space name.\n\t\t\t\treturn String(page.space ?? '')\n\t\t\t}\n\t\t\t// XWiki renders space paths with a \"›\" chevron separator.\n\t\t\treturn ancestors.map((c) => String(c)).filter((s) => s !== '').join(' › ')\n\t\t},\n\n\t\t/**\n\t\t * One-line plain-text excerpt of the page body for the detail\n\t\t * surface. Strips `<script>`/`<style>` bodies, then all tags,\n\t\t * collapses whitespace and truncates — XWiki macros stay inert\n\t\t * text because the result is bound via {{ }} interpolation.\n\t\t *\n\t\t * @param {object} page Provider row.\n\t\t *\n\t\t * @return {string} Safe single-line excerpt (≤ EXCERPT_MAX_CHARS).\n\t\t */\n\t\texcerpt(page) {\n\t\t\tconst raw = page.content ?? page.renderedContent ?? page.excerpt ?? ''\n\t\t\tconst str = String(raw)\n\t\t\tif (str === '') {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tlet text = str\n\t\t\t\t.replace(/<script\\b[^>]*>[\\s\\S]*?<\\/script>/gi, '')\n\t\t\t\t.replace(/<style\\b[^>]*>[\\s\\S]*?<\\/style>/gi, '')\n\t\t\t\t.replace(/<[^>]+>/g, ' ')\n\t\t\t\t.replace(/\\s+/g, ' ')\n\t\t\t\t.trim()\n\t\t\tif (text.length > EXCERPT_MAX_CHARS) {\n\t\t\t\ttext = text.slice(0, EXCERPT_MAX_CHARS).trimEnd() + '…'\n\t\t\t}\n\t\t\treturn text\n\t\t},\n\n\t\t/**\n\t\t * Last-modified timestamp in milliseconds for the page, suitable\n\t\t * for `NcDateTime`. Returns null when absent or unparseable.\n\t\t *\n\t\t * @param {object} page Provider row.\n\t\t *\n\t\t * @return {number|null} Epoch milliseconds or null.\n\t\t */\n\t\tmodifiedMs(page) {\n\t\t\tconst v = page.modified ?? page.lastModified ?? page.updated ?? null\n\t\t\tif (v === null || v === undefined || v === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tif (typeof v === 'number') {\n\t\t\t\treturn v < 1e12 ? v * 1000 : v\n\t\t\t}\n\t\t\tconst parsed = Date.parse(String(v))\n\t\t\treturn Number.isNaN(parsed) === true ? null : parsed\n\t\t},\n\n\t\t/**\n\t\t * Map a 503 cause from the controller (`details.cause` per AD-23) to\n\t\t * the matching banner kind. Unknown causes fall through to 'upstream'.\n\t\t *\n\t\t * @param {string} cause One of `openconnector-down` / `openconnector-source-missing` / `provider-auth` / `upstream-service-down`.\n\t\t *\n\t\t * @return {string} Banner kind.\n\t\t */\n\t\tbannerFromCause(cause) {\n\t\t\tif (cause === 'openconnector-down' || cause === 'openconnector-source-missing') {\n\t\t\t\treturn 'unconfigured'\n\t\t\t}\n\t\t\tif (cause === 'provider-auth') {\n\t\t\t\treturn 'auth'\n\t\t\t}\n\t\t\treturn 'upstream'\n\t\t},\n\n\t\tasync fetchPages() {\n\t\t\tif (!this.register || !this.schema || !this.objectId) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.loading = true\n\t\t\tthis.bannerKind = 'none'\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(this.baseUrl()), { headers: buildHeaders() })\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tconst data = await response.json()\n\t\t\t\t\tconst rows = data.results || data.items || (Array.isArray(data) ? data : []) || []\n\t\t\t\t\tthis.pages = rows\n\t\t\t\t} else if (response.status === 503) {\n\t\t\t\t\tthis.pages = []\n\t\t\t\t\tlet cause = ''\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst body = await response.json()\n\t\t\t\t\t\tcause = String(body?.details?.cause ?? '')\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tcause = ''\n\t\t\t\t\t}\n\t\t\t\t\tthis.bannerKind = this.bannerFromCause(cause)\n\t\t\t\t} else {\n\t\t\t\t\tthis.pages = []\n\t\t\t\t\tthis.bannerKind = 'error'\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[CnXwikiTab] failed to fetch XWiki pages', err)\n\t\t\t\tthis.pages = []\n\t\t\t\tthis.bannerKind = 'error'\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-xwiki-tab__actions {\n\tdisplay: flex;\n\tgap: 8px;\n\tmargin-bottom: 10px;\n\tflex-wrap: wrap;\n}\n\n.cn-xwiki-tab__unlink {\n\tflex-shrink: 0;\n}\n\n.cn-xwiki-tab__banner {\n\tdisplay: flex;\n\talign-items: flex-start;\n\tgap: 10px;\n\tpadding: 10px 12px;\n\tmargin-bottom: 12px;\n\tborder-radius: var(--border-radius);\n\tfont-size: 0.9em;\n}\n\n.cn-xwiki-tab__banner--unconfigured {\n\tbackground: var(--color-background-hover);\n\tcolor: var(--color-main-text);\n\tborder-left: 3px solid var(--color-primary-element, #21468B);\n}\n\n.cn-xwiki-tab__banner--auth,\n.cn-xwiki-tab__banner--error {\n\tbackground: var(--color-error, #e9322d);\n\tcolor: var(--color-main-background);\n}\n\n.cn-xwiki-tab__banner--upstream {\n\tbackground: var(--color-warning, #e9a40f);\n\tcolor: var(--color-main-background);\n}\n\n.cn-xwiki-tab__banner-icon {\n\tflex-shrink: 0;\n\tmargin-top: 2px;\n}\n\n.cn-xwiki-tab__banner-body {\n\tflex: 1;\n\tmin-width: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n}\n\n.cn-xwiki-tab__banner-body p {\n\tmargin: 0;\n}\n\n.cn-xwiki-tab__banner-cta {\n\tflex-shrink: 0;\n}\n\n.cn-xwiki-tab__empty {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tgap: 8px;\n\tpadding: 16px 8px;\n\tcolor: var(--color-text-maxcontrast);\n\ttext-align: center;\n}\n\n.cn-xwiki-tab__empty-icon {\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-xwiki-tab__list {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n}\n\n/* XWiki-style document tile: a tinted square holding the page glyph. */\n.cn-xwiki-tab__row-icon {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 40px;\n\theight: 40px;\n\tborder-radius: var(--border-radius);\n\tbackground: var(--cn-xwiki-accent-soft, rgba(60, 162, 47, 0.12));\n\tcolor: var(--cn-xwiki-accent, #3CA22F);\n}\n\n.cn-xwiki-tab__subline {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 8px;\n\tflex-wrap: wrap;\n\tmin-width: 0;\n}\n\n.cn-xwiki-tab__breadcrumb {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.9em;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n.cn-xwiki-tab__date {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.9em;\n\twhite-space: nowrap;\n}\n\n.cn-xwiki-tab__excerpt {\n\tdisplay: block;\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.85em;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\tmax-width: 100%;\n}\n</style>\n"],"names":["CnXwikiPagePicker","CnXwikiPageCreate","t"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CnXwikiTab.vue2.js","sources":["../../../../../src/integrations/builtin/xwiki/CnXwikiTab.vue"],"sourcesContent":["<!--\n CnXwikiTab — bespoke sidebar tab for the `xwiki` integration.\n\n Replaces the generic CnIntegrationTab for the `xwiki` leaf: renders\n linked XWiki pages as an XWiki-style document list. Each row mirrors\n an XWiki page-index entry — a document icon, the bold page title, a\n space breadcrumb subline (\"Space › Subspace\"), a relative last-\n modified hint (NcDateTime), and a one-line plain-text excerpt of the\n page body. Each row deep-links to the page on the external XWiki host\n (target=_blank rel=noopener).\n\n Talks to the same OpenRegister pluggable-integration sub-resource\n `/api/objects/{register}/{schema}/{objectId}/integrations/xwiki`\n served by `OCA\\OpenRegister\\Service\\Integration\\Providers\\XwikiProvider`\n (storage strategy `external` — routed through `ExternalIntegrationRouter`\n → Integriq `xwiki` source → remote XWiki REST API). Provider\n payload shape per `normalizeRow()`:\n { id, reference, title, space, page, breadcrumb, url, content, ... }\n where `breadcrumb` is an array (the UI joins it with \" › \"), and\n `content` (when present, e.g. on the detail-page surface) is the\n HTML-rendered body — the excerpt strips HTML/macros to inert text and\n is bound via {{ }} interpolation, never injected.\n\n Surface behaviour:\n - Empty state (\"No XWiki pages linked yet\") when the provider\n returns zero rows.\n - **Unconfigured state**: 503 + cause `openconnector-down` or\n `openconnector-source-missing` → prominent \"Configure XWiki\n connection\" CTA pointing at Integriq's source admin page.\n - **Auth-expired state**: 503 + cause `provider-auth` → \"XWiki\n returned 401 — check the Integriq source credentials\" with\n a Reconnect CTA pointing at Integriq.\n - **Upstream-down state**: 503 + cause `upstream-service-down` →\n \"XWiki is currently unavailable\" + Retry CTA.\n - **Generic-error state**: fetch throws or non-OK non-503 → \"Could\n not load XWiki pages\" + Retry CTA.\n - Loading state via NcLoadingIcon for the full-tab spin.\n\n XWiki calls go through Integriq → external HTTP, so latency can\n spike on cold caches. The fetch carries no client-side timeout (the\n router enforces an upstream timeout server-side and surfaces\n upstream-down on expiry), but the loading state is shown for the\n whole round-trip so the sidebar never appears hung.\n\n See `openregister/openspec/changes/integration-xwiki/` for the spec\n delta and ADR-019 (registry mechanism) / ADR-022 (consumption).\n-->\n<template>\n\t<div class=\"cn-sidebar-tab cn-xwiki-tab\">\n\t\t<!-- Banner state: surface auth + config + upstream failures prominently -->\n\t\t<div\n\t\t\tv-if=\"banner.kind !== 'none'\"\n\t\t\tclass=\"cn-xwiki-tab__banner\"\n\t\t\t:class=\"`cn-xwiki-tab__banner--${banner.kind}`\"\n\t\t\trole=\"alert\">\n\t\t\t<AlertCircleOutline :size=\"18\" class=\"cn-xwiki-tab__banner-icon\" />\n\t\t\t<div class=\"cn-xwiki-tab__banner-body\">\n\t\t\t\t<strong>{{ banner.title }}</strong>\n\t\t\t\t<p>{{ banner.message }}</p>\n\t\t\t</div>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"banner.ctaLabel\"\n\t\t\t\tvariant=\"primary\"\n\t\t\t\tclass=\"cn-xwiki-tab__banner-cta\"\n\t\t\t\t:href=\"banner.ctaHref || undefined\"\n\t\t\t\t:target=\"banner.ctaHref ? '_blank' : undefined\"\n\t\t\t\t@click=\"banner.ctaHandler\">\n\t\t\t\t{{ banner.ctaLabel }}\n\t\t\t</NcButton>\n\t\t</div>\n\n\t\t<!-- Link / Create actions. Disabled when the source is unconfigured;\n\t\t the banner above already carries the Configure CTA. -->\n\t\t<div v-if=\"banner.kind === 'none' || banner.kind === 'unconfigured'\" class=\"cn-xwiki-tab__actions\">\n\t\t\t<NcButton variant=\"secondary\" :disabled=\"banner.kind === 'unconfigured'\" @click=\"openPicker\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<LinkVariant :size=\"18\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Link existing page') }}\n\t\t\t</NcButton>\n\t\t\t<NcButton variant=\"primary\" :disabled=\"banner.kind === 'unconfigured'\" @click=\"openCreate\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Plus :size=\"18\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Create new page') }}\n\t\t\t</NcButton>\n\t\t</div>\n\n\t\t<NcLoadingIcon v-if=\"loading\" />\n\n\t\t<div\n\t\t\tv-else-if=\"pages.length === 0 && banner.kind === 'none'\"\n\t\t\tclass=\"cn-sidebar-tab__empty cn-xwiki-tab__empty\">\n\t\t\t<FileDocumentMultiple :size=\"32\" class=\"cn-xwiki-tab__empty-icon\" />\n\t\t\t<p>{{ emptyLabel }}</p>\n\t\t</div>\n\n\t\t<ul v-else-if=\"pages.length > 0\" class=\"cn-xwiki-tab__list\">\n\t\t\t<NcListItem\n\t\t\t\tv-for=\"page in pages\"\n\t\t\t\t:key=\"pageKey(page)\"\n\t\t\t\tclass=\"cn-xwiki-tab__row\"\n\t\t\t\t:name=\"pageTitle(page)\"\n\t\t\t\t:bold=\"true\"\n\t\t\t\t:href=\"pageHref(page)\"\n\t\t\t\t:target=\"pageHref(page) ? '_blank' : undefined\"\n\t\t\t\t:forceDisplayActions=\"true\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<span class=\"cn-xwiki-tab__row-icon\">\n\t\t\t\t\t\t<FileDocumentOutline :size=\"22\" />\n\t\t\t\t\t</span>\n\t\t\t\t</template>\n\t\t\t\t<template #subname>\n\t\t\t\t\t<span class=\"cn-xwiki-tab__subline\">\n\t\t\t\t\t\t<span v-if=\"breadcrumbLabel(page)\" class=\"cn-xwiki-tab__breadcrumb\">\n\t\t\t\t\t\t\t{{ breadcrumbLabel(page) }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<NcDateTime\n\t\t\t\t\t\t\tv-if=\"modifiedMs(page) !== null\"\n\t\t\t\t\t\t\tclass=\"cn-xwiki-tab__date\"\n\t\t\t\t\t\t\t:timestamp=\"modifiedMs(page)\"\n\t\t\t\t\t\t\trelativeTime=\"short\" />\n\t\t\t\t\t</span>\n\t\t\t\t</template>\n\t\t\t\t<template v-if=\"excerpt(page)\" #extra>\n\t\t\t\t\t<span class=\"cn-xwiki-tab__excerpt\">{{ excerpt(page) }}</span>\n\t\t\t\t</template>\n\t\t\t\t<template #actions>\n\t\t\t\t\t<NcActionLink\n\t\t\t\t\t\tv-if=\"pageHref(page)\"\n\t\t\t\t\t\tclass=\"cn-xwiki-tab__open\"\n\t\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t\t:href=\"pageHref(page)\"\n\t\t\t\t\t\ttarget=\"_blank\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<OpenInNew :size=\"20\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ t('nextcloud-vue', 'Open in XWiki') }}\n\t\t\t\t\t</NcActionLink>\n\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\tclass=\"cn-xwiki-tab__unlink\"\n\t\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t\t@click=\"unlinkPage(page)\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<LinkOff :size=\"20\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ t('nextcloud-vue', 'Unlink page') }}\n\t\t\t\t\t</NcActionButton>\n\t\t\t\t</template>\n\t\t\t</NcListItem>\n\t\t</ul>\n\n\t\t<CnXwikiPagePicker\n\t\t\tv-if=\"pickerOpen\"\n\t\t\t:apiBase=\"apiBase\"\n\t\t\t:openConnectorSourcesUrl=\"openConnectorSourcesUrl\"\n\t\t\t@close=\"pickerOpen = false\"\n\t\t\t@link=\"onLinkPick\" />\n\n\t\t<CnXwikiPageCreate\n\t\t\tv-if=\"createOpen\"\n\t\t\t:apiBase=\"apiBase\"\n\t\t\t:unavailable=\"banner.kind === 'unconfigured'\"\n\t\t\t:openConnectorSourcesUrl=\"openConnectorSourcesUrl\"\n\t\t\t@close=\"createOpen = false\"\n\t\t\t@create=\"onCreatePick\" />\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcActionButton, NcActionLink, NcButton, NcDateTime, NcListItem, NcLoadingIcon } from '@nextcloud/vue'\nimport AlertCircleOutline from 'vue-material-design-icons/AlertCircleOutline.vue'\nimport FileDocumentMultiple from 'vue-material-design-icons/FileDocumentMultiple.vue'\nimport FileDocumentOutline from 'vue-material-design-icons/FileDocumentOutline.vue'\nimport LinkOff from 'vue-material-design-icons/LinkOff.vue'\nimport LinkVariant from 'vue-material-design-icons/LinkVariant.vue'\nimport OpenInNew from 'vue-material-design-icons/OpenInNew.vue'\nimport Plus from 'vue-material-design-icons/Plus.vue'\nimport CnXwikiPageCreate from '../../../components/CnXwikiPageCreate/CnXwikiPageCreate.vue'\nimport CnXwikiPagePicker from '../../../components/CnXwikiPagePicker/CnXwikiPagePicker.vue'\nimport { buildHeaders, prefixUrl, safeHref } from '../../../utils/index.js'\n\nconst EXCERPT_MAX_CHARS = 140\n\n/**\n * CnXwikiTab — bespoke sidebar list for the `xwiki` external integration.\n *\n * Renders linked XWiki pages as an XWiki-style document index: document\n * icon, bold title, space breadcrumb, relative last-modified, and a\n * one-line plain-text excerpt — plus prominent auth/config banners when\n * the Integriq source is missing/unhealthy.\n */\nexport default {\n\tname: 'CnXwikiTab',\n\n\tcomponents: {\n\t\tNcActionButton,\n\t\tNcActionLink,\n\t\tNcButton,\n\t\tNcDateTime,\n\t\tNcListItem,\n\t\tNcLoadingIcon,\n\t\tAlertCircleOutline,\n\t\tFileDocumentMultiple,\n\t\tFileDocumentOutline,\n\t\tLinkOff,\n\t\tLinkVariant,\n\t\tOpenInNew,\n\t\tPlus,\n\t\tCnXwikiPagePicker,\n\t\tCnXwikiPageCreate,\n\t},\n\n\tprops: {\n\t\t/** Stable integration id (forwarded from the registry — always `'xwiki'`). */\n\t\tintegrationId: { type: String, default: 'xwiki' },\n\t\t/** Parent object id. */\n\t\tobjectId: { type: String, required: true },\n\t\t/** OpenRegister register id (slug or uuid). */\n\t\tregister: { type: String, default: '' },\n\t\t/** OpenRegister schema id (slug or uuid). */\n\t\tschema: { type: String, default: '' },\n\t\t/** Base API URL. */\n\t\tapiBase: { type: String, default: '/apps/openregister/api' },\n\t\t/** Pre-translated empty-state label. */\n\t\temptyLabel: { type: String, default: () => t('nextcloud-vue', 'No XWiki pages linked yet') },\n\t\t/** URL of Integriq's sources admin page (deep-link target for the configure CTA). */\n\t\topenConnectorSourcesUrl: { type: String, default: '/index.php/apps/openconnector/sources' },\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tpages: [],\n\t\t\tloading: false,\n\t\t\t/** One of: 'none' | 'unconfigured' | 'auth' | 'upstream' | 'error'. */\n\t\t\tbannerKind: 'none',\n\t\t\tpickerOpen: false,\n\t\t\tcreateOpen: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tbanner() {\n\t\t\tswitch (this.bannerKind) {\n\t\t\t\tcase 'unconfigured':\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: 'unconfigured',\n\t\t\t\t\t\ttitle: t('nextcloud-vue', 'XWiki connection not configured'),\n\t\t\t\t\t\tmessage: t('nextcloud-vue', 'Add an XWiki source in Integriq with the upstream URL and credentials so OpenRegister can link pages.'),\n\t\t\t\t\t\tctaLabel: t('nextcloud-vue', 'Configure XWiki connection'),\n\t\t\t\t\t\tctaHref: this.openConnectorSourcesUrl,\n\t\t\t\t\t}\n\t\t\t\tcase 'auth':\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: 'auth',\n\t\t\t\t\t\ttitle: t('nextcloud-vue', 'XWiki authentication failed'),\n\t\t\t\t\t\tmessage: t('nextcloud-vue', 'XWiki returned 401 — check the Integriq source credentials.'),\n\t\t\t\t\t\tctaLabel: t('nextcloud-vue', 'Reconnect'),\n\t\t\t\t\t\tctaHref: this.openConnectorSourcesUrl,\n\t\t\t\t\t}\n\t\t\t\tcase 'upstream':\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: 'upstream',\n\t\t\t\t\t\ttitle: t('nextcloud-vue', 'XWiki is currently unavailable'),\n\t\t\t\t\t\tmessage: t('nextcloud-vue', 'The upstream XWiki host did not respond. Try again in a moment.'),\n\t\t\t\t\t\tctaLabel: t('nextcloud-vue', 'Retry'),\n\t\t\t\t\t\tctaHandler: this.fetchPages,\n\t\t\t\t\t}\n\t\t\t\tcase 'error':\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: 'error',\n\t\t\t\t\t\ttitle: t('nextcloud-vue', 'Could not load XWiki pages'),\n\t\t\t\t\t\tmessage: t('nextcloud-vue', 'Something went wrong while loading the linked pages.'),\n\t\t\t\t\t\tctaLabel: t('nextcloud-vue', 'Retry'),\n\t\t\t\t\t\tctaHandler: this.fetchPages,\n\t\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\treturn { kind: 'none', title: '', message: '', ctaLabel: '', ctaHandler: () => {} }\n\t\t\t}\n\t\t},\n\t},\n\n\twatch: {\n\t\tobjectId: { immediate: true, handler(id) {\n\t\t\tif (id) {\n\t\t\t\tthis.fetchPages()\n\t\t\t}\n\t\t} },\n\n\t\tregister() {\n\t\t\tthis.fetchPages()\n\t\t},\n\n\t\tschema() {\n\t\t\tthis.fetchPages()\n\t\t},\n\t},\n\n\tmethods: {\n\t\tt,\n\n\t\tbaseUrl() {\n\t\t\treturn `${this.apiBase}/objects/${this.register}/${this.schema}/${this.objectId}/integrations/${this.integrationId}`\n\t\t},\n\n\t\t/**\n\t\t * Base for the Tier-2 xwiki endpoints (link/new/destroy).\n\t\t *\n\t\t * @return {string} The endpoint URL.\n\t\t */\n\t\txwikiEndpoint() {\n\t\t\treturn `${this.apiBase}/objects/${this.register}/${this.schema}/${this.objectId}/xwiki`\n\t\t},\n\n\t\topenPicker() {\n\t\t\tthis.pickerOpen = true\n\t\t},\n\n\t\topenCreate() {\n\t\t\tthis.createOpen = true\n\t\t},\n\n\t\tasync onLinkPick(payload) {\n\t\t\tthis.pickerOpen = false\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(this.xwikiEndpoint()), {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { ...buildHeaders(), 'Content-Type': 'application/json' },\n\t\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\t})\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tawait this.fetchPages()\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[CnXwikiTab] link failed', err)\n\t\t\t}\n\t\t},\n\n\t\tasync onCreatePick(payload) {\n\t\t\tthis.createOpen = false\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(`${this.xwikiEndpoint()}/new`), {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { ...buildHeaders(), 'Content-Type': 'application/json' },\n\t\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\t})\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tawait this.fetchPages()\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[CnXwikiTab] create failed', err)\n\t\t\t}\n\t\t},\n\n\t\tasync unlinkPage(page) {\n\t\t\tconst ref = this.pageKey(page)\n\t\t\tif (!ref) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(`${this.xwikiEndpoint()}/${encodeURIComponent(ref)}`), {\n\t\t\t\t\tmethod: 'DELETE',\n\t\t\t\t\theaders: buildHeaders(),\n\t\t\t\t})\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tawait this.fetchPages()\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[CnXwikiTab] unlink failed', err)\n\t\t\t}\n\t\t},\n\n\t\tpageKey(page) {\n\t\t\treturn page.id ?? page.reference ?? ''\n\t\t},\n\n\t\tpageTitle(page) {\n\t\t\treturn String(page.title ?? page.page ?? page.reference ?? this.pageKey(page))\n\t\t},\n\n\t\t/**\n\t\t * External XWiki deep-link for the page. Empty string when the\n\t\t * provider didn't surface a `url`, or surfaced an unsafe scheme, so\n\t\t * the row renders as a plain (non-anchored) NcListItem rather than a\n\t\t * dead link.\n\t\t *\n\t\t * @param {object} page Provider row.\n\t\t *\n\t\t * @return {string} Absolute XWiki URL or ''.\n\t\t */\n\t\tpageHref(page) {\n\t\t\tconst url = String(page.url ?? '')\n\t\t\treturn url && safeHref(url) !== '#' ? url : ''\n\t\t},\n\n\t\tbreadcrumbLabel(page) {\n\t\t\tconst crumb = page.breadcrumb\n\t\t\tif (Array.isArray(crumb) === false || crumb.length === 0) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\t// Drop the last element (the title) per AC — show only the ancestor path.\n\t\t\tconst ancestors = crumb.slice(0, -1)\n\t\t\tif (ancestors.length === 0) {\n\t\t\t\t// Single-element breadcrumb (root page) — fall back to the space name.\n\t\t\t\treturn String(page.space ?? '')\n\t\t\t}\n\t\t\t// XWiki renders space paths with a \"›\" chevron separator.\n\t\t\treturn ancestors.map((c) => String(c)).filter((s) => s !== '').join(' › ')\n\t\t},\n\n\t\t/**\n\t\t * One-line plain-text excerpt of the page body for the detail\n\t\t * surface. Strips `<script>`/`<style>` bodies, then all tags,\n\t\t * collapses whitespace and truncates — XWiki macros stay inert\n\t\t * text because the result is bound via {{ }} interpolation.\n\t\t *\n\t\t * @param {object} page Provider row.\n\t\t *\n\t\t * @return {string} Safe single-line excerpt (≤ EXCERPT_MAX_CHARS).\n\t\t */\n\t\texcerpt(page) {\n\t\t\tconst raw = page.content ?? page.renderedContent ?? page.excerpt ?? ''\n\t\t\tconst str = String(raw)\n\t\t\tif (str === '') {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tlet text = str\n\t\t\t\t.replace(/<script\\b[^>]*>[\\s\\S]*?<\\/script>/gi, '')\n\t\t\t\t.replace(/<style\\b[^>]*>[\\s\\S]*?<\\/style>/gi, '')\n\t\t\t\t.replace(/<[^>]+>/g, ' ')\n\t\t\t\t.replace(/\\s+/g, ' ')\n\t\t\t\t.trim()\n\t\t\tif (text.length > EXCERPT_MAX_CHARS) {\n\t\t\t\ttext = text.slice(0, EXCERPT_MAX_CHARS).trimEnd() + '…'\n\t\t\t}\n\t\t\treturn text\n\t\t},\n\n\t\t/**\n\t\t * Last-modified timestamp in milliseconds for the page, suitable\n\t\t * for `NcDateTime`. Returns null when absent or unparseable.\n\t\t *\n\t\t * @param {object} page Provider row.\n\t\t *\n\t\t * @return {number|null} Epoch milliseconds or null.\n\t\t */\n\t\tmodifiedMs(page) {\n\t\t\tconst v = page.modified ?? page.lastModified ?? page.updated ?? null\n\t\t\tif (v === null || v === undefined || v === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tif (typeof v === 'number') {\n\t\t\t\treturn v < 1e12 ? v * 1000 : v\n\t\t\t}\n\t\t\tconst parsed = Date.parse(String(v))\n\t\t\treturn Number.isNaN(parsed) === true ? null : parsed\n\t\t},\n\n\t\t/**\n\t\t * Map a 503 cause from the controller (`details.cause` per AD-23) to\n\t\t * the matching banner kind. Unknown causes fall through to 'upstream'.\n\t\t *\n\t\t * @param {string} cause One of `openconnector-down` / `openconnector-source-missing` / `provider-auth` / `upstream-service-down`.\n\t\t *\n\t\t * @return {string} Banner kind.\n\t\t */\n\t\tbannerFromCause(cause) {\n\t\t\tif (cause === 'openconnector-down' || cause === 'openconnector-source-missing') {\n\t\t\t\treturn 'unconfigured'\n\t\t\t}\n\t\t\tif (cause === 'provider-auth') {\n\t\t\t\treturn 'auth'\n\t\t\t}\n\t\t\treturn 'upstream'\n\t\t},\n\n\t\tasync fetchPages() {\n\t\t\tif (!this.register || !this.schema || !this.objectId) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.loading = true\n\t\t\tthis.bannerKind = 'none'\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(this.baseUrl()), { headers: buildHeaders() })\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tconst data = await response.json()\n\t\t\t\t\tconst rows = data.results || data.items || (Array.isArray(data) ? data : []) || []\n\t\t\t\t\tthis.pages = rows\n\t\t\t\t} else if (response.status === 503) {\n\t\t\t\t\tthis.pages = []\n\t\t\t\t\tlet cause = ''\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst body = await response.json()\n\t\t\t\t\t\tcause = String(body?.details?.cause ?? '')\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tcause = ''\n\t\t\t\t\t}\n\t\t\t\t\tthis.bannerKind = this.bannerFromCause(cause)\n\t\t\t\t} else {\n\t\t\t\t\tthis.pages = []\n\t\t\t\t\tthis.bannerKind = 'error'\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[CnXwikiTab] failed to fetch XWiki pages', err)\n\t\t\t\tthis.pages = []\n\t\t\t\tthis.bannerKind = 'error'\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-xwiki-tab__actions {\n\tdisplay: flex;\n\tgap: 8px;\n\tmargin-bottom: 10px;\n\tflex-wrap: wrap;\n}\n\n.cn-xwiki-tab__unlink {\n\tflex-shrink: 0;\n}\n\n.cn-xwiki-tab__banner {\n\tdisplay: flex;\n\talign-items: flex-start;\n\tgap: 10px;\n\tpadding: 10px 12px;\n\tmargin-bottom: 12px;\n\tborder-radius: var(--border-radius);\n\tfont-size: 0.9em;\n}\n\n.cn-xwiki-tab__banner--unconfigured {\n\tbackground: var(--color-background-hover);\n\tcolor: var(--color-main-text);\n\tborder-left: 3px solid var(--color-primary-element, #21468B);\n}\n\n.cn-xwiki-tab__banner--auth,\n.cn-xwiki-tab__banner--error {\n\tbackground: var(--color-error, #e9322d);\n\tcolor: var(--color-main-background);\n}\n\n.cn-xwiki-tab__banner--upstream {\n\tbackground: var(--color-warning, #e9a40f);\n\tcolor: var(--color-main-background);\n}\n\n.cn-xwiki-tab__banner-icon {\n\tflex-shrink: 0;\n\tmargin-top: 2px;\n}\n\n.cn-xwiki-tab__banner-body {\n\tflex: 1;\n\tmin-width: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n}\n\n.cn-xwiki-tab__banner-body p {\n\tmargin: 0;\n}\n\n.cn-xwiki-tab__banner-cta {\n\tflex-shrink: 0;\n}\n\n.cn-xwiki-tab__empty {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tgap: 8px;\n\tpadding: 16px 8px;\n\tcolor: var(--color-text-maxcontrast);\n\ttext-align: center;\n}\n\n.cn-xwiki-tab__empty-icon {\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-xwiki-tab__list {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n}\n\n/* XWiki-style document tile: a tinted square holding the page glyph. */\n.cn-xwiki-tab__row-icon {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 40px;\n\theight: 40px;\n\tborder-radius: var(--border-radius);\n\tbackground: var(--cn-xwiki-accent-soft, rgba(60, 162, 47, 0.12));\n\tcolor: var(--cn-xwiki-accent, #3CA22F);\n}\n\n.cn-xwiki-tab__subline {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 8px;\n\tflex-wrap: wrap;\n\tmin-width: 0;\n}\n\n.cn-xwiki-tab__breadcrumb {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.9em;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n.cn-xwiki-tab__date {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.9em;\n\twhite-space: nowrap;\n}\n\n.cn-xwiki-tab__excerpt {\n\tdisplay: block;\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.85em;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\tmax-width: 100%;\n}\n</style>\n"],"names":["CnXwikiPagePicker","CnXwikiPageCreate","t"],"mappings":"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"}
|
|
@@ -61,14 +61,13 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
61
61
|
class: "cn-xwiki-tab__banner-cta",
|
|
62
62
|
href: $options.banner.ctaHref || undefined,
|
|
63
63
|
target: $options.banner.ctaHref ? '_blank' : undefined,
|
|
64
|
-
rel: $options.banner.ctaHref ? 'noopener noreferrer' : undefined,
|
|
65
64
|
onClick: $options.banner.ctaHandler
|
|
66
65
|
}, {
|
|
67
66
|
default: withCtx(() => [
|
|
68
67
|
createTextVNode(toDisplayString($options.banner.ctaLabel), 1 /* TEXT */)
|
|
69
68
|
]),
|
|
70
69
|
_: 1 /* STABLE */
|
|
71
|
-
}, 8 /* PROPS */, ["href", "target", "
|
|
70
|
+
}, 8 /* PROPS */, ["href", "target", "onClick"]))
|
|
72
71
|
: createCommentVNode("v-if", true)
|
|
73
72
|
], 2 /* CLASS */))
|
|
74
73
|
: createCommentVNode("v-if", true),
|
|
@@ -151,8 +150,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
151
150
|
class: "cn-xwiki-tab__open",
|
|
152
151
|
closeAfterClick: true,
|
|
153
152
|
href: $options.pageHref(page),
|
|
154
|
-
target: "_blank"
|
|
155
|
-
rel: "noopener noreferrer"
|
|
153
|
+
target: "_blank"
|
|
156
154
|
}, {
|
|
157
155
|
icon: withCtx(() => [
|
|
158
156
|
createVNode(_component_OpenInNew, { size: 20 })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CnXwikiTab.vue3.js","sources":["../../../../../src/integrations/builtin/xwiki/CnXwikiTab.vue?vue&type=template&id=4b3fb212&lang.js"],"sourcesContent":["<!--\n CnXwikiTab — bespoke sidebar tab for the `xwiki` integration.\n\n Replaces the generic CnIntegrationTab for the `xwiki` leaf: renders\n linked XWiki pages as an XWiki-style document list. Each row mirrors\n an XWiki page-index entry — a document icon, the bold page title, a\n space breadcrumb subline (\"Space › Subspace\"), a relative last-\n modified hint (NcDateTime), and a one-line plain-text excerpt of the\n page body. Each row deep-links to the page on the external XWiki host\n (target=_blank rel=noopener).\n\n Talks to the same OpenRegister pluggable-integration sub-resource\n `/api/objects/{register}/{schema}/{objectId}/integrations/xwiki`\n served by `OCA\\OpenRegister\\Service\\Integration\\Providers\\XwikiProvider`\n (storage strategy `external` — routed through `ExternalIntegrationRouter`\n → Integriq `xwiki` source → remote XWiki REST API). Provider\n payload shape per `normalizeRow()`:\n { id, reference, title, space, page, breadcrumb, url, content, ... }\n where `breadcrumb` is an array (the UI joins it with \" › \"), and\n `content` (when present, e.g. on the detail-page surface) is the\n HTML-rendered body — the excerpt strips HTML/macros to inert text and\n is bound via {{ }} interpolation, never injected.\n\n Surface behaviour:\n - Empty state (\"No XWiki pages linked yet\") when the provider\n returns zero rows.\n - **Unconfigured state**: 503 + cause `openconnector-down` or\n `openconnector-source-missing` → prominent \"Configure XWiki\n connection\" CTA pointing at Integriq's source admin page.\n - **Auth-expired state**: 503 + cause `provider-auth` → \"XWiki\n returned 401 — check the Integriq source credentials\" with\n a Reconnect CTA pointing at Integriq.\n - **Upstream-down state**: 503 + cause `upstream-service-down` →\n \"XWiki is currently unavailable\" + Retry CTA.\n - **Generic-error state**: fetch throws or non-OK non-503 → \"Could\n not load XWiki pages\" + Retry CTA.\n - Loading state via NcLoadingIcon for the full-tab spin.\n\n XWiki calls go through Integriq → external HTTP, so latency can\n spike on cold caches. The fetch carries no client-side timeout (the\n router enforces an upstream timeout server-side and surfaces\n upstream-down on expiry), but the loading state is shown for the\n whole round-trip so the sidebar never appears hung.\n\n See `openregister/openspec/changes/integration-xwiki/` for the spec\n delta and ADR-019 (registry mechanism) / ADR-022 (consumption).\n-->\n<template>\n\t<div class=\"cn-sidebar-tab cn-xwiki-tab\">\n\t\t<!-- Banner state: surface auth + config + upstream failures prominently -->\n\t\t<div\n\t\t\tv-if=\"banner.kind !== 'none'\"\n\t\t\tclass=\"cn-xwiki-tab__banner\"\n\t\t\t:class=\"`cn-xwiki-tab__banner--${banner.kind}`\"\n\t\t\trole=\"alert\">\n\t\t\t<AlertCircleOutline :size=\"18\" class=\"cn-xwiki-tab__banner-icon\" />\n\t\t\t<div class=\"cn-xwiki-tab__banner-body\">\n\t\t\t\t<strong>{{ banner.title }}</strong>\n\t\t\t\t<p>{{ banner.message }}</p>\n\t\t\t</div>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"banner.ctaLabel\"\n\t\t\t\tvariant=\"primary\"\n\t\t\t\tclass=\"cn-xwiki-tab__banner-cta\"\n\t\t\t\t:href=\"banner.ctaHref || undefined\"\n\t\t\t\t:target=\"banner.ctaHref ? '_blank' : undefined\"\n\t\t\t\t:rel=\"banner.ctaHref ? 'noopener noreferrer' : undefined\"\n\t\t\t\t@click=\"banner.ctaHandler\">\n\t\t\t\t{{ banner.ctaLabel }}\n\t\t\t</NcButton>\n\t\t</div>\n\n\t\t<!-- Link / Create actions. Disabled when the source is unconfigured;\n\t\t the banner above already carries the Configure CTA. -->\n\t\t<div v-if=\"banner.kind === 'none' || banner.kind === 'unconfigured'\" class=\"cn-xwiki-tab__actions\">\n\t\t\t<NcButton variant=\"secondary\" :disabled=\"banner.kind === 'unconfigured'\" @click=\"openPicker\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<LinkVariant :size=\"18\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Link existing page') }}\n\t\t\t</NcButton>\n\t\t\t<NcButton variant=\"primary\" :disabled=\"banner.kind === 'unconfigured'\" @click=\"openCreate\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Plus :size=\"18\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Create new page') }}\n\t\t\t</NcButton>\n\t\t</div>\n\n\t\t<NcLoadingIcon v-if=\"loading\" />\n\n\t\t<div\n\t\t\tv-else-if=\"pages.length === 0 && banner.kind === 'none'\"\n\t\t\tclass=\"cn-sidebar-tab__empty cn-xwiki-tab__empty\">\n\t\t\t<FileDocumentMultiple :size=\"32\" class=\"cn-xwiki-tab__empty-icon\" />\n\t\t\t<p>{{ emptyLabel }}</p>\n\t\t</div>\n\n\t\t<ul v-else-if=\"pages.length > 0\" class=\"cn-xwiki-tab__list\">\n\t\t\t<NcListItem\n\t\t\t\tv-for=\"page in pages\"\n\t\t\t\t:key=\"pageKey(page)\"\n\t\t\t\tclass=\"cn-xwiki-tab__row\"\n\t\t\t\t:name=\"pageTitle(page)\"\n\t\t\t\t:bold=\"true\"\n\t\t\t\t:href=\"pageHref(page)\"\n\t\t\t\t:target=\"pageHref(page) ? '_blank' : undefined\"\n\t\t\t\t:forceDisplayActions=\"true\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<span class=\"cn-xwiki-tab__row-icon\">\n\t\t\t\t\t\t<FileDocumentOutline :size=\"22\" />\n\t\t\t\t\t</span>\n\t\t\t\t</template>\n\t\t\t\t<template #subname>\n\t\t\t\t\t<span class=\"cn-xwiki-tab__subline\">\n\t\t\t\t\t\t<span v-if=\"breadcrumbLabel(page)\" class=\"cn-xwiki-tab__breadcrumb\">\n\t\t\t\t\t\t\t{{ breadcrumbLabel(page) }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<NcDateTime\n\t\t\t\t\t\t\tv-if=\"modifiedMs(page) !== null\"\n\t\t\t\t\t\t\tclass=\"cn-xwiki-tab__date\"\n\t\t\t\t\t\t\t:timestamp=\"modifiedMs(page)\"\n\t\t\t\t\t\t\trelativeTime=\"short\" />\n\t\t\t\t\t</span>\n\t\t\t\t</template>\n\t\t\t\t<template v-if=\"excerpt(page)\" #extra>\n\t\t\t\t\t<span class=\"cn-xwiki-tab__excerpt\">{{ excerpt(page) }}</span>\n\t\t\t\t</template>\n\t\t\t\t<template #actions>\n\t\t\t\t\t<NcActionLink\n\t\t\t\t\t\tv-if=\"pageHref(page)\"\n\t\t\t\t\t\tclass=\"cn-xwiki-tab__open\"\n\t\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t\t:href=\"pageHref(page)\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\trel=\"noopener noreferrer\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<OpenInNew :size=\"20\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ t('nextcloud-vue', 'Open in XWiki') }}\n\t\t\t\t\t</NcActionLink>\n\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\tclass=\"cn-xwiki-tab__unlink\"\n\t\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t\t@click=\"unlinkPage(page)\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<LinkOff :size=\"20\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ t('nextcloud-vue', 'Unlink page') }}\n\t\t\t\t\t</NcActionButton>\n\t\t\t\t</template>\n\t\t\t</NcListItem>\n\t\t</ul>\n\n\t\t<CnXwikiPagePicker\n\t\t\tv-if=\"pickerOpen\"\n\t\t\t:apiBase=\"apiBase\"\n\t\t\t:openConnectorSourcesUrl=\"openConnectorSourcesUrl\"\n\t\t\t@close=\"pickerOpen = false\"\n\t\t\t@link=\"onLinkPick\" />\n\n\t\t<CnXwikiPageCreate\n\t\t\tv-if=\"createOpen\"\n\t\t\t:apiBase=\"apiBase\"\n\t\t\t:unavailable=\"banner.kind === 'unconfigured'\"\n\t\t\t:openConnectorSourcesUrl=\"openConnectorSourcesUrl\"\n\t\t\t@close=\"createOpen = false\"\n\t\t\t@create=\"onCreatePick\" />\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcActionButton, NcActionLink, NcButton, NcDateTime, NcListItem, NcLoadingIcon } from '@nextcloud/vue'\nimport AlertCircleOutline from 'vue-material-design-icons/AlertCircleOutline.vue'\nimport FileDocumentMultiple from 'vue-material-design-icons/FileDocumentMultiple.vue'\nimport FileDocumentOutline from 'vue-material-design-icons/FileDocumentOutline.vue'\nimport LinkOff from 'vue-material-design-icons/LinkOff.vue'\nimport LinkVariant from 'vue-material-design-icons/LinkVariant.vue'\nimport OpenInNew from 'vue-material-design-icons/OpenInNew.vue'\nimport Plus from 'vue-material-design-icons/Plus.vue'\nimport CnXwikiPageCreate from '../../../components/CnXwikiPageCreate/CnXwikiPageCreate.vue'\nimport CnXwikiPagePicker from '../../../components/CnXwikiPagePicker/CnXwikiPagePicker.vue'\nimport { buildHeaders, prefixUrl } from '../../../utils/index.js'\n\nconst EXCERPT_MAX_CHARS = 140\n\n/**\n * CnXwikiTab — bespoke sidebar list for the `xwiki` external integration.\n *\n * Renders linked XWiki pages as an XWiki-style document index: document\n * icon, bold title, space breadcrumb, relative last-modified, and a\n * one-line plain-text excerpt — plus prominent auth/config banners when\n * the Integriq source is missing/unhealthy.\n */\nexport default {\n\tname: 'CnXwikiTab',\n\n\tcomponents: {\n\t\tNcActionButton,\n\t\tNcActionLink,\n\t\tNcButton,\n\t\tNcDateTime,\n\t\tNcListItem,\n\t\tNcLoadingIcon,\n\t\tAlertCircleOutline,\n\t\tFileDocumentMultiple,\n\t\tFileDocumentOutline,\n\t\tLinkOff,\n\t\tLinkVariant,\n\t\tOpenInNew,\n\t\tPlus,\n\t\tCnXwikiPagePicker,\n\t\tCnXwikiPageCreate,\n\t},\n\n\tprops: {\n\t\t/** Stable integration id (forwarded from the registry — always `'xwiki'`). */\n\t\tintegrationId: { type: String, default: 'xwiki' },\n\t\t/** Parent object id. */\n\t\tobjectId: { type: String, required: true },\n\t\t/** OpenRegister register id (slug or uuid). */\n\t\tregister: { type: String, default: '' },\n\t\t/** OpenRegister schema id (slug or uuid). */\n\t\tschema: { type: String, default: '' },\n\t\t/** Base API URL. */\n\t\tapiBase: { type: String, default: '/apps/openregister/api' },\n\t\t/** Pre-translated empty-state label. */\n\t\temptyLabel: { type: String, default: () => t('nextcloud-vue', 'No XWiki pages linked yet') },\n\t\t/** URL of Integriq's sources admin page (deep-link target for the configure CTA). */\n\t\topenConnectorSourcesUrl: { type: String, default: '/index.php/apps/openconnector/sources' },\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tpages: [],\n\t\t\tloading: false,\n\t\t\t/** One of: 'none' | 'unconfigured' | 'auth' | 'upstream' | 'error'. */\n\t\t\tbannerKind: 'none',\n\t\t\tpickerOpen: false,\n\t\t\tcreateOpen: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tbanner() {\n\t\t\tswitch (this.bannerKind) {\n\t\t\t\tcase 'unconfigured':\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: 'unconfigured',\n\t\t\t\t\t\ttitle: t('nextcloud-vue', 'XWiki connection not configured'),\n\t\t\t\t\t\tmessage: t('nextcloud-vue', 'Add an XWiki source in Integriq with the upstream URL and credentials so OpenRegister can link pages.'),\n\t\t\t\t\t\tctaLabel: t('nextcloud-vue', 'Configure XWiki connection'),\n\t\t\t\t\t\tctaHref: this.openConnectorSourcesUrl,\n\t\t\t\t\t}\n\t\t\t\tcase 'auth':\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: 'auth',\n\t\t\t\t\t\ttitle: t('nextcloud-vue', 'XWiki authentication failed'),\n\t\t\t\t\t\tmessage: t('nextcloud-vue', 'XWiki returned 401 — check the Integriq source credentials.'),\n\t\t\t\t\t\tctaLabel: t('nextcloud-vue', 'Reconnect'),\n\t\t\t\t\t\tctaHref: this.openConnectorSourcesUrl,\n\t\t\t\t\t}\n\t\t\t\tcase 'upstream':\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: 'upstream',\n\t\t\t\t\t\ttitle: t('nextcloud-vue', 'XWiki is currently unavailable'),\n\t\t\t\t\t\tmessage: t('nextcloud-vue', 'The upstream XWiki host did not respond. Try again in a moment.'),\n\t\t\t\t\t\tctaLabel: t('nextcloud-vue', 'Retry'),\n\t\t\t\t\t\tctaHandler: this.fetchPages,\n\t\t\t\t\t}\n\t\t\t\tcase 'error':\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: 'error',\n\t\t\t\t\t\ttitle: t('nextcloud-vue', 'Could not load XWiki pages'),\n\t\t\t\t\t\tmessage: t('nextcloud-vue', 'Something went wrong while loading the linked pages.'),\n\t\t\t\t\t\tctaLabel: t('nextcloud-vue', 'Retry'),\n\t\t\t\t\t\tctaHandler: this.fetchPages,\n\t\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\treturn { kind: 'none', title: '', message: '', ctaLabel: '', ctaHandler: () => {} }\n\t\t\t}\n\t\t},\n\t},\n\n\twatch: {\n\t\tobjectId: { immediate: true, handler(id) {\n\t\t\tif (id) {\n\t\t\t\tthis.fetchPages()\n\t\t\t}\n\t\t} },\n\n\t\tregister() {\n\t\t\tthis.fetchPages()\n\t\t},\n\n\t\tschema() {\n\t\t\tthis.fetchPages()\n\t\t},\n\t},\n\n\tmethods: {\n\t\tt,\n\n\t\tbaseUrl() {\n\t\t\treturn `${this.apiBase}/objects/${this.register}/${this.schema}/${this.objectId}/integrations/${this.integrationId}`\n\t\t},\n\n\t\t/**\n\t\t * Base for the Tier-2 xwiki endpoints (link/new/destroy).\n\t\t *\n\t\t * @return {string} The endpoint URL.\n\t\t */\n\t\txwikiEndpoint() {\n\t\t\treturn `${this.apiBase}/objects/${this.register}/${this.schema}/${this.objectId}/xwiki`\n\t\t},\n\n\t\topenPicker() {\n\t\t\tthis.pickerOpen = true\n\t\t},\n\n\t\topenCreate() {\n\t\t\tthis.createOpen = true\n\t\t},\n\n\t\tasync onLinkPick(payload) {\n\t\t\tthis.pickerOpen = false\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(this.xwikiEndpoint()), {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { ...buildHeaders(), 'Content-Type': 'application/json' },\n\t\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\t})\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tawait this.fetchPages()\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[CnXwikiTab] link failed', err)\n\t\t\t}\n\t\t},\n\n\t\tasync onCreatePick(payload) {\n\t\t\tthis.createOpen = false\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(`${this.xwikiEndpoint()}/new`), {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { ...buildHeaders(), 'Content-Type': 'application/json' },\n\t\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\t})\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tawait this.fetchPages()\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[CnXwikiTab] create failed', err)\n\t\t\t}\n\t\t},\n\n\t\tasync unlinkPage(page) {\n\t\t\tconst ref = this.pageKey(page)\n\t\t\tif (!ref) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(`${this.xwikiEndpoint()}/${encodeURIComponent(ref)}`), {\n\t\t\t\t\tmethod: 'DELETE',\n\t\t\t\t\theaders: buildHeaders(),\n\t\t\t\t})\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tawait this.fetchPages()\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[CnXwikiTab] unlink failed', err)\n\t\t\t}\n\t\t},\n\n\t\tpageKey(page) {\n\t\t\treturn page.id ?? page.reference ?? ''\n\t\t},\n\n\t\tpageTitle(page) {\n\t\t\treturn String(page.title ?? page.page ?? page.reference ?? this.pageKey(page))\n\t\t},\n\n\t\t/**\n\t\t * External XWiki deep-link for the page. Empty string when the\n\t\t * provider didn't surface a `url`, so the row renders as a plain\n\t\t * (non-anchored) NcListItem rather than a dead link.\n\t\t *\n\t\t * @param {object} page Provider row.\n\t\t *\n\t\t * @return {string} Absolute XWiki URL or ''.\n\t\t */\n\t\tpageHref(page) {\n\t\t\treturn String(page.url ?? '')\n\t\t},\n\n\t\tbreadcrumbLabel(page) {\n\t\t\tconst crumb = page.breadcrumb\n\t\t\tif (Array.isArray(crumb) === false || crumb.length === 0) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\t// Drop the last element (the title) per AC — show only the ancestor path.\n\t\t\tconst ancestors = crumb.slice(0, -1)\n\t\t\tif (ancestors.length === 0) {\n\t\t\t\t// Single-element breadcrumb (root page) — fall back to the space name.\n\t\t\t\treturn String(page.space ?? '')\n\t\t\t}\n\t\t\t// XWiki renders space paths with a \"›\" chevron separator.\n\t\t\treturn ancestors.map((c) => String(c)).filter((s) => s !== '').join(' › ')\n\t\t},\n\n\t\t/**\n\t\t * One-line plain-text excerpt of the page body for the detail\n\t\t * surface. Strips `<script>`/`<style>` bodies, then all tags,\n\t\t * collapses whitespace and truncates — XWiki macros stay inert\n\t\t * text because the result is bound via {{ }} interpolation.\n\t\t *\n\t\t * @param {object} page Provider row.\n\t\t *\n\t\t * @return {string} Safe single-line excerpt (≤ EXCERPT_MAX_CHARS).\n\t\t */\n\t\texcerpt(page) {\n\t\t\tconst raw = page.content ?? page.renderedContent ?? page.excerpt ?? ''\n\t\t\tconst str = String(raw)\n\t\t\tif (str === '') {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tlet text = str\n\t\t\t\t.replace(/<script\\b[^>]*>[\\s\\S]*?<\\/script>/gi, '')\n\t\t\t\t.replace(/<style\\b[^>]*>[\\s\\S]*?<\\/style>/gi, '')\n\t\t\t\t.replace(/<[^>]+>/g, ' ')\n\t\t\t\t.replace(/\\s+/g, ' ')\n\t\t\t\t.trim()\n\t\t\tif (text.length > EXCERPT_MAX_CHARS) {\n\t\t\t\ttext = text.slice(0, EXCERPT_MAX_CHARS).trimEnd() + '…'\n\t\t\t}\n\t\t\treturn text\n\t\t},\n\n\t\t/**\n\t\t * Last-modified timestamp in milliseconds for the page, suitable\n\t\t * for `NcDateTime`. Returns null when absent or unparseable.\n\t\t *\n\t\t * @param {object} page Provider row.\n\t\t *\n\t\t * @return {number|null} Epoch milliseconds or null.\n\t\t */\n\t\tmodifiedMs(page) {\n\t\t\tconst v = page.modified ?? page.lastModified ?? page.updated ?? null\n\t\t\tif (v === null || v === undefined || v === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tif (typeof v === 'number') {\n\t\t\t\treturn v < 1e12 ? v * 1000 : v\n\t\t\t}\n\t\t\tconst parsed = Date.parse(String(v))\n\t\t\treturn Number.isNaN(parsed) === true ? null : parsed\n\t\t},\n\n\t\t/**\n\t\t * Map a 503 cause from the controller (`details.cause` per AD-23) to\n\t\t * the matching banner kind. Unknown causes fall through to 'upstream'.\n\t\t *\n\t\t * @param {string} cause One of `openconnector-down` / `openconnector-source-missing` / `provider-auth` / `upstream-service-down`.\n\t\t *\n\t\t * @return {string} Banner kind.\n\t\t */\n\t\tbannerFromCause(cause) {\n\t\t\tif (cause === 'openconnector-down' || cause === 'openconnector-source-missing') {\n\t\t\t\treturn 'unconfigured'\n\t\t\t}\n\t\t\tif (cause === 'provider-auth') {\n\t\t\t\treturn 'auth'\n\t\t\t}\n\t\t\treturn 'upstream'\n\t\t},\n\n\t\tasync fetchPages() {\n\t\t\tif (!this.register || !this.schema || !this.objectId) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.loading = true\n\t\t\tthis.bannerKind = 'none'\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(this.baseUrl()), { headers: buildHeaders() })\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tconst data = await response.json()\n\t\t\t\t\tconst rows = data.results || data.items || (Array.isArray(data) ? data : []) || []\n\t\t\t\t\tthis.pages = rows\n\t\t\t\t} else if (response.status === 503) {\n\t\t\t\t\tthis.pages = []\n\t\t\t\t\tlet cause = ''\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst body = await response.json()\n\t\t\t\t\t\tcause = String(body?.details?.cause ?? '')\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tcause = ''\n\t\t\t\t\t}\n\t\t\t\t\tthis.bannerKind = this.bannerFromCause(cause)\n\t\t\t\t} else {\n\t\t\t\t\tthis.pages = []\n\t\t\t\t\tthis.bannerKind = 'error'\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[CnXwikiTab] failed to fetch XWiki pages', err)\n\t\t\t\tthis.pages = []\n\t\t\t\tthis.bannerKind = 'error'\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-xwiki-tab__actions {\n\tdisplay: flex;\n\tgap: 8px;\n\tmargin-bottom: 10px;\n\tflex-wrap: wrap;\n}\n\n.cn-xwiki-tab__unlink {\n\tflex-shrink: 0;\n}\n\n.cn-xwiki-tab__banner {\n\tdisplay: flex;\n\talign-items: flex-start;\n\tgap: 10px;\n\tpadding: 10px 12px;\n\tmargin-bottom: 12px;\n\tborder-radius: var(--border-radius);\n\tfont-size: 0.9em;\n}\n\n.cn-xwiki-tab__banner--unconfigured {\n\tbackground: var(--color-background-hover);\n\tcolor: var(--color-main-text);\n\tborder-left: 3px solid var(--color-primary-element, #21468B);\n}\n\n.cn-xwiki-tab__banner--auth,\n.cn-xwiki-tab__banner--error {\n\tbackground: var(--color-error, #e9322d);\n\tcolor: var(--color-main-background);\n}\n\n.cn-xwiki-tab__banner--upstream {\n\tbackground: var(--color-warning, #e9a40f);\n\tcolor: var(--color-main-background);\n}\n\n.cn-xwiki-tab__banner-icon {\n\tflex-shrink: 0;\n\tmargin-top: 2px;\n}\n\n.cn-xwiki-tab__banner-body {\n\tflex: 1;\n\tmin-width: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n}\n\n.cn-xwiki-tab__banner-body p {\n\tmargin: 0;\n}\n\n.cn-xwiki-tab__banner-cta {\n\tflex-shrink: 0;\n}\n\n.cn-xwiki-tab__empty {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tgap: 8px;\n\tpadding: 16px 8px;\n\tcolor: var(--color-text-maxcontrast);\n\ttext-align: center;\n}\n\n.cn-xwiki-tab__empty-icon {\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-xwiki-tab__list {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n}\n\n/* XWiki-style document tile: a tinted square holding the page glyph. */\n.cn-xwiki-tab__row-icon {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 40px;\n\theight: 40px;\n\tborder-radius: var(--border-radius);\n\tbackground: var(--cn-xwiki-accent-soft, rgba(60, 162, 47, 0.12));\n\tcolor: var(--cn-xwiki-accent, #3CA22F);\n}\n\n.cn-xwiki-tab__subline {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 8px;\n\tflex-wrap: wrap;\n\tmin-width: 0;\n}\n\n.cn-xwiki-tab__breadcrumb {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.9em;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n.cn-xwiki-tab__date {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.9em;\n\twhite-space: nowrap;\n}\n\n.cn-xwiki-tab__excerpt {\n\tdisplay: block;\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.85em;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\tmax-width: 100%;\n}\n</style>\n"],"names":["_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_toDisplayString","_createTextVNode","_createVNode","_createBlock"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CnXwikiTab.vue3.js","sources":["../../../../../src/integrations/builtin/xwiki/CnXwikiTab.vue?vue&type=template&id=4b3fb212&lang.js"],"sourcesContent":["<!--\n CnXwikiTab — bespoke sidebar tab for the `xwiki` integration.\n\n Replaces the generic CnIntegrationTab for the `xwiki` leaf: renders\n linked XWiki pages as an XWiki-style document list. Each row mirrors\n an XWiki page-index entry — a document icon, the bold page title, a\n space breadcrumb subline (\"Space › Subspace\"), a relative last-\n modified hint (NcDateTime), and a one-line plain-text excerpt of the\n page body. Each row deep-links to the page on the external XWiki host\n (target=_blank rel=noopener).\n\n Talks to the same OpenRegister pluggable-integration sub-resource\n `/api/objects/{register}/{schema}/{objectId}/integrations/xwiki`\n served by `OCA\\OpenRegister\\Service\\Integration\\Providers\\XwikiProvider`\n (storage strategy `external` — routed through `ExternalIntegrationRouter`\n → Integriq `xwiki` source → remote XWiki REST API). Provider\n payload shape per `normalizeRow()`:\n { id, reference, title, space, page, breadcrumb, url, content, ... }\n where `breadcrumb` is an array (the UI joins it with \" › \"), and\n `content` (when present, e.g. on the detail-page surface) is the\n HTML-rendered body — the excerpt strips HTML/macros to inert text and\n is bound via {{ }} interpolation, never injected.\n\n Surface behaviour:\n - Empty state (\"No XWiki pages linked yet\") when the provider\n returns zero rows.\n - **Unconfigured state**: 503 + cause `openconnector-down` or\n `openconnector-source-missing` → prominent \"Configure XWiki\n connection\" CTA pointing at Integriq's source admin page.\n - **Auth-expired state**: 503 + cause `provider-auth` → \"XWiki\n returned 401 — check the Integriq source credentials\" with\n a Reconnect CTA pointing at Integriq.\n - **Upstream-down state**: 503 + cause `upstream-service-down` →\n \"XWiki is currently unavailable\" + Retry CTA.\n - **Generic-error state**: fetch throws or non-OK non-503 → \"Could\n not load XWiki pages\" + Retry CTA.\n - Loading state via NcLoadingIcon for the full-tab spin.\n\n XWiki calls go through Integriq → external HTTP, so latency can\n spike on cold caches. The fetch carries no client-side timeout (the\n router enforces an upstream timeout server-side and surfaces\n upstream-down on expiry), but the loading state is shown for the\n whole round-trip so the sidebar never appears hung.\n\n See `openregister/openspec/changes/integration-xwiki/` for the spec\n delta and ADR-019 (registry mechanism) / ADR-022 (consumption).\n-->\n<template>\n\t<div class=\"cn-sidebar-tab cn-xwiki-tab\">\n\t\t<!-- Banner state: surface auth + config + upstream failures prominently -->\n\t\t<div\n\t\t\tv-if=\"banner.kind !== 'none'\"\n\t\t\tclass=\"cn-xwiki-tab__banner\"\n\t\t\t:class=\"`cn-xwiki-tab__banner--${banner.kind}`\"\n\t\t\trole=\"alert\">\n\t\t\t<AlertCircleOutline :size=\"18\" class=\"cn-xwiki-tab__banner-icon\" />\n\t\t\t<div class=\"cn-xwiki-tab__banner-body\">\n\t\t\t\t<strong>{{ banner.title }}</strong>\n\t\t\t\t<p>{{ banner.message }}</p>\n\t\t\t</div>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"banner.ctaLabel\"\n\t\t\t\tvariant=\"primary\"\n\t\t\t\tclass=\"cn-xwiki-tab__banner-cta\"\n\t\t\t\t:href=\"banner.ctaHref || undefined\"\n\t\t\t\t:target=\"banner.ctaHref ? '_blank' : undefined\"\n\t\t\t\t@click=\"banner.ctaHandler\">\n\t\t\t\t{{ banner.ctaLabel }}\n\t\t\t</NcButton>\n\t\t</div>\n\n\t\t<!-- Link / Create actions. Disabled when the source is unconfigured;\n\t\t the banner above already carries the Configure CTA. -->\n\t\t<div v-if=\"banner.kind === 'none' || banner.kind === 'unconfigured'\" class=\"cn-xwiki-tab__actions\">\n\t\t\t<NcButton variant=\"secondary\" :disabled=\"banner.kind === 'unconfigured'\" @click=\"openPicker\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<LinkVariant :size=\"18\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Link existing page') }}\n\t\t\t</NcButton>\n\t\t\t<NcButton variant=\"primary\" :disabled=\"banner.kind === 'unconfigured'\" @click=\"openCreate\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Plus :size=\"18\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Create new page') }}\n\t\t\t</NcButton>\n\t\t</div>\n\n\t\t<NcLoadingIcon v-if=\"loading\" />\n\n\t\t<div\n\t\t\tv-else-if=\"pages.length === 0 && banner.kind === 'none'\"\n\t\t\tclass=\"cn-sidebar-tab__empty cn-xwiki-tab__empty\">\n\t\t\t<FileDocumentMultiple :size=\"32\" class=\"cn-xwiki-tab__empty-icon\" />\n\t\t\t<p>{{ emptyLabel }}</p>\n\t\t</div>\n\n\t\t<ul v-else-if=\"pages.length > 0\" class=\"cn-xwiki-tab__list\">\n\t\t\t<NcListItem\n\t\t\t\tv-for=\"page in pages\"\n\t\t\t\t:key=\"pageKey(page)\"\n\t\t\t\tclass=\"cn-xwiki-tab__row\"\n\t\t\t\t:name=\"pageTitle(page)\"\n\t\t\t\t:bold=\"true\"\n\t\t\t\t:href=\"pageHref(page)\"\n\t\t\t\t:target=\"pageHref(page) ? '_blank' : undefined\"\n\t\t\t\t:forceDisplayActions=\"true\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<span class=\"cn-xwiki-tab__row-icon\">\n\t\t\t\t\t\t<FileDocumentOutline :size=\"22\" />\n\t\t\t\t\t</span>\n\t\t\t\t</template>\n\t\t\t\t<template #subname>\n\t\t\t\t\t<span class=\"cn-xwiki-tab__subline\">\n\t\t\t\t\t\t<span v-if=\"breadcrumbLabel(page)\" class=\"cn-xwiki-tab__breadcrumb\">\n\t\t\t\t\t\t\t{{ breadcrumbLabel(page) }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<NcDateTime\n\t\t\t\t\t\t\tv-if=\"modifiedMs(page) !== null\"\n\t\t\t\t\t\t\tclass=\"cn-xwiki-tab__date\"\n\t\t\t\t\t\t\t:timestamp=\"modifiedMs(page)\"\n\t\t\t\t\t\t\trelativeTime=\"short\" />\n\t\t\t\t\t</span>\n\t\t\t\t</template>\n\t\t\t\t<template v-if=\"excerpt(page)\" #extra>\n\t\t\t\t\t<span class=\"cn-xwiki-tab__excerpt\">{{ excerpt(page) }}</span>\n\t\t\t\t</template>\n\t\t\t\t<template #actions>\n\t\t\t\t\t<NcActionLink\n\t\t\t\t\t\tv-if=\"pageHref(page)\"\n\t\t\t\t\t\tclass=\"cn-xwiki-tab__open\"\n\t\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t\t:href=\"pageHref(page)\"\n\t\t\t\t\t\ttarget=\"_blank\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<OpenInNew :size=\"20\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ t('nextcloud-vue', 'Open in XWiki') }}\n\t\t\t\t\t</NcActionLink>\n\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\tclass=\"cn-xwiki-tab__unlink\"\n\t\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t\t@click=\"unlinkPage(page)\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<LinkOff :size=\"20\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ t('nextcloud-vue', 'Unlink page') }}\n\t\t\t\t\t</NcActionButton>\n\t\t\t\t</template>\n\t\t\t</NcListItem>\n\t\t</ul>\n\n\t\t<CnXwikiPagePicker\n\t\t\tv-if=\"pickerOpen\"\n\t\t\t:apiBase=\"apiBase\"\n\t\t\t:openConnectorSourcesUrl=\"openConnectorSourcesUrl\"\n\t\t\t@close=\"pickerOpen = false\"\n\t\t\t@link=\"onLinkPick\" />\n\n\t\t<CnXwikiPageCreate\n\t\t\tv-if=\"createOpen\"\n\t\t\t:apiBase=\"apiBase\"\n\t\t\t:unavailable=\"banner.kind === 'unconfigured'\"\n\t\t\t:openConnectorSourcesUrl=\"openConnectorSourcesUrl\"\n\t\t\t@close=\"createOpen = false\"\n\t\t\t@create=\"onCreatePick\" />\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcActionButton, NcActionLink, NcButton, NcDateTime, NcListItem, NcLoadingIcon } from '@nextcloud/vue'\nimport AlertCircleOutline from 'vue-material-design-icons/AlertCircleOutline.vue'\nimport FileDocumentMultiple from 'vue-material-design-icons/FileDocumentMultiple.vue'\nimport FileDocumentOutline from 'vue-material-design-icons/FileDocumentOutline.vue'\nimport LinkOff from 'vue-material-design-icons/LinkOff.vue'\nimport LinkVariant from 'vue-material-design-icons/LinkVariant.vue'\nimport OpenInNew from 'vue-material-design-icons/OpenInNew.vue'\nimport Plus from 'vue-material-design-icons/Plus.vue'\nimport CnXwikiPageCreate from '../../../components/CnXwikiPageCreate/CnXwikiPageCreate.vue'\nimport CnXwikiPagePicker from '../../../components/CnXwikiPagePicker/CnXwikiPagePicker.vue'\nimport { buildHeaders, prefixUrl, safeHref } from '../../../utils/index.js'\n\nconst EXCERPT_MAX_CHARS = 140\n\n/**\n * CnXwikiTab — bespoke sidebar list for the `xwiki` external integration.\n *\n * Renders linked XWiki pages as an XWiki-style document index: document\n * icon, bold title, space breadcrumb, relative last-modified, and a\n * one-line plain-text excerpt — plus prominent auth/config banners when\n * the Integriq source is missing/unhealthy.\n */\nexport default {\n\tname: 'CnXwikiTab',\n\n\tcomponents: {\n\t\tNcActionButton,\n\t\tNcActionLink,\n\t\tNcButton,\n\t\tNcDateTime,\n\t\tNcListItem,\n\t\tNcLoadingIcon,\n\t\tAlertCircleOutline,\n\t\tFileDocumentMultiple,\n\t\tFileDocumentOutline,\n\t\tLinkOff,\n\t\tLinkVariant,\n\t\tOpenInNew,\n\t\tPlus,\n\t\tCnXwikiPagePicker,\n\t\tCnXwikiPageCreate,\n\t},\n\n\tprops: {\n\t\t/** Stable integration id (forwarded from the registry — always `'xwiki'`). */\n\t\tintegrationId: { type: String, default: 'xwiki' },\n\t\t/** Parent object id. */\n\t\tobjectId: { type: String, required: true },\n\t\t/** OpenRegister register id (slug or uuid). */\n\t\tregister: { type: String, default: '' },\n\t\t/** OpenRegister schema id (slug or uuid). */\n\t\tschema: { type: String, default: '' },\n\t\t/** Base API URL. */\n\t\tapiBase: { type: String, default: '/apps/openregister/api' },\n\t\t/** Pre-translated empty-state label. */\n\t\temptyLabel: { type: String, default: () => t('nextcloud-vue', 'No XWiki pages linked yet') },\n\t\t/** URL of Integriq's sources admin page (deep-link target for the configure CTA). */\n\t\topenConnectorSourcesUrl: { type: String, default: '/index.php/apps/openconnector/sources' },\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tpages: [],\n\t\t\tloading: false,\n\t\t\t/** One of: 'none' | 'unconfigured' | 'auth' | 'upstream' | 'error'. */\n\t\t\tbannerKind: 'none',\n\t\t\tpickerOpen: false,\n\t\t\tcreateOpen: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tbanner() {\n\t\t\tswitch (this.bannerKind) {\n\t\t\t\tcase 'unconfigured':\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: 'unconfigured',\n\t\t\t\t\t\ttitle: t('nextcloud-vue', 'XWiki connection not configured'),\n\t\t\t\t\t\tmessage: t('nextcloud-vue', 'Add an XWiki source in Integriq with the upstream URL and credentials so OpenRegister can link pages.'),\n\t\t\t\t\t\tctaLabel: t('nextcloud-vue', 'Configure XWiki connection'),\n\t\t\t\t\t\tctaHref: this.openConnectorSourcesUrl,\n\t\t\t\t\t}\n\t\t\t\tcase 'auth':\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: 'auth',\n\t\t\t\t\t\ttitle: t('nextcloud-vue', 'XWiki authentication failed'),\n\t\t\t\t\t\tmessage: t('nextcloud-vue', 'XWiki returned 401 — check the Integriq source credentials.'),\n\t\t\t\t\t\tctaLabel: t('nextcloud-vue', 'Reconnect'),\n\t\t\t\t\t\tctaHref: this.openConnectorSourcesUrl,\n\t\t\t\t\t}\n\t\t\t\tcase 'upstream':\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: 'upstream',\n\t\t\t\t\t\ttitle: t('nextcloud-vue', 'XWiki is currently unavailable'),\n\t\t\t\t\t\tmessage: t('nextcloud-vue', 'The upstream XWiki host did not respond. Try again in a moment.'),\n\t\t\t\t\t\tctaLabel: t('nextcloud-vue', 'Retry'),\n\t\t\t\t\t\tctaHandler: this.fetchPages,\n\t\t\t\t\t}\n\t\t\t\tcase 'error':\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: 'error',\n\t\t\t\t\t\ttitle: t('nextcloud-vue', 'Could not load XWiki pages'),\n\t\t\t\t\t\tmessage: t('nextcloud-vue', 'Something went wrong while loading the linked pages.'),\n\t\t\t\t\t\tctaLabel: t('nextcloud-vue', 'Retry'),\n\t\t\t\t\t\tctaHandler: this.fetchPages,\n\t\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\treturn { kind: 'none', title: '', message: '', ctaLabel: '', ctaHandler: () => {} }\n\t\t\t}\n\t\t},\n\t},\n\n\twatch: {\n\t\tobjectId: { immediate: true, handler(id) {\n\t\t\tif (id) {\n\t\t\t\tthis.fetchPages()\n\t\t\t}\n\t\t} },\n\n\t\tregister() {\n\t\t\tthis.fetchPages()\n\t\t},\n\n\t\tschema() {\n\t\t\tthis.fetchPages()\n\t\t},\n\t},\n\n\tmethods: {\n\t\tt,\n\n\t\tbaseUrl() {\n\t\t\treturn `${this.apiBase}/objects/${this.register}/${this.schema}/${this.objectId}/integrations/${this.integrationId}`\n\t\t},\n\n\t\t/**\n\t\t * Base for the Tier-2 xwiki endpoints (link/new/destroy).\n\t\t *\n\t\t * @return {string} The endpoint URL.\n\t\t */\n\t\txwikiEndpoint() {\n\t\t\treturn `${this.apiBase}/objects/${this.register}/${this.schema}/${this.objectId}/xwiki`\n\t\t},\n\n\t\topenPicker() {\n\t\t\tthis.pickerOpen = true\n\t\t},\n\n\t\topenCreate() {\n\t\t\tthis.createOpen = true\n\t\t},\n\n\t\tasync onLinkPick(payload) {\n\t\t\tthis.pickerOpen = false\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(this.xwikiEndpoint()), {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { ...buildHeaders(), 'Content-Type': 'application/json' },\n\t\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\t})\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tawait this.fetchPages()\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[CnXwikiTab] link failed', err)\n\t\t\t}\n\t\t},\n\n\t\tasync onCreatePick(payload) {\n\t\t\tthis.createOpen = false\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(`${this.xwikiEndpoint()}/new`), {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { ...buildHeaders(), 'Content-Type': 'application/json' },\n\t\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\t})\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tawait this.fetchPages()\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[CnXwikiTab] create failed', err)\n\t\t\t}\n\t\t},\n\n\t\tasync unlinkPage(page) {\n\t\t\tconst ref = this.pageKey(page)\n\t\t\tif (!ref) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(`${this.xwikiEndpoint()}/${encodeURIComponent(ref)}`), {\n\t\t\t\t\tmethod: 'DELETE',\n\t\t\t\t\theaders: buildHeaders(),\n\t\t\t\t})\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tawait this.fetchPages()\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[CnXwikiTab] unlink failed', err)\n\t\t\t}\n\t\t},\n\n\t\tpageKey(page) {\n\t\t\treturn page.id ?? page.reference ?? ''\n\t\t},\n\n\t\tpageTitle(page) {\n\t\t\treturn String(page.title ?? page.page ?? page.reference ?? this.pageKey(page))\n\t\t},\n\n\t\t/**\n\t\t * External XWiki deep-link for the page. Empty string when the\n\t\t * provider didn't surface a `url`, or surfaced an unsafe scheme, so\n\t\t * the row renders as a plain (non-anchored) NcListItem rather than a\n\t\t * dead link.\n\t\t *\n\t\t * @param {object} page Provider row.\n\t\t *\n\t\t * @return {string} Absolute XWiki URL or ''.\n\t\t */\n\t\tpageHref(page) {\n\t\t\tconst url = String(page.url ?? '')\n\t\t\treturn url && safeHref(url) !== '#' ? url : ''\n\t\t},\n\n\t\tbreadcrumbLabel(page) {\n\t\t\tconst crumb = page.breadcrumb\n\t\t\tif (Array.isArray(crumb) === false || crumb.length === 0) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\t// Drop the last element (the title) per AC — show only the ancestor path.\n\t\t\tconst ancestors = crumb.slice(0, -1)\n\t\t\tif (ancestors.length === 0) {\n\t\t\t\t// Single-element breadcrumb (root page) — fall back to the space name.\n\t\t\t\treturn String(page.space ?? '')\n\t\t\t}\n\t\t\t// XWiki renders space paths with a \"›\" chevron separator.\n\t\t\treturn ancestors.map((c) => String(c)).filter((s) => s !== '').join(' › ')\n\t\t},\n\n\t\t/**\n\t\t * One-line plain-text excerpt of the page body for the detail\n\t\t * surface. Strips `<script>`/`<style>` bodies, then all tags,\n\t\t * collapses whitespace and truncates — XWiki macros stay inert\n\t\t * text because the result is bound via {{ }} interpolation.\n\t\t *\n\t\t * @param {object} page Provider row.\n\t\t *\n\t\t * @return {string} Safe single-line excerpt (≤ EXCERPT_MAX_CHARS).\n\t\t */\n\t\texcerpt(page) {\n\t\t\tconst raw = page.content ?? page.renderedContent ?? page.excerpt ?? ''\n\t\t\tconst str = String(raw)\n\t\t\tif (str === '') {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tlet text = str\n\t\t\t\t.replace(/<script\\b[^>]*>[\\s\\S]*?<\\/script>/gi, '')\n\t\t\t\t.replace(/<style\\b[^>]*>[\\s\\S]*?<\\/style>/gi, '')\n\t\t\t\t.replace(/<[^>]+>/g, ' ')\n\t\t\t\t.replace(/\\s+/g, ' ')\n\t\t\t\t.trim()\n\t\t\tif (text.length > EXCERPT_MAX_CHARS) {\n\t\t\t\ttext = text.slice(0, EXCERPT_MAX_CHARS).trimEnd() + '…'\n\t\t\t}\n\t\t\treturn text\n\t\t},\n\n\t\t/**\n\t\t * Last-modified timestamp in milliseconds for the page, suitable\n\t\t * for `NcDateTime`. Returns null when absent or unparseable.\n\t\t *\n\t\t * @param {object} page Provider row.\n\t\t *\n\t\t * @return {number|null} Epoch milliseconds or null.\n\t\t */\n\t\tmodifiedMs(page) {\n\t\t\tconst v = page.modified ?? page.lastModified ?? page.updated ?? null\n\t\t\tif (v === null || v === undefined || v === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tif (typeof v === 'number') {\n\t\t\t\treturn v < 1e12 ? v * 1000 : v\n\t\t\t}\n\t\t\tconst parsed = Date.parse(String(v))\n\t\t\treturn Number.isNaN(parsed) === true ? null : parsed\n\t\t},\n\n\t\t/**\n\t\t * Map a 503 cause from the controller (`details.cause` per AD-23) to\n\t\t * the matching banner kind. Unknown causes fall through to 'upstream'.\n\t\t *\n\t\t * @param {string} cause One of `openconnector-down` / `openconnector-source-missing` / `provider-auth` / `upstream-service-down`.\n\t\t *\n\t\t * @return {string} Banner kind.\n\t\t */\n\t\tbannerFromCause(cause) {\n\t\t\tif (cause === 'openconnector-down' || cause === 'openconnector-source-missing') {\n\t\t\t\treturn 'unconfigured'\n\t\t\t}\n\t\t\tif (cause === 'provider-auth') {\n\t\t\t\treturn 'auth'\n\t\t\t}\n\t\t\treturn 'upstream'\n\t\t},\n\n\t\tasync fetchPages() {\n\t\t\tif (!this.register || !this.schema || !this.objectId) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.loading = true\n\t\t\tthis.bannerKind = 'none'\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(this.baseUrl()), { headers: buildHeaders() })\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tconst data = await response.json()\n\t\t\t\t\tconst rows = data.results || data.items || (Array.isArray(data) ? data : []) || []\n\t\t\t\t\tthis.pages = rows\n\t\t\t\t} else if (response.status === 503) {\n\t\t\t\t\tthis.pages = []\n\t\t\t\t\tlet cause = ''\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst body = await response.json()\n\t\t\t\t\t\tcause = String(body?.details?.cause ?? '')\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tcause = ''\n\t\t\t\t\t}\n\t\t\t\t\tthis.bannerKind = this.bannerFromCause(cause)\n\t\t\t\t} else {\n\t\t\t\t\tthis.pages = []\n\t\t\t\t\tthis.bannerKind = 'error'\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[CnXwikiTab] failed to fetch XWiki pages', err)\n\t\t\t\tthis.pages = []\n\t\t\t\tthis.bannerKind = 'error'\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-xwiki-tab__actions {\n\tdisplay: flex;\n\tgap: 8px;\n\tmargin-bottom: 10px;\n\tflex-wrap: wrap;\n}\n\n.cn-xwiki-tab__unlink {\n\tflex-shrink: 0;\n}\n\n.cn-xwiki-tab__banner {\n\tdisplay: flex;\n\talign-items: flex-start;\n\tgap: 10px;\n\tpadding: 10px 12px;\n\tmargin-bottom: 12px;\n\tborder-radius: var(--border-radius);\n\tfont-size: 0.9em;\n}\n\n.cn-xwiki-tab__banner--unconfigured {\n\tbackground: var(--color-background-hover);\n\tcolor: var(--color-main-text);\n\tborder-left: 3px solid var(--color-primary-element, #21468B);\n}\n\n.cn-xwiki-tab__banner--auth,\n.cn-xwiki-tab__banner--error {\n\tbackground: var(--color-error, #e9322d);\n\tcolor: var(--color-main-background);\n}\n\n.cn-xwiki-tab__banner--upstream {\n\tbackground: var(--color-warning, #e9a40f);\n\tcolor: var(--color-main-background);\n}\n\n.cn-xwiki-tab__banner-icon {\n\tflex-shrink: 0;\n\tmargin-top: 2px;\n}\n\n.cn-xwiki-tab__banner-body {\n\tflex: 1;\n\tmin-width: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n}\n\n.cn-xwiki-tab__banner-body p {\n\tmargin: 0;\n}\n\n.cn-xwiki-tab__banner-cta {\n\tflex-shrink: 0;\n}\n\n.cn-xwiki-tab__empty {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tgap: 8px;\n\tpadding: 16px 8px;\n\tcolor: var(--color-text-maxcontrast);\n\ttext-align: center;\n}\n\n.cn-xwiki-tab__empty-icon {\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-xwiki-tab__list {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n}\n\n/* XWiki-style document tile: a tinted square holding the page glyph. */\n.cn-xwiki-tab__row-icon {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 40px;\n\theight: 40px;\n\tborder-radius: var(--border-radius);\n\tbackground: var(--cn-xwiki-accent-soft, rgba(60, 162, 47, 0.12));\n\tcolor: var(--cn-xwiki-accent, #3CA22F);\n}\n\n.cn-xwiki-tab__subline {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 8px;\n\tflex-wrap: wrap;\n\tmin-width: 0;\n}\n\n.cn-xwiki-tab__breadcrumb {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.9em;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n.cn-xwiki-tab__date {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.9em;\n\twhite-space: nowrap;\n}\n\n.cn-xwiki-tab__excerpt {\n\tdisplay: block;\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.85em;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\tmax-width: 100%;\n}\n</style>\n"],"names":["_createElementBlock","_normalizeClass","_createElementVNode","_toDisplayString","_createBlock","_createTextVNode","_createVNode","_openBlock"],"mappings":"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"}
|
package/dist/esm/l10n/en.json.js
CHANGED
|
@@ -291,6 +291,25 @@ var translations = {
|
|
|
291
291
|
"JSON pointer": "JSON pointer",
|
|
292
292
|
Last: "Last",
|
|
293
293
|
"Load more": "Load more",
|
|
294
|
+
"To do": "To do",
|
|
295
|
+
"Next step": "Next step",
|
|
296
|
+
Review: "Review",
|
|
297
|
+
"No documents to review.": "No documents to review.",
|
|
298
|
+
"Partly public": "Partly public",
|
|
299
|
+
"To review": "To review",
|
|
300
|
+
"{reviewed} of {total} reviewed": "{reviewed} of {total} reviewed",
|
|
301
|
+
"Documents to review": "Documents to review",
|
|
302
|
+
Reply: "Reply",
|
|
303
|
+
Send: "Send",
|
|
304
|
+
You: "You",
|
|
305
|
+
"No messages yet.": "No messages yet.",
|
|
306
|
+
Conversation: "Conversation",
|
|
307
|
+
"The message could not be sent. Try again.": "The message could not be sent. Try again.",
|
|
308
|
+
More: "More",
|
|
309
|
+
"More tabs": "More tabs",
|
|
310
|
+
"Due soon": "Due soon",
|
|
311
|
+
Administration: "Administration",
|
|
312
|
+
Details: "Details",
|
|
294
313
|
Actor: "Actor",
|
|
295
314
|
"All types": "All types",
|
|
296
315
|
"All actors": "All actors",
|
|
@@ -369,6 +388,7 @@ var translations = {
|
|
|
369
388
|
"One of": "One of",
|
|
370
389
|
Open: "Open",
|
|
371
390
|
"Open access:": "Open access:",
|
|
391
|
+
"Open row": "Open row",
|
|
372
392
|
Operator: "Operator",
|
|
373
393
|
Order: "Order",
|
|
374
394
|
"Owner:": "Owner:",
|
|
@@ -977,7 +997,41 @@ var translations = {
|
|
|
977
997
|
"Capabilities in {group}, rated per system.": "Capabilities in {group}, rated per system.",
|
|
978
998
|
Yes: "Yes",
|
|
979
999
|
Partial: "Partial",
|
|
980
|
-
No: "No"
|
|
1000
|
+
No: "No",
|
|
1001
|
+
"Nothing planned": "Nothing planned",
|
|
1002
|
+
today: "today",
|
|
1003
|
+
Late: "Late",
|
|
1004
|
+
"This week, day by day": "This week, day by day",
|
|
1005
|
+
"The items for this week could not be loaded.": "The items for this week could not be loaded.",
|
|
1006
|
+
"Nothing to show yet": "Nothing to show yet",
|
|
1007
|
+
"The numbers could not be loaded.": "The numbers could not be loaded.",
|
|
1008
|
+
"Date field": "Date field",
|
|
1009
|
+
"Title field": "Title field",
|
|
1010
|
+
"Extra fields under the title (comma separated)": "Extra fields under the title (comma separated)",
|
|
1011
|
+
"Days shown": "Days shown",
|
|
1012
|
+
"Page an item opens (page id, optional)": "Page an item opens (page id, optional)",
|
|
1013
|
+
"Text for a day without items": "Text for a day without items",
|
|
1014
|
+
"A date field is required": "A date field is required",
|
|
1015
|
+
"Field to group by": "Field to group by",
|
|
1016
|
+
"Order of the segments (values, comma separated)": "Order of the segments (values, comma separated)",
|
|
1017
|
+
"Text when there is nothing to count": "Text when there is nothing to count",
|
|
1018
|
+
"A field to group by is required": "A field to group by is required",
|
|
1019
|
+
Layout: "Layout",
|
|
1020
|
+
"Label above the title": "Label above the title",
|
|
1021
|
+
"Reason (why this needs attention)": "Reason (why this needs attention)",
|
|
1022
|
+
"The actions of an attention card are declared in the manifest.": "The actions of an attention card are declared in the manifest.",
|
|
1023
|
+
"An attention card needs a title": "An attention card needs a title",
|
|
1024
|
+
"Good morning, {name}": "Good morning, {name}",
|
|
1025
|
+
"Good morning": "Good morning",
|
|
1026
|
+
"Good afternoon, {name}": "Good afternoon, {name}",
|
|
1027
|
+
"Good afternoon": "Good afternoon",
|
|
1028
|
+
"Good evening, {name}": "Good evening, {name}",
|
|
1029
|
+
"Good evening": "Good evening",
|
|
1030
|
+
"Greet the user by name instead of showing the title": "Greet the user by name instead of showing the title",
|
|
1031
|
+
"Show the date of today above the heading": "Show the date of today above the heading",
|
|
1032
|
+
"Plain header without a coloured background": "Plain header without a coloured background",
|
|
1033
|
+
"Loading…": "Loading…",
|
|
1034
|
+
"A register and schema are required": "A register and schema are required"
|
|
981
1035
|
};
|
|
982
1036
|
var plurals = {
|
|
983
1037
|
"%n year": [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/esm/l10n/nl.json.js
CHANGED
|
@@ -291,6 +291,25 @@ var translations = {
|
|
|
291
291
|
"JSON pointer": "JSON-aanwijzer",
|
|
292
292
|
Last: "Laatste",
|
|
293
293
|
"Load more": "Meer laden",
|
|
294
|
+
"To do": "Nog doen",
|
|
295
|
+
"Next step": "Volgende stap",
|
|
296
|
+
Review: "Beoordelen",
|
|
297
|
+
"No documents to review.": "Geen documenten om te beoordelen.",
|
|
298
|
+
"Partly public": "Deels openbaar",
|
|
299
|
+
"To review": "Nog beoordelen",
|
|
300
|
+
"{reviewed} of {total} reviewed": "{reviewed} van {total} beoordeeld",
|
|
301
|
+
"Documents to review": "Documenten om te beoordelen",
|
|
302
|
+
Reply: "Antwoord",
|
|
303
|
+
Send: "Versturen",
|
|
304
|
+
You: "U",
|
|
305
|
+
"No messages yet.": "Nog geen berichten.",
|
|
306
|
+
Conversation: "Gesprek",
|
|
307
|
+
"The message could not be sent. Try again.": "Het bericht is niet verstuurd. Probeer het opnieuw.",
|
|
308
|
+
More: "Meer",
|
|
309
|
+
"More tabs": "Meer tabbladen",
|
|
310
|
+
"Due soon": "Bijna te laat",
|
|
311
|
+
Administration: "Beheer",
|
|
312
|
+
Details: "Details",
|
|
294
313
|
Actor: "Actor",
|
|
295
314
|
"All types": "Alle typen",
|
|
296
315
|
"All actors": "Alle actoren",
|
|
@@ -369,6 +388,7 @@ var translations = {
|
|
|
369
388
|
"One of": "Één van",
|
|
370
389
|
Open: "Openen",
|
|
371
390
|
"Open access:": "Openbare toegang:",
|
|
391
|
+
"Open row": "Rij openen",
|
|
372
392
|
Operator: "Operator",
|
|
373
393
|
Order: "Volgorde",
|
|
374
394
|
"Owner:": "Eigenaar:",
|
|
@@ -1029,7 +1049,41 @@ var translations = {
|
|
|
1029
1049
|
"Capabilities in {group}, rated per system.": "Functionaliteiten in {group}, beoordeeld per systeem.",
|
|
1030
1050
|
Yes: "Ja",
|
|
1031
1051
|
Partial: "Gedeeltelijk",
|
|
1032
|
-
No: "Nee"
|
|
1052
|
+
No: "Nee",
|
|
1053
|
+
"Nothing planned": "Niets gepland",
|
|
1054
|
+
today: "vandaag",
|
|
1055
|
+
Late: "Te laat",
|
|
1056
|
+
"This week, day by day": "Deze week, dag voor dag",
|
|
1057
|
+
"The items for this week could not be loaded.": "De items van deze week konden niet worden geladen.",
|
|
1058
|
+
"Nothing to show yet": "Nog niets te tonen",
|
|
1059
|
+
"The numbers could not be loaded.": "De aantallen konden niet worden geladen.",
|
|
1060
|
+
"Date field": "Datumveld",
|
|
1061
|
+
"Title field": "Titelveld",
|
|
1062
|
+
"Extra fields under the title (comma separated)": "Extra velden onder de titel (gescheiden door komma's)",
|
|
1063
|
+
"Days shown": "Aantal dagen",
|
|
1064
|
+
"Page an item opens (page id, optional)": "Pagina die een item opent (pagina-id, optioneel)",
|
|
1065
|
+
"Text for a day without items": "Tekst voor een dag zonder items",
|
|
1066
|
+
"A date field is required": "Een datumveld is verplicht",
|
|
1067
|
+
"Field to group by": "Veld om op te groeperen",
|
|
1068
|
+
"Order of the segments (values, comma separated)": "Volgorde van de segmenten (waarden, gescheiden door komma's)",
|
|
1069
|
+
"Text when there is nothing to count": "Tekst als er niets te tellen is",
|
|
1070
|
+
"A field to group by is required": "Een veld om op te groeperen is verplicht",
|
|
1071
|
+
Layout: "Opmaak",
|
|
1072
|
+
"Label above the title": "Label boven de titel",
|
|
1073
|
+
"Reason (why this needs attention)": "Reden (waarom dit aandacht vraagt)",
|
|
1074
|
+
"The actions of an attention card are declared in the manifest.": "De acties van een aandachtskaart staan in het manifest.",
|
|
1075
|
+
"An attention card needs a title": "Een aandachtskaart heeft een titel nodig",
|
|
1076
|
+
"Good morning, {name}": "Goedemorgen, {name}",
|
|
1077
|
+
"Good morning": "Goedemorgen",
|
|
1078
|
+
"Good afternoon, {name}": "Goedemiddag, {name}",
|
|
1079
|
+
"Good afternoon": "Goedemiddag",
|
|
1080
|
+
"Good evening, {name}": "Goedenavond, {name}",
|
|
1081
|
+
"Good evening": "Goedenavond",
|
|
1082
|
+
"Greet the user by name instead of showing the title": "Begroet de gebruiker bij naam in plaats van de titel te tonen",
|
|
1083
|
+
"Show the date of today above the heading": "Toon de datum van vandaag boven de kop",
|
|
1084
|
+
"Plain header without a coloured background": "Eenvoudige kop zonder gekleurde achtergrond",
|
|
1085
|
+
"Loading…": "Laden…",
|
|
1086
|
+
"A register and schema are required": "Een register en schema zijn verplicht"
|
|
1033
1087
|
};
|
|
1034
1088
|
var plurals = {
|
|
1035
1089
|
"%n year": [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nl.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"nl.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|