Files
2026-10-31 07:55:53 +00:00

1 line
110 KiB
Plaintext

{"version":3,"mappings":"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","names":["_hoisted_1","_sfc_main","defineComponent","__props","__emit","emit","isCopied","copy","icon","altText","useCopy","whenever","_ctx","_cache","openBlock","createBlock","NcFormBoxButton","unref","createSlots","withCtx","createTextVNode","toDisplayString","createVNode","NcIconSvgWrapper","createElementVNode","renderSlot","mergeModels","modelValue","useModel","inputId","createElementId","watch","NcFormBoxItem","descriptionId","withDirectives","$event","normalizeClass","vModelCheckbox","NcIconToggleSwitch","formBoxSwitch__input","style0","cssModules","NcFormBoxSwitch","_export_sfc","buttonVariant","ref","provide","INSIDE_RADIO_GROUP_KEY","computed","register","onUpdate","isButton","value","NcFormGroup","NcFormBox","createElementBlock","radioGroup_checkboxRadioContainer","NcRadioGroup","_hoisted_2","props","labelId","radioGroup","useInsideRadioGroup","formBoxItemClass","useNcFormBox","onMounted","isChecked","createCommentVNode","radioGroupButton","radioGroupButton__label","radioGroupButton__icon","radioGroupButton_disabled","radioGroupButton_active","NcRadioGroupButton","allViews","shallowRef","visibleViews","view","initialized","useViews","navigation","getNavigation","useVisibleViews","initialViewConfig","loadState","useViewConfigStore","defineStore","viewConfigs","getConfig","viewid","viewId","key","update","getCurrentUser","axios","generateUrl","setSortingBy","toggleSortingDirection","newDirection","subscribe","collator","getLanguage","getCanonicalLocale","maxLevel","viewConfigStore","viewConfig","isExpanded","views","childViews","v","isDescendant","parent","parentView","sortedChildViews","a","b","hasChildViews","activeViewId","inject","isActiveView","navigationRoute","dir","isLoading","childViewsLoaded","loadChildViews","onExpandCollapse","expanded","folderTreeId","_createBlock","_unref","NcAppNavigationItem","_createVNode","_createElementBlock","_Fragment","_renderList","childView","_component_FilesNavigationListItem","rootViews","sortViews","NcAppNavigationList","_normalizeClass","$style","t","FilesNavigationListItem","onBeforeNavigation","fn","remove","useRouter","onUnmounted","activeStore","useActiveStore","searchStore","useSearchStore","to","from","VIEW_ID","isSearchView","searchLabel","NcAppNavigationSearch","NcActions","mdiSearchWeb","mdiMagnify","NcActionButton","_createTextVNode","_hoisted_3","_mergeProps","$props","_createElementVNode","_openBlock","loadingStorageStats","storageStats","storageStatsTitle","usedQuotaByte","formatFileSize","quotaByte","storageStatsTooltip","throttleUpdateStorageStats","useThrottleFn","updateStorageStats","onBeforeMount","unsubscribe","showStorageFullWarning","event","response","error","logger","showError","ChartPie","NcProgressBar","store","useUserConfigStore","NcAppSettingsSection","mdiFolderOutline","mdiAccountOutline","el","onBeforeUnmount","apiSettings","setting","FilesAppSettingsLegacyApiEntry","actions","useFileActions","getFileActions","getFilesRegistry","readonly","useEnabledFileActions","context","action","toValue","actionHotkeys","hotkeyToString","hotkey","parts","NcAppSettingsShortcutsSection","NcHotkeyList","NcHotkey","webDavDocsUrl","webDavUrl","generateRemoteUrl","appPasswordUrl","isTwoFactorEnabled","NcFormBoxCopyButton","useHotKey","showKeyboardShortcuts","nextTick","NcAppSettingsDialog","FilesAppSettingsGeneral","FilesAppSettingsAppearance","FilesAppSettingsLegacyApi","FilesAppSettingsWarnings","FilesAppSettingsWebDav","FilesAppSettingsShortcuts","sidebar","useSidebarStore","settingsOpened","route","useRoute","currentViewId","currentNavigationViewId","matchingParams","matchingDir","watchEffect","id","NcAppNavigation","FilesNavigationSearch","FilesNavigationList","FilesAppSettings","NavigationQuota","IconCog","executeAction","trigger","currentFolder","currentNode","currentView","NodeStatus","contents","displayName","success","showSuccess","useRouteParameters","directory","fileId","openFile","openDetails","useHotKeys","userConfigStore","router","goToParentDir","toggleGridView","dirname","isPublic","isPublicShare","NcContent","FilesNavigation","_component_RouterView","FilesSidebar","Setting","#name","#options","name","options","FilesListComponent","__vitePreload","stringifyNextcloudQuery","query","stringifyQuery","createRouter","createWebHistory","defaultView","isNavigationFailure","NavigationFailureType","fromDir","toDir","relative","getNode","useFilesStore","getPath","usePathsStore","fromSource","node","Router","params","pinia","source","parentFolder","RouterService","path","replace","location","Settings$1","e","createFilesStoreDataProvider","filesPinia","folder","setNode","newNode","onOpenStateChanged","isOpen","routerHookRegistered","fetchNode","setSidebarDataProvider","exposeSidebarApi","Settings","SettingsService","SettingsModel","app","createApp","FilesApp"],"ignoreList":[0,1,2,3,10],"sources":["../node_modules/@nextcloud/vue/dist/chunks/NcFormBoxCopyButton.vue_vue_type_script_setup_true_lang.mjs","../node_modules/@nextcloud/vue/dist/chunks/NcFormBoxSwitch.mjs","../node_modules/@nextcloud/vue/dist/chunks/NcRadioGroup.mjs","../node_modules/@nextcloud/vue/dist/chunks/NcRadioGroupButton.mjs","../build/frontend/apps/files/src/composables/useViews.ts","../build/frontend/apps/files/src/store/viewConfig.ts","../build/frontend/apps/files/src/components/FilesNavigationListItem.vue","../build/frontend/apps/files/src/components/FilesNavigationList.vue","../build/frontend/apps/files/src/composables/useBeforeNavigation.ts","../build/frontend/apps/files/src/components/FilesNavigationSearch.vue","../node_modules/vue-material-design-icons/ChartPieOutline.vue","../build/frontend/apps/files/src/components/NavigationQuota.vue","../build/frontend/apps/files/src/components/FilesAppSettings/FilesAppSettingsAppearance.vue","../build/frontend/apps/files/src/components/FilesAppSettings/FilesAppSettingsGeneral.vue","../build/frontend/apps/files/src/components/FilesAppSettings/FilesAppSettingsLegacyApiEntry.vue","../build/frontend/apps/files/src/components/FilesAppSettings/FilesAppSettingsLegacyApi.vue","../build/frontend/apps/files/src/composables/useFileActions.ts","../build/frontend/apps/files/src/components/FilesAppSettings/FilesAppSettingsShortcuts.vue","../build/frontend/apps/files/src/components/FilesAppSettings/FilesAppSettingsWarnings.vue","../build/frontend/apps/files/src/components/FilesAppSettings/FilesAppSettingsWebDav.vue","../build/frontend/apps/files/src/views/FilesAppSettings.vue","../build/frontend/apps/files/src/views/FilesNavigation.vue","../build/frontend/apps/files/src/utils/actionUtils.ts","../build/frontend/apps/files/src/composables/useRouteParameters.ts","../build/frontend/apps/files/src/composables/useHotKeys.ts","../build/frontend/apps/files/src/FilesApp.vue","../build/frontend/apps/files/src/models/Setting.ts","../build/frontend/apps/files/src/router/router.ts","../build/frontend/apps/files/src/services/RouterService.ts","../build/frontend/apps/files/src/services/Settings.js","../build/frontend/apps/files/src/sidebar/providers/filesStore.ts","../build/frontend/apps/files/src/main.ts"],"sourcesContent":["import { defineComponent, openBlock, createBlock, unref, createSlots, withCtx, createVNode, createTextVNode, toDisplayString, createElementVNode, renderSlot } from \"vue\";\nimport { whenever } from \"@vueuse/core\";\nimport { N as NcFormBoxButton } from \"./NcFormBoxButton.mjs\";\nimport { N as NcIconSvgWrapper } from \"./NcIconSvgWrapper.mjs\";\nimport { u as useCopy } from \"./useCopy.mjs\";\nconst _hoisted_1 = { class: \"hidden-visually\" };\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n __name: \"NcFormBoxCopyButton\",\n props: {\n label: { default: () => void 0 },\n value: {},\n disabled: { type: Boolean, default: false }\n },\n emits: [\"copy\"],\n setup(__props, { emit: __emit }) {\n const emit = __emit;\n const { isCopied, copy, icon, altText } = useCopy(() => __props.value);\n whenever(isCopied, () => emit(\"copy\"));\n return (_ctx, _cache) => {\n return openBlock(), createBlock(NcFormBoxButton, {\n disabled: __props.disabled,\n invertedAccent: \"\",\n onClick: unref(copy)\n }, createSlots({\n description: withCtx(() => [\n createTextVNode(toDisplayString(__props.value), 1)\n ]),\n icon: withCtx(() => [\n createVNode(NcIconSvgWrapper, {\n path: unref(icon),\n inline: \"\"\n }, null, 8, [\"path\"])\n ]),\n _: 2\n }, [\n _ctx.$slots.default || __props.label ? {\n name: \"default\",\n fn: withCtx(() => [\n createElementVNode(\"span\", _hoisted_1, toDisplayString(unref(altText)), 1),\n renderSlot(_ctx.$slots, \"default\", {}, () => [\n createTextVNode(toDisplayString(__props.label), 1)\n ])\n ]),\n key: \"0\"\n } : void 0\n ]), 1032, [\"disabled\", \"onClick\"]);\n };\n }\n});\nexport {\n _sfc_main as _\n};\n//# sourceMappingURL=NcFormBoxCopyButton.vue_vue_type_script_setup_true_lang.mjs.map\n","import '../assets/NcFormBoxSwitch.css';\nimport { defineComponent, useModel, watch, openBlock, createBlock, unref, createSlots, withCtx, withDirectives, createElementVNode, normalizeClass, vModelCheckbox, createVNode, renderSlot, createTextVNode, toDisplayString, mergeModels } from \"vue\";\nimport { N as NcFormBoxItem } from \"./NcFormBoxItem.mjs\";\nimport { N as NcIconToggleSwitch } from \"./NcIconToggleSwitch.mjs\";\nimport { c as createElementId } from \"./createElementId.mjs\";\nimport { _ as _export_sfc } from \"./_plugin-vue_export-helper.mjs\";\nconst _hoisted_1 = [\"id\", \"aria-describedby\", \"disabled\"];\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n __name: \"NcFormBoxSwitch\",\n props: /* @__PURE__ */ mergeModels({\n label: { default: () => void 0 },\n description: { default: () => void 0 },\n disabled: { type: Boolean, default: false }\n }, {\n \"modelValue\": { type: Boolean, ...{ required: true } },\n \"modelModifiers\": {}\n }),\n emits: /* @__PURE__ */ mergeModels([\"enable\", \"disable\"], [\"update:modelValue\"]),\n setup(__props, { emit: __emit }) {\n const modelValue = useModel(__props, \"modelValue\");\n const emit = __emit;\n const inputId = createElementId();\n watch(modelValue, () => {\n if (modelValue.value) {\n emit(\"enable\");\n } else {\n emit(\"disable\");\n }\n }, {\n // defineModel emits update:modelValue synchronously\n // Watching it synchronously to emit the enable/disable events together with the update:modelValue event\n flush: \"sync\"\n });\n return (_ctx, _cache) => {\n return openBlock(), createBlock(NcFormBoxItem, {\n tag: \"label\",\n for: unref(inputId)\n }, createSlots({\n icon: withCtx(({ descriptionId }) => [\n withDirectives(createElementVNode(\"input\", {\n id: unref(inputId),\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event) => modelValue.value = $event),\n class: normalizeClass(_ctx.$style.formBoxSwitch__input),\n type: \"checkbox\",\n role: \"switch\",\n \"aria-describedby\": descriptionId,\n disabled: __props.disabled\n }, null, 10, _hoisted_1), [\n [vModelCheckbox, modelValue.value]\n ]),\n createVNode(NcIconToggleSwitch, {\n checked: modelValue.value,\n inline: \"\"\n }, null, 8, [\"checked\"])\n ]),\n _: 2\n }, [\n _ctx.$slots.default || __props.label ? {\n name: \"default\",\n fn: withCtx(() => [\n renderSlot(_ctx.$slots, \"default\", {}, () => [\n createTextVNode(toDisplayString(__props.label), 1)\n ])\n ]),\n key: \"0\"\n } : void 0,\n _ctx.$slots.description || __props.description ? {\n name: \"description\",\n fn: withCtx(() => [\n renderSlot(_ctx.$slots, \"description\", {}, () => [\n createTextVNode(toDisplayString(__props.description), 1)\n ])\n ]),\n key: \"1\"\n } : void 0\n ]), 1032, [\"for\"]);\n };\n }\n});\nconst formBoxSwitch__input = \"_formBoxSwitch__input_oY7zN\";\nconst style0 = {\n \"material-design-icon\": \"_material-design-icon_Xz4ev\",\n formBoxSwitch__input\n};\nconst cssModules = {\n \"$style\": style0\n};\nconst NcFormBoxSwitch = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__cssModules\", cssModules]]);\nexport {\n NcFormBoxSwitch as N\n};\n//# sourceMappingURL=NcFormBoxSwitch.mjs.map\n","import '../assets/NcRadioGroup.css';\nimport { defineComponent, useModel, ref, provide, computed, warn, openBlock, createBlock, withCtx, renderSlot, createElementBlock, normalizeClass, mergeModels } from \"vue\";\nimport { N as NcFormBox } from \"./NcFormBox.mjs\";\nimport { N as NcFormGroup } from \"./NcFormGroup.mjs\";\nimport { I as INSIDE_RADIO_GROUP_KEY } from \"./useNcRadioGroup.mjs\";\nimport { _ as _export_sfc } from \"./_plugin-vue_export-helper.mjs\";\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n __name: \"NcRadioGroup\",\n props: /* @__PURE__ */ mergeModels({\n label: {},\n labelHidden: { type: Boolean },\n hideLabel: { type: Boolean },\n description: {}\n }, {\n \"modelValue\": { required: false, default: \"\" },\n \"modelModifiers\": {}\n }),\n emits: [\"update:modelValue\"],\n setup(__props) {\n const modelValue = useModel(__props, \"modelValue\");\n const buttonVariant = ref();\n provide(INSIDE_RADIO_GROUP_KEY, computed(() => ({\n register,\n modelValue: modelValue.value,\n onUpdate\n })));\n function register(isButton) {\n if (buttonVariant.value !== void 0 && buttonVariant.value !== isButton) {\n warn(\"[NcRadioGroup] Mixing NcCheckboxRadioSwitch and NcRadioGroupButton is not possible!\");\n }\n buttonVariant.value = isButton;\n }\n function onUpdate(value) {\n modelValue.value = value;\n }\n return (_ctx, _cache) => {\n return openBlock(), createBlock(NcFormGroup, {\n label: __props.label,\n description: __props.description,\n hideLabel: __props.labelHidden || __props.hideLabel\n }, {\n default: withCtx(() => [\n buttonVariant.value ? (openBlock(), createBlock(NcFormBox, {\n key: 0,\n row: \"\"\n }, {\n default: withCtx(() => [\n renderSlot(_ctx.$slots, \"default\")\n ]),\n _: 3\n })) : (openBlock(), createElementBlock(\"span\", {\n key: 1,\n class: normalizeClass(_ctx.$style.radioGroup_checkboxRadioContainer)\n }, [\n renderSlot(_ctx.$slots, \"default\")\n ], 2))\n ]),\n _: 3\n }, 8, [\"label\", \"description\", \"hideLabel\"]);\n };\n }\n});\nconst radioGroup_checkboxRadioContainer = \"_radioGroup_checkboxRadioContainer_JW-uf\";\nconst style0 = {\n \"material-design-icon\": \"_material-design-icon_KFY-h\",\n radioGroup_checkboxRadioContainer\n};\nconst cssModules = {\n \"$style\": style0\n};\nconst NcRadioGroup = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__cssModules\", cssModules]]);\nexport {\n NcRadioGroup as N\n};\n//# sourceMappingURL=NcRadioGroup.mjs.map\n","import '../assets/NcRadioGroupButton.css';\nimport { defineComponent, onMounted, computed, openBlock, createElementBlock, normalizeClass, unref, renderSlot, createCommentVNode, toDisplayString, createElementVNode } from \"vue\";\nimport { c as createElementId } from \"./createElementId.mjs\";\nimport { u as useNcFormBox } from \"./useNcFormBox.mjs\";\nimport { u as useInsideRadioGroup } from \"./useNcRadioGroup.mjs\";\nimport { _ as _export_sfc } from \"./_plugin-vue_export-helper.mjs\";\nconst _hoisted_1 = [\"id\"];\nconst _hoisted_2 = [\"aria-labelledby\", \"aria-label\", \"checked\", \"disabled\", \"value\"];\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n __name: \"NcRadioGroupButton\",\n props: {\n ariaLabel: {},\n label: {},\n value: {},\n disabled: { type: Boolean }\n },\n setup(__props) {\n const props = __props;\n const labelId = createElementId();\n const radioGroup = useInsideRadioGroup();\n const { formBoxItemClass } = useNcFormBox();\n onMounted(() => radioGroup.value.register(true));\n const isChecked = computed(() => radioGroup?.value.modelValue === props.value);\n function onUpdate() {\n if (props.disabled) {\n return;\n }\n radioGroup.value.onUpdate(props.value);\n }\n return (_ctx, _cache) => {\n return openBlock(), createElementBlock(\"div\", {\n class: normalizeClass([{\n [_ctx.$style.radioGroupButton_active]: isChecked.value,\n [_ctx.$style.radioGroupButton_disabled]: __props.disabled\n }, _ctx.$style.radioGroupButton, unref(formBoxItemClass)]),\n onClick: onUpdate\n }, [\n _ctx.$slots.icon ? (openBlock(), createElementBlock(\"div\", {\n key: 0,\n class: normalizeClass(_ctx.$style.radioGroupButton__icon)\n }, [\n renderSlot(_ctx.$slots, \"icon\")\n ], 2)) : createCommentVNode(\"\", true),\n __props.label ? (openBlock(), createElementBlock(\"div\", {\n key: 1,\n id: unref(labelId),\n class: normalizeClass(_ctx.$style.radioGroupButton__label)\n }, toDisplayString(__props.label), 11, _hoisted_1)) : createCommentVNode(\"\", true),\n createElementVNode(\"input\", {\n \"aria-labelledby\": __props.label ? unref(labelId) : void 0,\n \"aria-label\": __props.label ? void 0 : __props.ariaLabel,\n class: \"hidden-visually\",\n checked: isChecked.value,\n type: \"radio\",\n disabled: __props.disabled,\n value: __props.value,\n onInput: onUpdate\n }, null, 40, _hoisted_2)\n ], 2);\n };\n }\n});\nconst radioGroupButton = \"_radioGroupButton_zvINB\";\nconst radioGroupButton__label = \"_radioGroupButton__label_bAKze\";\nconst radioGroupButton__icon = \"_radioGroupButton__icon_DB-zg\";\nconst radioGroupButton_disabled = \"_radioGroupButton_disabled_Acqgc\";\nconst radioGroupButton_active = \"_radioGroupButton_active_EEJX-\";\nconst style0 = {\n \"material-design-icon\": \"_material-design-icon_WI1tJ\",\n radioGroupButton,\n radioGroupButton__label,\n radioGroupButton__icon,\n radioGroupButton_disabled,\n radioGroupButton_active\n};\nconst cssModules = {\n \"$style\": style0\n};\nconst NcRadioGroupButton = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"__cssModules\", cssModules]]);\nexport {\n NcRadioGroupButton as N\n};\n//# sourceMappingURL=NcRadioGroupButton.mjs.map\n","/*!\n * SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { IView } from '@nextcloud/files'\n\nimport { getNavigation } from '@nextcloud/files'\nimport { computed, shallowRef } from 'vue'\n\nconst allViews = shallowRef<IView[]>([])\nconst visibleViews = computed(() => allViews.value?.filter((view) => !view.hidden) ?? [])\n\nlet initialized = false\n\n/**\n * Get all currently registered views.\n * Unline `Navigation.views` this is reactive and will update when new views are added or existing views are removed.\n */\nexport function useViews() {\n\tif (!initialized) {\n\t\tconst navigation = getNavigation()\n\t\tnavigation.addEventListener('update', () => {\n\t\t\tallViews.value = [...navigation.views]\n\t\t})\n\n\t\tallViews.value = [...navigation.views]\n\t\tinitialized = true\n\t}\n\n\treturn allViews\n}\n\n/**\n * Get all non-hidden views.\n */\nexport function useVisibleViews() {\n\tuseViews()\n\treturn visibleViews\n}\n","/**\n * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { ViewConfig, ViewConfigs, ViewId } from '../types.ts'\n\nimport { getCurrentUser } from '@nextcloud/auth'\nimport axios from '@nextcloud/axios'\nimport { emit, subscribe } from '@nextcloud/event-bus'\nimport { loadState } from '@nextcloud/initial-state'\nimport { generateUrl } from '@nextcloud/router'\nimport { defineStore } from 'pinia'\nimport { ref } from 'vue'\n\nconst initialViewConfig = loadState('files', 'viewConfigs', {}) as ViewConfigs\n\nexport const useViewConfigStore = defineStore('viewconfig', () => {\n\tconst viewConfigs = ref({ ...initialViewConfig })\n\n\t/**\n\t * Get the config for a specific view\n\t *\n\t * @param viewid Id of the view to fet the config for\n\t */\n\tfunction getConfig(viewid: ViewId): ViewConfig {\n\t\treturn viewConfigs.value[viewid] || {}\n\t}\n\n\t/**\n\t * Update the view config local store\n\t *\n\t * @param viewId The id of the view to update\n\t * @param key The config key to update\n\t * @param value The new value\n\t */\n\tfunction onUpdate(viewId: ViewId, key: string, value: string | number | boolean): void {\n\t\tif (!(viewId in viewConfigs.value)) {\n\t\t\tviewConfigs.value[viewId] = {}\n\t\t}\n\t\tviewConfigs.value[viewId][key] = value\n\t}\n\n\t/**\n\t * Update the view config local store AND on server side\n\t *\n\t * @param view Id of the view to update\n\t * @param key Config key to update\n\t * @param value New value\n\t */\n\tasync function update(view: ViewId, key: string, value: string | number | boolean): Promise<void> {\n\t\tif (getCurrentUser() !== null) {\n\t\t\tawait axios.put(generateUrl('/apps/files/api/v1/views'), {\n\t\t\t\tvalue,\n\t\t\t\tview,\n\t\t\t\tkey,\n\t\t\t})\n\t\t}\n\n\t\temit('files:view-config:updated', { view, key, value })\n\t}\n\n\t/**\n\t * Set the sorting key AND sort by ASC\n\t * The key param must be a valid key of a File object\n\t * If not found, will be searched within the File attributes\n\t *\n\t * @param key Key to sort by\n\t * @param view View to set the sorting key for\n\t */\n\tfunction setSortingBy(key = 'basename', view = 'files'): void {\n\t\t// Save new config\n\t\tupdate(view, 'sorting_mode', key)\n\t\tupdate(view, 'sorting_direction', 'asc')\n\t}\n\n\t/**\n\t * Toggle the sorting direction\n\t *\n\t * @param viewId id of the view to set the sorting order for\n\t */\n\tfunction toggleSortingDirection(viewId = 'files'): void {\n\t\tconst config = viewConfigs.value[viewId] || { sorting_direction: 'asc' }\n\t\tconst newDirection = config.sorting_direction === 'asc' ? 'desc' : 'asc'\n\n\t\t// Save new config\n\t\tupdate(viewId, 'sorting_direction', newDirection)\n\t}\n\n\t// Initialize event listener\n\tsubscribe('files:view-config:updated', ({ view, key, value }) => onUpdate(view, key, value))\n\n\treturn {\n\t\tviewConfigs,\n\n\t\tgetConfig,\n\t\tsetSortingBy,\n\t\ttoggleSortingDirection,\n\t\tupdate,\n\t}\n})\n","<!--\n - SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport type { IView } from '@nextcloud/files'\n\nimport { getCanonicalLocale, getLanguage } from '@nextcloud/l10n'\nimport { computed, inject, onMounted, ref } from 'vue'\nimport NcAppNavigationItem from '@nextcloud/vue/components/NcAppNavigationItem'\nimport NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'\nimport { useVisibleViews } from '../composables/useViews.ts'\nimport { folderTreeId } from '../services/FolderTree.ts'\nimport { useViewConfigStore } from '../store/viewConfig.ts'\n\nconst props = withDefaults(defineProps<{\n\tview: IView\n\tlevel?: number\n}>(), {\n\tlevel: 0,\n})\n\nconst maxLevel = 6 // Limit nesting to not exceed max call stack size\nconst viewConfigStore = useViewConfigStore()\nconst viewConfig = computed(() => viewConfigStore.viewConfigs[props.view.id])\nconst isExpanded = computed(() => viewConfig.value\n\t? (viewConfig.value.expanded === true)\n\t: (props.view.expanded === true))\n\nconst views = useVisibleViews()\nconst childViews = computed(() => {\n\tif (props.level < maxLevel) {\n\t\treturn views.value.filter((v) => v.parent === props.view.id)\n\t} else {\n\t\treturn views.value.filter((v) => isDescendant(v, props.view.id))\n\t}\n\n\t/**\n\t * Check if a view is a descendant of another view by recursively traversing up the parent chain.\n\t *\n\t * @param view - The view to check\n\t * @param parent - The parent view id to check against\n\t */\n\tfunction isDescendant(view: IView, parent: string): boolean {\n\t\tif (!view.parent) {\n\t\t\treturn false\n\t\t} else if (view.parent === parent) {\n\t\t\treturn true\n\t\t}\n\n\t\tconst parentView = views.value.find((v) => v.id === view.parent)\n\t\treturn !!parentView && isDescendant(parentView, parent)\n\t}\n})\nconst sortedChildViews = computed(() => childViews.value.slice().sort((a, b) => {\n\tif (a.order !== undefined && b.order === undefined) {\n\t\treturn -1\n\t} else if (a.order === undefined && b.order !== undefined) {\n\t\treturn 1\n\t}\n\treturn collator.compare(a.name, b.name)\n}))\nconst hasChildViews = computed(() => childViews.value.length > 0)\nconst activeViewId = inject('currentNavigationView', ref<string | undefined>(undefined))\nconst isActiveView = computed(() => activeViewId.value === props.view.id)\n\nconst navigationRoute = computed(() => {\n\tif (props.view.params) {\n\t\tconst { dir } = props.view.params\n\t\treturn { name: 'filelist', params: { ...props.view.params }, query: { dir } }\n\t}\n\treturn { name: 'filelist', params: { view: props.view.id } }\n})\n\nconst isLoading = ref(false)\nconst childViewsLoaded = ref(false)\n\n/**\n * Load child views on mount if the view is expanded by default\n * but has no child views loaded yet.\n */\nonMounted(() => {\n\tif (isExpanded.value && !hasChildViews.value) {\n\t\tloadChildViews()\n\t}\n})\n\n/**\n * Handle expanding/collapsing the navigation item.\n *\n * @param expanded - The expanded state\n */\nasync function onExpandCollapse(expanded: boolean) {\n\tif (viewConfig.value) {\n\t\tviewConfig.value.expanded = expanded\n\t} else if (expanded) {\n\t\tviewConfigStore.viewConfigs[props.view.id] = { expanded: true }\n\t}\n\n\t// folder tree should only show current directory by default,\n\t// so we don't want to persist the expanded state in the store for its views\n\tif (!props.view.id.startsWith(`${folderTreeId}::`)) {\n\t\tviewConfigStore.update(props.view.id, 'expanded', expanded)\n\t}\n\n\tif (expanded) {\n\t\tawait loadChildViews()\n\t}\n}\n\n/**\n * Load child views if a loader function is provided and child views haven't been loaded yet.\n */\nasync function loadChildViews() {\n\tif (props.view.loadChildViews && !childViewsLoaded.value) {\n\t\tisLoading.value = true\n\t\ttry {\n\t\t\tawait props.view.loadChildViews(props.view)\n\t\t\tchildViewsLoaded.value = true\n\t\t} finally {\n\t\t\tisLoading.value = false\n\t\t}\n\t}\n}\n</script>\n\n<script lang=\"ts\">\nconst collator = Intl.Collator(\n\t[getLanguage(), getCanonicalLocale()],\n\t{ numeric: true, usage: 'sort' },\n)\n</script>\n\n<template>\n\t<NcAppNavigationItem\n\t\tclass=\"files-navigation__item\"\n\t\t:data-cy-files-navigation-item=\"view.id\"\n\t\t:active=\"isActiveView\"\n\t\tallowCollapse\n\t\t:loading=\"isLoading\"\n\t\t:name=\"view.name\"\n\t\t:open=\"isExpanded\"\n\t\t:pinned=\"view.sticky\"\n\t\t:to=\"navigationRoute\"\n\t\t@update:open=\"onExpandCollapse\">\n\t\t<template v-if=\"view.icon\" #icon>\n\t\t\t<NcIconSvgWrapper :svg=\"view.icon\" />\n\t\t</template>\n\n\t\t<!-- Recursively nest child views -->\n\t\t<template v-if=\"hasChildViews || (!childViewsLoaded && view.loadChildViews)\" #default>\n\t\t\t<FilesNavigationListItem\n\t\t\t\tv-for=\"childView in sortedChildViews\"\n\t\t\t\t:key=\"childView.id\"\n\t\t\t\t:level=\"level + 1\"\n\t\t\t\t:view=\"childView\" />\n\t\t</template>\n\t</NcAppNavigationItem>\n</template>\n","<!--\n - SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport type { IView } from '@nextcloud/files'\n\nimport { getCanonicalLocale, getLanguage, t } from '@nextcloud/l10n'\nimport { computed } from 'vue'\nimport NcAppNavigationList from '@nextcloud/vue/components/NcAppNavigationList'\nimport FilesNavigationListItem from './FilesNavigationListItem.vue'\nimport { useVisibleViews } from '../composables/useViews.ts'\n\nconst views = useVisibleViews()\nconst rootViews = computed(() => views.value\n\t.filter((view) => !view.parent)\n\t.sort(sortViews))\n\nconst collator = Intl.Collator(\n\t[getLanguage(), getCanonicalLocale()],\n\t{ numeric: true, usage: 'sort' },\n)\n\n/**\n * Sort views by their order property if available, otherwise sort alphabetically by name.\n *\n * @param a - first view\n * @param b - second view\n */\nfunction sortViews(a: IView, b: IView): number {\n\tif (a.order !== undefined && b.order !== undefined) {\n\t\treturn a.order - b.order\n\t} else if (a.order !== undefined && b.order === undefined) {\n\t\treturn -1\n\t} else if (a.order === undefined && b.order !== undefined) {\n\t\treturn 1\n\t}\n\treturn collator.compare(a.name, b.name)\n}\n</script>\n\n<template>\n\t<NcAppNavigationList\n\t\t:class=\"$style.filesNavigationList\"\n\t\t:aria-label=\"t('files', 'Views')\">\n\t\t<FilesNavigationListItem\n\t\t\tv-for=\"view in rootViews\"\n\t\t\t:key=\"view.id\"\n\t\t\t:view=\"view\" />\n\t</NcAppNavigationList>\n</template>\n\n<style module>\n.filesNavigationList {\n\theight: 100%; /* Fill all available space for sticky views */\n}\n</style>\n","/**\n * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { NavigationGuard } from 'vue-router'\n\nimport { onUnmounted } from 'vue'\nimport { useRouter } from 'vue-router'\n\n/**\n * Register a global navigation guard for the lifetime of the calling component.\n *\n * For components that are not rendered by a `RouterView` - such as the ones in\n * the app navigation - the in-component guards never run, so they need this.\n *\n * @param fn - The navigation guard\n */\nexport function onBeforeNavigation(fn: NavigationGuard) {\n\tconst router = useRouter()\n\tconst remove = router.beforeResolve(fn)\n\tonUnmounted(remove)\n}\n","<!--\n - SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport { mdiMagnify, mdiSearchWeb } from '@mdi/js'\nimport { t } from '@nextcloud/l10n'\nimport { computed } from 'vue'\nimport NcActionButton from '@nextcloud/vue/components/NcActionButton'\nimport NcActions from '@nextcloud/vue/components/NcActions'\nimport NcAppNavigationSearch from '@nextcloud/vue/components/NcAppNavigationSearch'\nimport NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'\nimport { onBeforeNavigation } from '../composables/useBeforeNavigation.ts'\nimport { useActiveStore } from '../store/active.ts'\nimport { useSearchStore } from '../store/search.ts'\nimport { VIEW_ID } from '../views/search.ts'\n\nconst activeStore = useActiveStore()\nconst searchStore = useSearchStore()\n\n/**\n * When the route is changed from search view to something different we need to clear the search box.\n *\n * This component is rendered by the navigation, not by a `RouterView`, so the\n * in-component guards do not apply to it and a global guard is needed.\n */\nonBeforeNavigation((to, from) => {\n\tif (to.params.view !== VIEW_ID\n\t\t&& (from.params.view === VIEW_ID || from.query.dir !== to.query.dir)) {\n\t\t// we are leaving the search view or navigate to another directory -> unset the query\n\t\tsearchStore.query = ''\n\t\tsearchStore.scope = 'filter'\n\t} else if (to.params.view === VIEW_ID && from.params.view === VIEW_ID) {\n\t\t// fix the query if the user refreshed the view\n\t\tif (searchStore.query && !to.query.query) {\n\t\t\treturn {\n\t\t\t\t...to,\n\t\t\t\tquery: {\n\t\t\t\t\t...to.query,\n\t\t\t\t\tquery: searchStore.query,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t}\n})\n\n/**\n * Are we currently on the search view.\n * Needed to disable the action menu (we cannot change the search mode there)\n */\nconst isSearchView = computed(() => activeStore.activeView?.id === VIEW_ID)\n\n/**\n * Different searchbox label depending if filtering or searching\n */\nconst searchLabel = computed(() => {\n\tif (searchStore.scope === 'globally') {\n\t\treturn t('files', 'Search everywhere')\n\t}\n\treturn t('files', 'Search here')\n})\n</script>\n\n<template>\n\t<NcAppNavigationSearch v-model=\"searchStore.query\" :label=\"searchLabel\">\n\t\t<template #actions>\n\t\t\t<NcActions :aria-label=\"t('files', 'Search scope options')\" :disabled=\"isSearchView\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcIconSvgWrapper :path=\"searchStore.scope === 'globally' ? mdiSearchWeb : mdiMagnify\" />\n\t\t\t\t</template>\n\t\t\t\t<NcActionButton closeAfterClick @click=\"searchStore.scope = 'filter'\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<NcIconSvgWrapper :path=\"mdiMagnify\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('files', 'Search here') }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<NcActionButton closeAfterClick @click=\"searchStore.scope = 'globally'\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<NcIconSvgWrapper :path=\"mdiSearchWeb\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('files', 'Search everywhere') }}\n\t\t\t\t</NcActionButton>\n\t\t\t</NcActions>\n\t\t</template>\n\t</NcAppNavigationSearch>\n</template>\n","<template>\n <span v-bind=\"$attrs\"\n :aria-hidden=\"title ? null : 'true'\"\n :aria-label=\"title\"\n class=\"material-design-icon chart-pie-outline-icon\"\n role=\"img\"\n @click=\"$emit('click', $event)\">\n <svg :fill=\"fillColor\"\n class=\"material-design-icon__svg\"\n :width=\"size\"\n :height=\"size\"\n viewBox=\"0 0 24 24\">\n <path d=\"M13 11H19.95Q19.58 8.25 17.66 6.34 15.75 4.43 13 4.05M11 19.95V4.05Q8 4.43 6 6.69 4 8.95 4 12T6 17.31Q8 19.58 11 19.95M13 19.95Q15.75 19.6 17.68 17.68 19.6 15.75 19.95 13H13M12 12M12 22Q9.93 22 8.1 21.21 6.28 20.43 4.93 19.08 3.58 17.73 2.79 15.9 2 14.08 2 12T2.79 8.1Q3.58 6.28 4.93 4.93 6.28 3.58 8.1 2.79 9.93 2 12 2T15.89 2.79Q17.7 3.58 19.06 4.94 20.43 6.3 21.21 8.11 22 9.93 22 12 22 14.05 21.21 15.88 20.43 17.7 19.08 19.06 17.73 20.43 15.9 21.21 14.08 22 12 22Z\">\n <title v-if=\"title\">{{ title }}</title>\n </path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: \"ChartPieOutlineIcon\",\n emits: ['click'],\n props: {\n title: {\n type: String,\n },\n fillColor: {\n type: String,\n default: \"currentColor\"\n },\n size: {\n type: Number,\n default: 24\n }\n }\n}\n</script>","<!--\n - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n -->\n\n<script setup lang=\"ts\">\nimport axios from '@nextcloud/axios'\nimport { showError } from '@nextcloud/dialogs'\nimport { subscribe, unsubscribe } from '@nextcloud/event-bus'\nimport { formatFileSize } from '@nextcloud/files'\nimport { loadState } from '@nextcloud/initial-state'\nimport { t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport { useThrottleFn } from '@vueuse/core'\nimport { computed, onBeforeMount, onMounted, onUnmounted, ref } from 'vue'\nimport NcAppNavigationItem from '@nextcloud/vue/components/NcAppNavigationItem'\nimport NcProgressBar from '@nextcloud/vue/components/NcProgressBar'\nimport ChartPie from 'vue-material-design-icons/ChartPieOutline.vue'\nimport { logger } from '../utils/logger.ts'\n\ntype StorageStats = {\n\tused: number\n\tfree: number\n\ttotal: number\n\tquota: number\n\trelative: number\n}\n\nconst loadingStorageStats = ref(false)\nconst storageStats = ref(loadState<StorageStats | null>('files', 'storageStats', null))\n\nconst storageStatsTitle = computed(() => {\n\tconst usedQuotaByte = formatFileSize(storageStats.value?.used ?? 0, false, false)\n\tconst quotaByte = formatFileSize(storageStats.value?.total ?? 0, false, false)\n\n\t// If no quota set\n\tif (storageStats.value === null || storageStats.value?.quota < 0) {\n\t\treturn t('files', '{usedQuotaByte} used', { usedQuotaByte })\n\t}\n\n\treturn t('files', '{used} of {quota} used', {\n\t\tused: usedQuotaByte,\n\t\tquota: quotaByte,\n\t})\n})\n\nconst storageStatsTooltip = computed(() => {\n\tif (!storageStats.value?.relative) {\n\t\treturn ''\n\t}\n\n\treturn t('files', '{relative}% used', storageStats.value)\n})\n\nconst throttleUpdateStorageStats = useThrottleFn(updateStorageStats, 2000)\nonBeforeMount(() => {\n\tsubscribe('files:node:created', throttleUpdateStorageStats)\n\tsubscribe('files:node:deleted', throttleUpdateStorageStats)\n\tsubscribe('files:node:moved', throttleUpdateStorageStats)\n\tsubscribe('files:node:updated', throttleUpdateStorageStats)\n})\nonUnmounted(() => {\n\tunsubscribe('files:node:created', throttleUpdateStorageStats)\n\tunsubscribe('files:node:deleted', throttleUpdateStorageStats)\n\tunsubscribe('files:node:moved', throttleUpdateStorageStats)\n\tunsubscribe('files:node:updated', throttleUpdateStorageStats)\n})\n\nonMounted(() => {\n\t// If the user has a quota set, warn if the available account storage is <=0\n\t//\n\t// NOTE: This doesn't catch situations where actual *server*\n\t// disk (non-quota) space is low, but those should probably\n\t// be handled differently anyway since a regular user can't\n\t// can't do much about them (If we did want to indicate server disk\n\t// space matters to users, we'd probably want to use a warning\n\t// specific to that situation anyhow. So this covers warning covers\n\t// our primary day-to-day concern (individual account quota usage).\n\t//\n\tif (storageStats.value && storageStats.value?.quota > 0 && storageStats.value?.free === 0) {\n\t\tshowStorageFullWarning()\n\t}\n})\n\n/**\n * Update the storage stats\n * Throttled at max 1 refresh per minute\n *\n * @param event - If user interaction\n */\nasync function updateStorageStats(event?: unknown) {\n\tif (loadingStorageStats.value) {\n\t\treturn\n\t}\n\n\tloadingStorageStats.value = true\n\ttry {\n\t\tconst response = await axios.get(generateUrl('/apps/files/api/v1/stats'))\n\t\tif (!response?.data?.data) {\n\t\t\tthrow new Error('Invalid storage stats')\n\t\t}\n\n\t\t// Warn the user if the available account storage changed from > 0 to 0\n\t\t// (unless only because quota was intentionally set to 0 by admin in the interim)\n\t\tif (storageStats.value && storageStats.value?.free > 0 && response.data.data?.free === 0 && response.data.data?.quota > 0) {\n\t\t\tshowStorageFullWarning()\n\t\t}\n\n\t\tstorageStats.value = response.data.data\n\t} catch (error) {\n\t\tlogger.error('Could not refresh storage stats', { error })\n\t\t// Only show to the user if it was manually triggered\n\t\tif (event) {\n\t\t\tshowError(t('files', 'Could not refresh storage stats'))\n\t\t}\n\t} finally {\n\t\tloadingStorageStats.value = false\n\t}\n}\n\n/**\n * Show a warning that the user's storage is full and files can not be updated or synced anymore\n */\nfunction showStorageFullWarning() {\n\tshowError(t('files', 'Your storage is full, files can not be updated or synced anymore!'))\n}\n</script>\n\n<template>\n\t<NcAppNavigationItem\n\t\tv-if=\"storageStats\"\n\t\t:aria-description=\"t('files', 'Storage information')\"\n\t\t:class=\"{ 'app-navigation-entry__settings-quota--not-unlimited': storageStats.quota >= 0 }\"\n\t\t:loading=\"loadingStorageStats\"\n\t\t:name=\"storageStatsTitle\"\n\t\t:title=\"storageStatsTooltip\"\n\t\tclass=\"app-navigation-entry__settings-quota\"\n\t\tdata-cy-files-navigation-settings-quota\n\t\t@click.stop.prevent=\"throttleUpdateStorageStats\">\n\t\t<template #icon>\n\t\t\t<ChartPie :size=\"20\" />\n\t\t</template>\n\n\t\t<!-- Progress bar -->\n\t\t<template #extra>\n\t\t\t<NcProgressBar\n\t\t\t\tv-if=\"storageStats.quota >= 0\"\n\n\t\t\t\t:aria-label=\"t('files', 'Storage quota')\"\n\t\t\t\t:error=\"storageStats.relative > 80\"\n\t\t\t\t:value=\"Math.min(storageStats.relative, 100)\" />\n\t\t</template>\n\t</NcAppNavigationItem>\n</template>\n\n<style lang=\"scss\" scoped>\n// User storage stats display\n.app-navigation-entry__settings-quota {\n\t// Align title with progress and icon\n\t--app-navigation-quota-margin: calc((var(--default-clickable-area) - 24px) / 2); // 20px icon size and 4px progress bar\n\n\t&--not-unlimited :deep(.app-navigation-entry__name) {\n\t\tline-height: 1;\n\t\tmargin-top: var(--app-navigation-quota-margin);\n\t}\n\n\tprogress {\n\t\tposition: absolute;\n\t\tbottom: var(--app-navigation-quota-margin);\n\t\tmargin-inline-start: var(--default-clickable-area);\n\t\twidth: calc(100% - (1.5 * var(--default-clickable-area)));\n\t}\n}\n</style>\n","<!--\n - SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport { t } from '@nextcloud/l10n'\nimport NcAppSettingsSection from '@nextcloud/vue/components/NcAppSettingsSection'\nimport NcFormBox from '@nextcloud/vue/components/NcFormBox'\nimport NcFormBoxSwitch from '@nextcloud/vue/components/NcFormBoxSwitch'\nimport { useUserConfigStore } from '../../store/userconfig.ts'\n\nconst store = useUserConfigStore()\n</script>\n\n<template>\n\t<NcAppSettingsSection id=\"appearance\" :name=\"t('files', 'Appearance')\">\n\t\t<NcFormBox>\n\t\t\t<NcFormBoxSwitch\n\t\t\t\tv-model=\"store.userConfig.show_hidden\"\n\t\t\t\t:label=\"t('files', 'Show hidden files')\"\n\t\t\t\t@update:modelValue=\"store.update('show_hidden', $event)\" />\n\t\t\t<NcFormBoxSwitch\n\t\t\t\tv-model=\"store.userConfig.show_mime_column\"\n\t\t\t\t:label=\"t('files', 'Show file type column')\"\n\t\t\t\t@update:modelValue=\"store.update('show_mime_column', $event)\" />\n\t\t\t<NcFormBoxSwitch\n\t\t\t\tv-model=\"store.userConfig.show_files_extensions\"\n\t\t\t\t:label=\"t('files', 'Show file extensions')\"\n\t\t\t\t@update:modelValue=\"store.update('show_files_extensions', $event)\" />\n\t\t\t<NcFormBoxSwitch\n\t\t\t\tv-model=\"store.userConfig.crop_image_previews\"\n\t\t\t\t:label=\"t('files', 'Crop image previews')\"\n\t\t\t\t@update:modelValue=\"store.update('crop_image_previews', $event)\" />\n\t\t</NcFormBox>\n\t</NcAppSettingsSection>\n</template>\n","<!--\n - SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport { mdiAccountOutline, mdiFolderOutline } from '@mdi/js'\nimport { t } from '@nextcloud/l10n'\nimport NcAppSettingsSection from '@nextcloud/vue/components/NcAppSettingsSection'\nimport NcFormBox from '@nextcloud/vue/components/NcFormBox'\nimport NcFormBoxSwitch from '@nextcloud/vue/components/NcFormBoxSwitch'\nimport NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'\nimport NcRadioGroup from '@nextcloud/vue/components/NcRadioGroup'\nimport NcRadioGroupButton from '@nextcloud/vue/components/NcRadioGroupButton'\nimport { useUserConfigStore } from '../../store/userconfig.ts'\n\nconst store = useUserConfigStore()\n</script>\n\n<template>\n\t<NcAppSettingsSection\n\t\tid=\"settings\"\n\t\t:name=\"t('files', 'General')\">\n\t\t<NcFormBox>\n\t\t\t<NcFormBoxSwitch\n\t\t\t\tv-model=\"store.userConfig.sort_favorites_first\"\n\t\t\t\t:label=\"t('files', 'Sort favorites first')\"\n\t\t\t\t@update:modelValue=\"store.update('sort_favorites_first', $event)\" />\n\t\t\t<NcFormBoxSwitch\n\t\t\t\tv-model=\"store.userConfig.sort_folders_first\"\n\t\t\t\t:label=\"t('files', 'Sort folders before files')\"\n\t\t\t\t@update:modelValue=\"store.update('sort_folders_first', $event)\" />\n\t\t\t<NcFormBoxSwitch\n\t\t\t\tv-model=\"store.userConfig.folder_tree\"\n\t\t\t\t:label=\"t('files', 'Enable folder tree view')\"\n\t\t\t\t@update:modelValue=\"store.update('folder_tree', $event)\" />\n\t\t</NcFormBox>\n\t\t<NcRadioGroup\n\t\t\tv-model=\"store.userConfig.default_view\"\n\t\t\t:label=\"t('files', 'Default view')\"\n\t\t\t@update:modelValue=\"store.update('default_view', $event)\">\n\t\t\t<NcRadioGroupButton :label=\"t('files', 'All files')\" value=\"files\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcIconSvgWrapper :path=\"mdiFolderOutline\" />\n\t\t\t\t</template>\n\t\t\t</NcRadioGroupButton>\n\t\t\t<NcRadioGroupButton :label=\"t('files', 'Personal files')\" value=\"personal\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcIconSvgWrapper :path=\"mdiAccountOutline\" />\n\t\t\t\t</template>\n\t\t\t</NcRadioGroupButton>\n\t\t</NcRadioGroup>\n\t</NcAppSettingsSection>\n</template>\n","<!--\n - SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport type Setting from '../../models/Setting.ts'\n\nimport { onBeforeMount, onBeforeUnmount, onMounted, ref } from 'vue'\n\nconst props = defineProps<{\n\tsetting: Setting\n}>()\n\nconst el = ref<HTMLElement>()\n\nonBeforeMount(() => props.setting.open())\nonBeforeUnmount(() => props.setting.close())\nonMounted(() => {\n\tel.value!.appendChild(props.setting.el())\n})\n</script>\n\n<template>\n\t<div ref=\"el\" />\n</template>\n","<!--\n - SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport type Setting from '../../models/Setting.ts'\n\nimport { t } from '@nextcloud/l10n'\nimport NcAppSettingsSection from '@nextcloud/vue/components/NcAppSettingsSection'\nimport FilesAppSettingsLegacyApiEntry from './FilesAppSettingsLegacyApiEntry.vue'\n\nconst apiSettings = ((window.OCA?.Files?.Settings?.settings || []) as Setting[])\n\t.sort((a, b) => {\n\t\tif (a.order && b.order) {\n\t\t\treturn a.order - b.order\n\t\t}\n\t\treturn a.name.localeCompare(b.name)\n\t})\n</script>\n\n<template>\n\t<NcAppSettingsSection\n\t\tv-if=\"apiSettings.length !== 0\"\n\t\tid=\"api-settings\"\n\t\t:name=\"t('files', 'Additional settings')\">\n\t\t<FilesAppSettingsLegacyApiEntry v-for=\"setting in apiSettings\" :key=\"setting.name\" :setting=\"setting\" />\n\t</NcAppSettingsSection>\n</template>\n","/*!\n * SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { ActionContext, IFileAction } from '@nextcloud/files'\nimport type { MaybeRefOrGetter, Ref } from 'vue'\n\nimport { getFileActions, getFilesRegistry } from '@nextcloud/files'\nimport { computed, readonly, ref, toValue } from 'vue'\n\nconst actions = ref<IFileAction[] | undefined>()\n\n/**\n * Get the registered and sorted file actions.\n */\nexport function useFileActions() {\n\tif (!actions.value) {\n\t\t// if not initialized by other component yet, initialize and subscribe to registry changes\n\t\tactions.value = getFileActions()\n\t\tgetFilesRegistry().addEventListener('register:action', () => {\n\t\t\tactions.value = getFileActions()\n\t\t})\n\t}\n\n\treturn readonly(actions as Ref<IFileAction[]>)\n}\n\n/**\n * Get the enabled file actions for the given context.\n *\n * @param context - The context to check the enabled state of the actions against\n */\nexport function useEnabledFileActions(context: MaybeRefOrGetter<ActionContext>) {\n\tconst actions = useFileActions()\n\treturn computed(() => actions.value\n\t\t.filter((action) => action.enabled === undefined\n\t\t\t|| action.enabled(toValue(context)!))\n\t\t.sort((a, b) => (a.order ?? 0) - (b.order ?? 0)))\n}\n","<!--\n - SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport type { IHotkeyConfig } from '@nextcloud/files'\n\nimport { t } from '@nextcloud/l10n'\nimport { computed } from 'vue'\nimport NcAppSettingsShortcutsSection from '@nextcloud/vue/components/NcAppSettingsShortcutsSection'\nimport NcHotkey from '@nextcloud/vue/components/NcHotkey'\nimport NcHotkeyList from '@nextcloud/vue/components/NcHotkeyList'\nimport { useFileActions } from '../../composables/useFileActions.ts'\n\nconst actions = useFileActions()\nconst actionHotkeys = computed(() => actions.value\n\t.filter((action) => !!action.hotkey)\n\t.sort((a, b) => (a.order || 0) - (b.order || 0))\n\t.map((action) => ({\n\t\tid: action.id,\n\t\tlabel: action.hotkey!.description,\n\t\thotkey: hotkeyToString(action.hotkey!),\n\t})))\n\n/**\n * Convert a hotkey configuration to a hotkey string.\n *\n * @param hotkey - The hotkey configuration\n */\nfunction hotkeyToString(hotkey: IHotkeyConfig): string {\n\tconst parts: string[] = []\n\tif (hotkey.ctrl) {\n\t\tparts.push('Control')\n\t}\n\tif (hotkey.alt) {\n\t\tparts.push('Alt')\n\t}\n\tif (hotkey.shift) {\n\t\tparts.push('Shift')\n\t}\n\tif (hotkey.key.match(/^[a-z]$/)) {\n\t\tparts.push(hotkey.key.toUpperCase())\n\t} else {\n\t\tparts.push(hotkey.key)\n\t}\n\treturn parts.join(' ')\n}\n</script>\n\n<template>\n\t<NcAppSettingsShortcutsSection>\n\t\t<NcHotkeyList :label=\"t('files', 'Actions')\">\n\t\t\t<NcHotkey :label=\"t('files', 'File actions')\" hotkey=\"A\" />\n\n\t\t\t<NcHotkey\n\t\t\t\tv-for=\"hotkey of actionHotkeys\"\n\t\t\t\t:key=\"hotkey.id\"\n\t\t\t\t:label=\"hotkey.label\"\n\t\t\t\t:hotkey=\"hotkey.hotkey\" />\n\t\t</NcHotkeyList>\n\n\t\t<NcHotkeyList :label=\"t('files', 'Selection')\">\n\t\t\t<NcHotkey :label=\"t('files', 'Select all files')\" hotkey=\"Control A\" />\n\t\t\t<NcHotkey :label=\"t('files', 'Deselect all')\" hotkey=\"Escape\" />\n\t\t\t<NcHotkey :label=\"t('files', 'Select or deselect')\" hotkey=\"Control Space\" />\n\t\t\t<NcHotkey :label=\"t('files', 'Select a range')\" hotkey=\"Control Shift Space\" />\n\t\t</NcHotkeyList>\n\n\t\t<NcHotkeyList :label=\"t('files', 'Navigation')\">\n\t\t\t<NcHotkey :label=\"t('files', 'Go to parent folder')\" hotkey=\"Alt ArrowUp\" />\n\t\t\t<NcHotkey :label=\"t('files', 'Go to file above')\" hotkey=\"ArrowUp\" />\n\t\t\t<NcHotkey :label=\"t('files', 'Go to file below')\" hotkey=\"ArrowDown\" />\n\t\t\t<NcHotkey :label=\"t('files', 'Go left in grid')\" hotkey=\"ArrowLeft\" />\n\t\t\t<NcHotkey :label=\"t('files', 'Go right in grid')\" hotkey=\"ArrowRight\" />\n\t\t</NcHotkeyList>\n\n\t\t<NcHotkeyList :label=\"t('files', 'View')\">\n\t\t\t<NcHotkey :label=\"t('files', 'Toggle grid view')\" hotkey=\"V\" />\n\t\t\t<NcHotkey :label=\"t('files', 'Show those shortcuts')\" hotkey=\"?\" />\n\t\t</NcHotkeyList>\n\t</NcAppSettingsShortcutsSection>\n</template>\n","<!--\n - SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script lang=\"ts\" setup>\nimport { t } from '@nextcloud/l10n'\nimport NcAppSettingsSection from '@nextcloud/vue/components/NcAppSettingsSection'\nimport NcFormBox from '@nextcloud/vue/components/NcFormBox'\nimport NcFormBoxSwitch from '@nextcloud/vue/components/NcFormBoxSwitch'\nimport { useUserConfigStore } from '../../store/userconfig.ts'\n\nconst store = useUserConfigStore()\n</script>\n\n<template>\n\t<NcAppSettingsSection id=\"warning\" :name=\"t('files', 'Warnings')\">\n\t\t<NcFormBox>\n\t\t\t<NcFormBoxSwitch\n\t\t\t\tv-model=\"store.userConfig.show_dialog_file_extension\"\n\t\t\t\t:label=\"t('files', 'Warn before changing a file extension')\"\n\t\t\t\t@update:modelValue=\"store.update('show_dialog_file_extension', $event)\" />\n\t\t\t<NcFormBoxSwitch\n\t\t\t\tv-model=\"store.userConfig.show_dialog_deletion\"\n\t\t\t\t:label=\"t('files', 'Warn before deleting a file')\"\n\t\t\t\t@update:modelValue=\"store.update('show_dialog_deletion', $event)\" />\n\t\t</NcFormBox>\n\t</NcAppSettingsSection>\n</template>\n","<!--\n - SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script lang=\"ts\" setup>\nimport { getCurrentUser } from '@nextcloud/auth'\nimport { loadState } from '@nextcloud/initial-state'\nimport { t } from '@nextcloud/l10n'\nimport { generateRemoteUrl, generateUrl } from '@nextcloud/router'\nimport NcAppSettingsSection from '@nextcloud/vue/components/NcAppSettingsSection'\nimport NcFormBox from '@nextcloud/vue/components/NcFormBox'\nimport NcFormBoxButton from '@nextcloud/vue/components/NcFormBoxButton'\nimport NcFormBoxCopyButton from '@nextcloud/vue/components/NcFormBoxCopyButton'\n\nconst webDavUrl = generateRemoteUrl('dav/files/' + encodeURIComponent(getCurrentUser()!.uid))\nconst webDavDocsUrl = 'https://docs.nextcloud.com/server/stable/go.php?to=user-webdav'\nconst appPasswordUrl = generateUrl('/settings/user/security#generate-app-token-section')\nconst isTwoFactorEnabled = loadState('files', 'isTwoFactorEnabled', false)\n</script>\n\n<template>\n\t<NcAppSettingsSection id=\"webdav\" name=\"WebDAV\">\n\t\t<NcFormBox>\n\t\t\t<NcFormBoxCopyButton :label=\"t('files', 'WebDAV URL')\" :value=\"webDavUrl\" />\n\t\t\t<NcFormBoxButton\n\t\t\t\tv-if=\"isTwoFactorEnabled\"\n\t\t\t\t:label=\"t('files', 'Create an app password')\"\n\t\t\t\t:description=\"t('files', 'Required for WebDAV authentication because Two-Factor Authentication is enabled for this account.')\"\n\t\t\t\t:href=\"appPasswordUrl\"\n\t\t\t\ttarget=\"_blank\" />\n\t\t\t<NcFormBoxButton\n\t\t\t\t:label=\"t('files', 'How to access files using WebDAV')\"\n\t\t\t\t:href=\"webDavDocsUrl\"\n\t\t\t\ttarget=\"_blank\" />\n\t\t</NcFormBox>\n\t</NcAppSettingsSection>\n</template>\n","<!--\n - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport { t } from '@nextcloud/l10n'\nimport { useHotKey } from '@nextcloud/vue/composables/useHotKey'\nimport { nextTick } from 'vue'\nimport NcAppSettingsDialog from '@nextcloud/vue/components/NcAppSettingsDialog'\nimport FilesAppSettingsAppearance from '../components/FilesAppSettings/FilesAppSettingsAppearance.vue'\nimport FilesAppSettingsGeneral from '../components/FilesAppSettings/FilesAppSettingsGeneral.vue'\nimport FilesAppSettingsLegacyApi from '../components/FilesAppSettings/FilesAppSettingsLegacyApi.vue'\nimport FilesAppSettingsShortcuts from '../components/FilesAppSettings/FilesAppSettingsShortcuts.vue'\nimport FilesAppSettingsWarnings from '../components/FilesAppSettings/FilesAppSettingsWarnings.vue'\nimport FilesAppSettingsWebDav from '../components/FilesAppSettings/FilesAppSettingsWebDav.vue'\n\ndefineProps<{\n\topen: boolean\n}>()\n\nconst emit = defineEmits<{\n\t(e: 'close'): void\n\t(e: 'update:open', open: boolean): void\n}>()\n\n// ? opens the settings dialog on the keyboard shortcuts section\nuseHotKey('?', showKeyboardShortcuts, {\n\tstop: true,\n\tprevent: true,\n})\n\n/**\n * Opens the settings dialog and scrolls to the keyboard shortcuts section\n */\nasync function showKeyboardShortcuts() {\n\temit('update:open', true)\n\n\tawait nextTick()\n\tdocument.getElementById('settings-section_keyboard-shortcuts')!.scrollIntoView({\n\t\tbehavior: 'smooth',\n\t\tinline: 'nearest',\n\t})\n}\n</script>\n\n<template>\n\t<NcAppSettingsDialog\n\t\t:legacy=\"false\"\n\t\t:name=\"t('files', 'Files settings')\"\n\t\tnoVersion\n\t\t:open=\"open\"\n\t\tshowNavigation\n\t\t@update:open=\"emit('close')\">\n\t\t<FilesAppSettingsGeneral />\n\t\t<FilesAppSettingsAppearance />\n\t\t<FilesAppSettingsLegacyApi />\n\t\t<FilesAppSettingsWarnings />\n\t\t<FilesAppSettingsWebDav />\n\t\t<FilesAppSettingsShortcuts />\n\t</NcAppSettingsDialog>\n</template>\n","<!--\n - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n<template>\n\t<NcAppNavigation\n\t\tdata-cy-files-navigation\n\t\tclass=\"files-navigation\"\n\t\t:aria-label=\"t('files', 'Files')\">\n\t\t<template #search>\n\t\t\t<FilesNavigationSearch />\n\t\t</template>\n\t\t<template #default>\n\t\t\t<FilesNavigationList />\n\n\t\t\t<!-- Settings modal-->\n\t\t\t<FilesAppSettings\n\t\t\t\tv-model:open=\"settingsOpened\"\n\t\t\t\tdata-cy-files-navigation-settings\n\t\t\t\t@close=\"settingsOpened = false\" />\n\t\t</template>\n\n\t\t<!-- Non-scrollable navigation bottom elements -->\n\t\t<template #footer>\n\t\t\t<ul class=\"app-navigation-entry__settings\">\n\t\t\t\t<!-- User storage usage statistics -->\n\t\t\t\t<NavigationQuota />\n\n\t\t\t\t<!-- Files settings modal toggle-->\n\t\t\t\t<NcAppNavigationItem\n\t\t\t\t\t:name=\"t('files', 'Files settings')\"\n\t\t\t\t\tdata-cy-files-navigation-settings-button\n\t\t\t\t\t@click.prevent.stop=\"settingsOpened = true\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<IconCog :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcAppNavigationItem>\n\t\t\t</ul>\n\t\t</template>\n\t</NcAppNavigation>\n</template>\n\n<script setup lang=\"ts\">\nimport { emit } from '@nextcloud/event-bus'\nimport { getNavigation } from '@nextcloud/files'\nimport { t } from '@nextcloud/l10n'\nimport { computed, provide, ref, watchEffect } from 'vue'\nimport { useRoute } from 'vue-router'\nimport NcAppNavigation from '@nextcloud/vue/components/NcAppNavigation'\nimport NcAppNavigationItem from '@nextcloud/vue/components/NcAppNavigationItem'\nimport IconCog from 'vue-material-design-icons/CogOutline.vue'\nimport FilesNavigationList from '../components/FilesNavigationList.vue'\nimport FilesNavigationSearch from '../components/FilesNavigationSearch.vue'\nimport NavigationQuota from '../components/NavigationQuota.vue'\nimport FilesAppSettings from './FilesAppSettings.vue'\nimport { useViews } from '../composables/useViews.ts'\nimport { useActiveStore } from '../store/active.ts'\nimport { useSidebarStore } from '../store/sidebar.ts'\nimport { logger } from '../utils/logger.ts'\n\nconst sidebar = useSidebarStore()\nconst activeStore = useActiveStore()\n\nconst settingsOpened = ref(false)\n\nconst allViews = useViews()\n\nconst route = useRoute()\nconst currentViewId = computed(() => route?.params?.view || 'files')\n\nconst currentNavigationViewId = computed(() => {\n\tconst views = allViews.value.filter((view) => view.id === currentViewId.value\n\t\t|| view.params?.view === currentViewId.value)\n\tconst matchingParams = views.filter((view) => view.params\n\t\t&& Object.entries(view.params).every(([key, value]) => {\n\t\t\tif (key in route.params) {\n\t\t\t\treturn route.params[key] === value\n\t\t\t}\n\t\t\treturn route.query[key] === value\n\t\t}))\n\t\t.sort((a, b) => Object.keys(b.params!).length - Object.keys(a.params!).length)\n\t// if we have a full match use that\n\tif (matchingParams.length > 0) {\n\t\treturn matchingParams[0]!.id\n\t}\n\t// otherwise check if at least view + dir matches\n\tconst matchingDir = views.find((view) => view.params?.dir === route.query.dir)\n\tif (matchingDir) {\n\t\treturn matchingDir.id\n\t}\n\t// finally fallback to the parent view\n\treturn views.find((view) => view.id === currentViewId.value)?.id\n})\nprovide('currentNavigationView', currentNavigationViewId)\n\nwatchEffect(() => {\n\tif (currentViewId.value !== activeStore.activeView?.id) {\n\t\tlogger.debug(`Route view id ${currentViewId.value} is different from active view id ${activeStore.activeView?.id}, updating active view...`)\n\t\tconst view = allViews.value.find(({ id }) => id === currentViewId.value)!\n\t\tif (view) {\n\t\t\tsidebar.close()\n\t\t\tgetNavigation().setActive(view.id)\n\t\t\temit('files:navigation:changed', view)\n\t\t}\n\t}\n})\n</script>\n\n<style scoped lang=\"scss\">\n.app-navigation {\n\t:deep(.app-navigation-entry.active .button-vue.icon-collapse:not(:hover)) {\n\t\tcolor: var(--color-primary-element-text);\n\t}\n\n\t> ul.app-navigation__list {\n\t\t// Use flex gap value for more elegant spacing\n\t\tpadding-bottom: var(--default-grid-baseline, 4px);\n\t}\n}\n\n.app-navigation-entry__settings {\n\theight: auto !important;\n\toverflow: hidden !important;\n\tpadding-top: 0 !important;\n\t// Prevent shrinking or growing\n\tflex: 0 0 auto;\n}\n\n.files-navigation {\n\t:deep(.app-navigation__content > ul.app-navigation__list) {\n\t\twill-change: scroll-position;\n\t}\n}\n</style>\n","/**\n * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\nimport type { ActionContextSingle, IFileAction } from '@nextcloud/files'\n\nimport { showError, showSuccess } from '@nextcloud/dialogs'\nimport { NodeStatus } from '@nextcloud/files'\nimport { t } from '@nextcloud/l10n'\nimport { useActiveStore } from '../store/active.ts'\nimport { logger } from '../utils/logger.ts'\n\n/**\n * How the execution of an action was triggered.\n * `hotkey` means the action was triggered by a keyboard shortcut,\n * `menu` means it was triggered from the actions menu or an inline action button.\n */\nexport type ActionTrigger = 'hotkey' | 'menu'\n\n/**\n * Action context enriched with the trigger that started the execution.\n * The trigger is undefined if the action was executed programmatically.\n */\nexport type TriggeredActionContext = ActionContextSingle & { trigger?: ActionTrigger }\n\n/**\n * Execute an action on the current active node\n *\n * @param action The action to execute\n * @param trigger How the execution was triggered\n */\nexport async function executeAction(action: IFileAction, trigger?: ActionTrigger) {\n\tconst activeStore = useActiveStore()\n\tconst currentFolder = activeStore.activeFolder\n\tconst currentNode = activeStore.activeNode\n\tconst currentView = activeStore.activeView\n\n\tif (!currentFolder || !currentNode || !currentView) {\n\t\tlogger.error('No active folder, node or view', { folder: currentFolder, node: currentNode, view: currentView })\n\t\treturn\n\t}\n\n\tif (currentNode.status === NodeStatus.LOADING) {\n\t\tlogger.debug('Node is already loading', { node: currentNode })\n\t\treturn\n\t}\n\n\t// @ts-expect-error _children is private\n\tconst contents = currentFolder?._children || []\n\tconst context = {\n\t\tnodes: [currentNode],\n\t\tview: currentView,\n\t\tfolder: currentFolder,\n\t\tcontents,\n\t\ttrigger,\n\t} as TriggeredActionContext\n\n\tif (!action.enabled!(context)) {\n\t\tlogger.debug('Action is not not available for the current context', { action, node: currentNode, view: currentView })\n\t\treturn\n\t}\n\n\tlet displayName = action.id\n\ttry {\n\t\tdisplayName = action.displayName(context) || displayName\n\t} catch (error) {\n\t\tlogger.error('Error while getting action display name', { action, error })\n\t}\n\n\ttry {\n\t\t// Set the loading marker\n\t\tcurrentNode.status = NodeStatus.LOADING\n\t\tactiveStore.activeAction = action\n\n\t\tconst success = await action.exec(context)\n\n\t\t// If the action returns null, we stay silent\n\t\tif (success === null || success === undefined) {\n\t\t\treturn\n\t\t}\n\n\t\tif (success) {\n\t\t\tshowSuccess(t('files', '{displayName}: done', { displayName }))\n\t\t\treturn\n\t\t}\n\t\tshowError(t('files', '{displayName}: failed', { displayName }))\n\t} catch (error) {\n\t\tlogger.error('Error while executing action', { action, error })\n\t\tshowError(t('files', '{displayName}: failed', { displayName }))\n\t} finally {\n\t\t// Reset the loading marker\n\t\tcurrentNode.status = undefined\n\t\tactiveStore.activeAction = undefined\n\t}\n}\n","/*!\n * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { computed } from 'vue'\nimport { useRoute } from 'vue-router'\n\n/**\n * Get information about the current route\n */\nexport function useRouteParameters() {\n\tconst route = useRoute()\n\n\t/**\n\t * Get the path of the current active directory\n\t */\n\tconst directory = computed<string>(() => String(route.query.dir || '/')\n\t// Remove any trailing slash but leave root slash\n\t\t.replace(/^(.+)\\/$/, '$1'))\n\n\t/**\n\t * Get the current fileId used on the route\n\t */\n\tconst fileId = computed<number | null>(() => {\n\t\tconst fileId = Number.parseInt([route.params.fileid ?? '0'].flat()[0]) || null\n\t\treturn Number.isNaN(fileId) ? null : fileId\n\t})\n\n\t/**\n\t * State of `openFile` route param\n\t */\n\tconst openFile = computed<boolean>(() => 'openfile' in route.query\n\t\t&& (typeof route.query.openfile !== 'string'\n\t\t\t|| route.query.openfile.toLocaleLowerCase() !== 'false'\n\t\t))\n\n\t// if `opendetails` is set it is considered truthy, but allow to explicitly set it to 'false'\n\tconst openDetails = computed<boolean>(() => 'opendetails' in route.query\n\t\t&& (typeof route.query.opendetails !== 'string'\n\t\t\t|| route.query.opendetails.toLocaleLowerCase() !== 'false'\n\t\t))\n\n\treturn {\n\t\t/** Path of currently open directory */\n\t\tdirectory,\n\n\t\t/** Current active fileId */\n\t\tfileId,\n\n\t\t/** Should the active node should be opened (`openFile` route param) */\n\t\topenFile,\n\n\t\t/** Should the details sidebar be shown (`openDetails` route param) */\n\t\topenDetails,\n\t}\n}\n","/*!\n * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { getFileActions } from '@nextcloud/files'\nimport { useHotKey } from '@nextcloud/vue/composables/useHotKey'\nimport { dirname } from 'path'\nimport { useRoute, useRouter } from 'vue-router'\nimport { useUserConfigStore } from '../store/userconfig.ts'\nimport { executeAction } from '../utils/actionUtils.ts'\nimport { logger } from '../utils/logger.ts'\nimport { useRouteParameters } from './useRouteParameters.ts'\n\n/**\n * This register the hotkeys for the Files app.\n * As much as possible, we try to have all the hotkeys in one place.\n * Please make sure to add tests for the hotkeys after adding a new one.\n */\nexport function useHotKeys(): void {\n\tconst userConfigStore = useUserConfigStore()\n\tconst { directory } = useRouteParameters()\n\tconst router = useRouter()\n\tconst route = useRoute()\n\n\tconst actions = getFileActions()\n\tfor (const action of actions) {\n\t\tif (!action.hotkey) {\n\t\t\tcontinue\n\t\t}\n\t\tconst key = action.hotkey.key.match(/^[a-z]$/)\n\t\t\t? action.hotkey.key.toUpperCase()\n\t\t\t: action.hotkey.key\n\n\t\tlogger.debug(`Register hotkey for action \"${action.id}\"`)\n\t\tuseHotKey(key, () => executeAction(action, 'hotkey'), {\n\t\t\tstop: true,\n\t\t\tprevent: true,\n\t\t\talt: action.hotkey.alt,\n\t\t\tctrl: action.hotkey.ctrl,\n\t\t\tshift: action.hotkey.shift,\n\t\t})\n\t}\n\n\t// alt+up go to parent directory\n\tuseHotKey('ArrowUp', goToParentDir, {\n\t\tstop: true,\n\t\tprevent: true,\n\t\talt: true,\n\t})\n\n\t// v toggle grid view\n\tuseHotKey('v', toggleGridView, {\n\t\tstop: true,\n\t\tprevent: true,\n\t})\n\n\tlogger.debug('Hotkeys registered')\n\n\t/**\n\t * Use the router to go to the parent directory\n\t */\n\tfunction goToParentDir() {\n\t\tconst dir = dirname(directory.value)\n\n\t\tlogger.debug('Navigating to parent directory', { dir })\n\t\trouter.push({ params: { ...route.params }, query: { ...route.query, dir } })\n\t}\n\n\t/**\n\t * Toggle the grid view\n\t */\n\tfunction toggleGridView() {\n\t\tconst value = userConfigStore.userConfig.grid_view\n\t\tlogger.debug('Toggling grid view', { old: value, new: !value })\n\t\tuserConfigStore.update('grid_view', !value)\n\t}\n}\n","<!--\n - SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n -->\n<template>\n\t<NcContent appName=\"files\">\n\t\t<FilesNavigation v-if=\"!isPublic\" />\n\t\t<RouterView />\n\t\t<FilesSidebar v-if=\"!isPublic\" />\n\t</NcContent>\n</template>\n\n<script setup lang=\"ts\">\nimport { isPublicShare } from '@nextcloud/sharing/public'\nimport NcContent from '@nextcloud/vue/components/NcContent'\nimport FilesNavigation from './views/FilesNavigation.vue'\nimport FilesSidebar from './views/FilesSidebar.vue'\nimport { useHotKeys } from './composables/useHotKeys.ts'\n\nuseHotKeys()\n\nconst isPublic = isPublicShare()\n</script>\n","/**\n * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nexport interface SettingData {\n\tel: () => HTMLElement\n\topen?: () => void\n\tclose?: () => void\n\torder?: number\n}\n\nexport default class Setting {\n\t#name: string\n\t#options: Required<SettingData>\n\n\t/**\n\t * Create a new files app setting\n\t *\n\t * @param name - The name of this setting\n\t * @param options - The setting options\n\t * @param options.el - Function that returns an unmounted dom element to be added\n\t * @param options.open - Callback for when setting is added\n\t * @param options.close - Callback for when setting is closed\n\t * @param options.order - The order of this setting, lower numbers are shown first\n\t * @since 19.0.0\n\t */\n\tconstructor(name: string, options: SettingData) {\n\t\tthis.#name = name\n\t\tthis.#options = {\n\t\t\topen: () => {},\n\t\t\tclose: () => {},\n\t\t\torder: 0,\n\t\t\t...options,\n\t\t}\n\n\t\tif (typeof this.#options.el !== 'function') {\n\t\t\tthrow new Error('Setting must have an `el` function that returns a DOM element')\n\t\t}\n\n\t\tif (typeof this.#name !== 'string') {\n\t\t\tthrow new Error('Setting must have a `name` string')\n\t\t}\n\n\t\tif (typeof this.#options.order !== 'number') {\n\t\t\tthrow new Error('Setting must have an `order` number')\n\t\t}\n\t}\n\n\tget name() {\n\t\treturn this.#name\n\t}\n\n\tget el() {\n\t\treturn this.#options.el\n\t}\n\n\tget open() {\n\t\treturn this.#options.open\n\t}\n\n\tget close() {\n\t\treturn this.#options.close\n\t}\n\n\tget order() {\n\t\treturn this.#options.order\n\t}\n}\n","/*\n * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { INode } from '@nextcloud/files'\n\nimport { subscribe } from '@nextcloud/event-bus'\nimport { generateUrl } from '@nextcloud/router'\nimport { relative } from 'path'\nimport { createRouter, createWebHistory, isNavigationFailure, NavigationFailureType, stringifyQuery } from 'vue-router'\nimport { useFilesStore } from '../store/files.ts'\nimport { pinia } from '../store/index.ts'\nimport { usePathsStore } from '../store/paths.ts'\nimport { defaultView } from '../utils/filesViews.ts'\nimport { logger } from '../utils/logger.ts'\n\nconst FilesListComponent = () => import('../views/FilesList.vue')\n\n/**\n * Stringify the query the way Nextcloud URLs have always looked: spaces as\n * \"%20\" rather than \"+\". A literal \"+\" is already encoded as \"%2B\" by then, so\n * this cannot corrupt a file name.\n *\n * @param query - The query to stringify\n */\nfunction stringifyNextcloudQuery(query: Parameters<typeof stringifyQuery>[0]): string {\n\treturn stringifyQuery(query).replace(/\\+/g, '%20')\n}\n\nexport const router = createRouter({\n\t// if index.php is in the url AND we got this far, then it's working:\n\t// let's keep using index.php in the url\n\thistory: createWebHistory(generateUrl('/apps/files')),\n\tlinkActiveClass: 'active',\n\tstringifyQuery: stringifyNextcloudQuery,\n\troutes: [\n\t\t{\n\t\t\tpath: '/',\n\t\t\t// Pretending we're using the default view\n\t\t\tredirect: { name: 'filelist', params: { view: defaultView() } },\n\t\t},\n\t\t{\n\t\t\tpath: '/:view/:fileid(\\\\d+)?',\n\t\t\tname: 'filelist',\n\t\t\tprops: true,\n\t\t\tcomponent: FilesListComponent,\n\t\t},\n\t],\n})\n\n// Handle aborted navigation (NavigationGuards) gracefully\nrouter.onError((error) => {\n\tif (isNavigationFailure(error, NavigationFailureType.aborted)) {\n\t\tlogger.debug('Navigation was aborted', { error })\n\t} else {\n\t\tthrow error\n\t}\n})\n\n// If navigating back from a folder to a parent folder,\n// we need to keep the current dir fileid so it's highlighted\n// and scrolled into view.\nrouter.beforeResolve((to, from) => {\n\tif (to.params.view !== from.params.view) {\n\t\t// skip if different views\n\t\treturn\n\t}\n\n\tconst fromDir = (from.query?.dir || '/') as string\n\tconst toDir = (to.query?.dir || '/') as string\n\n\t// We are going back to a parent directory\n\tif (relative(fromDir, toDir) === '..') {\n\t\tconst { getNode } = useFilesStore()\n\t\tconst { getPath } = usePathsStore()\n\n\t\tif (!from.params.view) {\n\t\t\tlogger.error('No current view id found, cannot navigate to parent directory', { fromDir, toDir })\n\t\t\treturn\n\t\t}\n\n\t\t// Get the previous parent's file id\n\t\tconst fromSource = getPath(from.params.view as string, fromDir)\n\t\tif (!fromSource) {\n\t\t\tlogger.error('No source found for the parent directory', { fromDir, toDir })\n\t\t\treturn\n\t\t}\n\n\t\tconst fileId = getNode(fromSource)?.fileid\n\t\tif (to.params.fileid === String(fileId)) {\n\t\t\t// prevent infinite loop of navigating to the same parent directory\n\t\t\treturn\n\t\t}\n\n\t\tif (!fileId) {\n\t\t\tlogger.error('No fileid found for the parent directory', { fromDir, toDir, fromSource })\n\t\t\treturn\n\t\t}\n\n\t\tlogger.debug('Navigating back to parent directory', { fromDir, toDir, fileId })\n\t\treturn {\n\t\t\tname: 'filelist',\n\t\t\tquery: to.query,\n\t\t\tparams: {\n\t\t\t\t...to.params,\n\t\t\t\tfileid: String(fileId),\n\t\t\t},\n\t\t\t// Replace the current history entry\n\t\t\treplace: true,\n\t\t}\n\t}\n})\n\n// Navigate through the router service, so stores reacting to the same deletion\n// (e.g. the sidebar closing) build on this navigation instead of the outdated route.\nsubscribe('files:node:deleted', (node: INode) => {\n\tconst { Router } = window.OCP.Files\n\tif (Router.params.fileid === String(node.fileid)) {\n\t\tconst params = { ...Router.params }\n\t\tconst { getPath } = usePathsStore(pinia)\n\t\tconst { getNode } = useFilesStore(pinia)\n\t\tconst source = getPath(Router.params.view, node.dirname)\n\t\tconst parentFolder = getNode(source!)\n\t\tif (source && parentFolder) {\n\t\t\tparams.fileid = String(parentFolder.fileid)\n\t\t} else {\n\t\t\tdelete params.fileid\n\t\t}\n\n\t\tconst query = { ...Router.query }\n\t\tdelete query.opendetails\n\t\tdelete query.openfile\n\n\t\tRouter.goToRoute(null, params, query, true)\n\t}\n})\n","/*!\n * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { Location, Route } from 'vue-router'\nimport type VueRouter from 'vue-router'\n\nimport { unref } from 'vue'\n\nexport default class RouterService {\n\t// typescript compiles this to `#router` to make it private even in JS,\n\t// but in TS it needs to be called without the visibility specifier\n\tprivate router: VueRouter\n\n\t/**\n\t * The location of a navigation that was requested but is not applied yet.\n\t *\n\t * vue-router applies navigations asynchronously, so `currentRoute` still\n\t * holds the previous route until the navigation resolves. Several stores\n\t * react to the same state change and each merges its own change into the\n\t * route it reads here, so without this they would all read the route from\n\t * before the first navigation and overwrite each other's parameters.\n\t */\n\tprivate pendingLocation?: Location\n\n\tconstructor(router: VueRouter) {\n\t\tthis.router = router\n\t}\n\n\t/**\n\t * The route the wrapped router is currently on.\n\t *\n\t * This service is shared between the files app (vue-router 5, where\n\t * `currentRoute` is a ref) and the public share bundle (vue-router 3, where\n\t * it is the route itself), so the value has to be unwrapped.\n\t */\n\tprivate get route(): Route {\n\t\treturn unref(this.router.currentRoute) as Route\n\t}\n\n\tget name(): string | null | undefined {\n\t\treturn this.pendingLocation?.name ?? this.route.name\n\t}\n\n\tget query(): Record<string, string | (string | null)[] | null | undefined> {\n\t\treturn this.pendingLocation?.query ?? this.route.query ?? {}\n\t}\n\n\tget params(): Record<string, string> {\n\t\treturn (this.pendingLocation?.params ?? this.route.params ?? {}) as Record<string, string>\n\t}\n\n\t/**\n\t * This is a protected getter only for internal use\n\t *\n\t */\n\tget _router() {\n\t\treturn this.router\n\t}\n\n\t/**\n\t * Trigger a route change on the files app\n\t *\n\t * @param path the url path, eg: '/trashbin?dir=/Deleted'\n\t * @param replace replace the current history\n\t * @see https://router.vuejs.org/guide/essentials/navigation.html#navigate-to-a-different-location\n\t */\n\tgoTo(path: string, replace = false): Promise<Route> {\n\t\tthis.pendingLocation = undefined\n\t\treturn this.router.push({\n\t\t\tpath,\n\t\t\treplace,\n\t\t})\n\t}\n\n\t/**\n\t * Trigger a route change on the files App\n\t *\n\t * @param name - The route name or null to keep current route and just update params/query\n\t * @param params the route parameters\n\t * @param query the url query parameters\n\t * @param replace replace the current history\n\t * @see https://router.vuejs.org/guide/essentials/navigation.html#navigate-to-a-different-location\n\t */\n\tgoToRoute(\n\t\tname: string | null,\n\t\tparams: Record<string, string>,\n\t\tquery?: Record<string, string | (string | null)[] | null | undefined>,\n\t\treplace?: boolean,\n\t): Promise<Route> {\n\t\tname ??= this.name as string\n\t\tconst location: Location = { name, query, params }\n\t\tthis.pendingLocation = location\n\n\t\tconst navigation = replace\n\t\t\t? this._router.replace(location)\n\t\t\t: this._router.push(location)\n\n\t\treturn navigation.finally(() => {\n\t\t\t// only the newest request may clear it, an older one is already obsolete\n\t\t\tif (this.pendingLocation === location) {\n\t\t\t\tthis.pendingLocation = undefined\n\t\t\t}\n\t\t})\n\t}\n}\n","/**\n * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { logger } from '../utils/logger.ts'\n\nexport default class Settings {\n\t_settings\n\n\tconstructor() {\n\t\tthis._settings = []\n\t\tlogger.debug('OCA.Files.Settings initialized')\n\t}\n\n\t/**\n\t * Register a new setting\n\t *\n\t * @since 19.0.0\n\t * @param {OCA.Files.Settings.Setting} view element to add to settings\n\t * @return {boolean} whether registering was successful\n\t */\n\tregister(view) {\n\t\tif (this._settings.filter((e) => e.name === view.name).length > 0) {\n\t\t\tlogger.error('A setting with the same name is already registered')\n\t\t\treturn false\n\t\t}\n\t\tthis._settings.push(view)\n\t\treturn true\n\t}\n\n\t/**\n\t * All settings elements\n\t *\n\t * @return {OCA.Files.Settings.Setting[]} All currently registered settings\n\t */\n\tget settings() {\n\t\treturn this._settings\n\t}\n}\n","/*!\n * SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { INode } from '@nextcloud/files'\nimport type { Pinia } from 'pinia'\nimport type { ISidebarDataProvider } from '../types.ts'\n\nimport { subscribe } from '@nextcloud/event-bus'\nimport { computed } from 'vue'\nimport { fetchNode } from '../../services/WebdavClient.ts'\nimport { useActiveStore } from '../../store/active.ts'\nimport { useFilesStore } from '../../store/files.ts'\nimport { pinia as filesPinia } from '../../store/index.ts'\nimport { useSidebarStore } from '../../store/sidebar.ts'\nimport { logger } from '../../utils/logger.ts'\n\n/**\n * Create the data provider used when the sidebar is rendered by the files app.\n *\n * The sidebar follows the state of the files app: it renders the active node\n * within the active folder and view, and keeps the current URL in sync.\n *\n * @param pinia - The pinia instance of the files app\n */\nexport function createFilesStoreDataProvider(pinia: Pinia = filesPinia): ISidebarDataProvider {\n\tconst node = computed(() => useActiveStore(pinia).activeNode)\n\tconst folder = computed(() => useActiveStore(pinia).activeFolder)\n\tconst view = computed(() => useActiveStore(pinia).activeView)\n\n\t/**\n\t * Make the node the active node of the files app.\n\t *\n\t * @param newNode - The node to render the sidebar for\n\t */\n\tfunction setNode(newNode?: INode): void {\n\t\tconst activeStore = useActiveStore(pinia)\n\t\tif (newNode && !activeStore.activeView) {\n\t\t\tlogger.debug('sidebar: opening without an active view', { node: newNode })\n\t\t}\n\n\t\tactiveStore.activeNode = newNode\n\t}\n\n\t/**\n\t * Keep the `opendetails` query parameter in sync with the open state,\n\t * so the sidebar can be restored when the URL is shared or reloaded.\n\t *\n\t * @param isOpen - The new open state\n\t */\n\tfunction onOpenStateChanged(isOpen: boolean): void {\n\t\tconst params = { ...(window.OCP?.Files?.Router?.params ?? {}) }\n\t\tconst query = { ...(window.OCP?.Files?.Router?.query ?? {}) }\n\n\t\tlogger.debug(`sidebar: ${isOpen ? 'opened' : 'closed'}`, { query, params })\n\t\tif (!isOpen && ('opendetails' in query)) {\n\t\t\tdelete query.opendetails\n\t\t\twindow.OCP.Files.Router.goToRoute(\n\t\t\t\tnull,\n\t\t\t\tparams,\n\t\t\t\tquery,\n\t\t\t\ttrue,\n\t\t\t)\n\t\t}\n\n\t\tif (isOpen && !('opendetails' in query)) {\n\t\t\twindow.OCP.Files.Router.goToRoute(\n\t\t\t\tnull,\n\t\t\t\tparams,\n\t\t\t\t{\n\t\t\t\t\t...query,\n\t\t\t\t\topendetails: 'true',\n\t\t\t\t},\n\t\t\t\ttrue,\n\t\t\t)\n\t\t}\n\t}\n\n\tlet routerHookRegistered = false\n\t// close the sidebar when the `opendetails` parameter is removed from the URL,\n\t// the router is only available once the files app is mounted\n\tsubscribe('files:list:updated', () => {\n\t\tif (routerHookRegistered) {\n\t\t\treturn\n\t\t}\n\n\t\trouterHookRegistered = true\n\t\twindow.OCP.Files.Router._router.afterEach((to, from) => {\n\t\t\tif ((from.query && ('opendetails' in from.query))\n\t\t\t\t&& (to.query && !('opendetails' in to.query))) {\n\t\t\t\tlogger.debug('sidebar: closing because \"opendetails\" query parameter was removed from URL.')\n\t\t\t\tuseSidebarStore(pinia).close()\n\t\t\t}\n\t\t})\n\t})\n\n\tsubscribe('viewer:sidebar:open', async ({ source, path }) => {\n\t\tlogger.debug('sidebar: opening for node from Viewer.', { source })\n\t\ttry {\n\t\t\t// Currently (as of Nextcloud 35) the viewer not fully uses the Node API\n\t\t\t// the emitted node is only partially filled, so we need to resolve it to a full node.\n\t\t\tconst node = useFilesStore(pinia).getNode(source)\n\t\t\t\t?? await fetchNode(path)\n\t\t\tif (!node) {\n\t\t\t\tthrow new Error(`Node '${source}' could not be resolved`)\n\t\t\t}\n\n\t\t\tuseSidebarStore(pinia).open(node)\n\t\t} catch (error) {\n\t\t\tlogger.error('sidebar: could not open for the node from the Viewer.', { error, source })\n\t\t}\n\t})\n\n\treturn {\n\t\tnode,\n\t\tfolder,\n\t\tview,\n\n\t\tsetNode,\n\t\tonOpenStateChanged,\n\t}\n}\n","/**\n * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { isPublicShare } from '@nextcloud/sharing/public'\nimport { createApp } from 'vue'\nimport FilesApp from './FilesApp.vue'\nimport SettingsModel from './models/Setting.ts'\nimport { router } from './router/router.ts'\nimport RouterService from './services/RouterService.ts'\nimport SettingsService from './services/Settings.js'\nimport { setSidebarDataProvider } from './sidebar/provider.ts'\nimport { createFilesStoreDataProvider } from './sidebar/providers/filesStore.ts'\nimport { exposeSidebarApi } from './sidebar/setup.ts'\nimport { pinia } from './store/index.ts'\n\nimport 'vite/modulepreload-polyfill'\n\n// Init private and public Files namespace\nwindow.OCA.Files = window.OCA.Files ?? {}\nwindow.OCP.Files = window.OCP.Files ?? {}\n\n// Expose router\nif (!window.OCP.Files.Router) {\n\tconst Router = new RouterService(router)\n\tObject.assign(window.OCP.Files, { Router })\n}\n\n// The files app renders the sidebar itself, so it also provides the sidebar data.\n// Same condition as for rendering it in `FilesApp.vue`.\nif (!isPublicShare()) {\n\tsetSidebarDataProvider(createFilesStoreDataProvider())\n\texposeSidebarApi()\n}\n\n// Init Files App Settings Service\nconst Settings = new SettingsService()\nObject.assign(window.OCA.Files, { Settings })\nObject.assign(window.OCA.Files.Settings, { Setting: SettingsModel })\n\nconst app = createApp(FilesApp)\napp.use(pinia)\napp.use((window.OCP.Files.Router as RouterService)._router)\napp.mount('#content')\n"],"file":"files-main.mjs"}