nextcloud-server/dist/files-settings-admin.js

2 lines
22 KiB
JavaScript

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

(()=>{var t,e,n,i={15340:()=>{},39656:(t,e,n)=>{"use strict";var i=n(21777),s=n(53334),a=n(85471),o=n(19051),r=n(85168),l=n(81222),c=n(63814),d=n(32073),u=n(88837),f=n(74095),p=n(16879),m=n(88289),g=n(31133),v=n(95101);const h=(0,n(35947).YK)().setApp("files").detectUser().build();var b;!function(t){t[t.Unknown=0]="Unknown",t[t.Scheduled=1]="Scheduled",t[t.Running=2]="Running",t[t.Done=3]="Done",t[t.Error=4]="Error"}(b||(b={}));const A=(0,a.pM)({__name:"SettingsSanitizeFilenames",setup(t){const{status:e}=(0,l.C)("files","filesCompatibilitySettings"),n=(0,a.KR)(!1),i=(0,a.KR)(10),d=(0,a.KR)(e.status),u=(0,a.KR)(e.processed),A=(0,a.KR)(e.total),S=(0,a.IJ)(e.errors||{}),y=(0,a.EW)(()=>u.value>0?Math.round(100*u.value/A.value):0),w=(0,a.EW)(()=>d.value===b.Scheduled||d.value===b.Running);return{__sfc:!0,initialStatus:e,loading:n,renameLimit:i,status:d,processedUsers:u,totalUsers:A,errors:S,progress:y,isRunning:w,startSanitization:async function(){if(!w.value)try{n.value=!0,await o.Ay.post((0,c.KT)("apps/files/api/v1/filenames/sanitization"),{limit:i.value}),d.value=b.Scheduled}catch(t){h.error("Failed to start filename sanitization.",{error:t}),(0,o.F0)(t)&&t.response?.data?.ocs?(0,r.Qg)(t.response.data.ocs.meta.message):(0,r.Qg)((0,s.t)("files","Failed to start filename sanitization."))}finally{n.value=!1}},refreshStatus:async function(){if(!n.value)try{n.value=!0;const{data:t}=await o.Ay.get((0,c.KT)("apps/files/api/v1/filenames/sanitization"));d.value=t.ocs.data.status,A.value=t.ocs.data.total,u.value=t.ocs.data.processed,S.value=t.ocs.data.errors||{}}catch(t){h.error("Failed to refresh filename sanitization status.",{error:t}),(0,r.Qg)((0,s.t)("files","Failed to refresh filename sanitization status."))}finally{n.value=!1}},t:s.t,NcButton:f.A,NcInputField:p.A,NcLoadingIcon:m.A,NcNoteCard:g.A,NcProgressBar:v.A,SanitizeFilenameStatus:b}}});var S=n(85072),y=n.n(S),w=n(97825),_=n.n(w),x=n(77659),C=n.n(x),N=n(55056),z=n.n(N),k=n(10540),F=n.n(k),R=n(41113),U=n.n(R),W=n(46549),E={};E.styleTagTransform=U(),E.setAttributes=z(),E.insert=C().bind(null,"head"),E.domAPI=_(),E.insertStyleElement=F(),y()(W.A,E),W.A&&W.A.locals&&W.A.locals;var P=n(14486);const O=(0,P.A)(A,function(){var t=this,e=t._self._c,n=t._self._setupProxy;return n.isRunning?e(n.NcNoteCard,[e("div",{staticClass:"sanitize-filenames__progress-container"},[e("p",[t._v("\n\t\t\t"+t._s(n.t("files","Filename sanitization in progress."))+"\n\t\t\t"),e("br"),t._v(" "),n.processedUsers>0?[t._v("\n\t\t\t\t"+t._s(n.t("files","Currently {processedUsers} of {totalUsers} accounts are already processed.",{processedUsers:n.processedUsers,totalUsers:n.totalUsers}))+"\n\t\t\t")]:[t._v("\n\t\t\t\t"+t._s(n.t("files","Preparing …"))+"\n\t\t\t")]],2),t._v(" "),e(n.NcProgressBar,{attrs:{value:n.progress,size:12}}),t._v(" "),e(n.NcButton,{attrs:{variant:"tertiary"},on:{click:n.refreshStatus},scopedSlots:t._u([n.loading?{key:"icon",fn:function(){return[e(n.NcLoadingIcon)]},proxy:!0}:null],null,!0)},[t._v("\n\t\t\t"+t._s(n.t("files","Refresh"))+"\n\t\t")])],1)]):n.status===n.SanitizeFilenameStatus.Done?e(n.NcNoteCard,{attrs:{type:"success"}},[t._v("\n\t"+t._s(n.t("files","All files have been santized for Windows filename support."))+"\n")]):e("form",{staticClass:"sanitize-filenames__form",attrs:{disabled:n.loading},on:{submit:function(t){return t.stopPropagation(),t.preventDefault(),n.startSanitization.apply(null,arguments)}}},[n.status===n.SanitizeFilenameStatus.Error?e(n.NcNoteCard,{attrs:{type:"error"}},[t._v("\n\t\t"+t._s(n.t("files","Some files could not be sanitized, please check your logs."))+"\n\t\t"),e("ul",{staticClass:"sanitize-filenames__errors",attrs:{"aria-label":n.t("files","Sanitization errors")}},t._l(Object.entries(n.errors),function([i,s]){return e("li",{key:i},[e("h4",[t._v(t._s(i)+":")]),t._v(" "),e("ul",{attrs:{"aria-label":n.t("files","Not sanitized filenames")}},t._l(s,function(n){return e("li",{key:n},[t._v("\n\t\t\t\t\t\t"+t._s(n)+"\n\t\t\t\t\t")])}),0)])}),0)]):t._e(),t._v(" "),e(n.NcNoteCard,[t._v("\n\t\t"+t._s(n.t("files","Windows filename support has been enabled."))+"\n\t\t"),e("br"),t._v("\n\t\t"+t._s(n.t("files","While this blocks users from creating new files with unsupported filenames, existing files are not yet renamed and thus still may break sync on Windows."))+"\n\t\t"+t._s(n.t("files","You can trigger a rename of files with invalid filenames, this will be done in the background and may take some time."))+"\n\t\t"+t._s(n.t("files","Please note that this may cause high workload on the sync clients."))+"\n\t")]),t._v(" "),e("fieldset",{staticClass:"sanitize-filenames__fields"},[e(n.NcInputField,{attrs:{label:n.t("files","Limit"),"helper-text":n.t("files","This allows to configure how many users should be processed in one background job run."),min:"1",type:"number"},model:{value:n.renameLimit,callback:function(t){n.renameLimit=t},expression:"renameLimit"}}),t._v(" "),e(n.NcButton,{attrs:{type:"submit",variant:"error"},scopedSlots:t._u([n.loading?{key:"icon",fn:function(){return[e(n.NcLoadingIcon)]},proxy:!0}:null],null,!0)},[t._v("\n\t\t\t"+t._s(n.t("files","Sanitize filenames"))+"\n\t\t\t"),n.loading?e("span",{staticClass:"hidden-visually"},[t._v("\n\t\t\t\t"+t._s(n.t("files","(starting)"))+"\n\t\t\t")]):t._e()])],1)],1)},[],!1,null,"3c9d3bfa",null).exports,B=(0,a.pM)({__name:"SettingsAdmin",setup(t){const{docUrl:e,isRunningSanitization:n,windowsSupport:i}=(0,l.C)("files","filesCompatibilitySettings"),f=(0,s.t)("files","Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed.")+"\n"+(0,s.t)("files","After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner."),p=(0,a.KR)(!1),m=(0,a.KR)(i);return{__sfc:!0,docUrl:e,isRunningSanitization:n,windowsSupport:i,description:f,loading:p,hasWindowsSupport:m,toggleWindowsFilenameSupport:async function(t){if(!p.value)try{p.value=!0,await o.Ay.post((0,c.KT)("apps/files/api/v1/filenames/windows-compatibility"),{enabled:t}),m.value=t}catch(t){(0,r.Qg)((0,s.t)("files","Failed to toggle Windows filename support")),h.error("Failed to toggle Windows filename support",{error:t})}finally{p.value=!1}},t:s.t,NcCheckboxRadioSwitch:d.A,NcSettingsSection:u.A,SettingsSanitizeFilenames:O}}});var L=n(48081),T={};T.styleTagTransform=U(),T.setAttributes=z(),T.insert=C().bind(null,"head"),T.domAPI=_(),T.insertStyleElement=F(),y()(L.A,T),L.A&&L.A.locals&&L.A.locals;const I=(0,P.A)(B,function(){var t=this,e=t._self._c,n=t._self._setupProxy;return e(n.NcSettingsSection,{attrs:{"doc-url":n.docUrl,name:n.t("files","Files compatibility"),description:n.description}},[e(n.NcCheckboxRadioSwitch,{attrs:{"model-value":n.hasWindowsSupport,disabled:n.isRunningSanitization,loading:n.loading,type:"switch"},on:{"update:model-value":n.toggleWindowsFilenameSupport}},[t._v("\n\t\t"+t._s(n.t("files","Enforce Windows compatibility"))+"\n\t")]),t._v(" "),e("p",{staticClass:"hint"},[t._v("\n\t\t"+t._s(n.t("files","This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity."))+"\n\t")]),t._v(" "),n.hasWindowsSupport?e(n.SettingsSanitizeFilenames):t._e()],1)},[],!1,null,"269e4f0c",null).exports;n.nc=(0,i.aV)(),a.Ay.prototype.t=s.t,(new(a.Ay.extend(I))).$mount("#files-admin-settings")},46549:(t,e,n)=>{"use strict";n.d(e,{A:()=>r});var i=n(71354),s=n.n(i),a=n(76314),o=n.n(a)()(s());o.push([t.id,"\n.sanitize-filenames__progress-container[data-v-3c9d3bfa] {\n\talign-items: end;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--default-grid-baseline);\n}\n.sanitize-filenames__form[data-v-3c9d3bfa] {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--default-grid-baseline);\n}\n.sanitize-filenames__fields[data-v-3c9d3bfa] {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--default-grid-baseline);\n\n\talign-items: end;\n\tmax-width: 400px;\n}\n","",{version:3,sources:["webpack://./apps/files/src/components/Settings/SettingsSanitizeFilenames.vue"],names:[],mappings:";AAkKA;CACA,gBAAA;CACA,aAAA;CACA,sBAAA;CACA,iCAAA;AACA;AAEA;CACA,aAAA;CACA,sBAAA;CACA,iCAAA;AACA;AAEA;CACA,aAAA;CACA,sBAAA;CACA,iCAAA;;CAEA,gBAAA;CACA,gBAAA;AACA",sourcesContent:["\x3c!--\n - SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n--\x3e\n\n<script setup lang=\"ts\">\nimport type { OCSResponse } from '@nextcloud/typings/ocs'\n\nimport axios, { isAxiosError } from '@nextcloud/axios'\nimport { showError } from '@nextcloud/dialogs'\nimport { loadState } from '@nextcloud/initial-state'\nimport { t } from '@nextcloud/l10n'\nimport { generateOcsUrl } from '@nextcloud/router'\nimport { computed, ref, shallowRef } from 'vue'\nimport NcButton from '@nextcloud/vue/components/NcButton'\nimport NcInputField from '@nextcloud/vue/components/NcInputField'\nimport NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'\nimport NcNoteCard from '@nextcloud/vue/components/NcNoteCard'\nimport NcProgressBar from '@nextcloud/vue/components/NcProgressBar'\nimport logger from '../../logger.ts'\nimport { SanitizeFilenameStatus } from '../../models/SanitizeFilenameStatus.ts'\n\ntype ApiStatus = { total: number, processed: number, errors?: Record<string, string[]>, status: SanitizeFilenameStatus }\n\nconst { status: initialStatus } = loadState<{ isRunningSanitization: boolean, status: ApiStatus }>('files', 'filesCompatibilitySettings')\n\nconst loading = ref(false)\nconst renameLimit = ref(10)\nconst status = ref(initialStatus.status)\nconst processedUsers = ref(initialStatus.processed)\nconst totalUsers = ref(initialStatus.total)\nconst errors = shallowRef<ApiStatus['errors']>(initialStatus.errors || {})\n\nconst progress = computed(() => processedUsers.value > 0 ? Math.round((processedUsers.value * 100) / totalUsers.value) : 0)\nconst isRunning = computed(() => status.value === SanitizeFilenameStatus.Scheduled || status.value === SanitizeFilenameStatus.Running)\n\n/**\n * Start the sanitization process\n */\nasync function startSanitization() {\n\tif (isRunning.value) {\n\t\treturn\n\t}\n\n\ttry {\n\t\tloading.value = true\n\t\tawait axios.post(generateOcsUrl('apps/files/api/v1/filenames/sanitization'), {\n\t\t\tlimit: renameLimit.value,\n\t\t})\n\t\tstatus.value = SanitizeFilenameStatus.Scheduled\n\t} catch (error) {\n\t\tlogger.error('Failed to start filename sanitization.', { error })\n\n\t\tif (isAxiosError(error) && error.response?.data?.ocs) {\n\t\t\tshowError((error.response.data as OCSResponse).ocs.meta.message!)\n\t\t} else {\n\t\t\tshowError(t('files', 'Failed to start filename sanitization.'))\n\t\t}\n\t} finally {\n\t\tloading.value = false\n\t}\n}\n\n/**\n * Refresh the filename sanitization status\n */\nasync function refreshStatus() {\n\tif (loading.value) {\n\t\treturn\n\t}\n\n\ttry {\n\t\tloading.value = true\n\t\tconst { data } = await axios.get<OCSResponse<ApiStatus>>(generateOcsUrl('apps/files/api/v1/filenames/sanitization'))\n\t\tstatus.value = data.ocs.data.status\n\t\ttotalUsers.value = data.ocs.data.total\n\t\tprocessedUsers.value = data.ocs.data.processed\n\t\terrors.value = data.ocs.data.errors || {}\n\t} catch (error) {\n\t\tlogger.error('Failed to refresh filename sanitization status.', { error })\n\t\tshowError(t('files', 'Failed to refresh filename sanitization status.'))\n\t} finally {\n\t\tloading.value = false\n\t}\n}\n<\/script>\n\n<template>\n\t<NcNoteCard v-if=\"isRunning\">\n\t\t<div class=\"sanitize-filenames__progress-container\">\n\t\t\t<p>\n\t\t\t\t{{ t('files', 'Filename sanitization in progress.') }}\n\t\t\t\t<br>\n\t\t\t\t<template v-if=\"processedUsers > 0\">\n\t\t\t\t\t{{ t('files', 'Currently {processedUsers} of {totalUsers} accounts are already processed.', { processedUsers, totalUsers }) }}\n\t\t\t\t</template>\n\t\t\t\t<template v-else>\n\t\t\t\t\t{{ t('files', 'Preparing …') }}\n\t\t\t\t</template>\n\t\t\t</p>\n\t\t\t<NcProgressBar :value=\"progress\" :size=\"12\" />\n\t\t\t<NcButton variant=\"tertiary\" @click=\"refreshStatus\">\n\t\t\t\t<template v-if=\"loading\" #icon>\n\t\t\t\t\t<NcLoadingIcon />\n\t\t\t\t</template>\n\t\t\t\t{{ t('files', 'Refresh') }}\n\t\t\t</NcButton>\n\t\t</div>\n\t</NcNoteCard>\n\n\t<NcNoteCard v-else-if=\"status === SanitizeFilenameStatus.Done\" type=\"success\">\n\t\t{{ t('files', 'All files have been santized for Windows filename support.') }}\n\t</NcNoteCard>\n\n\t<form\n\t\tv-else\n\t\tclass=\"sanitize-filenames__form\"\n\t\t:disabled=\"loading\"\n\t\t@submit.stop.prevent=\"startSanitization\">\n\t\t<NcNoteCard v-if=\"status === SanitizeFilenameStatus.Error\" type=\"error\">\n\t\t\t{{ t('files', 'Some files could not be sanitized, please check your logs.') }}\n\t\t\t<ul class=\"sanitize-filenames__errors\" :aria-label=\"t('files', 'Sanitization errors')\">\n\t\t\t\t<li v-for=\"[user, failedFiles] of Object.entries(errors)\" :key=\"user\">\n\t\t\t\t\t<h4>{{ user }}:</h4>\n\t\t\t\t\t<ul :aria-label=\"t('files', 'Not sanitized filenames')\">\n\t\t\t\t\t\t<li v-for=\"file of failedFiles\" :key=\"file\">\n\t\t\t\t\t\t\t{{ file }}\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t</NcNoteCard>\n\t\t<NcNoteCard>\n\t\t\t{{ t('files', 'Windows filename support has been enabled.') }}\n\t\t\t<br>\n\t\t\t{{ t('files', 'While this blocks users from creating new files with unsupported filenames, existing files are not yet renamed and thus still may break sync on Windows.') }}\n\t\t\t{{ t('files', 'You can trigger a rename of files with invalid filenames, this will be done in the background and may take some time.') }}\n\t\t\t{{ t('files', 'Please note that this may cause high workload on the sync clients.') }}\n\t\t</NcNoteCard>\n\n\t\t<fieldset class=\"sanitize-filenames__fields\">\n\t\t\t<NcInputField\n\t\t\t\tv-model=\"renameLimit\"\n\t\t\t\t:label=\"t('files', 'Limit')\"\n\t\t\t\t:helper-text=\"t('files', 'This allows to configure how many users should be processed in one background job run.')\"\n\t\t\t\tmin=\"1\"\n\t\t\t\ttype=\"number\" />\n\n\t\t\t<NcButton type=\"submit\" variant=\"error\">\n\t\t\t\t<template v-if=\"loading\" #icon>\n\t\t\t\t\t<NcLoadingIcon />\n\t\t\t\t</template>\n\t\t\t\t{{ t('files', 'Sanitize filenames') }}\n\t\t\t\t<span v-if=\"loading\" class=\"hidden-visually\">\n\t\t\t\t\t{{ t('files', '(starting)') }}\n\t\t\t\t</span>\n\t\t\t</NcButton>\n\t\t</fieldset>\n\t</form>\n</template>\n\n<style scoped>\n.sanitize-filenames__progress-container {\n\talign-items: end;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--default-grid-baseline);\n}\n\n.sanitize-filenames__form {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--default-grid-baseline);\n}\n\n.sanitize-filenames__fields {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--default-grid-baseline);\n\n\talign-items: end;\n\tmax-width: 400px;\n}\n</style>\n"],sourceRoot:""}]);const r=o},47790:()=>{},48081:(t,e,n)=>{"use strict";n.d(e,{A:()=>r});var i=n(71354),s=n.n(i),a=n(76314),o=n.n(a)()(s());o.push([t.id,"\n.hint[data-v-269e4f0c] {\n\tcolor: var(--color-text-maxcontrast);\n\tmargin-inline-start: var(--border-radius-element);\n\tmargin-block-end: 1em;\n}\n","",{version:3,sources:["webpack://./apps/files/src/views/SettingsAdmin.vue"],names:[],mappings:";AA0EA;CACA,oCAAA;CACA,iDAAA;CACA,qBAAA;AACA",sourcesContent:["\x3c!--\n - SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n--\x3e\n\n<script setup lang=\"ts\">\nimport axios from '@nextcloud/axios'\nimport { showError } from '@nextcloud/dialogs'\nimport { loadState } from '@nextcloud/initial-state'\nimport { t } from '@nextcloud/l10n'\nimport { generateOcsUrl } from '@nextcloud/router'\nimport { ref } from 'vue'\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'\nimport NcSettingsSection from '@nextcloud/vue/components/NcSettingsSection'\nimport SettingsSanitizeFilenames from '../components/Settings/SettingsSanitizeFilenames.vue'\nimport logger from '../logger.ts'\n\nconst {\n\tdocUrl,\n\tisRunningSanitization,\n\twindowsSupport,\n} = loadState<{ docUrl: string, isRunningSanitization: boolean, windowsSupport: boolean }>('files', 'filesCompatibilitySettings')\n\nconst description = t('files', 'Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed.')\n\t+ '\\n' + t('files', 'After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner.')\n\nconst loading = ref(false)\nconst hasWindowsSupport = ref(windowsSupport)\n\n/**\n * Toggle the Windows filename support on the backend.\n *\n * @param enabled - The new state to be set\n */\nasync function toggleWindowsFilenameSupport(enabled: boolean) {\n\tif (loading.value) {\n\t\treturn\n\t}\n\n\ttry {\n\t\tloading.value = true\n\t\tawait axios.post(generateOcsUrl('apps/files/api/v1/filenames/windows-compatibility'), { enabled })\n\t\thasWindowsSupport.value = enabled\n\t} catch (error) {\n\t\tshowError(t('files', 'Failed to toggle Windows filename support'))\n\t\tlogger.error('Failed to toggle Windows filename support', { error })\n\t} finally {\n\t\tloading.value = false\n\t}\n}\n<\/script>\n\n<template>\n\t<NcSettingsSection\n\t\t:doc-url=\"docUrl\"\n\t\t:name=\"t('files', 'Files compatibility')\"\n\t\t:description=\"description\">\n\t\t<NcCheckboxRadioSwitch\n\t\t\t:model-value=\"hasWindowsSupport\"\n\t\t\t:disabled=\"isRunningSanitization\"\n\t\t\t:loading=\"loading\"\n\t\t\ttype=\"switch\"\n\t\t\t@update:model-value=\"toggleWindowsFilenameSupport\">\n\t\t\t{{ t('files', 'Enforce Windows compatibility') }}\n\t\t</NcCheckboxRadioSwitch>\n\t\t<p class=\"hint\">\n\t\t\t{{ t('files', 'This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity.') }}\n\t\t</p>\n\n\t\t<SettingsSanitizeFilenames v-if=\"hasWindowsSupport\" />\n\t</NcSettingsSection>\n</template>\n\n<style scoped>\n.hint {\n\tcolor: var(--color-text-maxcontrast);\n\tmargin-inline-start: var(--border-radius-element);\n\tmargin-block-end: 1em;\n}\n</style>\n"],sourceRoot:""}]);const r=o},51069:()=>{},63779:()=>{},64688:()=>{},66089:()=>{},73776:()=>{},77199:()=>{},77965:()=>{},78982:()=>{},79368:()=>{},79838:()=>{}},s={};function a(t){var e=s[t];if(void 0!==e)return e.exports;var n=s[t]={id:t,loaded:!1,exports:{}};return i[t].call(n.exports,n,n.exports,a),n.loaded=!0,n.exports}a.m=i,t=[],a.O=(e,n,i,s)=>{if(!n){var o=1/0;for(d=0;d<t.length;d++){for(var[n,i,s]=t[d],r=!0,l=0;l<n.length;l++)(!1&s||o>=s)&&Object.keys(a.O).every(t=>a.O[t](n[l]))?n.splice(l--,1):(r=!1,s<o&&(o=s));if(r){t.splice(d--,1);var c=i();void 0!==c&&(e=c)}}return e}s=s||0;for(var d=t.length;d>0&&t[d-1][2]>s;d--)t[d]=t[d-1];t[d]=[n,i,s]},a.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return a.d(e,{a:e}),e},a.d=(t,e)=>{for(var n in e)a.o(e,n)&&!a.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},a.f={},a.e=t=>Promise.all(Object.keys(a.f).reduce((e,n)=>(a.f[n](t,e),e),[])),a.u=t=>t+"-"+t+".js?v="+{594:"706f8e77fcd637f25ccf",620:"8e3c118f58088ce04c74",2391:"a1c7f293d21dd6ef8096",2880:"62fd555d64b20d9a6c97",4325:"cc118df199f1941c08e4",5862:"4ca96c4f928b038599cf",7145:"375037f0ab8e6cfa581e",8339:"3f9cf3b616cfbc0082d4"}[t],a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),a.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),e={},n="nextcloud:",a.l=(t,i,s,o)=>{if(e[t])e[t].push(i);else{var r,l;if(void 0!==s)for(var c=document.getElementsByTagName("script"),d=0;d<c.length;d++){var u=c[d];if(u.getAttribute("src")==t||u.getAttribute("data-webpack")==n+s){r=u;break}}r||(l=!0,(r=document.createElement("script")).charset="utf-8",a.nc&&r.setAttribute("nonce",a.nc),r.setAttribute("data-webpack",n+s),r.src=t),e[t]=[i];var f=(n,i)=>{r.onerror=r.onload=null,clearTimeout(p);var s=e[t];if(delete e[t],r.parentNode&&r.parentNode.removeChild(r),s&&s.forEach(t=>t(i)),n)return n(i)},p=setTimeout(f.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=f.bind(null,r.onerror),r.onload=f.bind(null,r.onload),l&&document.head.appendChild(r)}},a.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},a.nmd=t=>(t.paths=[],t.children||(t.children=[]),t),a.j=5404,(()=>{var t;a.g.importScripts&&(t=a.g.location+"");var e=a.g.document;if(!t&&e&&(e.currentScript&&"SCRIPT"===e.currentScript.tagName.toUpperCase()&&(t=e.currentScript.src),!t)){var n=e.getElementsByTagName("script");if(n.length)for(var i=n.length-1;i>-1&&(!t||!/^http(s?):/.test(t));)t=n[i--].src}if(!t)throw new Error("Automatic publicPath is not supported in this browser");t=t.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),a.p=t})(),(()=>{a.b="undefined"!=typeof document&&document.baseURI||self.location.href;var t={5404:0};a.f.j=(e,n)=>{var i=a.o(t,e)?t[e]:void 0;if(0!==i)if(i)n.push(i[2]);else{var s=new Promise((n,s)=>i=t[e]=[n,s]);n.push(i[2]=s);var o=a.p+a.u(e),r=new Error;a.l(o,n=>{if(a.o(t,e)&&(0!==(i=t[e])&&(t[e]=void 0),i)){var s=n&&("load"===n.type?"missing":n.type),o=n&&n.target&&n.target.src;r.message="Loading chunk "+e+" failed.\n("+s+": "+o+")",r.name="ChunkLoadError",r.type=s,r.request=o,i[1](r)}},"chunk-"+e,e)}},a.O.j=e=>0===t[e];var e=(e,n)=>{var i,s,[o,r,l]=n,c=0;if(o.some(e=>0!==t[e])){for(i in r)a.o(r,i)&&(a.m[i]=r[i]);if(l)var d=l(a)}for(e&&e(n);c<o.length;c++)s=o[c],a.o(t,s)&&t[s]&&t[s][0](),t[s]=0;return a.O(d)},n=self.webpackChunknextcloud=self.webpackChunknextcloud||[];n.forEach(e.bind(null,0)),n.push=e.bind(null,n.push.bind(n))})(),a.nc=void 0;var o=a.O(void 0,[4208],()=>a(39656));o=a.O(o)})();
//# sourceMappingURL=files-settings-admin.js.map?v=965e10878d0e6744b3f3