You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

2 lines
21 KiB

(()=>{"use strict";var t,e,n,i={31764:(t,e,n)=>{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-502103e2] {\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:";AAwEA;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 NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'\nimport NcSettingsSection from '@nextcloud/vue/components/NcSettingsSection'\nimport SettingsSanitizeFilenames from '../components/Settings/SettingsSanitizeFilenames.vue'\nimport { ref } from 'vue'\nimport logger from '../logger'\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 :doc-url=\"docUrl\"\n\t\t:name=\"t('files', 'Files compatibility')\"\n\t\t:description=\"description\">\n\t\t<NcCheckboxRadioSwitch :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},35238:(t,e,n)=>{var i,s=n(21777),a=n(53334),o=n(85471),r=n(65043),l=n(85168),c=n(81222),d=n(63814),u=n(32073),f=n(88837),p=n(74095),m=n(16879),g=n(88289),v=n(31133),h=n(95101);!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"}(i||(i={}));const b=(0,n(35947).YK)().setApp("files").detectUser().build(),A=(0,o.pM)({__name:"SettingsSanitizeFilenames",setup(t){const{status:e}=(0,c.C)("files","filesCompatibilitySettings"),n=(0,o.KR)(!1),s=(0,o.KR)(10),u=(0,o.KR)(e.status),f=(0,o.KR)(e.processed),A=(0,o.KR)(e.total),S=(0,o.IJ)(e.errors||{}),y=(0,o.EW)(()=>f.value>0?Math.round(100*f.value/A.value):0),w=(0,o.EW)(()=>u.value===i.Scheduled||u.value===i.Running);return{__sfc:!0,initialStatus:e,loading:n,renameLimit:s,status:u,processedUsers:f,totalUsers:A,errors:S,progress:y,isRunning:w,startSanitization:async function(){if(!w.value)try{n.value=!0,await r.Ay.post((0,d.KT)("apps/files/api/v1/filenames/sanitization"),{limit:s.value}),u.value=i.Scheduled}catch(t){b.error("Failed to start filename sanitization.",{error:t}),(0,r.F0)(t)&&t.response?.data?.ocs?(0,l.Qg)(t.response.data.ocs.meta.message):(0,l.Qg)((0,a.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 r.Ay.get((0,d.KT)("apps/files/api/v1/filenames/sanitization"));u.value=t.ocs.data.status,A.value=t.ocs.data.total,f.value=t.ocs.data.processed,S.value=t.ocs.data.errors||{}}catch(t){b.error("Failed to refresh filename sanitization status.",{error:t}),(0,l.Qg)((0,a.t)("files","Failed to refresh filename sanitization status."))}finally{n.value=!1}},t:a.t,NcButton:p.A,NcInputField:m.A,NcLoadingIcon:g.A,NcNoteCard:v.A,NcProgressBar:h.A,SanitizeFilenameStatus:i}}});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(65108),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){let[s,a]=i;return e("li",{key:s},[e("h4",[t._v(t._s(s)+":")]),t._v(" "),e("ul",{attrs:{"aria-label":n.t("files","Not sanitized filenames")}},t._l(a,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,"bd5a10be",null).exports,B=(0,o.pM)({__name:"SettingsAdmin",setup(t){const{docUrl:e,isRunningSanitization:n,windowsSupport:i}=(0,c.C)("files","filesCompatibilitySettings"),s=(0,a.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,a.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,o.KR)(!1),m=(0,o.KR)(i);return{__sfc:!0,docUrl:e,isRunningSanitization:n,windowsSupport:i,description:s,loading:p,hasWindowsSupport:m,toggleWindowsFilenameSupport:async function(t){if(!p.value)try{p.value=!0,await r.Ay.post((0,d.KT)("apps/files/api/v1/filenames/windows-compatibility"),{enabled:t}),m.value=t}catch(t){(0,l.Qg)((0,a.t)("files","Failed to toggle Windows filename support")),b.error("Failed to toggle Windows filename support",{error:t})}finally{p.value=!1}},t:a.t,NcCheckboxRadioSwitch:u.A,NcSettingsSection:f.A,SettingsSanitizeFilenames:O}}});var L=n(31764),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,"502103e2",null).exports;n.nc=(0,s.aV)(),o.Ay.prototype.t=a.t,(new(o.Ay.extend(I))).$mount("#files-admin-settings")},65108:(t,e,n)=>{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-bd5a10be] {\n\talign-items: end;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--default-grid-baseline);\n}\n.sanitize-filenames__form[data-v-bd5a10be] {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--default-grid-baseline);\n}\n.sanitize-filenames__fields[data-v-bd5a10be] {\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:";AAgKA;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 { SanitizeFilenameStatus } from '../../models/SanitizeFilenameStatus.ts'\nimport logger from '../../logger.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 v-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 v-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}},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++){n=t[d][0],i=t[d][1],s=t[d][2];for(var 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="+{640:"d4c5c018803ee8751b2a",780:"e3ee44fa7690af29d8d7",3564:"29e8338d43e0d4bd3995",5810:"b550a24d46f75f92c2d5",7471:"6423b9b898ffefeb7d1d"}[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",r.timeout=120,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=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=n[0],r=n[1],l=n[2],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(35238));o=a.O(o)})();
//# sourceMappingURL=files-settings-admin.js.map?v=5259c94740fb438d6b93