@conduction/nextcloud-vue 2.56.0-beta.4 → 2.56.0-beta.5
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.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/CnBoardView/CnBoardView.vue2.js +12 -5
- package/dist/esm/components/CnBoardView/CnBoardView.vue2.js.map +1 -1
- package/dist/esm/components/CnBoardView/CnBoardView.vue3.js +2 -1
- package/dist/esm/components/CnBoardView/CnBoardView.vue3.js.map +1 -1
- 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/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/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 +29 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
- 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/CnIndexPage/CnIndexPage.vue2.js +67 -13
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +15 -8
- 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/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/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/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/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/CnTabs/CnTabs.vue2.js.map +1 -1
- package/dist/esm/components/CnTabs/CnTabs.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/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 +1 -0
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +1 -0
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/nextcloud-vue.css +71 -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/linkNavigation.js +6 -3
- package/dist/esm/utils/linkNavigation.js.map +1 -1
- 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/nextcloud-vue.cjs.js +809 -383
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +71 -7
- package/l10n/en.json +1 -0
- package/l10n/nl.json +1 -0
- package/package.json +1 -1
- package/src/components/CnActionsBar/CnActionsBar.vue +14 -5
- package/src/components/CnActionsMenu/CnActionsMenu.vue +0 -3
- package/src/components/CnAdminSettingsShell/CnAdminSettingsShell.vue +1 -2
- package/src/components/CnBoardView/CnBoardView.vue +13 -5
- package/src/components/CnCardGrid/CnCardGrid.vue +9 -1
- package/src/components/CnContextMenu/CnContextMenu.vue +6 -1
- 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 +1 -1
- package/src/components/CnDetailPage/CnDetailPage.vue +29 -1
- 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/CnIndexPage/CnIndexPage.vue +75 -14
- 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/CnObjectCard/CnObjectCard.vue +24 -6
- 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/CnRowActions/CnRowActions.vue +7 -2
- package/src/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue +5 -3
- package/src/components/CnTabs/CnTabs.vue +7 -3
- package/src/components/CnTasksWidget/CnTasksWidget.vue +4 -1
- package/src/css/table.css +26 -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/utils/actionLink.js +5 -0
- package/src/utils/actionsDispatcher.js +15 -0
- package/src/utils/linkNavigation.js +6 -3
- package/src/utils/rowAuxClick.js +29 -4
- package/src/utils/safeHref.js +18 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CnFilesBrowser.vue2.js","sources":["../../../../src/components/CnFilesBrowser/CnFilesBrowser.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<div\n\t\tclass=\"cn-files-browser\"\n\t\t:class=\"{ 'cn-files-browser--dragging': dragging }\"\n\t\tdata-testid=\"cn-files-browser\"\n\t\t@dragenter.prevent=\"dragging = true\"\n\t\t@dragover.prevent=\"dragging = true\"\n\t\t@dragleave.prevent=\"dragging = false\"\n\t\t@drop.prevent=\"onDrop\">\n\t\t<!-- The bar: where you are, and what you can add. The crumbs are the\n\t\t Files app's own breadcrumb component; the New menu lists what the\n\t\t Files app and its plugins registered for this folder (a new folder,\n\t\t a template, a file request) beside a plain upload. -->\n\t\t<div class=\"cn-files-browser__bar\">\n\t\t\t<NcBreadcrumbs class=\"cn-files-browser__crumbs\">\n\t\t\t\t<!-- The whole trail from the user's files root, as the Files app\n\t\t\t\t draws it. A crumb above the browser's root links into the Files\n\t\t\t\t app (the browser never leaves its root); the root and everything\n\t\t\t\t beneath it navigate in place. NcBreadcrumbs draws its first\n\t\t\t\t crumb as a home icon and keeps the name for screen readers;\n\t\t\t\t forceIconText puts the name beside the icon. -->\n\t\t\t\t<NcBreadcrumb\n\t\t\t\t\tv-for=\"(crumb, index) in crumbs\"\n\t\t\t\t\t:key=\"crumb.path\"\n\t\t\t\t\t:name=\"crumb.name\"\n\t\t\t\t\t:forceIconText=\"index === 0\"\n\t\t\t\t\t:disableDrop=\"true\"\n\t\t\t\t\t:href=\"crumb.aboveRoot ? filesAppUrl(crumb.path) : undefined\"\n\t\t\t\t\t:target=\"crumb.aboveRoot ? '_blank' : undefined\"\n\t\t\t\t\t:data-above-root=\"crumb.aboveRoot ? 'true' : undefined\"\n\t\t\t\t\tdata-testid=\"cn-files-browser-crumb\"\n\t\t\t\t\t@click=\"crumb.aboveRoot ? undefined : navigate(crumb.path)\" />\n\t\t\t</NcBreadcrumbs>\n\t\t\t<!-- The Columns chooser hides declared columns for this user. It\n\t\t\t cannot add one: it is built by walking the host's declaration,\n\t\t\t so a column the host removed is not listed and cannot be\n\t\t\t ticked back on however the stored preference reads. -->\n\t\t\t<NcActions v-if=\"columnsChooserEnabled\"\n\t\t\t\t:menuName=\"columnsLabel\"\n\t\t\t\t:forceMenu=\"true\"\n\t\t\t\tdata-testid=\"cn-files-browser-columns\">\n\t\t\t\t<NcActionCheckbox\n\t\t\t\t\tv-for=\"column in declaredColumns\"\n\t\t\t\t\t:key=\"column.key\"\n\t\t\t\t\t:modelValue=\"isColumnVisible(column)\"\n\t\t\t\t\t:data-testid=\"`cn-files-browser-column-${column.key}`\"\n\t\t\t\t\t@update:modelValue=\"toggleColumn(column)\">\n\t\t\t\t\t{{ columnLabel(column) }}\n\t\t\t\t</NcActionCheckbox>\n\t\t\t</NcActions>\n\t\t\t<NcActions\n\t\t\t\t:menuName=\"newLabel\"\n\t\t\t\t:forceMenu=\"true\"\n\t\t\t\t:forceName=\"true\"\n\t\t\t\tvariant=\"primary\"\n\t\t\t\t:disabled=\"folder === null\"\n\t\t\t\tdata-testid=\"cn-files-browser-new\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Plus :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t<NcActionButton :closeAfterClick=\"true\" data-testid=\"cn-files-browser-upload\" @click=\"pickFiles\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Upload :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ uploadLabel }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-for=\"entry in newMenuEntries\"\n\t\t\t\t\t:key=\"entry.id\"\n\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t:data-testid=\"`cn-files-browser-new-${entry.id}`\"\n\t\t\t\t\t@click=\"runNewEntry(entry)\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<NcIconSvgWrapper v-if=\"entry.iconSvgInline\" :svg=\"entry.iconSvgInline\" />\n\t\t\t\t\t\t<span v-else-if=\"entry.iconClass\" :class=\"entry.iconClass\" />\n\t\t\t\t\t\t<Plus v-else :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ entry.displayName }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<!-- The host's own entries, after the Files app's. -->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-for=\"action in newActions\"\n\t\t\t\t\t:key=\"`host-${action.id}`\"\n\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t:data-testid=\"`cn-files-browser-new-host-${action.id}`\"\n\t\t\t\t\t@click=\"runHostAction(action, null)\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<CnIcon :name=\"action.icon || 'Plus'\" :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ action.label }}\n\t\t\t\t</NcActionButton>\n\t\t\t</NcActions>\n\t\t</div>\n\n\t\t<!-- `:ref` (dynamic), not `ref`: a static ref on a vnode with only static\n\t\t bindings is hoisted, and a hoisted vnode has no owner instance to\n\t\t hold the ref, which throws in a production build. -->\n\t\t<input\n\t\t\t:ref=\"fileInputRef\"\n\t\t\ttype=\"file\"\n\t\t\tmultiple\n\t\t\tclass=\"cn-files-browser__file-input\"\n\t\t\t:aria-label=\"uploadLabel\"\n\t\t\t@change=\"onFilesPicked\">\n\n\t\t<ul v-if=\"uploads.length > 0\" class=\"cn-files-browser__uploads\" data-testid=\"cn-files-browser-uploads\">\n\t\t\t<li v-for=\"upload in uploads\" :key=\"upload.key\" class=\"cn-files-browser__upload\">\n\t\t\t\t<span class=\"cn-files-browser__upload-name\">{{ upload.name }}</span>\n\t\t\t\t<NcProgressBar :value=\"upload.progress\" :error=\"upload.error !== ''\" />\n\t\t\t\t<span v-if=\"upload.error\" class=\"cn-files-browser__upload-error\" role=\"alert\">{{ upload.error }}</span>\n\t\t\t</li>\n\t\t</ul>\n\n\t\t<NcLoadingIcon v-if=\"loading\" :size=\"32\" class=\"cn-files-browser__loading\" />\n\n\t\t<NcEmptyContent v-else-if=\"error !== ''\" :name=\"error\" class=\"cn-files-browser__state\">\n\t\t\t<template #icon>\n\t\t\t\t<AlertCircleOutline :size=\"44\" />\n\t\t\t</template>\n\t\t\t<template #action>\n\t\t\t\t<NcButton @click=\"refresh\">\n\t\t\t\t\t{{ retryLabel }}\n\t\t\t\t</NcButton>\n\t\t\t</template>\n\t\t</NcEmptyContent>\n\n\t\t<NcEmptyContent\n\t\t\tv-else-if=\"sorted.length === 0 && linkedItems.length === 0\"\n\t\t\t:name=\"emptyLabel\"\n\t\t\t:description=\"emptyHint\"\n\t\t\tclass=\"cn-files-browser__state\">\n\t\t\t<template #icon>\n\t\t\t\t<FolderOutline :size=\"44\" />\n\t\t\t</template>\n\t\t</NcEmptyContent>\n\n\t\t<!-- The table. Its rows are @nextcloud/files nodes read over DAV, and\n\t\t each row's menu is the list of actions the Files app registered on\n\t\t this page, offered under the same names and icons the Files app\n\t\t uses. What cannot run away from the Files page (the details\n\t\t sidebar) is left out, and Show in Files covers it. -->\n\t\t<table v-else class=\"cn-files-browser__table\" data-testid=\"cn-files-browser-table\">\n\t\t\t<thead>\n\t\t\t\t<tr>\n\t\t\t\t\t<th class=\"cn-files-browser__col-icon\" scope=\"col\">\n\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('nextcloud-vue', 'Type') }}</span>\n\t\t\t\t\t</th>\n\t\t\t\t\t<th v-for=\"column in renderedColumns\"\n\t\t\t\t\t\t:key=\"column.key\"\n\t\t\t\t\t\tscope=\"col\"\n\t\t\t\t\t\t:class=\"`cn-files-browser__col-${column.key}`\"\n\t\t\t\t\t\t:aria-sort=\"ariaSort(sortTokenOf(column))\"\n\t\t\t\t\t\t:data-testid=\"`cn-files-browser-header-${column.key}`\">\n\t\t\t\t\t\t<button v-if=\"column.sortable !== false\"\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"cn-files-browser__sort\"\n\t\t\t\t\t\t\t@click=\"sortBy(sortTokenOf(column))\">\n\t\t\t\t\t\t\t{{ columnLabel(column) }}\n\t\t\t\t\t\t\t<component :is=\"sortIcon(sortTokenOf(column))\" v-if=\"sortKey === sortTokenOf(column)\" :size=\"16\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t\t{{ columnLabel(column) }}\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</th>\n\t\t\t\t\t<th class=\"cn-files-browser__col-actions\" scope=\"col\">\n\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('nextcloud-vue', 'Actions') }}</span>\n\t\t\t\t\t</th>\n\t\t\t\t</tr>\n\t\t\t</thead>\n\t\t\t<tbody>\n\t\t\t\t<tr\n\t\t\t\t\tv-for=\"node in sorted\"\n\t\t\t\t\t:key=\"node.source\"\n\t\t\t\t\tclass=\"cn-files-browser__row\"\n\t\t\t\t\t:class=\"{ 'cn-files-browser__row--folder': isFolder(node) }\"\n\t\t\t\t\tdata-testid=\"cn-files-browser-row\"\n\t\t\t\t\t:data-name=\"node.basename\"\n\t\t\t\t\t@click=\"onRowClick(node, $event)\"\n\t\t\t\t\t@auxclick=\"onRowAuxClick(node, $event)\">\n\t\t\t\t\t<td class=\"cn-files-browser__col-icon\">\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tv-if=\"previewUrlFor(node)\"\n\t\t\t\t\t\t\tclass=\"cn-files-browser__thumb\"\n\t\t\t\t\t\t\t:src=\"previewUrlFor(node)\"\n\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t\t\t\t@error=\"onPreviewError(node)\">\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tv-else-if=\"mimeIconFor(node)\"\n\t\t\t\t\t\t\tclass=\"cn-files-browser__mime\"\n\t\t\t\t\t\t\t:src=\"mimeIconFor(node)\"\n\t\t\t\t\t\t\talt=\"\">\n\t\t\t\t\t\t<FolderOutline v-else-if=\"isFolder(node)\" :size=\"32\" />\n\t\t\t\t\t\t<FileOutline v-else :size=\"32\" />\n\t\t\t\t\t</td>\n\t\t\t\t\t<td v-for=\"column in renderedColumns\"\n\t\t\t\t\t\t:key=\"column.key\"\n\t\t\t\t\t\t:class=\"`cn-files-browser__col-${column.key}`\"\n\t\t\t\t\t\t:data-testid=\"`cn-files-browser-cell-${column.key}`\">\n\t\t\t\t\t\t<span v-if=\"column.key === 'name'\" class=\"cn-files-browser__name\">{{ node.basename }}</span>\n\t\t\t\t\t\t<template v-else-if=\"column.key === 'size'\">\n\t\t\t\t\t\t\t{{ isFolder(node) ? '' : formatSize(node.size) }}\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<NcDateTime v-else-if=\"column.key === 'modified'\" :timestamp=\"node.mtime\" :ignoreSeconds=\"true\" />\n\t\t\t\t\t\t<!-- Everything the host declared renders through the same\n\t\t\t\t\t\t cell renderer the tables use, so a `formatter` means\n\t\t\t\t\t\t here what it means there. -->\n\t\t\t\t\t\t<CnCellRenderer v-else\n\t\t\t\t\t\t\t:value=\"cellValue(column, node)\"\n\t\t\t\t\t\t\t:formatter=\"column.formatter || null\"\n\t\t\t\t\t\t\t:formatterOptions=\"column.formatterOptions || null\"\n\t\t\t\t\t\t\t:widget=\"column.widget || null\"\n\t\t\t\t\t\t\t:row=\"node\" />\n\t\t\t\t\t</td>\n\t\t\t\t\t<td class=\"cn-files-browser__col-actions\" @click.stop @auxclick.stop>\n\t\t\t\t\t\t<NcActions :forceMenu=\"true\" :ariaLabel=\"t('nextcloud-vue', 'Actions for {name}', { name: node.basename })\">\n\t\t\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\t\t\tv-for=\"action in actionsFor(node)\"\n\t\t\t\t\t\t\t\t:key=\"action.id\"\n\t\t\t\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t\t\t\t:data-testid=\"`cn-files-browser-action-${action.id}`\"\n\t\t\t\t\t\t\t\t@click=\"run(action, node)\">\n\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t<NcIconSvgWrapper :svg=\"iconOf(action, node)\" />\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t{{ labelOf(action, node) }}\n\t\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t\t\t<!-- The host's own actions on a file (never on a folder): declared\n\t\t\t\t\t\t\t in its manifest, dispatched through the page's action runner\n\t\t\t\t\t\t\t with the node's file id, name and path merged in. -->\n\t\t\t\t\t\t\t<template v-if=\"!isFolder(node)\">\n\t\t\t\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\t\t\t\tv-for=\"action in rowActions\"\n\t\t\t\t\t\t\t\t\t:key=\"`host-${action.id}`\"\n\t\t\t\t\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t\t\t\t\t:data-testid=\"`cn-files-browser-host-action-${action.id}`\"\n\t\t\t\t\t\t\t\t\t@click=\"runHostAction(action, node)\">\n\t\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t\t<CnIcon :name=\"action.icon || 'FileDocumentEditOutline'\" :size=\"20\" />\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t\t{{ action.label }}\n\t\t\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<NcActionSeparator v-if=\"actionsFor(node).length > 0 || (!isFolder(node) && rowActions.length > 0)\" />\n\t\t\t\t\t\t\t<!-- The Files app's own rename is its list's inline input,\n\t\t\t\t\t\t\t which is not here; this one is a dialog over a DAV move. -->\n\t\t\t\t\t\t\t<NcActionButton :closeAfterClick=\"true\" data-testid=\"cn-files-browser-action-rename\" @click=\"askRename(node)\">\n\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t<Pencil :size=\"20\" />\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t{{ renameLabel }}\n\t\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t\t\t<NcActionLink\n\t\t\t\t\t\t\t\tv-if=\"node.fileid\"\n\t\t\t\t\t\t\t\t:href=\"permalink(node)\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\t\t:closeAfterClick=\"true\">\n\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t<OpenInNew :size=\"20\" />\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t{{ showInFilesLabel }}\n\t\t\t\t\t\t\t</NcActionLink>\n\t\t\t\t\t\t</NcActions>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<!-- Rows that are not nodes of this folder: documents the host\n\t\t\t\t joined from elsewhere (another object's folder). Open and\n\t\t\t\t download only; nothing here can change the file. -->\n\t\t\t\t<tr\n\t\t\t\t\tv-for=\"item in linkedItems\"\n\t\t\t\t\t:key=\"`linked-${item.id}`\"\n\t\t\t\t\tclass=\"cn-files-browser__row cn-files-browser__row--linked\"\n\t\t\t\t\tdata-testid=\"cn-files-browser-linked-row\"\n\t\t\t\t\t:data-name=\"item.name\"\n\t\t\t\t\t@click=\"openLinked(item)\"\n\t\t\t\t\t@auxclick=\"onLinkedAuxClick(item, $event)\">\n\t\t\t\t\t<td class=\"cn-files-browser__col-icon\">\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tv-if=\"mimeIconFor({ mime: item.mime })\"\n\t\t\t\t\t\t\tclass=\"cn-files-browser__mime\"\n\t\t\t\t\t\t\t:src=\"mimeIconFor({ mime: item.mime })\"\n\t\t\t\t\t\t\talt=\"\">\n\t\t\t\t\t\t<FileOutline v-else :size=\"32\" />\n\t\t\t\t\t</td>\n\t\t\t\t\t<!-- A linked item is not a node of this folder, so it can only\n\t\t\t\t\t answer for name, size and modified. It still walks the same\n\t\t\t\t\t column list, or a declared column set would shift every\n\t\t\t\t\t linked row one cell out of line with its header. -->\n\t\t\t\t\t<td v-for=\"column in renderedColumns\"\n\t\t\t\t\t\t:key=\"column.key\"\n\t\t\t\t\t\t:class=\"`cn-files-browser__col-${column.key}`\">\n\t\t\t\t\t\t<template v-if=\"column.key === 'name'\">\n\t\t\t\t\t\t\t<span class=\"cn-files-browser__name\">{{ item.name }}</span>\n\t\t\t\t\t\t\t<span v-if=\"item.note\" class=\"cn-files-browser__note\">\n\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\tv-if=\"item.noteHref\"\n\t\t\t\t\t\t\t\t\t:href=\"item.noteHref\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-files-browser__note-link\"\n\t\t\t\t\t\t\t\t\t@click.stop>{{ item.note }}</a>\n\t\t\t\t\t\t\t\t<template v-else>{{ item.note }}</template>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<template v-else-if=\"column.key === 'size'\">\n\t\t\t\t\t\t\t{{ item.size ? formatSize(item.size) : '' }}\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<NcDateTime v-else-if=\"column.key === 'modified' && item.mtime\" :timestamp=\"item.mtime\" :ignoreSeconds=\"true\" />\n\t\t\t\t\t</td>\n\t\t\t\t\t<td class=\"cn-files-browser__col-actions\" @click.stop @auxclick.stop>\n\t\t\t\t\t\t<NcActions :forceMenu=\"true\" :ariaLabel=\"t('nextcloud-vue', 'Actions for {name}', { name: item.name })\">\n\t\t\t\t\t\t\t<NcActionLink\n\t\t\t\t\t\t\t\tv-if=\"item.href\"\n\t\t\t\t\t\t\t\t:href=\"item.href\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t\t\t\tdata-testid=\"cn-files-browser-linked-open\">\n\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t<OpenInNew :size=\"20\" />\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t{{ openLinkedLabel }}\n\t\t\t\t\t\t\t</NcActionLink>\n\t\t\t\t\t\t\t<NcActionLink\n\t\t\t\t\t\t\t\tv-if=\"item.downloadHref\"\n\t\t\t\t\t\t\t\t:href=\"item.downloadHref\"\n\t\t\t\t\t\t\t\t:download=\"item.name\"\n\t\t\t\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t\t\t\tdata-testid=\"cn-files-browser-linked-download\">\n\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t<Download :size=\"20\" />\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t{{ downloadLabel }}\n\t\t\t\t\t\t\t</NcActionLink>\n\t\t\t\t\t\t</NcActions>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</tbody>\n\t\t</table>\n\n\t\t<NcDialog\n\t\t\tv-if=\"renaming !== null\"\n\t\t\t:name=\"renameLabel\"\n\t\t\tsize=\"small\"\n\t\t\tdata-testid=\"cn-files-browser-rename\"\n\t\t\t@closing=\"renaming = null\">\n\t\t\t<form class=\"cn-files-browser__new-folder\" @submit.prevent=\"rename\">\n\t\t\t\t<NcTextField\n\t\t\t\t\tv-model=\"renameName\"\n\t\t\t\t\t:label=\"t('nextcloud-vue', 'New name')\"\n\t\t\t\t\t:error=\"renameError !== ''\"\n\t\t\t\t\t:helperText=\"renameError\"\n\t\t\t\t\tdata-testid=\"cn-files-browser-rename-name\" />\n\t\t\t</form>\n\t\t\t<template #actions>\n\t\t\t\t<NcButton @click=\"renaming = null\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Cancel') }}\n\t\t\t\t</NcButton>\n\t\t\t\t<NcButton variant=\"primary\"\n\t\t\t\t\t:disabled=\"renameName.trim() === '' || renameName.trim() === renaming.basename\"\n\t\t\t\t\tdata-testid=\"cn-files-browser-rename-confirm\"\n\t\t\t\t\t@click=\"rename\">\n\t\t\t\t\t{{ renameLabel }}\n\t\t\t\t</NcButton>\n\t\t\t</template>\n\t\t</NcDialog>\n\n\t\t<NcDialog\n\t\t\tv-if=\"newFolderOpen\"\n\t\t\t:name=\"newFolderLabel\"\n\t\t\tsize=\"small\"\n\t\t\tdata-testid=\"cn-files-browser-new-folder\"\n\t\t\t@closing=\"newFolderOpen = false\">\n\t\t\t<form class=\"cn-files-browser__new-folder\" @submit.prevent=\"createFolder\">\n\t\t\t\t<NcTextField\n\t\t\t\t\tv-model=\"newFolderName\"\n\t\t\t\t\t:label=\"t('nextcloud-vue', 'Folder name')\"\n\t\t\t\t\t:error=\"newFolderError !== ''\"\n\t\t\t\t\t:helperText=\"newFolderError\"\n\t\t\t\t\tdata-testid=\"cn-files-browser-new-folder-name\" />\n\t\t\t</form>\n\t\t\t<template #actions>\n\t\t\t\t<NcButton @click=\"newFolderOpen = false\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Cancel') }}\n\t\t\t\t</NcButton>\n\t\t\t\t<NcButton variant=\"primary\"\n\t\t\t\t\t:disabled=\"newFolderName.trim() === ''\"\n\t\t\t\t\tdata-testid=\"cn-files-browser-new-folder-create\"\n\t\t\t\t\t@click=\"createFolder\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Create') }}\n\t\t\t\t</NcButton>\n\t\t\t</template>\n\t\t</NcDialog>\n\t</div>\n</template>\n\n<script>\nimport { getCurrentUser } from '@nextcloud/auth'\nimport axios from '@nextcloud/axios'\nimport { FileType, formatFileSize, getFileActions, getNewFileMenuEntries, sortNodes, View } from '@nextcloud/files'\nimport { getClient, getDefaultPropfind, getRemoteURL, getRootPath, resultToNode } from '@nextcloud/files/dav'\n/**\n * CnFilesBrowser — a folder of Nextcloud files, on any page, built from the\n * Files app's own primitives rather than a copy of its screen.\n *\n * WHAT IS BORROWED, AND FROM WHERE.\n *\n * - The rows are `@nextcloud/files` nodes read over WebDAV with the same\n * PROPFIND the Files app sends, so a node here carries what a node there\n * carries: id, mime, size, mtime, permissions, attributes.\n * - Each row's menu is `getFileActions()`: the actions the Files app and its\n * plugins registered on this page (download, delete, rename, favourite, move\n * and copy, sharing status, tags, lock, open in Files…). They are run with\n * the same context the Files app hands them, so a plugin's action does what\n * it does in the Files app. The host page has to load those scripts: it\n * dispatches `LoadAdditionalScriptsEvent` and asks for the Files app's `init`\n * script server-side. On a page that did not, the menu holds only Show in\n * Files, which is the honest fallback.\n * - The New menu is `getNewFileMenuEntries(folder)`: new folder, a template,\n * a file request, whatever the plugins offer for this folder, beside a plain\n * upload that PUTs over DAV.\n * - The crumbs are NcBreadcrumbs, the icons are the theme's own mime icons\n * through `OC.MimeType`, and image previews come from the core preview\n * endpoint.\n *\n * WHAT IS NOT. The Files app's list itself (its column filters, selection bar\n * and inline rename) is a Vue app bound to the Files router and its own stores,\n * and so is its details sidebar on Nextcloud 34. Neither can be mounted here.\n * The actions that need them are left out of the menu by name\n * (`ACTIONS_NEEDING_THE_FILES_PAGE`), and Show in Files opens the Files app on\n * the file for the rest.\n *\n * THE REGISTRY IS VERSIONED. `@nextcloud/files` keeps its registries under\n * `window._nc_files_scope.v4_0`; a page's plugins register into the copy the\n * server ships, and this component reads through its own bundled copy. Both\n * have to be the same major, which is why this library depends on 4.x: a 3.x\n * copy read `window._nc_fileactions`, which the server's plugins never write,\n * and saw nothing while the page held thirty actions.\n */\nimport { translate as t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport {\n\tNcActionButton,\n\tNcActionCheckbox,\n\tNcActionLink,\n\tNcActions,\n\tNcActionSeparator,\n\tNcBreadcrumb,\n\tNcBreadcrumbs,\n\tNcButton,\n\tNcDateTime,\n\tNcDialog,\n\tNcEmptyContent,\n\tNcIconSvgWrapper,\n\tNcLoadingIcon,\n\tNcProgressBar,\n\tNcTextField,\n} from '@nextcloud/vue'\nimport AlertCircleOutline from 'vue-material-design-icons/AlertCircleOutline.vue'\nimport ChevronDown from 'vue-material-design-icons/ChevronDown.vue'\nimport ChevronUp from 'vue-material-design-icons/ChevronUp.vue'\nimport Download from 'vue-material-design-icons/Download.vue'\nimport FileOutline from 'vue-material-design-icons/FileOutline.vue'\nimport FolderOutline from 'vue-material-design-icons/FolderOutline.vue'\nimport OpenInNew from 'vue-material-design-icons/OpenInNew.vue'\nimport Pencil from 'vue-material-design-icons/Pencil.vue'\nimport Plus from 'vue-material-design-icons/Plus.vue'\nimport Upload from 'vue-material-design-icons/Upload.vue'\nimport CnCellRenderer from '../CnCellRenderer/CnCellRenderer.vue'\nimport CnIcon from '../CnIcon/CnIcon.vue'\nimport { readUserPreference, writeUserPreference } from '../../composables/useUserPreferences.js'\nimport { dispatchAction } from '../../utils/actionsDispatcher.js'\nimport { isNewTabClick, isRowMiddleClick } from '../../utils/rowAuxClick.js'\nimport { ACTIONS_NEEDING_THE_FILES_PAGE, crumbsFor, joinPath } from './filesBrowser.js'\nimport {\n\tattributePropertiesFor,\n\tfileColumnValue,\n\tnormaliseFileColumns,\n\tsortNodesByColumn,\n\tvisibleFileColumns,\n} from './filesBrowserColumns.js'\n\nlet uploadSeq = 0\n\n/** A folder glyph, the icon the Files app's View constructor requires. */\nconst VIEW_ICON = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M10 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z\"/></svg>'\n\nexport default {\n\tname: 'CnFilesBrowser',\n\n\tcomponents: {\n\t\tAlertCircleOutline,\n\t\tCnCellRenderer,\n\t\tCnIcon,\n\t\tDownload,\n\t\tFileOutline,\n\t\tFolderOutline,\n\t\tNcActionButton,\n\t\tNcActionCheckbox,\n\t\tNcActionLink,\n\t\tNcActionSeparator,\n\t\tNcActions,\n\t\tNcBreadcrumb,\n\t\tNcBreadcrumbs,\n\t\tNcButton,\n\t\tNcDateTime,\n\t\tNcDialog,\n\t\tNcEmptyContent,\n\t\tNcIconSvgWrapper,\n\t\tNcLoadingIcon,\n\t\tNcProgressBar,\n\t\tNcTextField,\n\t\tOpenInNew,\n\t\tPencil,\n\t\tPlus,\n\t\tUpload,\n\t},\n\n\tinject: {\n\t\t// The page's pre-bound action runner (CnPageRenderer provides it);\n\t\t// absent outside a page tree, in which case the bare dispatcher runs.\n\t\tcnDispatchAction: { default: null },\n\t},\n\n\tprops: {\n\t\t/**\n\t\t * The host's own actions on each file row, declared the way a\n\t\t * manifest declares any action (`open-modal`, `handler`, ...), and\n\t\t * dispatched through the page's action runner with the node's\n\t\t * `fileId`, `fileName` and `path` merged into an `open-modal` action's\n\t\t * props (or appended as the node to a `handler` action's args). Folders\n\t\t * get none. `icon` is an MDI icon name.\n\t\t *\n\t\t * @type {Array<{id: string, label: string, icon?: string, type?: string, target?: string, props?: object, handler?: string, args?: Array}>}\n\t\t */\n\t\trowActions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * The host's own entries in the New menu, after the ones the Files\n\t\t * app and its plugins register. Each is dispatched like a row action\n\t\t * (`type: 'open-modal' | 'handler' | …`) through the page's\n\t\t * `cnDispatchAction`, carrying the current folder rather than a row,\n\t\t * so a host can offer \"new from template\" or \"request a file from a\n\t\t * party\" here.\n\t\t *\n\t\t * @type {Array<{id: string, label: string, icon?: string, type?: string, target?: string, props?: object, handler?: string, args?: Array}>}\n\t\t */\n\t\tnewActions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * Rows that are not nodes of this folder: files the host joined from\n\t\t * another object's folder. Rendered after the folder's own rows with\n\t\t * open and download only. `note` (and its optional `noteHref`) says\n\t\t * where the file lives.\n\t\t *\n\t\t * @type {Array<{id: string|number, name: string, mime?: string, size?: number, mtime?: Date|number, href?: string, downloadHref?: string, note?: string, noteHref?: string}>}\n\t\t */\n\t\tlinkedItems: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * Label of a linked row's open action.\n\t\t */\n\t\topenLinkedLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Open'),\n\t\t},\n\n\t\t/**\n\t\t * Label of a linked row's download action.\n\t\t */\n\t\tdownloadLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Download'),\n\t\t},\n\n\t\t/**\n\t\t * The folder this browser is rooted at, relative to the current user's\n\t\t * files root (`/Open Registers/Cases/<uuid>`). The browser never\n\t\t * navigates above it. Resolve it with `resolveObjectFolder()` for an\n\t\t * OpenRegister object.\n\t\t */\n\t\trootPath: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\n\t\t/**\n\t\t * What the root crumb reads. Null shows the folder's own name, which\n\t\t * is what the Files app shows; pass a label when the folder on disk is\n\t\t * a uuid and the host knows a better name.\n\t\t */\n\t\trootLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Label of the New menu. */\n\t\tnewLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'New'),\n\t\t},\n\n\t\t/** Label of the upload entry in the New menu. */\n\t\tuploadLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Upload files'),\n\t\t},\n\n\t\t/** Label of the new-folder entry and its dialog. */\n\t\tnewFolderLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'New folder'),\n\t\t},\n\n\t\t/** Label of the rename action and its dialog. */\n\t\trenameLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Rename'),\n\t\t},\n\n\t\t/** Label of the link that opens the file in the Files app. */\n\t\tshowInFilesLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Show in Files'),\n\t\t},\n\n\t\t/** Title of the empty state. */\n\t\temptyLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'This folder is empty'),\n\t\t},\n\n\t\t/** Line under the empty state's title. */\n\t\temptyHint: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Drop files here, or use New'),\n\t\t},\n\n\t\t/** Label of the retry button on a failed listing. */\n\t\tretryLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Try again'),\n\t\t},\n\n\t\t/**\n\t\t * The columns this browser shows, in order. An entry is a built-in name\n\t\t * (`name`, `size`, `modified`, `owner`, `type`, `tags`) or an object\n\t\t * declaring its own: `{ key, label, source, attribute, formatter,\n\t\t * sortable }`, where `source` is `node` (a property of the node),\n\t\t * `attribute` (a DAV property, added to the PROPFIND before listing) or\n\t\t * `row` (a value from `rowData`).\n\t\t *\n\t\t * Declaring none keeps today's table: name, size and modified.\n\t\t *\n\t\t * This is the membership list. The Columns chooser lets a user hide any\n\t\t * of these; it never adds one, and a column removed from here is gone\n\t\t * for every user, whatever they had stored.\n\t\t *\n\t\t * @type {Array<string|object>}\n\t\t */\n\t\tcolumns: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * The host's own per-file data for `source: 'row'` columns, keyed by\n\t\t * file id. Either an object, or a function of the listed nodes called\n\t\t * once per folder so the host can fetch its projection in one request.\n\t\t *\n\t\t * @type {object | ((nodes: Array<object>) => (object|Promise<object>))}\n\t\t */\n\t\trowData: {\n\t\t\ttype: [Object, Function],\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * The app id the Columns chooser stores this user's choice under. Unset\n\t\t * means the chooser is not offered and every declared column renders.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tpreferenceApp: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * The key this browser's column choice is stored under, so two browsers\n\t\t * in one app remember separately.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tpreferenceKey: {\n\t\t\ttype: String,\n\t\t\tdefault: 'files-browser-columns',\n\t\t},\n\n\t\t/** Label of the toolbar's Columns chooser. */\n\t\tcolumnsLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Columns'),\n\t\t},\n\t},\n\n\temits: ['changed'],\n\n\tdata() {\n\t\treturn {\n\t\t\tcurrentPath: this.rootPath,\n\t\t\t/** The open folder as a node, or null before the first listing. */\n\t\t\tfolder: null,\n\t\t\t/** The open folder's children as nodes. */\n\t\t\tnodes: [],\n\t\t\tloading: false,\n\t\t\terror: '',\n\t\t\tsortKey: 'basename',\n\t\t\tsortAsc: true,\n\t\t\t/** The host's per-file data for `row` columns, by file id. */\n\t\t\tresolvedRowData: null,\n\t\t\t/**\n\t\t\t * The column keys this user chose to see, or null while they have\n\t\t\t * chosen nothing. Never a source of membership: it is intersected\n\t\t\t * with the host's declaration, never added to it.\n\t\t\t */\n\t\t\tvisibleColumnKeys: null,\n\t\t\tdragging: false,\n\t\t\tuploads: [],\n\t\t\tpreviewFailed: {},\n\t\t\tnewFolderOpen: false,\n\t\t\tnewFolderName: '',\n\t\t\tnewFolderError: '',\n\t\t\t/** The node being renamed, or null. */\n\t\t\trenaming: null,\n\t\t\trenameName: '',\n\t\t\trenameError: '',\n\t\t\tfileInputEl: null,\n\t\t\t/**\n\t\t\t * The view the Files app's actions are handed. They read `view.id`\n\t\t\t * to tell a trash bin or a share view from a plain folder; this is\n\t\t\t * a plain folder.\n\t\t\t */\n\t\t\tview: new View({\n\t\t\t\tid: 'files',\n\t\t\t\tname: t('nextcloud-vue', 'Files'),\n\t\t\t\t// The View constructor refuses anything but an SVG string here,\n\t\t\t\t// and throws from data(), which takes the whole tab down.\n\t\t\t\ticon: VIEW_ICON,\n\t\t\t\torder: 0,\n\t\t\t\tgetContents: async () => ({ folder: this.folder, contents: this.nodes }),\n\t\t\t}),\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * The breadcrumb trail from the root to the open folder.\n\t\t *\n\t\t * @return {Array<{name: string, path: string}>} The crumbs.\n\t\t */\n\t\tcrumbs() {\n\t\t\treturn crumbsFor(this.rootPath, this.currentPath, this.rootLabel)\n\t\t},\n\n\t\t/**\n\t\t * The children in the chosen order, folders first the way the Files app\n\t\t * lists them.\n\t\t *\n\t\t * @return {Array<object>} The nodes.\n\t\t */\n\t\tsorted() {\n\t\t\tconst column = this.activeSortColumn\n\t\t\tif (column && !column.sortKey) {\n\t\t\t\t// A declared column has no meaning to the Files app's sorter, so\n\t\t\t\t// it sorts here, within the folder that is listed.\n\t\t\t\treturn sortNodesByColumn(this.nodes, column, this.sortAsc, this.resolvedRowData, (node) => this.isFolder(node))\n\t\t\t}\n\t\t\treturn sortNodes(this.nodes, {\n\t\t\t\tsortingMode: this.sortKey,\n\t\t\t\tsortingOrder: this.sortAsc ? 'asc' : 'desc',\n\t\t\t\tsortFoldersFirst: true,\n\t\t\t\tsortFavoritesFirst: false,\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * The columns the host declared, resolved. This is the membership list:\n\t\t * a column exists because the host declared it, in the host's order.\n\t\t *\n\t\t * @return {Array<object>} The declared columns.\n\t\t * @spec openspec/changes/files-browser-columns/specs/files-browser/spec.md\n\t\t */\n\t\tdeclaredColumns() {\n\t\t\treturn normaliseFileColumns(this.columns)\n\t\t},\n\n\t\t/**\n\t\t * The library's own word for each built-in column, used when the host\n\t\t * did not write a label.\n\t\t *\n\t\t * @return {object} Labels by column key.\n\t\t */\n\t\tbuiltInColumnLabels() {\n\t\t\treturn {\n\t\t\t\tname: t('nextcloud-vue', 'Name'),\n\t\t\t\tsize: t('nextcloud-vue', 'Size'),\n\t\t\t\tmodified: t('nextcloud-vue', 'Modified'),\n\t\t\t\towner: t('nextcloud-vue', 'Owner'),\n\t\t\t\ttype: t('nextcloud-vue', 'Type'),\n\t\t\t\ttags: t('nextcloud-vue', 'Tags'),\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * The columns this browser renders: the host's declaration narrowed by\n\t\t * what this user chose to see.\n\t\t *\n\t\t * The user's stored choice only ever takes columns away. It is applied\n\t\t * by walking the declaration, so a key the host no longer declares is\n\t\t * passed over rather than rendered, and a preference written when a\n\t\t * different set was declared cannot bring an old column back.\n\t\t *\n\t\t * @return {Array<object>} The columns to render.\n\t\t * @spec openspec/changes/files-browser-columns/specs/files-browser/spec.md\n\t\t */\n\t\trenderedColumns() {\n\t\t\treturn visibleFileColumns(this.declaredColumns, this.visibleColumnKeys)\n\t\t},\n\n\t\t/**\n\t\t * The column the table is currently sorted on, or null when the sort\n\t\t * key belongs to no declared column.\n\t\t *\n\t\t * @return {(object|null)} The active column.\n\t\t */\n\t\tactiveSortColumn() {\n\t\t\treturn this.declaredColumns.find((column) => this.sortTokenOf(column) === this.sortKey) || null\n\t\t},\n\n\t\t/**\n\t\t * Whether the Columns chooser is offered: only when the host said where\n\t\t * to store the answer, because a chooser that forgets is worse than no\n\t\t * chooser.\n\t\t *\n\t\t * @return {boolean} True when the chooser renders.\n\t\t */\n\t\tcolumnsChooserEnabled() {\n\t\t\treturn this.preferenceApp !== '' && this.declaredColumns.length > 0\n\t\t},\n\n\t\t/**\n\t\t * What the Files app and its plugins offer to create in this folder.\n\t\t *\n\t\t * Read at render, not cached: a plugin's script may register its entry\n\t\t * after this component mounted.\n\t\t *\n\t\t * @return {Array<object>} The entries, in the plugins' order.\n\t\t */\n\t\tnewMenuEntries() {\n\t\t\tif (this.folder === null) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn getNewFileMenuEntries(this.folder)\n\t\t\t\t\t.filter((entry) => typeof entry.handler === 'function')\n\t\t\t\t\t.sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\n\t\t\t} catch {\n\t\t\t\treturn []\n\t\t\t}\n\t\t},\n\t},\n\n\twatch: {\n\t\trootPath(next) {\n\t\t\tthis.currentPath = next\n\t\t\tthis.refresh()\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.loadColumnChoice()\n\t\tthis.refresh()\n\t},\n\n\tmethods: {\n\t\tt,\n\n\t\t/**\n\t\t * Hold the file input element from its function ref.\n\t\t *\n\t\t * @param {HTMLInputElement|null} el The element.\n\t\t * @return {void}\n\t\t */\n\t\tfileInputRef(el) {\n\t\t\tthis.fileInputEl = el || null\n\t\t},\n\n\t\t/**\n\t\t * The DAV path of a user-relative path.\n\t\t *\n\t\t * @param {string} path The user-relative path.\n\t\t * @return {string} The path under the DAV files root.\n\t\t */\n\t\tdavPath(path) {\n\t\t\treturn `${getRootPath()}${path}`\n\t\t},\n\n\t\t/**\n\t\t * List the open folder over DAV, with the same PROPFIND the Files app sends.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync refresh() {\n\t\t\tthis.loading = true\n\t\t\tthis.error = ''\n\t\t\ttry {\n\t\t\t\tconst client = getClient()\n\t\t\t\tconst { data } = await client.getDirectoryContents(this.davPath(this.currentPath), {\n\t\t\t\t\tdetails: true,\n\t\t\t\t\tdata: this.propfindBody(),\n\t\t\t\t\tincludeSelf: true,\n\t\t\t\t})\n\t\t\t\tconst stats = Array.isArray(data) ? data : []\n\t\t\t\tconst nodes = stats.map((stat) => resultToNode(stat))\n\t\t\t\tconst self = nodes.find((node) => node.path === this.currentPath) || nodes[0] || null\n\t\t\t\tthis.folder = self\n\t\t\t\tthis.nodes = nodes.filter((node) => node !== self)\n\t\t\t\t// One call per folder, not one per file: the host's projection\n\t\t\t\t// is asked for the whole listing at once.\n\t\t\t\tawait this.resolveRowData(this.nodes)\n\t\t\t} catch (err) {\n\t\t\t\tconst status = err?.response?.status ?? err?.status\n\t\t\t\tthis.error = status === 404\n\t\t\t\t\t? t('nextcloud-vue', 'This folder no longer exists')\n\t\t\t\t\t: (status === 403 ? t('nextcloud-vue', 'You cannot see this folder') : t('nextcloud-vue', 'The folder could not be read'))\n\t\t\t\tthis.folder = null\n\t\t\t\tthis.nodes = []\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Open a folder below the root.\n\t\t *\n\t\t * @param {string} path The user-relative path.\n\t\t * @return {void}\n\t\t */\n\t\tnavigate(path) {\n\t\t\tconst root = this.rootPath.replace(/\\/+$/, '') || '/'\n\t\t\tif (path !== root && !path.startsWith(root === '/' ? '/' : `${root}/`)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.currentPath = path\n\t\t\tthis.refresh()\n\t\t},\n\n\t\t/**\n\t\t * Whether a node is a folder.\n\t\t *\n\t\t * @param {object} node The node.\n\t\t * @return {boolean} true for a folder.\n\t\t */\n\t\tisFolder(node) {\n\t\t\treturn node.type === FileType.Folder\n\t\t},\n\n\t\t/**\n\t\t * A row was clicked: enter a folder, or open a file the way the Files\n\t\t * app would (its `view` action, which hands over to the Viewer).\n\t\t *\n\t\t * @param {object} node The node.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync open(node) {\n\t\t\tif (this.isFolder(node)) {\n\t\t\t\tthis.navigate(node.path)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst view = this.actionsFor(node).find((action) => action.id === 'view')\n\t\t\tif (view) {\n\t\t\t\tawait this.run(view, node)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (node.fileid) {\n\t\t\t\twindow.open(this.permalink(node), '_blank', 'noopener,noreferrer')\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Row click: a ctrl/cmd/shift click opens the node's permalink in a new\n\t\t * tab, like a link would; a plain click opens it in place (`open`).\n\t\t *\n\t\t * @param {object} node The node.\n\t\t * @param {MouseEvent} [event] The click event.\n\t\t * @return {void}\n\t\t */\n\t\tonRowClick(node, event) {\n\t\t\tif (isNewTabClick(event)) {\n\t\t\t\tthis.openInNewTab(node)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.open(node)\n\t\t},\n\n\t\t/**\n\t\t * Row middle click: open the node's permalink in a new tab.\n\t\t *\n\t\t * @param {object} node The node.\n\t\t * @param {MouseEvent} event The auxclick event.\n\t\t * @return {void}\n\t\t */\n\t\tonRowAuxClick(node, event) {\n\t\t\tif (isRowMiddleClick(event)) {\n\t\t\t\tthis.openInNewTab(node)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Open a node's permalink (a file or a folder in the Files app) in a new tab.\n\t\t *\n\t\t * @param {object} node The node.\n\t\t * @return {void}\n\t\t */\n\t\topenInNewTab(node) {\n\t\t\tif (node.fileid) {\n\t\t\t\twindow.open(this.permalink(node), '_blank', 'noopener,noreferrer')\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * The action context the Files app hands its actions for one node.\n\t\t *\n\t\t * @param {object} node The node.\n\t\t * @return {object} The context.\n\t\t */\n\t\tcontextFor(node) {\n\t\t\treturn { nodes: [node], view: this.view, folder: this.folder, contents: this.nodes }\n\t\t},\n\n\t\t/**\n\t\t * The registered actions that apply to a node, in the Files app's order.\n\t\t *\n\t\t * Inline actions (a sharing badge, an unread-comments dot) are status\n\t\t * marks the Files app paints beside the name, not menu items; a\n\t\t * sub-action lives under its parent's own menu; and the actions that\n\t\t * need the Files page are named in `ACTIONS_NEEDING_THE_FILES_PAGE`.\n\t\t *\n\t\t * @param {object} node The node.\n\t\t * @return {Array<object>} The actions.\n\t\t */\n\t\tactionsFor(node) {\n\t\t\tlet actions\n\t\t\ttry {\n\t\t\t\tactions = getFileActions()\n\t\t\t} catch {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst context = this.contextFor(node)\n\t\t\treturn actions\n\t\t\t\t.filter((action) => !action.parent && !ACTIONS_NEEDING_THE_FILES_PAGE.includes(action.id))\n\t\t\t\t.filter((action) => typeof action.inline !== 'function' || action.inline(context) !== true)\n\t\t\t\t.filter((action) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn typeof action.enabled !== 'function' || action.enabled(context) === true\n\t\t\t\t\t} catch {\n\t\t\t\t\t\treturn false\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\n\t\t},\n\n\t\t/**\n\t\t * An action's label for a node, in the words the Files app uses.\n\t\t *\n\t\t * @param {object} action The action.\n\t\t * @param {object} node The node.\n\t\t * @return {string} The label.\n\t\t */\n\t\tlabelOf(action, node) {\n\t\t\ttry {\n\t\t\t\treturn action.displayName(this.contextFor(node))\n\t\t\t} catch {\n\t\t\t\treturn action.id\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * An action's icon for a node, as inline SVG.\n\t\t *\n\t\t * @param {object} action The action.\n\t\t * @param {object} node The node.\n\t\t * @return {string} The SVG, or the empty string.\n\t\t */\n\t\ticonOf(action, node) {\n\t\t\ttry {\n\t\t\t\treturn action.iconSvgInline(this.contextFor(node)) || ''\n\t\t\t} catch {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Run a registered action on a node, then re-read the folder: most of\n\t\t * them change it (a delete, a rename, a move), and the ones that do\n\t\t * not cost one PROPFIND.\n\t\t *\n\t\t * @param {object} action The action.\n\t\t * @param {object} node The node.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync run(action, node) {\n\t\t\ttry {\n\t\t\t\tconst result = await action.exec(this.contextFor(node))\n\t\t\t\tif (result === false) {\n\t\t\t\t\tconst { showError } = await import('@nextcloud/dialogs')\n\t\t\t\t\tshowError(t('nextcloud-vue', '{action} did not succeed', { action: this.labelOf(action, node) }))\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconst { showError } = await import('@nextcloud/dialogs')\n\t\t\t\tshowError(err?.message || t('nextcloud-vue', '{action} did not succeed', { action: this.labelOf(action, node) }))\n\t\t\t}\n\t\t\tawait this.refresh()\n\t\t\t/**\n\t\t\t * @event changed The folder's contents changed through this browser:\n\t\t\t * an upload, a new folder, or an action that ran.\n\t\t\t */\n\t\t\tthis.$emit('changed')\n\t\t},\n\n\t\t/**\n\t\t * Run a New menu entry the Files app or a plugin registered, then re-read.\n\t\t *\n\t\t * The `newFolder` entry the Files app registers opens its own inline\n\t\t * rename in the Files list, which is not here, so that one is answered\n\t\t * by this component's dialog instead.\n\t\t *\n\t\t * @param {object} entry The entry.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync runNewEntry(entry) {\n\t\t\tif (entry.id === 'newFolder') {\n\t\t\t\tthis.askNewFolder()\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait entry.handler(this.folder, this.nodes)\n\t\t\t} catch (err) {\n\t\t\t\tconst { showError } = await import('@nextcloud/dialogs')\n\t\t\t\tshowError(err?.message || t('nextcloud-vue', '{action} did not succeed', { action: entry.displayName }))\n\t\t\t}\n\t\t\tawait this.refresh()\n\t\t\tthis.$emit('changed')\n\t\t},\n\n\t\t/**\n\t\t * Open the new-folder dialog.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\taskNewFolder() {\n\t\t\tthis.newFolderName = ''\n\t\t\tthis.newFolderError = ''\n\t\t\tthis.newFolderOpen = true\n\t\t},\n\n\t\t/**\n\t\t * Create the folder named in the dialog, over DAV.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync createFolder() {\n\t\t\tconst name = this.newFolderName.trim()\n\t\t\tif (name === '') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (this.nodes.some((node) => node.basename === name)) {\n\t\t\t\tthis.newFolderError = t('nextcloud-vue', 'A file or folder with that name is already here')\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait getClient().createDirectory(this.davPath(joinPath(this.currentPath, name)))\n\t\t\t\tthis.newFolderOpen = false\n\t\t\t\tawait this.refresh()\n\t\t\t\tthis.$emit('changed')\n\t\t\t} catch (err) {\n\t\t\t\tthis.newFolderError = err?.message || t('nextcloud-vue', 'The folder could not be created')\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Open the rename dialog on a node.\n\t\t *\n\t\t * @param {object} node The node.\n\t\t * @return {void}\n\t\t */\n\t\taskRename(node) {\n\t\t\tthis.renaming = node\n\t\t\tthis.renameName = node.basename\n\t\t\tthis.renameError = ''\n\t\t},\n\n\t\t/**\n\t\t * Rename the node named in the dialog, as a DAV move within its folder.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync rename() {\n\t\t\tconst node = this.renaming\n\t\t\tconst name = this.renameName.trim()\n\t\t\tif (node === null || name === '' || name === node.basename) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (name.includes('/')) {\n\t\t\t\tthis.renameError = t('nextcloud-vue', 'A name cannot contain a slash')\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (this.nodes.some((other) => other !== node && other.basename === name)) {\n\t\t\t\tthis.renameError = t('nextcloud-vue', 'A file or folder with that name is already here')\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait getClient().moveFile(this.davPath(node.path), this.davPath(joinPath(this.currentPath, name)))\n\t\t\t\tthis.renaming = null\n\t\t\t\tawait this.refresh()\n\t\t\t\tthis.$emit('changed')\n\t\t\t} catch (err) {\n\t\t\t\tthis.renameError = err?.message || t('nextcloud-vue', 'The name could not be changed')\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Open the file picker.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tpickFiles() {\n\t\t\tthis.fileInputEl?.click()\n\t\t},\n\n\t\t/**\n\t\t * Files were picked.\n\t\t *\n\t\t * @param {Event} event The change event.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync onFilesPicked(event) {\n\t\t\tconst files = event.target?.files\n\t\t\tif (files?.length) {\n\t\t\t\tawait this.uploadFiles(files)\n\t\t\t}\n\t\t\tif (this.fileInputEl) {\n\t\t\t\tthis.fileInputEl.value = ''\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Files were dropped.\n\t\t *\n\t\t * @param {DragEvent} event The drop.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync onDrop(event) {\n\t\t\tthis.dragging = false\n\t\t\tconst files = event.dataTransfer?.files\n\t\t\tif (files?.length) {\n\t\t\t\tawait this.uploadFiles(files)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * PUT each file into the open folder over DAV, with a progress row\n\t\t * each, then re-read the folder once.\n\t\t *\n\t\t * @param {FileList|File[]} files The files.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync uploadFiles(files) {\n\t\t\tif (this.folder === null) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// A PUT through axios rather than the DAV client: the client's\n\t\t\t// putFileContents refuses a browser File (\"Cannot calculate data\n\t\t\t// length\"), and fetch reports no upload progress anyway. axios\n\t\t\t// carries the session and the request token, and its XHR reports\n\t\t\t// progress per file. If-None-Match: * refuses to overwrite.\n\t\t\tconst batch = [...files].map((file) => ({ key: `u${++uploadSeq}`, name: file.name, progress: 0, error: '', file }))\n\t\t\tthis.uploads = [...this.uploads, ...batch]\n\t\t\tfor (const upload of batch) {\n\t\t\t\ttry {\n\t\t\t\t\tawait axios.put(`${getRemoteURL()}${this.davPath(joinPath(this.currentPath, upload.name))}`, upload.file, {\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t'Content-Type': upload.file.type || 'application/octet-stream',\n\t\t\t\t\t\t\t'If-None-Match': '*',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonUploadProgress: (progress) => {\n\t\t\t\t\t\t\tif (progress?.total) {\n\t\t\t\t\t\t\t\tupload.progress = Math.round((progress.loaded / progress.total) * 100)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\tupload.progress = 100\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconst status = err?.response?.status ?? err?.status\n\t\t\t\t\tupload.error = status === 412\n\t\t\t\t\t\t? t('nextcloud-vue', 'A file with that name is already here')\n\t\t\t\t\t\t: (err?.message || t('nextcloud-vue', 'The upload failed'))\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait this.refresh()\n\t\t\tthis.$emit('changed')\n\t\t\t// Finished rows leave the list; failed ones stay with their reason.\n\t\t\twindow.setTimeout(() => {\n\t\t\t\tthis.uploads = this.uploads.filter((upload) => upload.error !== '' || batch.every((b) => b.key !== upload.key))\n\t\t\t}, 1500)\n\t\t},\n\n\t\t/**\n\t\t * Change the sort column, or flip the order on the same one.\n\t\t *\n\t\t * @param {string} key `basename`, `size` or `mtime`.\n\t\t * @return {void}\n\t\t */\n\t\t/**\n\t\t * The PROPFIND this browser sends: the Files app's own body, plus one\n\t\t * `<prop>` for every DAV property a declared `attribute` column reads,\n\t\t * so that value is on the node when the folder lists rather than one\n\t\t * request later.\n\t\t *\n\t\t * @return {string} The PROPFIND body.\n\t\t * @spec openspec/changes/files-browser-columns/specs/files-browser/spec.md\n\t\t */\n\t\tpropfindBody() {\n\t\t\tconst base = getDefaultPropfind()\n\t\t\tconst extra = attributePropertiesFor(this.declaredColumns)\n\t\t\tif (extra.length === 0) {\n\t\t\t\treturn base\n\t\t\t}\n\t\t\tconst props = extra.map((name) => {\n\t\t\t\tconst match = /^\\{(.+)\\}(.+)$/.exec(name)\n\t\t\t\tif (!match) {\n\t\t\t\t\treturn `<d:${name} />`\n\t\t\t\t}\n\t\t\t\treturn `<x-cn:${match[2]} xmlns:x-cn=\"${match[1]}\" />`\n\t\t\t}).join('')\n\t\t\t// Spliced into the existing <d:prop> rather than appended after it:\n\t\t\t// a second <d:prop> block is not a PROPFIND any server answers.\n\t\t\treturn base.includes('</d:prop>')\n\t\t\t\t? base.replace('</d:prop>', `${props}</d:prop>`)\n\t\t\t\t: base\n\t\t},\n\n\t\t/**\n\t\t * The token a column sorts under: the Files app's own sorting mode for\n\t\t * a built-in, the column key for anything else.\n\t\t *\n\t\t * @param {object} column A resolved column.\n\t\t * @return {string} The sort token.\n\t\t */\n\t\tsortTokenOf(column) {\n\t\t\treturn (column && (column.sortKey || column.key)) || ''\n\t\t},\n\n\t\t/**\n\t\t * The label a column's header shows: what the host wrote, else the\n\t\t * library's own word for a built-in, else the key.\n\t\t *\n\t\t * @param {object} column A resolved column.\n\t\t * @return {string} The header text.\n\t\t */\n\t\tcolumnLabel(column) {\n\t\t\tif (column && typeof column.label === 'string' && column.label !== '') {\n\t\t\t\treturn column.label\n\t\t\t}\n\t\t\treturn this.builtInColumnLabels[column && column.key] || (column && column.key) || ''\n\t\t},\n\n\t\t/**\n\t\t * One cell's value.\n\t\t *\n\t\t * @param {object} column A resolved column.\n\t\t * @param {object} node The node.\n\t\t * @return {(Array|object|string|number|boolean|undefined)} The value.\n\t\t */\n\t\tcellValue(column, node) {\n\t\t\treturn fileColumnValue(column, node, this.resolvedRowData)\n\t\t},\n\n\t\t/**\n\t\t * Whether a user currently sees a column, for the chooser's ticks.\n\t\t *\n\t\t * @param {object} column A resolved column.\n\t\t * @return {boolean} True when it renders.\n\t\t */\n\t\tisColumnVisible(column) {\n\t\t\treturn this.renderedColumns.some((c) => c.key === column.key)\n\t\t},\n\n\t\t/**\n\t\t * Tick or untick a column for this user and remember it.\n\t\t *\n\t\t * The stored value is always rebuilt from the host's declaration, never\n\t\t * from the previous stored value, so a key the host has since dropped\n\t\t * cannot survive a toggle and reappear later.\n\t\t *\n\t\t * @param {object} column The column being toggled.\n\t\t * @return {void}\n\t\t * @spec openspec/changes/files-browser-columns/specs/files-browser/spec.md\n\t\t */\n\t\ttoggleColumn(column) {\n\t\t\tconst next = this.declaredColumns\n\t\t\t\t.filter((c) => (c.key === column.key ? !this.isColumnVisible(c) : this.isColumnVisible(c)))\n\t\t\t\t.map((c) => c.key)\n\t\t\tthis.visibleColumnKeys = next\n\t\t\tthis.saveColumnChoice(next)\n\t\t},\n\n\t\t/**\n\t\t * Read this user's column choice. A stored key the host no longer\n\t\t * declares is dropped on the way in as well as on the way out, so the\n\t\t * chooser never lists a column that cannot render.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync loadColumnChoice() {\n\t\t\tif (!this.columnsChooserEnabled) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst stored = await readUserPreference(this.preferenceApp, this.preferenceKey, null)\n\t\t\tif (!Array.isArray(stored)) {\n\t\t\t\tthis.visibleColumnKeys = null\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst declared = new Set(this.declaredColumns.map((c) => c.key))\n\t\t\tthis.visibleColumnKeys = stored.filter((key) => declared.has(key))\n\t\t},\n\n\t\t/**\n\t\t * Store this user's column choice.\n\t\t *\n\t\t * @param {string[]} keys The visible column keys.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync saveColumnChoice(keys) {\n\t\t\tif (!this.columnsChooserEnabled) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tawait writeUserPreference(this.preferenceApp, this.preferenceKey, keys)\n\t\t},\n\n\t\t/**\n\t\t * Resolve the host's per-file data for this folder's nodes. Called once\n\t\t * per listing, so a projection of ninety files is one request.\n\t\t *\n\t\t * @param {Array<object>} nodes The listed nodes.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync resolveRowData(nodes) {\n\t\t\tif (this.rowData === null || this.rowData === undefined) {\n\t\t\t\tthis.resolvedRowData = null\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (typeof this.rowData !== 'function') {\n\t\t\t\tthis.resolvedRowData = this.rowData\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tthis.resolvedRowData = await this.rowData(nodes)\n\t\t\t} catch {\n\t\t\t\t// A projection that could not be fetched leaves those cells\n\t\t\t\t// empty. It is not a reason to say the folder failed to list:\n\t\t\t\t// the files are there and the host's extra columns are not.\n\t\t\t\tthis.resolvedRowData = null\n\t\t\t}\n\t\t},\n\n\t\tsortBy(key) {\n\t\t\tif (this.sortKey === key) {\n\t\t\t\tthis.sortAsc = !this.sortAsc\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.sortKey = key\n\t\t\t// Size and modified read most usefully largest and newest first;\n\t\t\t// everything else, including every declared column, starts at A.\n\t\t\tthis.sortAsc = key !== 'size' && key !== 'mtime'\n\t\t},\n\n\t\t/**\n\t\t * The `aria-sort` value for a column header.\n\t\t *\n\t\t * @param {string} key The column's sort key.\n\t\t * @return {string|null} `ascending`, `descending` or null.\n\t\t */\n\t\tariaSort(key) {\n\t\t\tif (this.sortKey !== key) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.sortAsc ? 'ascending' : 'descending'\n\t\t},\n\n\t\t/**\n\t\t * The arrow beside the sorted column's name.\n\t\t *\n\t\t * @param {string} key The column's sort key.\n\t\t * @return {object} The icon component.\n\t\t */\n\t\tsortIcon(key) {\n\t\t\treturn this.sortKey === key && !this.sortAsc ? ChevronDown : ChevronUp\n\t\t},\n\n\t\t/**\n\t\t * A file's size the way the Files app prints it.\n\t\t *\n\t\t * @param {number|undefined} size The size in bytes.\n\t\t * @return {string} The size, or the empty string.\n\t\t */\n\t\tformatSize(size) {\n\t\t\treturn typeof size === 'number' ? formatFileSize(size, true) : ''\n\t\t},\n\n\t\t/**\n\t\t * The theme's own icon for a node's mime type, or null off Nextcloud.\n\t\t *\n\t\t * @param {object} node The node.\n\t\t * @return {string|null} The icon url.\n\t\t */\n\t\tmimeIconFor(node) {\n\t\t\tconst getIconUrl = typeof window !== 'undefined' ? window.OC?.MimeType?.getIconUrl : null\n\t\t\tif (typeof getIconUrl !== 'function') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn getIconUrl(this.isFolder(node) ? 'dir' : (node.mime || '')) || null\n\t\t\t} catch {\n\t\t\t\treturn null\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * A small preview for a raster image, from the core preview endpoint.\n\t\t *\n\t\t * @param {object} node The node.\n\t\t * @return {string|null} The url, or null.\n\t\t */\n\t\tpreviewUrlFor(node) {\n\t\t\tconst mime = node.mime || ''\n\t\t\tif (!node.fileid || this.isFolder(node) || !/^image\\//i.test(mime) || /svg/i.test(mime) || this.previewFailed[node.fileid]) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn generateUrl('/core/preview?fileId={fileId}&x=64&y=64&a=1', { fileId: node.fileid })\n\t\t},\n\n\t\t/**\n\t\t * Remember a preview that did not load.\n\t\t *\n\t\t * @param {object} node The node.\n\t\t * @return {void}\n\t\t */\n\t\tonPreviewError(node) {\n\t\t\tthis.previewFailed = { ...this.previewFailed, [node.fileid]: true }\n\t\t},\n\n\t\t/**\n\t\t * The Files app opened on a folder, for the crumbs above the root.\n\t\t *\n\t\t * @param {string} path The user-relative folder path.\n\t\t * @return {string} The url.\n\t\t */\n\t\tfilesAppUrl(path) {\n\t\t\treturn generateUrl('/apps/files/files?dir={dir}', { dir: path })\n\t\t},\n\n\t\t/**\n\t\t * The Files app's permalink for a node.\n\t\t *\n\t\t * @param {object} node The node.\n\t\t * @return {string} The url.\n\t\t */\n\t\tpermalink(node) {\n\t\t\treturn generateUrl('/f/{fileid}', { fileid: node.fileid })\n\t\t},\n\n\t\t/**\n\t\t * Run one of the host's declared actions on a file.\n\t\t *\n\t\t * An `open-modal` action gets the node merged onto its props as\n\t\t * `fileId`, `fileName` and `path`, the same way a widget's row action\n\t\t * hands a modal its row; a `handler` action gets the node appended to\n\t\t * its args. Everything else is dispatched as declared.\n\t\t *\n\t\t * @param {object} action The declared action.\n\t\t * @param {object} node The file it was clicked on.\n\t\t * @return {void}\n\t\t */\n\t\trunHostAction(action, node) {\n\t\t\tif (!action || typeof action !== 'object') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst type = action.type || 'handler'\n\t\t\tlet wrapped = action\n\t\t\t// A New-menu entry carries no row, only the folder it was opened in.\n\t\t\tconst context = node === null\n\t\t\t\t? { path: this.currentPath }\n\t\t\t\t: { fileId: node.fileid, fileName: node.basename, path: node.path }\n\t\t\tif (type === 'open-modal') {\n\t\t\t\twrapped = { ...action, props: { ...(action.props || {}), ...context } }\n\t\t\t} else if (type === 'handler') {\n\t\t\t\twrapped = { ...action, args: [...(action.args || []), node ?? this.folder] }\n\t\t\t}\n\t\t\tif (typeof this.cnDispatchAction === 'function') {\n\t\t\t\tthis.cnDispatchAction(wrapped)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tdispatchAction(wrapped, { router: this.$router || null })\n\t\t},\n\n\t\t/**\n\t\t * A click on a linked row opens the file where it lives.\n\t\t *\n\t\t * @param {object} item The linked item.\n\t\t * @return {void}\n\t\t */\n\t\topenLinked(item) {\n\t\t\tif (item.href && typeof window !== 'undefined') {\n\t\t\t\twindow.open(item.href, '_blank', 'noopener')\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * A middle click on a linked row opens it like a click does.\n\t\t *\n\t\t * @param {object} item The linked item.\n\t\t * @param {MouseEvent} event The auxclick event.\n\t\t * @return {void}\n\t\t */\n\t\tonLinkedAuxClick(item, event) {\n\t\t\tif (isRowMiddleClick(event)) {\n\t\t\t\tthis.openLinked(item)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * The current user's id, for callers resolving a root path.\n\t\t *\n\t\t * @return {string} The uid, or the empty string.\n\t\t */\n\t\tcurrentUid() {\n\t\t\treturn getCurrentUser()?.uid || ''\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-files-browser {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n\tmin-width: 0;\n\tborder-radius: var(--border-radius-large, 8px);\n}\n\n.cn-files-browser--dragging {\n\toutline: 2px dashed var(--color-primary-element);\n\toutline-offset: 4px;\n}\n\n.cn-files-browser__bar {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tgap: 8px;\n\tmin-width: 0;\n}\n\n.cn-files-browser__crumbs {\n\tmin-width: 0;\n\tflex: 1 1 auto;\n}\n\n.cn-files-browser__file-input {\n\tdisplay: none;\n}\n\n.cn-files-browser__uploads {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n}\n\n.cn-files-browser__upload {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n}\n\n.cn-files-browser__upload-name {\n\tfont-size: 13px;\n}\n\n.cn-files-browser__upload-error {\n\tcolor: var(--color-error);\n\tfont-size: 13px;\n}\n\n.cn-files-browser__loading {\n\tpadding: 24px 0;\n}\n\n.cn-files-browser__table {\n\twidth: 100%;\n\tborder-collapse: collapse;\n\ttable-layout: fixed;\n}\n\n.cn-files-browser__table th {\n\ttext-align: start;\n\tfont-weight: normal;\n\tcolor: var(--color-text-maxcontrast);\n\tpadding: 4px 8px;\n\tborder-bottom: 1px solid var(--color-border);\n}\n\n.cn-files-browser__sort {\n\tbackground: none;\n\tborder: none;\n\tpadding: 0;\n\tfont: inherit;\n\tcolor: inherit;\n\tcursor: pointer;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 2px;\n}\n\n.cn-files-browser__sort:hover,\n.cn-files-browser__sort:focus-visible {\n\tcolor: var(--color-main-text);\n}\n\n.cn-files-browser__row {\n\tcursor: pointer;\n}\n\n.cn-files-browser__row:hover,\n.cn-files-browser__row:focus-within {\n\tbackground-color: var(--color-background-hover);\n}\n\n.cn-files-browser__table td {\n\tpadding: 4px 8px;\n\tborder-bottom: 1px solid var(--color-border);\n\tvertical-align: middle;\n}\n\n.cn-files-browser__col-icon {\n\twidth: 48px;\n}\n\n.cn-files-browser__col-size {\n\twidth: 96px;\n\twhite-space: nowrap;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-files-browser__col-mtime {\n\twidth: 140px;\n\twhite-space: nowrap;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-files-browser__col-actions {\n\twidth: 48px;\n}\n\n.cn-files-browser__col-name {\n\tmin-width: 0;\n}\n\n.cn-files-browser__name {\n\tdisplay: block;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n.cn-files-browser__row--linked {\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-files-browser__note {\n\tcolor: var(--color-text-maxcontrast);\n\tdisplay: block;\n\tfont-size: var(--font-size-small, 13px);\n}\n\n.cn-files-browser__note-link {\n\tcolor: inherit;\n\ttext-decoration: underline;\n}\n\n.cn-files-browser__row--folder .cn-files-browser__name {\n\tfont-weight: 600;\n}\n\n.cn-files-browser__mime,\n.cn-files-browser__thumb {\n\twidth: 32px;\n\theight: 32px;\n\tdisplay: block;\n}\n\n.cn-files-browser__thumb {\n\tobject-fit: cover;\n\tborder-radius: var(--border-radius, 4px);\n}\n\n.cn-files-browser__new-folder {\n\tpadding: 8px 0;\n}\n\n.hidden-visually {\n\tposition: absolute;\n\twidth: 1px;\n\theight: 1px;\n\toverflow: hidden;\n\tclip-path: inset(50%);\n\twhite-space: nowrap;\n}\n</style>\n"],"names":["CnCellRenderer","CnIcon","t","axios"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CnFilesBrowser.vue2.js","sources":["../../../../src/components/CnFilesBrowser/CnFilesBrowser.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<div\n\t\tclass=\"cn-files-browser\"\n\t\t:class=\"{ 'cn-files-browser--dragging': dragging }\"\n\t\tdata-testid=\"cn-files-browser\"\n\t\t@dragenter.prevent=\"dragging = true\"\n\t\t@dragover.prevent=\"dragging = true\"\n\t\t@dragleave.prevent=\"dragging = false\"\n\t\t@drop.prevent=\"onDrop\">\n\t\t<!-- The bar: where you are, and what you can add. The crumbs are the\n\t\t Files app's own breadcrumb component; the New menu lists what the\n\t\t Files app and its plugins registered for this folder (a new folder,\n\t\t a template, a file request) beside a plain upload. -->\n\t\t<div class=\"cn-files-browser__bar\">\n\t\t\t<NcBreadcrumbs class=\"cn-files-browser__crumbs\">\n\t\t\t\t<!-- The whole trail from the user's files root, as the Files app\n\t\t\t\t draws it. A crumb above the browser's root links into the Files\n\t\t\t\t app (the browser never leaves its root); the root and everything\n\t\t\t\t beneath it navigate in place. NcBreadcrumbs draws its first\n\t\t\t\t crumb as a home icon and keeps the name for screen readers;\n\t\t\t\t forceIconText puts the name beside the icon. -->\n\t\t\t\t<NcBreadcrumb\n\t\t\t\t\tv-for=\"(crumb, index) in crumbs\"\n\t\t\t\t\t:key=\"crumb.path\"\n\t\t\t\t\t:name=\"crumb.name\"\n\t\t\t\t\t:forceIconText=\"index === 0\"\n\t\t\t\t\t:disableDrop=\"true\"\n\t\t\t\t\t:href=\"crumb.aboveRoot ? filesAppUrl(crumb.path) : undefined\"\n\t\t\t\t\t:target=\"crumb.aboveRoot ? '_blank' : undefined\"\n\t\t\t\t\t:data-above-root=\"crumb.aboveRoot ? 'true' : undefined\"\n\t\t\t\t\tdata-testid=\"cn-files-browser-crumb\"\n\t\t\t\t\t@click=\"crumb.aboveRoot ? undefined : navigate(crumb.path)\" />\n\t\t\t</NcBreadcrumbs>\n\t\t\t<!-- The Columns chooser hides declared columns for this user. It\n\t\t\t cannot add one: it is built by walking the host's declaration,\n\t\t\t so a column the host removed is not listed and cannot be\n\t\t\t ticked back on however the stored preference reads. -->\n\t\t\t<NcActions v-if=\"columnsChooserEnabled\"\n\t\t\t\t:menuName=\"columnsLabel\"\n\t\t\t\t:forceMenu=\"true\"\n\t\t\t\tdata-testid=\"cn-files-browser-columns\">\n\t\t\t\t<NcActionCheckbox\n\t\t\t\t\tv-for=\"column in declaredColumns\"\n\t\t\t\t\t:key=\"column.key\"\n\t\t\t\t\t:modelValue=\"isColumnVisible(column)\"\n\t\t\t\t\t:data-testid=\"`cn-files-browser-column-${column.key}`\"\n\t\t\t\t\t@update:modelValue=\"toggleColumn(column)\">\n\t\t\t\t\t{{ columnLabel(column) }}\n\t\t\t\t</NcActionCheckbox>\n\t\t\t</NcActions>\n\t\t\t<NcActions\n\t\t\t\t:menuName=\"newLabel\"\n\t\t\t\t:forceMenu=\"true\"\n\t\t\t\t:forceName=\"true\"\n\t\t\t\tvariant=\"primary\"\n\t\t\t\t:disabled=\"folder === null\"\n\t\t\t\tdata-testid=\"cn-files-browser-new\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Plus :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t<NcActionButton :closeAfterClick=\"true\" data-testid=\"cn-files-browser-upload\" @click=\"pickFiles\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Upload :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ uploadLabel }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-for=\"entry in newMenuEntries\"\n\t\t\t\t\t:key=\"entry.id\"\n\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t:data-testid=\"`cn-files-browser-new-${entry.id}`\"\n\t\t\t\t\t@click=\"runNewEntry(entry)\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<NcIconSvgWrapper v-if=\"entry.iconSvgInline\" :svg=\"entry.iconSvgInline\" />\n\t\t\t\t\t\t<span v-else-if=\"entry.iconClass\" :class=\"entry.iconClass\" />\n\t\t\t\t\t\t<Plus v-else :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ entry.displayName }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<!-- The host's own entries, after the Files app's. -->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-for=\"action in newActions\"\n\t\t\t\t\t:key=\"`host-${action.id}`\"\n\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t:data-testid=\"`cn-files-browser-new-host-${action.id}`\"\n\t\t\t\t\t@click=\"runHostAction(action, null)\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<CnIcon :name=\"action.icon || 'Plus'\" :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ action.label }}\n\t\t\t\t</NcActionButton>\n\t\t\t</NcActions>\n\t\t</div>\n\n\t\t<!-- `:ref` (dynamic), not `ref`: a static ref on a vnode with only static\n\t\t bindings is hoisted, and a hoisted vnode has no owner instance to\n\t\t hold the ref, which throws in a production build. -->\n\t\t<input\n\t\t\t:ref=\"fileInputRef\"\n\t\t\ttype=\"file\"\n\t\t\tmultiple\n\t\t\tclass=\"cn-files-browser__file-input\"\n\t\t\t:aria-label=\"uploadLabel\"\n\t\t\t@change=\"onFilesPicked\">\n\n\t\t<ul v-if=\"uploads.length > 0\" class=\"cn-files-browser__uploads\" data-testid=\"cn-files-browser-uploads\">\n\t\t\t<li v-for=\"upload in uploads\" :key=\"upload.key\" class=\"cn-files-browser__upload\">\n\t\t\t\t<span class=\"cn-files-browser__upload-name\">{{ upload.name }}</span>\n\t\t\t\t<NcProgressBar :value=\"upload.progress\" :error=\"upload.error !== ''\" />\n\t\t\t\t<span v-if=\"upload.error\" class=\"cn-files-browser__upload-error\" role=\"alert\">{{ upload.error }}</span>\n\t\t\t</li>\n\t\t</ul>\n\n\t\t<NcLoadingIcon v-if=\"loading\" :size=\"32\" class=\"cn-files-browser__loading\" />\n\n\t\t<NcEmptyContent v-else-if=\"error !== ''\" :name=\"error\" class=\"cn-files-browser__state\">\n\t\t\t<template #icon>\n\t\t\t\t<AlertCircleOutline :size=\"44\" />\n\t\t\t</template>\n\t\t\t<template #action>\n\t\t\t\t<NcButton @click=\"refresh\">\n\t\t\t\t\t{{ retryLabel }}\n\t\t\t\t</NcButton>\n\t\t\t</template>\n\t\t</NcEmptyContent>\n\n\t\t<NcEmptyContent\n\t\t\tv-else-if=\"sorted.length === 0 && linkedItems.length === 0\"\n\t\t\t:name=\"emptyLabel\"\n\t\t\t:description=\"emptyHint\"\n\t\t\tclass=\"cn-files-browser__state\">\n\t\t\t<template #icon>\n\t\t\t\t<FolderOutline :size=\"44\" />\n\t\t\t</template>\n\t\t</NcEmptyContent>\n\n\t\t<!-- The table. Its rows are @nextcloud/files nodes read over DAV, and\n\t\t each row's menu is the list of actions the Files app registered on\n\t\t this page, offered under the same names and icons the Files app\n\t\t uses. What cannot run away from the Files page (the details\n\t\t sidebar) is left out, and Show in Files covers it. -->\n\t\t<table v-else class=\"cn-files-browser__table\" data-testid=\"cn-files-browser-table\">\n\t\t\t<thead>\n\t\t\t\t<tr>\n\t\t\t\t\t<th class=\"cn-files-browser__col-icon\" scope=\"col\">\n\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('nextcloud-vue', 'Type') }}</span>\n\t\t\t\t\t</th>\n\t\t\t\t\t<th v-for=\"column in renderedColumns\"\n\t\t\t\t\t\t:key=\"column.key\"\n\t\t\t\t\t\tscope=\"col\"\n\t\t\t\t\t\t:class=\"`cn-files-browser__col-${column.key}`\"\n\t\t\t\t\t\t:aria-sort=\"ariaSort(sortTokenOf(column))\"\n\t\t\t\t\t\t:data-testid=\"`cn-files-browser-header-${column.key}`\">\n\t\t\t\t\t\t<button v-if=\"column.sortable !== false\"\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"cn-files-browser__sort\"\n\t\t\t\t\t\t\t@click=\"sortBy(sortTokenOf(column))\">\n\t\t\t\t\t\t\t{{ columnLabel(column) }}\n\t\t\t\t\t\t\t<component :is=\"sortIcon(sortTokenOf(column))\" v-if=\"sortKey === sortTokenOf(column)\" :size=\"16\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t\t{{ columnLabel(column) }}\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</th>\n\t\t\t\t\t<th class=\"cn-files-browser__col-actions\" scope=\"col\">\n\t\t\t\t\t\t<span class=\"hidden-visually\">{{ t('nextcloud-vue', 'Actions') }}</span>\n\t\t\t\t\t</th>\n\t\t\t\t</tr>\n\t\t\t</thead>\n\t\t\t<tbody>\n\t\t\t\t<tr\n\t\t\t\t\tv-for=\"node in sorted\"\n\t\t\t\t\t:key=\"node.source\"\n\t\t\t\t\tclass=\"cn-files-browser__row\"\n\t\t\t\t\t:class=\"{ 'cn-files-browser__row--folder': isFolder(node) }\"\n\t\t\t\t\tdata-testid=\"cn-files-browser-row\"\n\t\t\t\t\t:data-name=\"node.basename\"\n\t\t\t\t\t@click=\"onRowClick(node, $event)\"\n\t\t\t\t\t@mousedown=\"preventMiddleClickAutoscroll\"\n\t\t\t\t\t@auxclick=\"onRowAuxClick(node, $event)\">\n\t\t\t\t\t<td class=\"cn-files-browser__col-icon\">\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tv-if=\"previewUrlFor(node)\"\n\t\t\t\t\t\t\tclass=\"cn-files-browser__thumb\"\n\t\t\t\t\t\t\t:src=\"previewUrlFor(node)\"\n\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t\t\t\t@error=\"onPreviewError(node)\">\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tv-else-if=\"mimeIconFor(node)\"\n\t\t\t\t\t\t\tclass=\"cn-files-browser__mime\"\n\t\t\t\t\t\t\t:src=\"mimeIconFor(node)\"\n\t\t\t\t\t\t\talt=\"\">\n\t\t\t\t\t\t<FolderOutline v-else-if=\"isFolder(node)\" :size=\"32\" />\n\t\t\t\t\t\t<FileOutline v-else :size=\"32\" />\n\t\t\t\t\t</td>\n\t\t\t\t\t<td v-for=\"column in renderedColumns\"\n\t\t\t\t\t\t:key=\"column.key\"\n\t\t\t\t\t\t:class=\"`cn-files-browser__col-${column.key}`\"\n\t\t\t\t\t\t:data-testid=\"`cn-files-browser-cell-${column.key}`\">\n\t\t\t\t\t\t<span v-if=\"column.key === 'name'\" class=\"cn-files-browser__name\">{{ node.basename }}</span>\n\t\t\t\t\t\t<template v-else-if=\"column.key === 'size'\">\n\t\t\t\t\t\t\t{{ isFolder(node) ? '' : formatSize(node.size) }}\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<NcDateTime v-else-if=\"column.key === 'modified'\" :timestamp=\"node.mtime\" :ignoreSeconds=\"true\" />\n\t\t\t\t\t\t<!-- Everything the host declared renders through the same\n\t\t\t\t\t\t cell renderer the tables use, so a `formatter` means\n\t\t\t\t\t\t here what it means there. -->\n\t\t\t\t\t\t<CnCellRenderer v-else\n\t\t\t\t\t\t\t:value=\"cellValue(column, node)\"\n\t\t\t\t\t\t\t:formatter=\"column.formatter || null\"\n\t\t\t\t\t\t\t:formatterOptions=\"column.formatterOptions || null\"\n\t\t\t\t\t\t\t:widget=\"column.widget || null\"\n\t\t\t\t\t\t\t:row=\"node\" />\n\t\t\t\t\t</td>\n\t\t\t\t\t<td class=\"cn-files-browser__col-actions\" @click.stop @auxclick.stop>\n\t\t\t\t\t\t<NcActions :forceMenu=\"true\" :ariaLabel=\"t('nextcloud-vue', 'Actions for {name}', { name: node.basename })\">\n\t\t\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\t\t\tv-for=\"action in actionsFor(node)\"\n\t\t\t\t\t\t\t\t:key=\"action.id\"\n\t\t\t\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t\t\t\t:data-testid=\"`cn-files-browser-action-${action.id}`\"\n\t\t\t\t\t\t\t\t@click=\"run(action, node)\">\n\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t<NcIconSvgWrapper :svg=\"iconOf(action, node)\" />\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t{{ labelOf(action, node) }}\n\t\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t\t\t<!-- The host's own actions on a file (never on a folder): declared\n\t\t\t\t\t\t\t in its manifest, dispatched through the page's action runner\n\t\t\t\t\t\t\t with the node's file id, name and path merged in. -->\n\t\t\t\t\t\t\t<template v-if=\"!isFolder(node)\">\n\t\t\t\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\t\t\t\tv-for=\"action in rowActions\"\n\t\t\t\t\t\t\t\t\t:key=\"`host-${action.id}`\"\n\t\t\t\t\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t\t\t\t\t:data-testid=\"`cn-files-browser-host-action-${action.id}`\"\n\t\t\t\t\t\t\t\t\t@click=\"runHostAction(action, node)\">\n\t\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t\t<CnIcon :name=\"action.icon || 'FileDocumentEditOutline'\" :size=\"20\" />\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t\t{{ action.label }}\n\t\t\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<NcActionSeparator v-if=\"actionsFor(node).length > 0 || (!isFolder(node) && rowActions.length > 0)\" />\n\t\t\t\t\t\t\t<!-- The Files app's own rename is its list's inline input,\n\t\t\t\t\t\t\t which is not here; this one is a dialog over a DAV move. -->\n\t\t\t\t\t\t\t<NcActionButton :closeAfterClick=\"true\" data-testid=\"cn-files-browser-action-rename\" @click=\"askRename(node)\">\n\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t<Pencil :size=\"20\" />\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t{{ renameLabel }}\n\t\t\t\t\t\t\t</NcActionButton>\n\t\t\t\t\t\t\t<NcActionLink\n\t\t\t\t\t\t\t\tv-if=\"node.fileid\"\n\t\t\t\t\t\t\t\t:href=\"permalink(node)\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t:closeAfterClick=\"true\">\n\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t<OpenInNew :size=\"20\" />\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t{{ showInFilesLabel }}\n\t\t\t\t\t\t\t</NcActionLink>\n\t\t\t\t\t\t</NcActions>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<!-- Rows that are not nodes of this folder: documents the host\n\t\t\t\t joined from elsewhere (another object's folder). Open and\n\t\t\t\t download only; nothing here can change the file. -->\n\t\t\t\t<tr\n\t\t\t\t\tv-for=\"item in linkedItems\"\n\t\t\t\t\t:key=\"`linked-${item.id}`\"\n\t\t\t\t\tclass=\"cn-files-browser__row cn-files-browser__row--linked\"\n\t\t\t\t\tdata-testid=\"cn-files-browser-linked-row\"\n\t\t\t\t\t:data-name=\"item.name\"\n\t\t\t\t\t@click=\"openLinked(item)\"\n\t\t\t\t\t@mousedown=\"preventMiddleClickAutoscroll\"\n\t\t\t\t\t@auxclick=\"onLinkedAuxClick(item, $event)\">\n\t\t\t\t\t<td class=\"cn-files-browser__col-icon\">\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tv-if=\"mimeIconFor({ mime: item.mime })\"\n\t\t\t\t\t\t\tclass=\"cn-files-browser__mime\"\n\t\t\t\t\t\t\t:src=\"mimeIconFor({ mime: item.mime })\"\n\t\t\t\t\t\t\talt=\"\">\n\t\t\t\t\t\t<FileOutline v-else :size=\"32\" />\n\t\t\t\t\t</td>\n\t\t\t\t\t<!-- A linked item is not a node of this folder, so it can only\n\t\t\t\t\t answer for name, size and modified. It still walks the same\n\t\t\t\t\t column list, or a declared column set would shift every\n\t\t\t\t\t linked row one cell out of line with its header. -->\n\t\t\t\t\t<td v-for=\"column in renderedColumns\"\n\t\t\t\t\t\t:key=\"column.key\"\n\t\t\t\t\t\t:class=\"`cn-files-browser__col-${column.key}`\">\n\t\t\t\t\t\t<template v-if=\"column.key === 'name'\">\n\t\t\t\t\t\t\t<span class=\"cn-files-browser__name\">{{ item.name }}</span>\n\t\t\t\t\t\t\t<span v-if=\"item.note\" class=\"cn-files-browser__note\">\n\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\tv-if=\"item.noteHref\"\n\t\t\t\t\t\t\t\t\t:href=\"item.noteHref\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-files-browser__note-link\"\n\t\t\t\t\t\t\t\t\t@click.stop>{{ item.note }}</a>\n\t\t\t\t\t\t\t\t<template v-else>{{ item.note }}</template>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<template v-else-if=\"column.key === 'size'\">\n\t\t\t\t\t\t\t{{ item.size ? formatSize(item.size) : '' }}\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<NcDateTime v-else-if=\"column.key === 'modified' && item.mtime\" :timestamp=\"item.mtime\" :ignoreSeconds=\"true\" />\n\t\t\t\t\t</td>\n\t\t\t\t\t<td class=\"cn-files-browser__col-actions\" @click.stop @auxclick.stop>\n\t\t\t\t\t\t<NcActions :forceMenu=\"true\" :ariaLabel=\"t('nextcloud-vue', 'Actions for {name}', { name: item.name })\">\n\t\t\t\t\t\t\t<NcActionLink\n\t\t\t\t\t\t\t\tv-if=\"item.href\"\n\t\t\t\t\t\t\t\t:href=\"item.href\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t\t\t\tdata-testid=\"cn-files-browser-linked-open\">\n\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t<OpenInNew :size=\"20\" />\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t{{ openLinkedLabel }}\n\t\t\t\t\t\t\t</NcActionLink>\n\t\t\t\t\t\t\t<NcActionLink\n\t\t\t\t\t\t\t\tv-if=\"item.downloadHref\"\n\t\t\t\t\t\t\t\t:href=\"item.downloadHref\"\n\t\t\t\t\t\t\t\t:download=\"item.name\"\n\t\t\t\t\t\t\t\t:closeAfterClick=\"true\"\n\t\t\t\t\t\t\t\tdata-testid=\"cn-files-browser-linked-download\">\n\t\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t\t<Download :size=\"20\" />\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t{{ downloadLabel }}\n\t\t\t\t\t\t\t</NcActionLink>\n\t\t\t\t\t\t</NcActions>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</tbody>\n\t\t</table>\n\n\t\t<NcDialog\n\t\t\tv-if=\"renaming !== null\"\n\t\t\t:name=\"renameLabel\"\n\t\t\tsize=\"small\"\n\t\t\tdata-testid=\"cn-files-browser-rename\"\n\t\t\t@closing=\"renaming = null\">\n\t\t\t<form class=\"cn-files-browser__new-folder\" @submit.prevent=\"rename\">\n\t\t\t\t<NcTextField\n\t\t\t\t\tv-model=\"renameName\"\n\t\t\t\t\t:label=\"t('nextcloud-vue', 'New name')\"\n\t\t\t\t\t:error=\"renameError !== ''\"\n\t\t\t\t\t:helperText=\"renameError\"\n\t\t\t\t\tdata-testid=\"cn-files-browser-rename-name\" />\n\t\t\t</form>\n\t\t\t<template #actions>\n\t\t\t\t<NcButton @click=\"renaming = null\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Cancel') }}\n\t\t\t\t</NcButton>\n\t\t\t\t<NcButton variant=\"primary\"\n\t\t\t\t\t:disabled=\"renameName.trim() === '' || renameName.trim() === renaming.basename\"\n\t\t\t\t\tdata-testid=\"cn-files-browser-rename-confirm\"\n\t\t\t\t\t@click=\"rename\">\n\t\t\t\t\t{{ renameLabel }}\n\t\t\t\t</NcButton>\n\t\t\t</template>\n\t\t</NcDialog>\n\n\t\t<NcDialog\n\t\t\tv-if=\"newFolderOpen\"\n\t\t\t:name=\"newFolderLabel\"\n\t\t\tsize=\"small\"\n\t\t\tdata-testid=\"cn-files-browser-new-folder\"\n\t\t\t@closing=\"newFolderOpen = false\">\n\t\t\t<form class=\"cn-files-browser__new-folder\" @submit.prevent=\"createFolder\">\n\t\t\t\t<NcTextField\n\t\t\t\t\tv-model=\"newFolderName\"\n\t\t\t\t\t:label=\"t('nextcloud-vue', 'Folder name')\"\n\t\t\t\t\t:error=\"newFolderError !== ''\"\n\t\t\t\t\t:helperText=\"newFolderError\"\n\t\t\t\t\tdata-testid=\"cn-files-browser-new-folder-name\" />\n\t\t\t</form>\n\t\t\t<template #actions>\n\t\t\t\t<NcButton @click=\"newFolderOpen = false\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Cancel') }}\n\t\t\t\t</NcButton>\n\t\t\t\t<NcButton variant=\"primary\"\n\t\t\t\t\t:disabled=\"newFolderName.trim() === ''\"\n\t\t\t\t\tdata-testid=\"cn-files-browser-new-folder-create\"\n\t\t\t\t\t@click=\"createFolder\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Create') }}\n\t\t\t\t</NcButton>\n\t\t\t</template>\n\t\t</NcDialog>\n\t</div>\n</template>\n\n<script>\nimport { getCurrentUser } from '@nextcloud/auth'\nimport axios from '@nextcloud/axios'\nimport { FileType, formatFileSize, getFileActions, getNewFileMenuEntries, sortNodes, View } from '@nextcloud/files'\nimport { getClient, getDefaultPropfind, getRemoteURL, getRootPath, resultToNode } from '@nextcloud/files/dav'\n/**\n * CnFilesBrowser — a folder of Nextcloud files, on any page, built from the\n * Files app's own primitives rather than a copy of its screen.\n *\n * WHAT IS BORROWED, AND FROM WHERE.\n *\n * - The rows are `@nextcloud/files` nodes read over WebDAV with the same\n * PROPFIND the Files app sends, so a node here carries what a node there\n * carries: id, mime, size, mtime, permissions, attributes.\n * - Each row's menu is `getFileActions()`: the actions the Files app and its\n * plugins registered on this page (download, delete, rename, favourite, move\n * and copy, sharing status, tags, lock, open in Files…). They are run with\n * the same context the Files app hands them, so a plugin's action does what\n * it does in the Files app. The host page has to load those scripts: it\n * dispatches `LoadAdditionalScriptsEvent` and asks for the Files app's `init`\n * script server-side. On a page that did not, the menu holds only Show in\n * Files, which is the honest fallback.\n * - The New menu is `getNewFileMenuEntries(folder)`: new folder, a template,\n * a file request, whatever the plugins offer for this folder, beside a plain\n * upload that PUTs over DAV.\n * - The crumbs are NcBreadcrumbs, the icons are the theme's own mime icons\n * through `OC.MimeType`, and image previews come from the core preview\n * endpoint.\n *\n * WHAT IS NOT. The Files app's list itself (its column filters, selection bar\n * and inline rename) is a Vue app bound to the Files router and its own stores,\n * and so is its details sidebar on Nextcloud 34. Neither can be mounted here.\n * The actions that need them are left out of the menu by name\n * (`ACTIONS_NEEDING_THE_FILES_PAGE`), and Show in Files opens the Files app on\n * the file for the rest.\n *\n * THE REGISTRY IS VERSIONED. `@nextcloud/files` keeps its registries under\n * `window._nc_files_scope.v4_0`; a page's plugins register into the copy the\n * server ships, and this component reads through its own bundled copy. Both\n * have to be the same major, which is why this library depends on 4.x: a 3.x\n * copy read `window._nc_fileactions`, which the server's plugins never write,\n * and saw nothing while the page held thirty actions.\n */\nimport { translate as t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport {\n\tNcActionButton,\n\tNcActionCheckbox,\n\tNcActionLink,\n\tNcActions,\n\tNcActionSeparator,\n\tNcBreadcrumb,\n\tNcBreadcrumbs,\n\tNcButton,\n\tNcDateTime,\n\tNcDialog,\n\tNcEmptyContent,\n\tNcIconSvgWrapper,\n\tNcLoadingIcon,\n\tNcProgressBar,\n\tNcTextField,\n} from '@nextcloud/vue'\nimport AlertCircleOutline from 'vue-material-design-icons/AlertCircleOutline.vue'\nimport ChevronDown from 'vue-material-design-icons/ChevronDown.vue'\nimport ChevronUp from 'vue-material-design-icons/ChevronUp.vue'\nimport Download from 'vue-material-design-icons/Download.vue'\nimport FileOutline from 'vue-material-design-icons/FileOutline.vue'\nimport FolderOutline from 'vue-material-design-icons/FolderOutline.vue'\nimport OpenInNew from 'vue-material-design-icons/OpenInNew.vue'\nimport Pencil from 'vue-material-design-icons/Pencil.vue'\nimport Plus from 'vue-material-design-icons/Plus.vue'\nimport Upload from 'vue-material-design-icons/Upload.vue'\nimport CnCellRenderer from '../CnCellRenderer/CnCellRenderer.vue'\nimport CnIcon from '../CnIcon/CnIcon.vue'\nimport { readUserPreference, writeUserPreference } from '../../composables/useUserPreferences.js'\nimport { dispatchAction } from '../../utils/actionsDispatcher.js'\nimport { isNewTabClick, isRowMiddleClick, preventMiddleClickAutoscroll } from '../../utils/rowAuxClick.js'\nimport { ACTIONS_NEEDING_THE_FILES_PAGE, crumbsFor, joinPath } from './filesBrowser.js'\nimport {\n\tattributePropertiesFor,\n\tfileColumnValue,\n\tnormaliseFileColumns,\n\tsortNodesByColumn,\n\tvisibleFileColumns,\n} from './filesBrowserColumns.js'\n\nlet uploadSeq = 0\n\n/** A folder glyph, the icon the Files app's View constructor requires. */\nconst VIEW_ICON = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M10 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z\"/></svg>'\n\nexport default {\n\tname: 'CnFilesBrowser',\n\n\tcomponents: {\n\t\tAlertCircleOutline,\n\t\tCnCellRenderer,\n\t\tCnIcon,\n\t\tDownload,\n\t\tFileOutline,\n\t\tFolderOutline,\n\t\tNcActionButton,\n\t\tNcActionCheckbox,\n\t\tNcActionLink,\n\t\tNcActionSeparator,\n\t\tNcActions,\n\t\tNcBreadcrumb,\n\t\tNcBreadcrumbs,\n\t\tNcButton,\n\t\tNcDateTime,\n\t\tNcDialog,\n\t\tNcEmptyContent,\n\t\tNcIconSvgWrapper,\n\t\tNcLoadingIcon,\n\t\tNcProgressBar,\n\t\tNcTextField,\n\t\tOpenInNew,\n\t\tPencil,\n\t\tPlus,\n\t\tUpload,\n\t},\n\n\tinject: {\n\t\t// The page's pre-bound action runner (CnPageRenderer provides it);\n\t\t// absent outside a page tree, in which case the bare dispatcher runs.\n\t\tcnDispatchAction: { default: null },\n\t},\n\n\tprops: {\n\t\t/**\n\t\t * The host's own actions on each file row, declared the way a\n\t\t * manifest declares any action (`open-modal`, `handler`, ...), and\n\t\t * dispatched through the page's action runner with the node's\n\t\t * `fileId`, `fileName` and `path` merged into an `open-modal` action's\n\t\t * props (or appended as the node to a `handler` action's args). Folders\n\t\t * get none. `icon` is an MDI icon name.\n\t\t *\n\t\t * @type {Array<{id: string, label: string, icon?: string, type?: string, target?: string, props?: object, handler?: string, args?: Array}>}\n\t\t */\n\t\trowActions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * The host's own entries in the New menu, after the ones the Files\n\t\t * app and its plugins register. Each is dispatched like a row action\n\t\t * (`type: 'open-modal' | 'handler' | …`) through the page's\n\t\t * `cnDispatchAction`, carrying the current folder rather than a row,\n\t\t * so a host can offer \"new from template\" or \"request a file from a\n\t\t * party\" here.\n\t\t *\n\t\t * @type {Array<{id: string, label: string, icon?: string, type?: string, target?: string, props?: object, handler?: string, args?: Array}>}\n\t\t */\n\t\tnewActions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * Rows that are not nodes of this folder: files the host joined from\n\t\t * another object's folder. Rendered after the folder's own rows with\n\t\t * open and download only. `note` (and its optional `noteHref`) says\n\t\t * where the file lives.\n\t\t *\n\t\t * @type {Array<{id: string|number, name: string, mime?: string, size?: number, mtime?: Date|number, href?: string, downloadHref?: string, note?: string, noteHref?: string}>}\n\t\t */\n\t\tlinkedItems: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * Label of a linked row's open action.\n\t\t */\n\t\topenLinkedLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Open'),\n\t\t},\n\n\t\t/**\n\t\t * Label of a linked row's download action.\n\t\t */\n\t\tdownloadLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Download'),\n\t\t},\n\n\t\t/**\n\t\t * The folder this browser is rooted at, relative to the current user's\n\t\t * files root (`/Open Registers/Cases/<uuid>`). The browser never\n\t\t * navigates above it. Resolve it with `resolveObjectFolder()` for an\n\t\t * OpenRegister object.\n\t\t */\n\t\trootPath: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\n\t\t/**\n\t\t * What the root crumb reads. Null shows the folder's own name, which\n\t\t * is what the Files app shows; pass a label when the folder on disk is\n\t\t * a uuid and the host knows a better name.\n\t\t */\n\t\trootLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Label of the New menu. */\n\t\tnewLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'New'),\n\t\t},\n\n\t\t/** Label of the upload entry in the New menu. */\n\t\tuploadLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Upload files'),\n\t\t},\n\n\t\t/** Label of the new-folder entry and its dialog. */\n\t\tnewFolderLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'New folder'),\n\t\t},\n\n\t\t/** Label of the rename action and its dialog. */\n\t\trenameLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Rename'),\n\t\t},\n\n\t\t/** Label of the link that opens the file in the Files app. */\n\t\tshowInFilesLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Show in Files'),\n\t\t},\n\n\t\t/** Title of the empty state. */\n\t\temptyLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'This folder is empty'),\n\t\t},\n\n\t\t/** Line under the empty state's title. */\n\t\temptyHint: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Drop files here, or use New'),\n\t\t},\n\n\t\t/** Label of the retry button on a failed listing. */\n\t\tretryLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Try again'),\n\t\t},\n\n\t\t/**\n\t\t * The columns this browser shows, in order. An entry is a built-in name\n\t\t * (`name`, `size`, `modified`, `owner`, `type`, `tags`) or an object\n\t\t * declaring its own: `{ key, label, source, attribute, formatter,\n\t\t * sortable }`, where `source` is `node` (a property of the node),\n\t\t * `attribute` (a DAV property, added to the PROPFIND before listing) or\n\t\t * `row` (a value from `rowData`).\n\t\t *\n\t\t * Declaring none keeps today's table: name, size and modified.\n\t\t *\n\t\t * This is the membership list. The Columns chooser lets a user hide any\n\t\t * of these; it never adds one, and a column removed from here is gone\n\t\t * for every user, whatever they had stored.\n\t\t *\n\t\t * @type {Array<string|object>}\n\t\t */\n\t\tcolumns: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * The host's own per-file data for `source: 'row'` columns, keyed by\n\t\t * file id. Either an object, or a function of the listed nodes called\n\t\t * once per folder so the host can fetch its projection in one request.\n\t\t *\n\t\t * @type {object | ((nodes: Array<object>) => (object|Promise<object>))}\n\t\t */\n\t\trowData: {\n\t\t\ttype: [Object, Function],\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * The app id the Columns chooser stores this user's choice under. Unset\n\t\t * means the chooser is not offered and every declared column renders.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tpreferenceApp: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * The key this browser's column choice is stored under, so two browsers\n\t\t * in one app remember separately.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tpreferenceKey: {\n\t\t\ttype: String,\n\t\t\tdefault: 'files-browser-columns',\n\t\t},\n\n\t\t/** Label of the toolbar's Columns chooser. */\n\t\tcolumnsLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Columns'),\n\t\t},\n\t},\n\n\temits: ['changed'],\n\n\tdata() {\n\t\treturn {\n\t\t\tcurrentPath: this.rootPath,\n\t\t\t/** The open folder as a node, or null before the first listing. */\n\t\t\tfolder: null,\n\t\t\t/** The open folder's children as nodes. */\n\t\t\tnodes: [],\n\t\t\tloading: false,\n\t\t\terror: '',\n\t\t\tsortKey: 'basename',\n\t\t\tsortAsc: true,\n\t\t\t/** The host's per-file data for `row` columns, by file id. */\n\t\t\tresolvedRowData: null,\n\t\t\t/**\n\t\t\t * The column keys this user chose to see, or null while they have\n\t\t\t * chosen nothing. Never a source of membership: it is intersected\n\t\t\t * with the host's declaration, never added to it.\n\t\t\t */\n\t\t\tvisibleColumnKeys: null,\n\t\t\tdragging: false,\n\t\t\tuploads: [],\n\t\t\tpreviewFailed: {},\n\t\t\tnewFolderOpen: false,\n\t\t\tnewFolderName: '',\n\t\t\tnewFolderError: '',\n\t\t\t/** The node being renamed, or null. */\n\t\t\trenaming: null,\n\t\t\trenameName: '',\n\t\t\trenameError: '',\n\t\t\tfileInputEl: null,\n\t\t\t/**\n\t\t\t * The view the Files app's actions are handed. They read `view.id`\n\t\t\t * to tell a trash bin or a share view from a plain folder; this is\n\t\t\t * a plain folder.\n\t\t\t */\n\t\t\tview: new View({\n\t\t\t\tid: 'files',\n\t\t\t\tname: t('nextcloud-vue', 'Files'),\n\t\t\t\t// The View constructor refuses anything but an SVG string here,\n\t\t\t\t// and throws from data(), which takes the whole tab down.\n\t\t\t\ticon: VIEW_ICON,\n\t\t\t\torder: 0,\n\t\t\t\tgetContents: async () => ({ folder: this.folder, contents: this.nodes }),\n\t\t\t}),\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * The breadcrumb trail from the root to the open folder.\n\t\t *\n\t\t * @return {Array<{name: string, path: string}>} The crumbs.\n\t\t */\n\t\tcrumbs() {\n\t\t\treturn crumbsFor(this.rootPath, this.currentPath, this.rootLabel)\n\t\t},\n\n\t\t/**\n\t\t * The children in the chosen order, folders first the way the Files app\n\t\t * lists them.\n\t\t *\n\t\t * @return {Array<object>} The nodes.\n\t\t */\n\t\tsorted() {\n\t\t\tconst column = this.activeSortColumn\n\t\t\tif (column && !column.sortKey) {\n\t\t\t\t// A declared column has no meaning to the Files app's sorter, so\n\t\t\t\t// it sorts here, within the folder that is listed.\n\t\t\t\treturn sortNodesByColumn(this.nodes, column, this.sortAsc, this.resolvedRowData, (node) => this.isFolder(node))\n\t\t\t}\n\t\t\treturn sortNodes(this.nodes, {\n\t\t\t\tsortingMode: this.sortKey,\n\t\t\t\tsortingOrder: this.sortAsc ? 'asc' : 'desc',\n\t\t\t\tsortFoldersFirst: true,\n\t\t\t\tsortFavoritesFirst: false,\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * The columns the host declared, resolved. This is the membership list:\n\t\t * a column exists because the host declared it, in the host's order.\n\t\t *\n\t\t * @return {Array<object>} The declared columns.\n\t\t * @spec openspec/changes/files-browser-columns/specs/files-browser/spec.md\n\t\t */\n\t\tdeclaredColumns() {\n\t\t\treturn normaliseFileColumns(this.columns)\n\t\t},\n\n\t\t/**\n\t\t * The library's own word for each built-in column, used when the host\n\t\t * did not write a label.\n\t\t *\n\t\t * @return {object} Labels by column key.\n\t\t */\n\t\tbuiltInColumnLabels() {\n\t\t\treturn {\n\t\t\t\tname: t('nextcloud-vue', 'Name'),\n\t\t\t\tsize: t('nextcloud-vue', 'Size'),\n\t\t\t\tmodified: t('nextcloud-vue', 'Modified'),\n\t\t\t\towner: t('nextcloud-vue', 'Owner'),\n\t\t\t\ttype: t('nextcloud-vue', 'Type'),\n\t\t\t\ttags: t('nextcloud-vue', 'Tags'),\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * The columns this browser renders: the host's declaration narrowed by\n\t\t * what this user chose to see.\n\t\t *\n\t\t * The user's stored choice only ever takes columns away. It is applied\n\t\t * by walking the declaration, so a key the host no longer declares is\n\t\t * passed over rather than rendered, and a preference written when a\n\t\t * different set was declared cannot bring an old column back.\n\t\t *\n\t\t * @return {Array<object>} The columns to render.\n\t\t * @spec openspec/changes/files-browser-columns/specs/files-browser/spec.md\n\t\t */\n\t\trenderedColumns() {\n\t\t\treturn visibleFileColumns(this.declaredColumns, this.visibleColumnKeys)\n\t\t},\n\n\t\t/**\n\t\t * The column the table is currently sorted on, or null when the sort\n\t\t * key belongs to no declared column.\n\t\t *\n\t\t * @return {(object|null)} The active column.\n\t\t */\n\t\tactiveSortColumn() {\n\t\t\treturn this.declaredColumns.find((column) => this.sortTokenOf(column) === this.sortKey) || null\n\t\t},\n\n\t\t/**\n\t\t * Whether the Columns chooser is offered: only when the host said where\n\t\t * to store the answer, because a chooser that forgets is worse than no\n\t\t * chooser.\n\t\t *\n\t\t * @return {boolean} True when the chooser renders.\n\t\t */\n\t\tcolumnsChooserEnabled() {\n\t\t\treturn this.preferenceApp !== '' && this.declaredColumns.length > 0\n\t\t},\n\n\t\t/**\n\t\t * What the Files app and its plugins offer to create in this folder.\n\t\t *\n\t\t * Read at render, not cached: a plugin's script may register its entry\n\t\t * after this component mounted.\n\t\t *\n\t\t * @return {Array<object>} The entries, in the plugins' order.\n\t\t */\n\t\tnewMenuEntries() {\n\t\t\tif (this.folder === null) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn getNewFileMenuEntries(this.folder)\n\t\t\t\t\t.filter((entry) => typeof entry.handler === 'function')\n\t\t\t\t\t.sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\n\t\t\t} catch {\n\t\t\t\treturn []\n\t\t\t}\n\t\t},\n\t},\n\n\twatch: {\n\t\trootPath(next) {\n\t\t\tthis.currentPath = next\n\t\t\tthis.refresh()\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.loadColumnChoice()\n\t\tthis.refresh()\n\t},\n\n\tmethods: {\n\t\tt,\n\n\t\tpreventMiddleClickAutoscroll,\n\n\t\t/**\n\t\t * Hold the file input element from its function ref.\n\t\t *\n\t\t * @param {HTMLInputElement|null} el The element.\n\t\t * @return {void}\n\t\t */\n\t\tfileInputRef(el) {\n\t\t\tthis.fileInputEl = el || null\n\t\t},\n\n\t\t/**\n\t\t * The DAV path of a user-relative path.\n\t\t *\n\t\t * @param {string} path The user-relative path.\n\t\t * @return {string} The path under the DAV files root.\n\t\t */\n\t\tdavPath(path) {\n\t\t\treturn `${getRootPath()}${path}`\n\t\t},\n\n\t\t/**\n\t\t * List the open folder over DAV, with the same PROPFIND the Files app sends.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync refresh() {\n\t\t\tthis.loading = true\n\t\t\tthis.error = ''\n\t\t\ttry {\n\t\t\t\tconst client = getClient()\n\t\t\t\tconst { data } = await client.getDirectoryContents(this.davPath(this.currentPath), {\n\t\t\t\t\tdetails: true,\n\t\t\t\t\tdata: this.propfindBody(),\n\t\t\t\t\tincludeSelf: true,\n\t\t\t\t})\n\t\t\t\tconst stats = Array.isArray(data) ? data : []\n\t\t\t\tconst nodes = stats.map((stat) => resultToNode(stat))\n\t\t\t\tconst self = nodes.find((node) => node.path === this.currentPath) || nodes[0] || null\n\t\t\t\tthis.folder = self\n\t\t\t\tthis.nodes = nodes.filter((node) => node !== self)\n\t\t\t\t// One call per folder, not one per file: the host's projection\n\t\t\t\t// is asked for the whole listing at once.\n\t\t\t\tawait this.resolveRowData(this.nodes)\n\t\t\t} catch (err) {\n\t\t\t\tconst status = err?.response?.status ?? err?.status\n\t\t\t\tthis.error = status === 404\n\t\t\t\t\t? t('nextcloud-vue', 'This folder no longer exists')\n\t\t\t\t\t: (status === 403 ? t('nextcloud-vue', 'You cannot see this folder') : t('nextcloud-vue', 'The folder could not be read'))\n\t\t\t\tthis.folder = null\n\t\t\t\tthis.nodes = []\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Open a folder below the root.\n\t\t *\n\t\t * @param {string} path The user-relative path.\n\t\t * @return {void}\n\t\t */\n\t\tnavigate(path) {\n\t\t\tconst root = this.rootPath.replace(/\\/+$/, '') || '/'\n\t\t\tif (path !== root && !path.startsWith(root === '/' ? '/' : `${root}/`)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.currentPath = path\n\t\t\tthis.refresh()\n\t\t},\n\n\t\t/**\n\t\t * Whether a node is a folder.\n\t\t *\n\t\t * @param {object} node The node.\n\t\t * @return {boolean} true for a folder.\n\t\t */\n\t\tisFolder(node) {\n\t\t\treturn node.type === FileType.Folder\n\t\t},\n\n\t\t/**\n\t\t * A row was clicked: enter a folder, or open a file the way the Files\n\t\t * app would (its `view` action, which hands over to the Viewer).\n\t\t *\n\t\t * @param {object} node The node.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync open(node) {\n\t\t\tif (this.isFolder(node)) {\n\t\t\t\tthis.navigate(node.path)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst view = this.actionsFor(node).find((action) => action.id === 'view')\n\t\t\tif (view) {\n\t\t\t\tawait this.run(view, node)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (node.fileid) {\n\t\t\t\twindow.open(this.permalink(node), '_blank', 'noopener,noreferrer')\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Row click: a ctrl/cmd/shift click opens the node's permalink in a new\n\t\t * tab, like a link would; a plain click opens it in place (`open`).\n\t\t *\n\t\t * @param {object} node The node.\n\t\t * @param {MouseEvent} [event] The click event.\n\t\t * @return {void}\n\t\t */\n\t\tonRowClick(node, event) {\n\t\t\tif (isNewTabClick(event)) {\n\t\t\t\tthis.openInNewTab(node)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.open(node)\n\t\t},\n\n\t\t/**\n\t\t * Row middle click: open the node's permalink in a new tab.\n\t\t *\n\t\t * @param {object} node The node.\n\t\t * @param {MouseEvent} event The auxclick event.\n\t\t * @return {void}\n\t\t */\n\t\tonRowAuxClick(node, event) {\n\t\t\tif (isRowMiddleClick(event)) {\n\t\t\t\tthis.openInNewTab(node)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Open a node's permalink (a file or a folder in the Files app) in a new tab.\n\t\t *\n\t\t * @param {object} node The node.\n\t\t * @return {void}\n\t\t */\n\t\topenInNewTab(node) {\n\t\t\tif (node.fileid) {\n\t\t\t\twindow.open(this.permalink(node), '_blank', 'noopener,noreferrer')\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * The action context the Files app hands its actions for one node.\n\t\t *\n\t\t * @param {object} node The node.\n\t\t * @return {object} The context.\n\t\t */\n\t\tcontextFor(node) {\n\t\t\treturn { nodes: [node], view: this.view, folder: this.folder, contents: this.nodes }\n\t\t},\n\n\t\t/**\n\t\t * The registered actions that apply to a node, in the Files app's order.\n\t\t *\n\t\t * Inline actions (a sharing badge, an unread-comments dot) are status\n\t\t * marks the Files app paints beside the name, not menu items; a\n\t\t * sub-action lives under its parent's own menu; and the actions that\n\t\t * need the Files page are named in `ACTIONS_NEEDING_THE_FILES_PAGE`.\n\t\t *\n\t\t * @param {object} node The node.\n\t\t * @return {Array<object>} The actions.\n\t\t */\n\t\tactionsFor(node) {\n\t\t\tlet actions\n\t\t\ttry {\n\t\t\t\tactions = getFileActions()\n\t\t\t} catch {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst context = this.contextFor(node)\n\t\t\treturn actions\n\t\t\t\t.filter((action) => !action.parent && !ACTIONS_NEEDING_THE_FILES_PAGE.includes(action.id))\n\t\t\t\t.filter((action) => typeof action.inline !== 'function' || action.inline(context) !== true)\n\t\t\t\t.filter((action) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn typeof action.enabled !== 'function' || action.enabled(context) === true\n\t\t\t\t\t} catch {\n\t\t\t\t\t\treturn false\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\n\t\t},\n\n\t\t/**\n\t\t * An action's label for a node, in the words the Files app uses.\n\t\t *\n\t\t * @param {object} action The action.\n\t\t * @param {object} node The node.\n\t\t * @return {string} The label.\n\t\t */\n\t\tlabelOf(action, node) {\n\t\t\ttry {\n\t\t\t\treturn action.displayName(this.contextFor(node))\n\t\t\t} catch {\n\t\t\t\treturn action.id\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * An action's icon for a node, as inline SVG.\n\t\t *\n\t\t * @param {object} action The action.\n\t\t * @param {object} node The node.\n\t\t * @return {string} The SVG, or the empty string.\n\t\t */\n\t\ticonOf(action, node) {\n\t\t\ttry {\n\t\t\t\treturn action.iconSvgInline(this.contextFor(node)) || ''\n\t\t\t} catch {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Run a registered action on a node, then re-read the folder: most of\n\t\t * them change it (a delete, a rename, a move), and the ones that do\n\t\t * not cost one PROPFIND.\n\t\t *\n\t\t * @param {object} action The action.\n\t\t * @param {object} node The node.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync run(action, node) {\n\t\t\ttry {\n\t\t\t\tconst result = await action.exec(this.contextFor(node))\n\t\t\t\tif (result === false) {\n\t\t\t\t\tconst { showError } = await import('@nextcloud/dialogs')\n\t\t\t\t\tshowError(t('nextcloud-vue', '{action} did not succeed', { action: this.labelOf(action, node) }))\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconst { showError } = await import('@nextcloud/dialogs')\n\t\t\t\tshowError(err?.message || t('nextcloud-vue', '{action} did not succeed', { action: this.labelOf(action, node) }))\n\t\t\t}\n\t\t\tawait this.refresh()\n\t\t\t/**\n\t\t\t * @event changed The folder's contents changed through this browser:\n\t\t\t * an upload, a new folder, or an action that ran.\n\t\t\t */\n\t\t\tthis.$emit('changed')\n\t\t},\n\n\t\t/**\n\t\t * Run a New menu entry the Files app or a plugin registered, then re-read.\n\t\t *\n\t\t * The `newFolder` entry the Files app registers opens its own inline\n\t\t * rename in the Files list, which is not here, so that one is answered\n\t\t * by this component's dialog instead.\n\t\t *\n\t\t * @param {object} entry The entry.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync runNewEntry(entry) {\n\t\t\tif (entry.id === 'newFolder') {\n\t\t\t\tthis.askNewFolder()\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait entry.handler(this.folder, this.nodes)\n\t\t\t} catch (err) {\n\t\t\t\tconst { showError } = await import('@nextcloud/dialogs')\n\t\t\t\tshowError(err?.message || t('nextcloud-vue', '{action} did not succeed', { action: entry.displayName }))\n\t\t\t}\n\t\t\tawait this.refresh()\n\t\t\tthis.$emit('changed')\n\t\t},\n\n\t\t/**\n\t\t * Open the new-folder dialog.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\taskNewFolder() {\n\t\t\tthis.newFolderName = ''\n\t\t\tthis.newFolderError = ''\n\t\t\tthis.newFolderOpen = true\n\t\t},\n\n\t\t/**\n\t\t * Create the folder named in the dialog, over DAV.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync createFolder() {\n\t\t\tconst name = this.newFolderName.trim()\n\t\t\tif (name === '') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (this.nodes.some((node) => node.basename === name)) {\n\t\t\t\tthis.newFolderError = t('nextcloud-vue', 'A file or folder with that name is already here')\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait getClient().createDirectory(this.davPath(joinPath(this.currentPath, name)))\n\t\t\t\tthis.newFolderOpen = false\n\t\t\t\tawait this.refresh()\n\t\t\t\tthis.$emit('changed')\n\t\t\t} catch (err) {\n\t\t\t\tthis.newFolderError = err?.message || t('nextcloud-vue', 'The folder could not be created')\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Open the rename dialog on a node.\n\t\t *\n\t\t * @param {object} node The node.\n\t\t * @return {void}\n\t\t */\n\t\taskRename(node) {\n\t\t\tthis.renaming = node\n\t\t\tthis.renameName = node.basename\n\t\t\tthis.renameError = ''\n\t\t},\n\n\t\t/**\n\t\t * Rename the node named in the dialog, as a DAV move within its folder.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync rename() {\n\t\t\tconst node = this.renaming\n\t\t\tconst name = this.renameName.trim()\n\t\t\tif (node === null || name === '' || name === node.basename) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (name.includes('/')) {\n\t\t\t\tthis.renameError = t('nextcloud-vue', 'A name cannot contain a slash')\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (this.nodes.some((other) => other !== node && other.basename === name)) {\n\t\t\t\tthis.renameError = t('nextcloud-vue', 'A file or folder with that name is already here')\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait getClient().moveFile(this.davPath(node.path), this.davPath(joinPath(this.currentPath, name)))\n\t\t\t\tthis.renaming = null\n\t\t\t\tawait this.refresh()\n\t\t\t\tthis.$emit('changed')\n\t\t\t} catch (err) {\n\t\t\t\tthis.renameError = err?.message || t('nextcloud-vue', 'The name could not be changed')\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Open the file picker.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tpickFiles() {\n\t\t\tthis.fileInputEl?.click()\n\t\t},\n\n\t\t/**\n\t\t * Files were picked.\n\t\t *\n\t\t * @param {Event} event The change event.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync onFilesPicked(event) {\n\t\t\tconst files = event.target?.files\n\t\t\tif (files?.length) {\n\t\t\t\tawait this.uploadFiles(files)\n\t\t\t}\n\t\t\tif (this.fileInputEl) {\n\t\t\t\tthis.fileInputEl.value = ''\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Files were dropped.\n\t\t *\n\t\t * @param {DragEvent} event The drop.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync onDrop(event) {\n\t\t\tthis.dragging = false\n\t\t\tconst files = event.dataTransfer?.files\n\t\t\tif (files?.length) {\n\t\t\t\tawait this.uploadFiles(files)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * PUT each file into the open folder over DAV, with a progress row\n\t\t * each, then re-read the folder once.\n\t\t *\n\t\t * @param {FileList|File[]} files The files.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync uploadFiles(files) {\n\t\t\tif (this.folder === null) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// A PUT through axios rather than the DAV client: the client's\n\t\t\t// putFileContents refuses a browser File (\"Cannot calculate data\n\t\t\t// length\"), and fetch reports no upload progress anyway. axios\n\t\t\t// carries the session and the request token, and its XHR reports\n\t\t\t// progress per file. If-None-Match: * refuses to overwrite.\n\t\t\tconst batch = [...files].map((file) => ({ key: `u${++uploadSeq}`, name: file.name, progress: 0, error: '', file }))\n\t\t\tthis.uploads = [...this.uploads, ...batch]\n\t\t\tfor (const upload of batch) {\n\t\t\t\ttry {\n\t\t\t\t\tawait axios.put(`${getRemoteURL()}${this.davPath(joinPath(this.currentPath, upload.name))}`, upload.file, {\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t'Content-Type': upload.file.type || 'application/octet-stream',\n\t\t\t\t\t\t\t'If-None-Match': '*',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonUploadProgress: (progress) => {\n\t\t\t\t\t\t\tif (progress?.total) {\n\t\t\t\t\t\t\t\tupload.progress = Math.round((progress.loaded / progress.total) * 100)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\tupload.progress = 100\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconst status = err?.response?.status ?? err?.status\n\t\t\t\t\tupload.error = status === 412\n\t\t\t\t\t\t? t('nextcloud-vue', 'A file with that name is already here')\n\t\t\t\t\t\t: (err?.message || t('nextcloud-vue', 'The upload failed'))\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait this.refresh()\n\t\t\tthis.$emit('changed')\n\t\t\t// Finished rows leave the list; failed ones stay with their reason.\n\t\t\twindow.setTimeout(() => {\n\t\t\t\tthis.uploads = this.uploads.filter((upload) => upload.error !== '' || batch.every((b) => b.key !== upload.key))\n\t\t\t}, 1500)\n\t\t},\n\n\t\t/**\n\t\t * Change the sort column, or flip the order on the same one.\n\t\t *\n\t\t * @param {string} key `basename`, `size` or `mtime`.\n\t\t * @return {void}\n\t\t */\n\t\t/**\n\t\t * The PROPFIND this browser sends: the Files app's own body, plus one\n\t\t * `<prop>` for every DAV property a declared `attribute` column reads,\n\t\t * so that value is on the node when the folder lists rather than one\n\t\t * request later.\n\t\t *\n\t\t * @return {string} The PROPFIND body.\n\t\t * @spec openspec/changes/files-browser-columns/specs/files-browser/spec.md\n\t\t */\n\t\tpropfindBody() {\n\t\t\tconst base = getDefaultPropfind()\n\t\t\tconst extra = attributePropertiesFor(this.declaredColumns)\n\t\t\tif (extra.length === 0) {\n\t\t\t\treturn base\n\t\t\t}\n\t\t\tconst props = extra.map((name) => {\n\t\t\t\tconst match = /^\\{(.+)\\}(.+)$/.exec(name)\n\t\t\t\tif (!match) {\n\t\t\t\t\treturn `<d:${name} />`\n\t\t\t\t}\n\t\t\t\treturn `<x-cn:${match[2]} xmlns:x-cn=\"${match[1]}\" />`\n\t\t\t}).join('')\n\t\t\t// Spliced into the existing <d:prop> rather than appended after it:\n\t\t\t// a second <d:prop> block is not a PROPFIND any server answers.\n\t\t\treturn base.includes('</d:prop>')\n\t\t\t\t? base.replace('</d:prop>', `${props}</d:prop>`)\n\t\t\t\t: base\n\t\t},\n\n\t\t/**\n\t\t * The token a column sorts under: the Files app's own sorting mode for\n\t\t * a built-in, the column key for anything else.\n\t\t *\n\t\t * @param {object} column A resolved column.\n\t\t * @return {string} The sort token.\n\t\t */\n\t\tsortTokenOf(column) {\n\t\t\treturn (column && (column.sortKey || column.key)) || ''\n\t\t},\n\n\t\t/**\n\t\t * The label a column's header shows: what the host wrote, else the\n\t\t * library's own word for a built-in, else the key.\n\t\t *\n\t\t * @param {object} column A resolved column.\n\t\t * @return {string} The header text.\n\t\t */\n\t\tcolumnLabel(column) {\n\t\t\tif (column && typeof column.label === 'string' && column.label !== '') {\n\t\t\t\treturn column.label\n\t\t\t}\n\t\t\treturn this.builtInColumnLabels[column && column.key] || (column && column.key) || ''\n\t\t},\n\n\t\t/**\n\t\t * One cell's value.\n\t\t *\n\t\t * @param {object} column A resolved column.\n\t\t * @param {object} node The node.\n\t\t * @return {(Array|object|string|number|boolean|undefined)} The value.\n\t\t */\n\t\tcellValue(column, node) {\n\t\t\treturn fileColumnValue(column, node, this.resolvedRowData)\n\t\t},\n\n\t\t/**\n\t\t * Whether a user currently sees a column, for the chooser's ticks.\n\t\t *\n\t\t * @param {object} column A resolved column.\n\t\t * @return {boolean} True when it renders.\n\t\t */\n\t\tisColumnVisible(column) {\n\t\t\treturn this.renderedColumns.some((c) => c.key === column.key)\n\t\t},\n\n\t\t/**\n\t\t * Tick or untick a column for this user and remember it.\n\t\t *\n\t\t * The stored value is always rebuilt from the host's declaration, never\n\t\t * from the previous stored value, so a key the host has since dropped\n\t\t * cannot survive a toggle and reappear later.\n\t\t *\n\t\t * @param {object} column The column being toggled.\n\t\t * @return {void}\n\t\t * @spec openspec/changes/files-browser-columns/specs/files-browser/spec.md\n\t\t */\n\t\ttoggleColumn(column) {\n\t\t\tconst next = this.declaredColumns\n\t\t\t\t.filter((c) => (c.key === column.key ? !this.isColumnVisible(c) : this.isColumnVisible(c)))\n\t\t\t\t.map((c) => c.key)\n\t\t\tthis.visibleColumnKeys = next\n\t\t\tthis.saveColumnChoice(next)\n\t\t},\n\n\t\t/**\n\t\t * Read this user's column choice. A stored key the host no longer\n\t\t * declares is dropped on the way in as well as on the way out, so the\n\t\t * chooser never lists a column that cannot render.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync loadColumnChoice() {\n\t\t\tif (!this.columnsChooserEnabled) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst stored = await readUserPreference(this.preferenceApp, this.preferenceKey, null)\n\t\t\tif (!Array.isArray(stored)) {\n\t\t\t\tthis.visibleColumnKeys = null\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst declared = new Set(this.declaredColumns.map((c) => c.key))\n\t\t\tthis.visibleColumnKeys = stored.filter((key) => declared.has(key))\n\t\t},\n\n\t\t/**\n\t\t * Store this user's column choice.\n\t\t *\n\t\t * @param {string[]} keys The visible column keys.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync saveColumnChoice(keys) {\n\t\t\tif (!this.columnsChooserEnabled) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tawait writeUserPreference(this.preferenceApp, this.preferenceKey, keys)\n\t\t},\n\n\t\t/**\n\t\t * Resolve the host's per-file data for this folder's nodes. Called once\n\t\t * per listing, so a projection of ninety files is one request.\n\t\t *\n\t\t * @param {Array<object>} nodes The listed nodes.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync resolveRowData(nodes) {\n\t\t\tif (this.rowData === null || this.rowData === undefined) {\n\t\t\t\tthis.resolvedRowData = null\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (typeof this.rowData !== 'function') {\n\t\t\t\tthis.resolvedRowData = this.rowData\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tthis.resolvedRowData = await this.rowData(nodes)\n\t\t\t} catch {\n\t\t\t\t// A projection that could not be fetched leaves those cells\n\t\t\t\t// empty. It is not a reason to say the folder failed to list:\n\t\t\t\t// the files are there and the host's extra columns are not.\n\t\t\t\tthis.resolvedRowData = null\n\t\t\t}\n\t\t},\n\n\t\tsortBy(key) {\n\t\t\tif (this.sortKey === key) {\n\t\t\t\tthis.sortAsc = !this.sortAsc\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.sortKey = key\n\t\t\t// Size and modified read most usefully largest and newest first;\n\t\t\t// everything else, including every declared column, starts at A.\n\t\t\tthis.sortAsc = key !== 'size' && key !== 'mtime'\n\t\t},\n\n\t\t/**\n\t\t * The `aria-sort` value for a column header.\n\t\t *\n\t\t * @param {string} key The column's sort key.\n\t\t * @return {string|null} `ascending`, `descending` or null.\n\t\t */\n\t\tariaSort(key) {\n\t\t\tif (this.sortKey !== key) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.sortAsc ? 'ascending' : 'descending'\n\t\t},\n\n\t\t/**\n\t\t * The arrow beside the sorted column's name.\n\t\t *\n\t\t * @param {string} key The column's sort key.\n\t\t * @return {object} The icon component.\n\t\t */\n\t\tsortIcon(key) {\n\t\t\treturn this.sortKey === key && !this.sortAsc ? ChevronDown : ChevronUp\n\t\t},\n\n\t\t/**\n\t\t * A file's size the way the Files app prints it.\n\t\t *\n\t\t * @param {number|undefined} size The size in bytes.\n\t\t * @return {string} The size, or the empty string.\n\t\t */\n\t\tformatSize(size) {\n\t\t\treturn typeof size === 'number' ? formatFileSize(size, true) : ''\n\t\t},\n\n\t\t/**\n\t\t * The theme's own icon for a node's mime type, or null off Nextcloud.\n\t\t *\n\t\t * @param {object} node The node.\n\t\t * @return {string|null} The icon url.\n\t\t */\n\t\tmimeIconFor(node) {\n\t\t\tconst getIconUrl = typeof window !== 'undefined' ? window.OC?.MimeType?.getIconUrl : null\n\t\t\tif (typeof getIconUrl !== 'function') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn getIconUrl(this.isFolder(node) ? 'dir' : (node.mime || '')) || null\n\t\t\t} catch {\n\t\t\t\treturn null\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * A small preview for a raster image, from the core preview endpoint.\n\t\t *\n\t\t * @param {object} node The node.\n\t\t * @return {string|null} The url, or null.\n\t\t */\n\t\tpreviewUrlFor(node) {\n\t\t\tconst mime = node.mime || ''\n\t\t\tif (!node.fileid || this.isFolder(node) || !/^image\\//i.test(mime) || /svg/i.test(mime) || this.previewFailed[node.fileid]) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn generateUrl('/core/preview?fileId={fileId}&x=64&y=64&a=1', { fileId: node.fileid })\n\t\t},\n\n\t\t/**\n\t\t * Remember a preview that did not load.\n\t\t *\n\t\t * @param {object} node The node.\n\t\t * @return {void}\n\t\t */\n\t\tonPreviewError(node) {\n\t\t\tthis.previewFailed = { ...this.previewFailed, [node.fileid]: true }\n\t\t},\n\n\t\t/**\n\t\t * The Files app opened on a folder, for the crumbs above the root.\n\t\t *\n\t\t * @param {string} path The user-relative folder path.\n\t\t * @return {string} The url.\n\t\t */\n\t\tfilesAppUrl(path) {\n\t\t\treturn generateUrl('/apps/files/files?dir={dir}', { dir: path })\n\t\t},\n\n\t\t/**\n\t\t * The Files app's permalink for a node.\n\t\t *\n\t\t * @param {object} node The node.\n\t\t * @return {string} The url.\n\t\t */\n\t\tpermalink(node) {\n\t\t\treturn generateUrl('/f/{fileid}', { fileid: node.fileid })\n\t\t},\n\n\t\t/**\n\t\t * Run one of the host's declared actions on a file.\n\t\t *\n\t\t * An `open-modal` action gets the node merged onto its props as\n\t\t * `fileId`, `fileName` and `path`, the same way a widget's row action\n\t\t * hands a modal its row; a `handler` action gets the node appended to\n\t\t * its args. Everything else is dispatched as declared.\n\t\t *\n\t\t * @param {object} action The declared action.\n\t\t * @param {object} node The file it was clicked on.\n\t\t * @return {void}\n\t\t */\n\t\trunHostAction(action, node) {\n\t\t\tif (!action || typeof action !== 'object') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst type = action.type || 'handler'\n\t\t\tlet wrapped = action\n\t\t\t// A New-menu entry carries no row, only the folder it was opened in.\n\t\t\tconst context = node === null\n\t\t\t\t? { path: this.currentPath }\n\t\t\t\t: { fileId: node.fileid, fileName: node.basename, path: node.path }\n\t\t\tif (type === 'open-modal') {\n\t\t\t\twrapped = { ...action, props: { ...(action.props || {}), ...context } }\n\t\t\t} else if (type === 'handler') {\n\t\t\t\twrapped = { ...action, args: [...(action.args || []), node ?? this.folder] }\n\t\t\t}\n\t\t\tif (typeof this.cnDispatchAction === 'function') {\n\t\t\t\tthis.cnDispatchAction(wrapped)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tdispatchAction(wrapped, { router: this.$router || null })\n\t\t},\n\n\t\t/**\n\t\t * A click on a linked row opens the file where it lives.\n\t\t *\n\t\t * @param {object} item The linked item.\n\t\t * @return {void}\n\t\t */\n\t\topenLinked(item) {\n\t\t\tif (item.href && typeof window !== 'undefined') {\n\t\t\t\twindow.open(item.href, '_blank', 'noopener')\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * A middle click on a linked row opens it like a click does.\n\t\t *\n\t\t * @param {object} item The linked item.\n\t\t * @param {MouseEvent} event The auxclick event.\n\t\t * @return {void}\n\t\t */\n\t\tonLinkedAuxClick(item, event) {\n\t\t\tif (isRowMiddleClick(event)) {\n\t\t\t\tthis.openLinked(item)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * The current user's id, for callers resolving a root path.\n\t\t *\n\t\t * @return {string} The uid, or the empty string.\n\t\t */\n\t\tcurrentUid() {\n\t\t\treturn getCurrentUser()?.uid || ''\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-files-browser {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n\tmin-width: 0;\n\tborder-radius: var(--border-radius-large, 8px);\n}\n\n.cn-files-browser--dragging {\n\toutline: 2px dashed var(--color-primary-element);\n\toutline-offset: 4px;\n}\n\n.cn-files-browser__bar {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tgap: 8px;\n\tmin-width: 0;\n}\n\n.cn-files-browser__crumbs {\n\tmin-width: 0;\n\tflex: 1 1 auto;\n}\n\n.cn-files-browser__file-input {\n\tdisplay: none;\n}\n\n.cn-files-browser__uploads {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n}\n\n.cn-files-browser__upload {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n}\n\n.cn-files-browser__upload-name {\n\tfont-size: 13px;\n}\n\n.cn-files-browser__upload-error {\n\tcolor: var(--color-error);\n\tfont-size: 13px;\n}\n\n.cn-files-browser__loading {\n\tpadding: 24px 0;\n}\n\n.cn-files-browser__table {\n\twidth: 100%;\n\tborder-collapse: collapse;\n\ttable-layout: fixed;\n}\n\n.cn-files-browser__table th {\n\ttext-align: start;\n\tfont-weight: normal;\n\tcolor: var(--color-text-maxcontrast);\n\tpadding: 4px 8px;\n\tborder-bottom: 1px solid var(--color-border);\n}\n\n.cn-files-browser__sort {\n\tbackground: none;\n\tborder: none;\n\tpadding: 0;\n\tfont: inherit;\n\tcolor: inherit;\n\tcursor: pointer;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 2px;\n}\n\n.cn-files-browser__sort:hover,\n.cn-files-browser__sort:focus-visible {\n\tcolor: var(--color-main-text);\n}\n\n.cn-files-browser__row {\n\tcursor: pointer;\n}\n\n.cn-files-browser__row:hover,\n.cn-files-browser__row:focus-within {\n\tbackground-color: var(--color-background-hover);\n}\n\n.cn-files-browser__table td {\n\tpadding: 4px 8px;\n\tborder-bottom: 1px solid var(--color-border);\n\tvertical-align: middle;\n}\n\n.cn-files-browser__col-icon {\n\twidth: 48px;\n}\n\n.cn-files-browser__col-size {\n\twidth: 96px;\n\twhite-space: nowrap;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-files-browser__col-mtime {\n\twidth: 140px;\n\twhite-space: nowrap;\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-files-browser__col-actions {\n\twidth: 48px;\n}\n\n.cn-files-browser__col-name {\n\tmin-width: 0;\n}\n\n.cn-files-browser__name {\n\tdisplay: block;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n.cn-files-browser__row--linked {\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-files-browser__note {\n\tcolor: var(--color-text-maxcontrast);\n\tdisplay: block;\n\tfont-size: var(--font-size-small, 13px);\n}\n\n.cn-files-browser__note-link {\n\tcolor: inherit;\n\ttext-decoration: underline;\n}\n\n.cn-files-browser__row--folder .cn-files-browser__name {\n\tfont-weight: 600;\n}\n\n.cn-files-browser__mime,\n.cn-files-browser__thumb {\n\twidth: 32px;\n\theight: 32px;\n\tdisplay: block;\n}\n\n.cn-files-browser__thumb {\n\tobject-fit: cover;\n\tborder-radius: var(--border-radius, 4px);\n}\n\n.cn-files-browser__new-folder {\n\tpadding: 8px 0;\n}\n\n.hidden-visually {\n\tposition: absolute;\n\twidth: 1px;\n\theight: 1px;\n\toverflow: hidden;\n\tclip-path: inset(50%);\n\twhite-space: nowrap;\n}\n</style>\n"],"names":["CnCellRenderer","CnIcon","t","axios"],"mappings":"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"}
|
|
@@ -79,10 +79,10 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
79
79
|
return (openBlock(), createElementBlock("div", {
|
|
80
80
|
class: normalizeClass(["cn-files-browser", { 'cn-files-browser--dragging': $data.dragging }]),
|
|
81
81
|
"data-testid": "cn-files-browser",
|
|
82
|
-
onDragenter: _cache[
|
|
83
|
-
onDragover: _cache[
|
|
84
|
-
onDragleave: _cache[
|
|
85
|
-
onDrop: _cache[
|
|
82
|
+
onDragenter: _cache[16] || (_cache[16] = withModifiers($event => ($data.dragging = true), ["prevent"])),
|
|
83
|
+
onDragover: _cache[17] || (_cache[17] = withModifiers($event => ($data.dragging = true), ["prevent"])),
|
|
84
|
+
onDragleave: _cache[18] || (_cache[18] = withModifiers($event => ($data.dragging = false), ["prevent"])),
|
|
85
|
+
onDrop: _cache[19] || (_cache[19] = withModifiers((...args) => ($options.onDrop && $options.onDrop(...args)), ["prevent"]))
|
|
86
86
|
}, [
|
|
87
87
|
createElementVNode("div", _hoisted_1, [
|
|
88
88
|
createVNode(_component_NcBreadcrumbs, { class: "cn-files-browser__crumbs" }, {
|
|
@@ -316,6 +316,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
316
316
|
"data-testid": "cn-files-browser-row",
|
|
317
317
|
"data-name": node.basename,
|
|
318
318
|
onClick: $event => ($options.onRowClick(node, $event)),
|
|
319
|
+
onMousedown: _cache[3] || (_cache[3] = (...args) => ($options.preventMiddleClickAutoscroll && $options.preventMiddleClickAutoscroll(...args))),
|
|
319
320
|
onAuxclick: $event => ($options.onRowAuxClick(node, $event))
|
|
320
321
|
}, [
|
|
321
322
|
createElementVNode("td", _hoisted_14, [
|
|
@@ -443,7 +444,6 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
443
444
|
key: 2,
|
|
444
445
|
href: $options.permalink(node),
|
|
445
446
|
target: "_blank",
|
|
446
|
-
rel: "noopener noreferrer",
|
|
447
447
|
closeAfterClick: true
|
|
448
448
|
}, {
|
|
449
449
|
icon: withCtx(() => [
|
|
@@ -468,6 +468,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
468
468
|
"data-testid": "cn-files-browser-linked-row",
|
|
469
469
|
"data-name": item.name,
|
|
470
470
|
onClick: $event => ($options.openLinked(item)),
|
|
471
|
+
onMousedown: _cache[7] || (_cache[7] = (...args) => ($options.preventMiddleClickAutoscroll && $options.preventMiddleClickAutoscroll(...args))),
|
|
471
472
|
onAuxclick: $event => ($options.onLinkedAuxClick(item, $event))
|
|
472
473
|
}, [
|
|
473
474
|
createElementVNode("td", _hoisted_20, [
|
|
@@ -498,7 +499,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
498
499
|
key: 0,
|
|
499
500
|
href: item.noteHref,
|
|
500
501
|
class: "cn-files-browser__note-link",
|
|
501
|
-
onClick: _cache[
|
|
502
|
+
onClick: _cache[4] || (_cache[4] = withModifiers(() => {}, ["stop"]))
|
|
502
503
|
}, toDisplayString(item.note), 9 /* TEXT, PROPS */, _hoisted_24))
|
|
503
504
|
: (openBlock(), createElementBlock(Fragment, { key: 1 }, [
|
|
504
505
|
createTextVNode(toDisplayString(item.note), 1 /* TEXT */)
|
|
@@ -521,8 +522,8 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
521
522
|
}), 128 /* KEYED_FRAGMENT */)),
|
|
522
523
|
createElementVNode("td", {
|
|
523
524
|
class: "cn-files-browser__col-actions",
|
|
524
|
-
onClick: _cache[
|
|
525
|
-
onAuxclick: _cache[
|
|
525
|
+
onClick: _cache[5] || (_cache[5] = withModifiers(() => {}, ["stop"])),
|
|
526
|
+
onAuxclick: _cache[6] || (_cache[6] = withModifiers(() => {}, ["stop"]))
|
|
526
527
|
}, [
|
|
527
528
|
createVNode(_component_NcActions, {
|
|
528
529
|
forceMenu: true,
|
|
@@ -534,7 +535,6 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
534
535
|
key: 0,
|
|
535
536
|
href: item.href,
|
|
536
537
|
target: "_blank",
|
|
537
|
-
rel: "noopener noreferrer",
|
|
538
538
|
closeAfterClick: true,
|
|
539
539
|
"data-testid": "cn-files-browser-linked-open"
|
|
540
540
|
}, {
|
|
@@ -578,11 +578,11 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
578
578
|
name: $props.renameLabel,
|
|
579
579
|
size: "small",
|
|
580
580
|
"data-testid": "cn-files-browser-rename",
|
|
581
|
-
onClosing: _cache[
|
|
581
|
+
onClosing: _cache[11] || (_cache[11] = $event => ($data.renaming = null))
|
|
582
582
|
}, {
|
|
583
583
|
actions: withCtx(() => [
|
|
584
584
|
createVNode(_component_NcButton, {
|
|
585
|
-
onClick: _cache[
|
|
585
|
+
onClick: _cache[10] || (_cache[10] = $event => ($data.renaming = null))
|
|
586
586
|
}, {
|
|
587
587
|
default: withCtx(() => [
|
|
588
588
|
createTextVNode(toDisplayString($options.t('nextcloud-vue', 'Cancel')), 1 /* TEXT */)
|
|
@@ -604,11 +604,11 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
604
604
|
default: withCtx(() => [
|
|
605
605
|
createElementVNode("form", {
|
|
606
606
|
class: "cn-files-browser__new-folder",
|
|
607
|
-
onSubmit: _cache[
|
|
607
|
+
onSubmit: _cache[9] || (_cache[9] = withModifiers((...args) => ($options.rename && $options.rename(...args)), ["prevent"]))
|
|
608
608
|
}, [
|
|
609
609
|
createVNode(_component_NcTextField, {
|
|
610
610
|
modelValue: $data.renameName,
|
|
611
|
-
"onUpdate:modelValue": _cache[
|
|
611
|
+
"onUpdate:modelValue": _cache[8] || (_cache[8] = $event => (($data.renameName) = $event)),
|
|
612
612
|
label: $options.t('nextcloud-vue', 'New name'),
|
|
613
613
|
error: $data.renameError !== '',
|
|
614
614
|
helperText: $data.renameError,
|
|
@@ -625,11 +625,11 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
625
625
|
name: $props.newFolderLabel,
|
|
626
626
|
size: "small",
|
|
627
627
|
"data-testid": "cn-files-browser-new-folder",
|
|
628
|
-
onClosing: _cache[
|
|
628
|
+
onClosing: _cache[15] || (_cache[15] = $event => ($data.newFolderOpen = false))
|
|
629
629
|
}, {
|
|
630
630
|
actions: withCtx(() => [
|
|
631
631
|
createVNode(_component_NcButton, {
|
|
632
|
-
onClick: _cache[
|
|
632
|
+
onClick: _cache[14] || (_cache[14] = $event => ($data.newFolderOpen = false))
|
|
633
633
|
}, {
|
|
634
634
|
default: withCtx(() => [
|
|
635
635
|
createTextVNode(toDisplayString($options.t('nextcloud-vue', 'Cancel')), 1 /* TEXT */)
|
|
@@ -651,11 +651,11 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
651
651
|
default: withCtx(() => [
|
|
652
652
|
createElementVNode("form", {
|
|
653
653
|
class: "cn-files-browser__new-folder",
|
|
654
|
-
onSubmit: _cache[
|
|
654
|
+
onSubmit: _cache[13] || (_cache[13] = withModifiers((...args) => ($options.createFolder && $options.createFolder(...args)), ["prevent"]))
|
|
655
655
|
}, [
|
|
656
656
|
createVNode(_component_NcTextField, {
|
|
657
657
|
modelValue: $data.newFolderName,
|
|
658
|
-
"onUpdate:modelValue": _cache[
|
|
658
|
+
"onUpdate:modelValue": _cache[12] || (_cache[12] = $event => (($data.newFolderName) = $event)),
|
|
659
659
|
label: $options.t('nextcloud-vue', 'Folder name'),
|
|
660
660
|
error: $data.newFolderError !== '',
|
|
661
661
|
helperText: $data.newFolderError,
|