summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dist/settings-vue-settings-admin-ai.js4
-rw-r--r--dist/settings-vue-settings-admin-ai.js.map2
2 files changed, 3 insertions, 3 deletions
diff --git a/dist/settings-vue-settings-admin-ai.js b/dist/settings-vue-settings-admin-ai.js
index e3e689ab405..064fc3492c3 100644
--- a/dist/settings-vue-settings-admin-ai.js
+++ b/dist/settings-vue-settings-admin-ai.js
@@ -1,3 +1,3 @@
/*! For license information please see settings-vue-settings-admin-ai.js.LICENSE.txt */
-(()=>{"use strict";var e,n={64028:(e,n,s)=>{var i=s(20144),r=s(4820),a=s(20571),o=s.n(a),c=s(13299),p=s.n(c),l=s(36456),d=s.n(l),g=s(10861),v=s.n(g),u=s(9980),h=s.n(u),m=s(24939),f=s(76236),y=s(85313),_=s(79954),b=s(79753),A=s(25108);const x={name:"AdminAI",components:{NcCheckboxRadioSwitch:o(),NcSettingsSection:p(),NcSelect:d(),draggable:h(),DragVerticalIcon:m.Z,ArrowDownIcon:f.Z,ArrowUpIcon:y.Z,NcButton:v()},data:()=>({loading:!1,dirty:!1,groups:[],loadingGroups:!1,sttProviders:(0,_.j)("settings","ai-stt-providers"),translationProviders:(0,_.j)("settings","ai-translation-providers"),textProcessingProviders:(0,_.j)("settings","ai-text-processing-providers"),textProcessingTaskTypes:(0,_.j)("settings","ai-text-processing-task-types"),settings:(0,_.j)("settings","ai-settings")}),computed:{hasStt(){return this.sttProviders.length>0},hasTextProcessing(){return Object.keys(this.settings["ai.textprocessing_provider_preferences"]).length>0&&Array.isArray(this.textProcessingTaskTypes)},tpTaskTypes(){return Object.keys(this.settings["ai.textprocessing_provider_preferences"]).filter((t=>!!this.getTaskType(t)))}},methods:{moveUp(t){this.settings["ai.translation_provider_preferences"].splice(Math.min(t-1,0),0,...this.settings["ai.translation_provider_preferences"].splice(t,1)),this.saveChanges()},moveDown(t){this.settings["ai.translation_provider_preferences"].splice(t+1,0,...this.settings["ai.translation_provider_preferences"].splice(t,1)),this.saveChanges()},async saveChanges(){this.loading=!0;const t={settings:this.settings};try{await r.default.put((0,b.generateUrl)("/settings/api/admin/ai"),t)}catch(t){A.error("could not save changes",t)}this.loading=!1},getTaskType(t){return Array.isArray(this.textProcessingTaskTypes)?this.textProcessingTaskTypes.find((e=>e.class===t)):null}}};var T=s(93379),k=s.n(T),S=s(7795),w=s.n(S),C=s(90569),N=s.n(C),P=s(3565),j=s.n(P),O=s(19216),I=s.n(O),D=s(44589),B=s.n(D),U=s(77666),M={};M.styleTagTransform=B(),M.setAttributes=j(),M.insert=N().bind(null,"head"),M.domAPI=w(),M.insertStyleElement=I(),k()(U.Z,M),U.Z&&U.Z.locals&&U.Z.locals;const R=(0,s(51900).Z)(x,(function(){var t=this,e=t._self._c;return e("div",[e("NcSettingsSection",{attrs:{title:t.t("settings","Machine translation"),description:t.t("settings","Machine translation can be implemented by different apps. Here you can define the precedence of the machine translation apps you have installed at the moment.")}},[e("draggable",{on:{change:t.saveChanges},model:{value:t.settings["ai.translation_provider_preferences"],callback:function(e){t.$set(t.settings,"ai.translation_provider_preferences",e)},expression:"settings['ai.translation_provider_preferences']"}},t._l(t.settings["ai.translation_provider_preferences"],(function(n,s){var i;return e("div",{key:n,staticClass:"draggable__item"},[e("DragVerticalIcon"),t._v(" "),e("span",{staticClass:"draggable__number"},[t._v(t._s(s+1))]),t._v(" "+t._s(null===(i=t.translationProviders.find((t=>t.class===n)))||void 0===i?void 0:i.name)+"\n\t\t\t\t"),e("NcButton",{attrs:{"aria-label":"Move up",type:"tertiary"},on:{click:function(e){return t.moveUp(s)}},scopedSlots:t._u([{key:"icon",fn:function(){return[e("ArrowUpIcon")]},proxy:!0}],null,!0)}),t._v(" "),e("NcButton",{attrs:{"aria-label":"Move down",type:"tertiary"},on:{click:function(e){return t.moveDown(s)}},scopedSlots:t._u([{key:"icon",fn:function(){return[e("ArrowDownIcon")]},proxy:!0}],null,!0)})],1)})),0)],1),t._v(" "),e("NcSettingsSection",{attrs:{title:t.t("settings","Speech-To-Text"),description:t.t("settings","Speech-To-Text can be implemented by different apps. Here you can set which app should be used.")}},[t._l(t.sttProviders,(function(n){return[e("NcCheckboxRadioSwitch",{key:n.class,attrs:{checked:t.settings["ai.stt_provider"],value:n.class,name:"stt_provider",type:"radio"},on:{"update:checked":[function(e){return t.$set(t.settings,"ai.stt_provider",e)},t.saveChanges]}},[t._v("\n\t\t\t\t"+t._s(n.name)+"\n\t\t\t")])]})),t._v(" "),t.hasStt?t._e():[e("NcCheckboxRadioSwitch",{attrs:{disabled:"",type:"radio"}},[t._v("\n\t\t\t\t"+t._s(t.t("settings","None of your currently installed apps provide Speech-To-Text functionality"))+"\n\t\t\t")])]],2),t._v(" "),e("NcSettingsSection",{attrs:{title:t.t("settings","Text processing"),description:t.t("settings","Text processing tasks can be implemented by different apps. Here you can set which app should be used for which task.")}},[t._l(t.tpTaskTypes,(function(n){return[e("div",{key:n},[e("h3",[t._v(t._s(t.t("settings","Task:"))+" "+t._s(t.getTaskType(n).name))]),t._v(" "),e("p",[t._v(t._s(t.getTaskType(n).description))]),t._v(" "),e("p",[t._v(" ")]),t._v(" "),e("NcSelect",{attrs:{clearable:!1,options:t.textProcessingProviders.filter((t=>t.taskType===n)).map((t=>t.class))},on:{input:t.saveChanges},scopedSlots:t._u([{key:"option",fn:function(e){var n;let{label:s}=e;return[t._v("\n\t\t\t\t\t\t"+t._s(null===(n=t.textProcessingProviders.find((t=>t.class===s)))||void 0===n?void 0:n.name)+"\n\t\t\t\t\t")]}},{key:"selected-option",fn:function(e){var n;let{label:s}=e;return[t._v("\n\t\t\t\t\t\t"+t._s(null===(n=t.textProcessingProviders.find((t=>t.class===s)))||void 0===n?void 0:n.name)+"\n\t\t\t\t\t")]}}],null,!0),model:{value:t.settings["ai.textprocessing_provider_preferences"][n],callback:function(e){t.$set(t.settings["ai.textprocessing_provider_preferences"],n,e)},expression:"settings['ai.textprocessing_provider_preferences'][type]"}}),t._v(" "),e("p",[t._v(" ")])],1)]})),t._v(" "),t.hasTextProcessing?t._e():[e("p",[t._v(t._s(t.t("settings","None of your currently installed apps provide Text processing functionality")))])]],2)],1)}),[],!1,null,"f950e528",null).exports;s.nc=btoa(OC.requestToken),i.default.prototype.t=t,window.OC=window.OC||{},window.OC.Settings=window.OC.Settings||{},(new(i.default.extend(R))).$mount("#ai-settings")},77666:(t,e,n)=>{n.d(e,{Z:()=>o});var s=n(87537),i=n.n(s),r=n(23645),a=n.n(r)()(i());a.push([t.id,"\n.draggable__item[data-v-f950e528] {\n\tmargin-bottom: 5px;\n display: flex;\n align-items: center;\n}\n.draggable__item[data-v-f950e528],\n.draggable__item *[data-v-f950e528] {\n cursor: grab;\n}\n.draggable__number[data-v-f950e528] {\n\tborder-radius: 20px;\n\tborder: 2px solid var(--color-primary-default);\n\tcolor: var(--color-primary-default);\n padding: 0px 7px;\n\tmargin-right: 3px;\n}\n.drag-vertical-icon[data-v-f950e528] {\n float: left;\n}\n","",{version:3,sources:["webpack://./apps/settings/src/components/AdminAI.vue"],names:[],mappings:";AAyJA;CACA,kBAAA;EACA,aAAA;EACA,mBAAA;AACA;AAEA;;EAEA,YAAA;AACA;AAEA;CACA,mBAAA;CACA,8CAAA;CACA,mCAAA;EACA,gBAAA;CACA,iBAAA;AACA;AAEA;EACA,WAAA;AACA",sourcesContent:["<template>\n\t<div>\n\t\t<NcSettingsSection :title=\"t('settings', 'Machine translation')\"\n\t\t\t:description=\"t('settings', 'Machine translation can be implemented by different apps. Here you can define the precedence of the machine translation apps you have installed at the moment.')\">\n\t\t\t<draggable v-model=\"settings['ai.translation_provider_preferences']\" @change=\"saveChanges\">\n\t\t\t\t<div v-for=\"(providerClass, i) in settings['ai.translation_provider_preferences']\" :key=\"providerClass\" class=\"draggable__item\">\n\t\t\t\t\t<DragVerticalIcon /> <span class=\"draggable__number\">{{ i + 1 }}</span> {{ translationProviders.find(p => p.class === providerClass)?.name }}\n\t\t\t\t\t<NcButton aria-label=\"Move up\" type=\"tertiary\" @click=\"moveUp(i)\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<ArrowUpIcon />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</NcButton>\n\t\t\t\t\t<NcButton aria-label=\"Move down\" type=\"tertiary\" @click=\"moveDown(i)\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<ArrowDownIcon />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</NcButton>\n\t\t\t\t</div>\n\t\t\t</draggable>\n\t\t</NcSettingsSection>\n\t\t<NcSettingsSection :title=\"t('settings', 'Speech-To-Text')\"\n\t\t\t:description=\"t('settings', 'Speech-To-Text can be implemented by different apps. Here you can set which app should be used.')\">\n\t\t\t<template v-for=\"provider in sttProviders\">\n\t\t\t\t<NcCheckboxRadioSwitch :key=\"provider.class\"\n\t\t\t\t\t:checked.sync=\"settings['ai.stt_provider']\"\n\t\t\t\t\t:value=\"provider.class\"\n\t\t\t\t\tname=\"stt_provider\"\n\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t@update:checked=\"saveChanges\">\n\t\t\t\t\t{{ provider.name }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t</template>\n\t\t\t<template v-if=\"!hasStt\">\n\t\t\t\t<NcCheckboxRadioSwitch disabled type=\"radio\">\n\t\t\t\t\t{{ t('settings', 'None of your currently installed apps provide Speech-To-Text functionality') }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t</template>\n\t\t</NcSettingsSection>\n\t\t<NcSettingsSection :title=\"t('settings', 'Text processing')\"\n\t\t\t:description=\"t('settings', 'Text processing tasks can be implemented by different apps. Here you can set which app should be used for which task.')\">\n\t\t\t<template v-for=\"type in tpTaskTypes\">\n\t\t\t\t<div :key=\"type\">\n\t\t\t\t\t<h3>{{ t('settings', 'Task:') }} {{ getTaskType(type).name }}</h3>\n\t\t\t\t\t<p>{{ getTaskType(type).description }}</p>\n\t\t\t\t\t<p>&nbsp;</p>\n\t\t\t\t\t<NcSelect v-model=\"settings['ai.textprocessing_provider_preferences'][type]\"\n\t\t\t\t\t\t:clearable=\"false\"\n\t\t\t\t\t\t:options=\"textProcessingProviders.filter(p => p.taskType === type).map(p => p.class)\"\n\t\t\t\t\t\t@input=\"saveChanges\">\n\t\t\t\t\t\t<template #option=\"{label}\">\n\t\t\t\t\t\t\t{{ textProcessingProviders.find(p => p.class === label)?.name }}\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<template #selected-option=\"{label}\">\n\t\t\t\t\t\t\t{{ textProcessingProviders.find(p => p.class === label)?.name }}\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</NcSelect>\n\t\t\t\t\t<p>&nbsp;</p>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<template v-if=\"!hasTextProcessing\">\n\t\t\t\t<p>{{ t('settings', 'None of your currently installed apps provide Text processing functionality') }}</p>\n\t\t\t</template>\n\t\t</NcSettingsSection>\n\t</div>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'\nimport NcSettingsSection from '@nextcloud/vue/dist/Components/NcSettingsSection.js'\nimport NcSelect from '@nextcloud/vue/dist/Components/NcSelect.js'\nimport NcButton from '@nextcloud/vue/dist/Components/NcButton.js'\nimport draggable from 'vuedraggable'\nimport DragVerticalIcon from 'vue-material-design-icons/DragVertical.vue'\nimport ArrowDownIcon from 'vue-material-design-icons/ArrowDown.vue'\nimport ArrowUpIcon from 'vue-material-design-icons/ArrowUp.vue'\nimport { loadState } from '@nextcloud/initial-state'\n\nimport { generateUrl } from '@nextcloud/router'\n\nexport default {\n\tname: 'AdminAI',\n\tcomponents: {\n\t\tNcCheckboxRadioSwitch,\n\t\tNcSettingsSection,\n\t\tNcSelect,\n\t\tdraggable,\n\t\tDragVerticalIcon,\n\t\tArrowDownIcon,\n\t\tArrowUpIcon,\n\t\tNcButton\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tloading: false,\n\t\t\tdirty: false,\n\t\t\tgroups: [],\n\t\t\tloadingGroups: false,\n\t\t\tsttProviders: loadState('settings', 'ai-stt-providers'),\n\t\t\ttranslationProviders: loadState('settings', 'ai-translation-providers'),\n\t\t\ttextProcessingProviders: loadState('settings', 'ai-text-processing-providers'),\n\t\t\ttextProcessingTaskTypes: loadState('settings', 'ai-text-processing-task-types'),\n\t\t\tsettings: loadState('settings', 'ai-settings'),\n\t\t}\n\t},\n\tcomputed: {\n\t\thasStt() {\n\t\t\treturn this.sttProviders.length > 0\n\t\t},\n\t\thasTextProcessing() {\n\t\t\treturn Object.keys(this.settings['ai.textprocessing_provider_preferences']).length > 0 && Array.isArray(this.textProcessingTaskTypes)\n\t\t},\n\t\ttpTaskTypes() {\n return Object.keys(this.settings['ai.textprocessing_provider_preferences']).filter(type => !!this.getTaskType(type))\n\t\t},\n\t},\n\tmethods: {\n\t moveUp(i) {\n\t\t\tthis.settings['ai.translation_provider_preferences'].splice(\n\t\t\t Math.min(i - 1, 0),\n\t\t\t\t0,\n\t\t\t\t...this.settings['ai.translation_provider_preferences'].splice(i, 1)\n\t\t\t)\n\t\t\tthis.saveChanges()\n\t\t},\n\t\tmoveDown(i) {\n\t\t\tthis.settings['ai.translation_provider_preferences'].splice(\n\t\t\t\ti + 1,\n\t\t\t\t0,\n\t\t\t\t...this.settings['ai.translation_provider_preferences'].splice(i, 1)\n\t\t\t)\n\t\t\tthis.saveChanges()\n\t\t},\n\t\tasync saveChanges() {\n\t\t\tthis.loading = true\n\t\t\tconst data = { settings: this.settings }\n\t\t\ttry {\n\t\t\t\tawait axios.put(generateUrl('/settings/api/admin/ai'), data)\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error('could not save changes', err)\n\t\t\t}\n\t\t\tthis.loading = false\n\t\t},\n\t\tgetTaskType(type) {\n\t\t if (!Array.isArray(this.textProcessingTaskTypes)) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.textProcessingTaskTypes.find(taskType => taskType.class === type)\n\t\t},\n\t},\n}\n<\/script>\n<style scoped>\n.draggable__item {\n\tmargin-bottom: 5px;\n display: flex;\n align-items: center;\n}\n\n.draggable__item,\n.draggable__item * {\n cursor: grab;\n}\n\n.draggable__number {\n\tborder-radius: 20px;\n\tborder: 2px solid var(--color-primary-default);\n\tcolor: var(--color-primary-default);\n padding: 0px 7px;\n\tmargin-right: 3px;\n}\n\n.drag-vertical-icon {\n float: left;\n}\n</style>\n"],sourceRoot:""}]);const o=a}},s={};function i(t){var e=s[t];if(void 0!==e)return e.exports;var r=s[t]={id:t,loaded:!1,exports:{}};return n[t].call(r.exports,r,r.exports,i),r.loaded=!0,r.exports}i.m=n,e=[],i.O=(t,n,s,r)=>{if(!n){var a=1/0;for(l=0;l<e.length;l++){n=e[l][0],s=e[l][1],r=e[l][2];for(var o=!0,c=0;c<n.length;c++)(!1&r||a>=r)&&Object.keys(i.O).every((t=>i.O[t](n[c])))?n.splice(c--,1):(o=!1,r<a&&(a=r));if(o){e.splice(l--,1);var p=s();void 0!==p&&(t=p)}}return t}r=r||0;for(var l=e.length;l>0&&e[l-1][2]>r;l--)e[l]=e[l-1];e[l]=[n,s,r]},i.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return i.d(e,{a:e}),e},i.d=(t,e)=>{for(var n in e)i.o(e,n)&&!i.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},i.e=()=>Promise.resolve(),i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),i.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},i.nmd=t=>(t.paths=[],t.children||(t.children=[]),t),i.j=1104,(()=>{i.b=document.baseURI||self.location.href;var t={1104:0};i.O.j=e=>0===t[e];var e=(e,n)=>{var s,r,a=n[0],o=n[1],c=n[2],p=0;if(a.some((e=>0!==t[e]))){for(s in o)i.o(o,s)&&(i.m[s]=o[s]);if(c)var l=c(i)}for(e&&e(n);p<a.length;p++)r=a[p],i.o(t,r)&&t[r]&&t[r][0](),t[r]=0;return i.O(l)},n=self.webpackChunknextcloud=self.webpackChunknextcloud||[];n.forEach(e.bind(null,0)),n.push=e.bind(null,n.push.bind(n))})(),i.nc=void 0;var r=i.O(void 0,[7874],(()=>i(64028)));r=i.O(r)})();
-//# sourceMappingURL=settings-vue-settings-admin-ai.js.map?v=b839aea9ef313a86be4d \ No newline at end of file
+(()=>{"use strict";var e,n={20529:(e,n,s)=>{var i=s(20144),r=s(4820),a=s(20571),o=s.n(a),c=s(13299),p=s.n(c),l=s(36456),d=s.n(l),g=s(10861),v=s.n(g),u=s(9980),h=s.n(u),m=s(24939),f=s(76236),y=s(85313),_=s(79954),b=s(79753),A=s(25108);const x={name:"AdminAI",components:{NcCheckboxRadioSwitch:o(),NcSettingsSection:p(),NcSelect:d(),draggable:h(),DragVerticalIcon:m.Z,ArrowDownIcon:f.Z,ArrowUpIcon:y.Z,NcButton:v()},data:()=>({loading:!1,dirty:!1,groups:[],loadingGroups:!1,sttProviders:(0,_.j)("settings","ai-stt-providers"),translationProviders:(0,_.j)("settings","ai-translation-providers"),textProcessingProviders:(0,_.j)("settings","ai-text-processing-providers"),textProcessingTaskTypes:(0,_.j)("settings","ai-text-processing-task-types"),settings:(0,_.j)("settings","ai-settings")}),computed:{hasStt(){return this.sttProviders.length>0},hasTextProcessing(){return Object.keys(this.settings["ai.textprocessing_provider_preferences"]).length>0&&Array.isArray(this.textProcessingTaskTypes)},tpTaskTypes(){return Object.keys(this.settings["ai.textprocessing_provider_preferences"]).filter((t=>!!this.getTaskType(t)))}},methods:{moveUp(t){this.settings["ai.translation_provider_preferences"].splice(Math.min(t-1,0),0,...this.settings["ai.translation_provider_preferences"].splice(t,1)),this.saveChanges()},moveDown(t){this.settings["ai.translation_provider_preferences"].splice(t+1,0,...this.settings["ai.translation_provider_preferences"].splice(t,1)),this.saveChanges()},async saveChanges(){this.loading=!0;const t={settings:this.settings};try{await r.default.put((0,b.generateUrl)("/settings/api/admin/ai"),t)}catch(t){A.error("could not save changes",t)}this.loading=!1},getTaskType(t){return Array.isArray(this.textProcessingTaskTypes)?this.textProcessingTaskTypes.find((e=>e.class===t)):null}}};var T=s(93379),k=s.n(T),S=s(7795),w=s.n(S),C=s(90569),N=s.n(C),P=s(3565),j=s.n(P),O=s(19216),I=s.n(O),D=s(44589),B=s.n(D),U=s(77025),M={};M.styleTagTransform=B(),M.setAttributes=j(),M.insert=N().bind(null,"head"),M.domAPI=w(),M.insertStyleElement=I(),k()(U.Z,M),U.Z&&U.Z.locals&&U.Z.locals;const R=(0,s(51900).Z)(x,(function(){var t=this,e=t._self._c;return e("div",[e("NcSettingsSection",{attrs:{title:t.t("settings","Machine translation"),description:t.t("settings","Machine translation can be implemented by different apps. Here you can define the precedence of the machine translation apps you have installed at the moment.")}},[e("draggable",{on:{change:t.saveChanges},model:{value:t.settings["ai.translation_provider_preferences"],callback:function(e){t.$set(t.settings,"ai.translation_provider_preferences",e)},expression:"settings['ai.translation_provider_preferences']"}},t._l(t.settings["ai.translation_provider_preferences"],(function(n,s){var i;return e("div",{key:n,staticClass:"draggable__item"},[e("DragVerticalIcon"),t._v(" "),e("span",{staticClass:"draggable__number"},[t._v(t._s(s+1))]),t._v(" "+t._s(null===(i=t.translationProviders.find((t=>t.class===n)))||void 0===i?void 0:i.name)+"\n\t\t\t\t"),e("NcButton",{attrs:{"aria-label":"Move up",type:"tertiary"},on:{click:function(e){return t.moveUp(s)}},scopedSlots:t._u([{key:"icon",fn:function(){return[e("ArrowUpIcon")]},proxy:!0}],null,!0)}),t._v(" "),e("NcButton",{attrs:{"aria-label":"Move down",type:"tertiary"},on:{click:function(e){return t.moveDown(s)}},scopedSlots:t._u([{key:"icon",fn:function(){return[e("ArrowDownIcon")]},proxy:!0}],null,!0)})],1)})),0)],1),t._v(" "),e("NcSettingsSection",{attrs:{title:t.t("settings","Speech-To-Text"),description:t.t("settings","Speech-To-Text can be implemented by different apps. Here you can set which app should be used.")}},[t._l(t.sttProviders,(function(n){return[e("NcCheckboxRadioSwitch",{key:n.class,attrs:{checked:t.settings["ai.stt_provider"],value:n.class,name:"stt_provider",type:"radio"},on:{"update:checked":[function(e){return t.$set(t.settings,"ai.stt_provider",e)},t.saveChanges]}},[t._v("\n\t\t\t\t"+t._s(n.name)+"\n\t\t\t")])]})),t._v(" "),t.hasStt?t._e():[e("NcCheckboxRadioSwitch",{attrs:{disabled:"",type:"radio"}},[t._v("\n\t\t\t\t"+t._s(t.t("settings","None of your currently installed apps provide Speech-To-Text functionality"))+"\n\t\t\t")])]],2),t._v(" "),e("NcSettingsSection",{attrs:{title:t.t("settings","Text processing"),description:t.t("settings","Text processing tasks can be implemented by different apps. Here you can set which app should be used for which task.")}},[t._l(t.tpTaskTypes,(function(n){return[e("div",{key:n},[e("h3",[t._v(t._s(t.t("settings","Task:"))+" "+t._s(t.getTaskType(n).name))]),t._v(" "),e("p",[t._v(t._s(t.getTaskType(n).description))]),t._v(" "),e("p",[t._v(" ")]),t._v(" "),e("NcSelect",{attrs:{clearable:!1,options:t.textProcessingProviders.filter((t=>t.taskType===n)).map((t=>t.class))},on:{input:t.saveChanges},scopedSlots:t._u([{key:"option",fn:function(e){var n;let{label:s}=e;return[t._v("\n\t\t\t\t\t\t"+t._s(null===(n=t.textProcessingProviders.find((t=>t.class===s)))||void 0===n?void 0:n.name)+"\n\t\t\t\t\t")]}},{key:"selected-option",fn:function(e){var n;let{label:s}=e;return[t._v("\n\t\t\t\t\t\t"+t._s(null===(n=t.textProcessingProviders.find((t=>t.class===s)))||void 0===n?void 0:n.name)+"\n\t\t\t\t\t")]}}],null,!0),model:{value:t.settings["ai.textprocessing_provider_preferences"][n],callback:function(e){t.$set(t.settings["ai.textprocessing_provider_preferences"],n,e)},expression:"settings['ai.textprocessing_provider_preferences'][type]"}}),t._v(" "),e("p",[t._v(" ")])],1)]})),t._v(" "),t.hasTextProcessing?t._e():[e("p",[t._v(t._s(t.t("settings","None of your currently installed apps provide Text processing functionality")))])]],2)],1)}),[],!1,null,"a3ab164e",null).exports;s.nc=btoa(OC.requestToken),i.default.prototype.t=t,window.OC=window.OC||{},window.OC.Settings=window.OC.Settings||{},(new(i.default.extend(R))).$mount("#ai-settings")},77025:(t,e,n)=>{n.d(e,{Z:()=>o});var s=n(87537),i=n.n(s),r=n(23645),a=n.n(r)()(i());a.push([t.id,"\n.draggable__item[data-v-a3ab164e] {\n\tmargin-bottom: 5px;\n display: flex;\n align-items: center;\n}\n.draggable__item[data-v-a3ab164e],\n.draggable__item *[data-v-a3ab164e] {\n cursor: grab;\n}\n.draggable__number[data-v-a3ab164e] {\n\tborder-radius: 20px;\n\tborder: 2px solid var(--color-primary-default);\n\tcolor: var(--color-primary-default);\n padding: 0px 7px;\n\tmargin-right: 3px;\n}\n.drag-vertical-icon[data-v-a3ab164e] {\n float: left;\n}\n","",{version:3,sources:["webpack://./apps/settings/src/components/AdminAI.vue"],names:[],mappings:";AAyJA;CACA,kBAAA;EACA,aAAA;EACA,mBAAA;AACA;AAEA;;EAEA,YAAA;AACA;AAEA;CACA,mBAAA;CACA,8CAAA;CACA,mCAAA;EACA,gBAAA;CACA,iBAAA;AACA;AAEA;EACA,WAAA;AACA",sourcesContent:["<template>\n\t<div>\n\t\t<NcSettingsSection :title=\"t('settings', 'Machine translation')\"\n\t\t\t:description=\"t('settings', 'Machine translation can be implemented by different apps. Here you can define the precedence of the machine translation apps you have installed at the moment.')\">\n\t\t\t<draggable v-model=\"settings['ai.translation_provider_preferences']\" @change=\"saveChanges\">\n\t\t\t\t<div v-for=\"(providerClass, i) in settings['ai.translation_provider_preferences']\" :key=\"providerClass\" class=\"draggable__item\">\n\t\t\t\t\t<DragVerticalIcon /> <span class=\"draggable__number\">{{ i + 1 }}</span> {{ translationProviders.find(p => p.class === providerClass)?.name }}\n\t\t\t\t\t<NcButton aria-label=\"Move up\" type=\"tertiary\" @click=\"moveUp(i)\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<ArrowUpIcon />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</NcButton>\n\t\t\t\t\t<NcButton aria-label=\"Move down\" type=\"tertiary\" @click=\"moveDown(i)\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<ArrowDownIcon />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</NcButton>\n\t\t\t\t</div>\n\t\t\t</draggable>\n\t\t</NcSettingsSection>\n\t\t<NcSettingsSection :title=\"t('settings', 'Speech-To-Text')\"\n\t\t\t:description=\"t('settings', 'Speech-To-Text can be implemented by different apps. Here you can set which app should be used.')\">\n\t\t\t<template v-for=\"provider in sttProviders\">\n\t\t\t\t<NcCheckboxRadioSwitch :key=\"provider.class\"\n\t\t\t\t\t:checked.sync=\"settings['ai.stt_provider']\"\n\t\t\t\t\t:value=\"provider.class\"\n\t\t\t\t\tname=\"stt_provider\"\n\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t@update:checked=\"saveChanges\">\n\t\t\t\t\t{{ provider.name }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t</template>\n\t\t\t<template v-if=\"!hasStt\">\n\t\t\t\t<NcCheckboxRadioSwitch disabled type=\"radio\">\n\t\t\t\t\t{{ t('settings', 'None of your currently installed apps provide Speech-To-Text functionality') }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t</template>\n\t\t</NcSettingsSection>\n\t\t<NcSettingsSection :title=\"t('settings', 'Text processing')\"\n\t\t\t:description=\"t('settings', 'Text processing tasks can be implemented by different apps. Here you can set which app should be used for which task.')\">\n\t\t\t<template v-for=\"type in tpTaskTypes\">\n\t\t\t\t<div :key=\"type\">\n\t\t\t\t\t<h3>{{ t('settings', 'Task:') }} {{ getTaskType(type).name }}</h3>\n\t\t\t\t\t<p>{{ getTaskType(type).description }}</p>\n\t\t\t\t\t<p>&nbsp;</p>\n\t\t\t\t\t<NcSelect v-model=\"settings['ai.textprocessing_provider_preferences'][type]\"\n\t\t\t\t\t\t:clearable=\"false\"\n\t\t\t\t\t\t:options=\"textProcessingProviders.filter(p => p.taskType === type).map(p => p.class)\"\n\t\t\t\t\t\t@input=\"saveChanges\">\n\t\t\t\t\t\t<template #option=\"{label}\">\n\t\t\t\t\t\t\t{{ textProcessingProviders.find(p => p.class === label)?.name }}\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<template #selected-option=\"{label}\">\n\t\t\t\t\t\t\t{{ textProcessingProviders.find(p => p.class === label)?.name }}\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</NcSelect>\n\t\t\t\t\t<p>&nbsp;</p>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<template v-if=\"!hasTextProcessing\">\n\t\t\t\t<p>{{ t('settings', 'None of your currently installed apps provide Text processing functionality') }}</p>\n\t\t\t</template>\n\t\t</NcSettingsSection>\n\t</div>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'\nimport NcSettingsSection from '@nextcloud/vue/dist/Components/NcSettingsSection.js'\nimport NcSelect from '@nextcloud/vue/dist/Components/NcSelect.js'\nimport NcButton from '@nextcloud/vue/dist/Components/NcButton.js'\nimport draggable from 'vuedraggable'\nimport DragVerticalIcon from 'vue-material-design-icons/DragVertical.vue'\nimport ArrowDownIcon from 'vue-material-design-icons/ArrowDown.vue'\nimport ArrowUpIcon from 'vue-material-design-icons/ArrowUp.vue'\nimport { loadState } from '@nextcloud/initial-state'\n\nimport { generateUrl } from '@nextcloud/router'\n\nexport default {\n\tname: 'AdminAI',\n\tcomponents: {\n\t\tNcCheckboxRadioSwitch,\n\t\tNcSettingsSection,\n\t\tNcSelect,\n\t\tdraggable,\n\t\tDragVerticalIcon,\n\t\tArrowDownIcon,\n\t\tArrowUpIcon,\n\t\tNcButton,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tloading: false,\n\t\t\tdirty: false,\n\t\t\tgroups: [],\n\t\t\tloadingGroups: false,\n\t\t\tsttProviders: loadState('settings', 'ai-stt-providers'),\n\t\t\ttranslationProviders: loadState('settings', 'ai-translation-providers'),\n\t\t\ttextProcessingProviders: loadState('settings', 'ai-text-processing-providers'),\n\t\t\ttextProcessingTaskTypes: loadState('settings', 'ai-text-processing-task-types'),\n\t\t\tsettings: loadState('settings', 'ai-settings'),\n\t\t}\n\t},\n\tcomputed: {\n\t\thasStt() {\n\t\t\treturn this.sttProviders.length > 0\n\t\t},\n\t\thasTextProcessing() {\n\t\t\treturn Object.keys(this.settings['ai.textprocessing_provider_preferences']).length > 0 && Array.isArray(this.textProcessingTaskTypes)\n\t\t},\n\t\ttpTaskTypes() {\n\t\t\treturn Object.keys(this.settings['ai.textprocessing_provider_preferences']).filter(type => !!this.getTaskType(type))\n\t\t},\n\t},\n\tmethods: {\n\t moveUp(i) {\n\t\t\tthis.settings['ai.translation_provider_preferences'].splice(\n\t\t\t Math.min(i - 1, 0),\n\t\t\t\t0,\n\t\t\t\t...this.settings['ai.translation_provider_preferences'].splice(i, 1)\n\t\t\t)\n\t\t\tthis.saveChanges()\n\t\t},\n\t\tmoveDown(i) {\n\t\t\tthis.settings['ai.translation_provider_preferences'].splice(\n\t\t\t\ti + 1,\n\t\t\t\t0,\n\t\t\t\t...this.settings['ai.translation_provider_preferences'].splice(i, 1)\n\t\t\t)\n\t\t\tthis.saveChanges()\n\t\t},\n\t\tasync saveChanges() {\n\t\t\tthis.loading = true\n\t\t\tconst data = { settings: this.settings }\n\t\t\ttry {\n\t\t\t\tawait axios.put(generateUrl('/settings/api/admin/ai'), data)\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error('could not save changes', err)\n\t\t\t}\n\t\t\tthis.loading = false\n\t\t},\n\t\tgetTaskType(type) {\n\t\t if (!Array.isArray(this.textProcessingTaskTypes)) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.textProcessingTaskTypes.find(taskType => taskType.class === type)\n\t\t},\n\t},\n}\n<\/script>\n<style scoped>\n.draggable__item {\n\tmargin-bottom: 5px;\n display: flex;\n align-items: center;\n}\n\n.draggable__item,\n.draggable__item * {\n cursor: grab;\n}\n\n.draggable__number {\n\tborder-radius: 20px;\n\tborder: 2px solid var(--color-primary-default);\n\tcolor: var(--color-primary-default);\n padding: 0px 7px;\n\tmargin-right: 3px;\n}\n\n.drag-vertical-icon {\n float: left;\n}\n</style>\n"],sourceRoot:""}]);const o=a}},s={};function i(t){var e=s[t];if(void 0!==e)return e.exports;var r=s[t]={id:t,loaded:!1,exports:{}};return n[t].call(r.exports,r,r.exports,i),r.loaded=!0,r.exports}i.m=n,e=[],i.O=(t,n,s,r)=>{if(!n){var a=1/0;for(l=0;l<e.length;l++){n=e[l][0],s=e[l][1],r=e[l][2];for(var o=!0,c=0;c<n.length;c++)(!1&r||a>=r)&&Object.keys(i.O).every((t=>i.O[t](n[c])))?n.splice(c--,1):(o=!1,r<a&&(a=r));if(o){e.splice(l--,1);var p=s();void 0!==p&&(t=p)}}return t}r=r||0;for(var l=e.length;l>0&&e[l-1][2]>r;l--)e[l]=e[l-1];e[l]=[n,s,r]},i.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return i.d(e,{a:e}),e},i.d=(t,e)=>{for(var n in e)i.o(e,n)&&!i.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},i.e=()=>Promise.resolve(),i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),i.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},i.nmd=t=>(t.paths=[],t.children||(t.children=[]),t),i.j=1104,(()=>{i.b=document.baseURI||self.location.href;var t={1104:0};i.O.j=e=>0===t[e];var e=(e,n)=>{var s,r,a=n[0],o=n[1],c=n[2],p=0;if(a.some((e=>0!==t[e]))){for(s in o)i.o(o,s)&&(i.m[s]=o[s]);if(c)var l=c(i)}for(e&&e(n);p<a.length;p++)r=a[p],i.o(t,r)&&t[r]&&t[r][0](),t[r]=0;return i.O(l)},n=self.webpackChunknextcloud=self.webpackChunknextcloud||[];n.forEach(e.bind(null,0)),n.push=e.bind(null,n.push.bind(n))})(),i.nc=void 0;var r=i.O(void 0,[7874],(()=>i(20529)));r=i.O(r)})();
+//# sourceMappingURL=settings-vue-settings-admin-ai.js.map?v=81b630b17b9903dcd6ba \ No newline at end of file
diff --git a/dist/settings-vue-settings-admin-ai.js.map b/dist/settings-vue-settings-admin-ai.js.map
index 88588e20be7..e83c48d82cf 100644
--- a/dist/settings-vue-settings-admin-ai.js.map
+++ b/dist/settings-vue-settings-admin-ai.js.map
@@ -1 +1 @@
-{"version":3,"file":"settings-vue-settings-admin-ai.js?v=b839aea9ef313a86be4d","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/apps/settings/src/components/AdminAI.vue","webpack:///nextcloud/apps/settings/src/components/AdminAI.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/settings/src/components/AdminAI.vue?ac77","webpack://nextcloud/./apps/settings/src/components/AdminAI.vue?91ad","webpack://nextcloud/./apps/settings/src/components/AdminAI.vue?cf22","webpack:///nextcloud/apps/settings/src/main-admin-ai.js","webpack:///nextcloud/apps/settings/src/components/AdminAI.vue?vue&type=style&index=0&id=f950e528&prod&scoped=true&lang=css&","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/ensure chunk","webpack:///nextcloud/webpack/runtime/global","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","<template>\n\t<div>\n\t\t<NcSettingsSection :title=\"t('settings', 'Machine translation')\"\n\t\t\t:description=\"t('settings', 'Machine translation can be implemented by different apps. Here you can define the precedence of the machine translation apps you have installed at the moment.')\">\n\t\t\t<draggable v-model=\"settings['ai.translation_provider_preferences']\" @change=\"saveChanges\">\n\t\t\t\t<div v-for=\"(providerClass, i) in settings['ai.translation_provider_preferences']\" :key=\"providerClass\" class=\"draggable__item\">\n\t\t\t\t\t<DragVerticalIcon /> <span class=\"draggable__number\">{{ i + 1 }}</span> {{ translationProviders.find(p => p.class === providerClass)?.name }}\n\t\t\t\t\t<NcButton aria-label=\"Move up\" type=\"tertiary\" @click=\"moveUp(i)\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<ArrowUpIcon />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</NcButton>\n\t\t\t\t\t<NcButton aria-label=\"Move down\" type=\"tertiary\" @click=\"moveDown(i)\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<ArrowDownIcon />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</NcButton>\n\t\t\t\t</div>\n\t\t\t</draggable>\n\t\t</NcSettingsSection>\n\t\t<NcSettingsSection :title=\"t('settings', 'Speech-To-Text')\"\n\t\t\t:description=\"t('settings', 'Speech-To-Text can be implemented by different apps. Here you can set which app should be used.')\">\n\t\t\t<template v-for=\"provider in sttProviders\">\n\t\t\t\t<NcCheckboxRadioSwitch :key=\"provider.class\"\n\t\t\t\t\t:checked.sync=\"settings['ai.stt_provider']\"\n\t\t\t\t\t:value=\"provider.class\"\n\t\t\t\t\tname=\"stt_provider\"\n\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t@update:checked=\"saveChanges\">\n\t\t\t\t\t{{ provider.name }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t</template>\n\t\t\t<template v-if=\"!hasStt\">\n\t\t\t\t<NcCheckboxRadioSwitch disabled type=\"radio\">\n\t\t\t\t\t{{ t('settings', 'None of your currently installed apps provide Speech-To-Text functionality') }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t</template>\n\t\t</NcSettingsSection>\n\t\t<NcSettingsSection :title=\"t('settings', 'Text processing')\"\n\t\t\t:description=\"t('settings', 'Text processing tasks can be implemented by different apps. Here you can set which app should be used for which task.')\">\n\t\t\t<template v-for=\"type in tpTaskTypes\">\n\t\t\t\t<div :key=\"type\">\n\t\t\t\t\t<h3>{{ t('settings', 'Task:') }} {{ getTaskType(type).name }}</h3>\n\t\t\t\t\t<p>{{ getTaskType(type).description }}</p>\n\t\t\t\t\t<p>&nbsp;</p>\n\t\t\t\t\t<NcSelect v-model=\"settings['ai.textprocessing_provider_preferences'][type]\"\n\t\t\t\t\t\t:clearable=\"false\"\n\t\t\t\t\t\t:options=\"textProcessingProviders.filter(p => p.taskType === type).map(p => p.class)\"\n\t\t\t\t\t\t@input=\"saveChanges\">\n\t\t\t\t\t\t<template #option=\"{label}\">\n\t\t\t\t\t\t\t{{ textProcessingProviders.find(p => p.class === label)?.name }}\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<template #selected-option=\"{label}\">\n\t\t\t\t\t\t\t{{ textProcessingProviders.find(p => p.class === label)?.name }}\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</NcSelect>\n\t\t\t\t\t<p>&nbsp;</p>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<template v-if=\"!hasTextProcessing\">\n\t\t\t\t<p>{{ t('settings', 'None of your currently installed apps provide Text processing functionality') }}</p>\n\t\t\t</template>\n\t\t</NcSettingsSection>\n\t</div>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'\nimport NcSettingsSection from '@nextcloud/vue/dist/Components/NcSettingsSection.js'\nimport NcSelect from '@nextcloud/vue/dist/Components/NcSelect.js'\nimport NcButton from '@nextcloud/vue/dist/Components/NcButton.js'\nimport draggable from 'vuedraggable'\nimport DragVerticalIcon from 'vue-material-design-icons/DragVertical.vue'\nimport ArrowDownIcon from 'vue-material-design-icons/ArrowDown.vue'\nimport ArrowUpIcon from 'vue-material-design-icons/ArrowUp.vue'\nimport { loadState } from '@nextcloud/initial-state'\n\nimport { generateUrl } from '@nextcloud/router'\n\nexport default {\n\tname: 'AdminAI',\n\tcomponents: {\n\t\tNcCheckboxRadioSwitch,\n\t\tNcSettingsSection,\n\t\tNcSelect,\n\t\tdraggable,\n\t\tDragVerticalIcon,\n\t\tArrowDownIcon,\n\t\tArrowUpIcon,\n\t\tNcButton\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tloading: false,\n\t\t\tdirty: false,\n\t\t\tgroups: [],\n\t\t\tloadingGroups: false,\n\t\t\tsttProviders: loadState('settings', 'ai-stt-providers'),\n\t\t\ttranslationProviders: loadState('settings', 'ai-translation-providers'),\n\t\t\ttextProcessingProviders: loadState('settings', 'ai-text-processing-providers'),\n\t\t\ttextProcessingTaskTypes: loadState('settings', 'ai-text-processing-task-types'),\n\t\t\tsettings: loadState('settings', 'ai-settings'),\n\t\t}\n\t},\n\tcomputed: {\n\t\thasStt() {\n\t\t\treturn this.sttProviders.length > 0\n\t\t},\n\t\thasTextProcessing() {\n\t\t\treturn Object.keys(this.settings['ai.textprocessing_provider_preferences']).length > 0 && Array.isArray(this.textProcessingTaskTypes)\n\t\t},\n\t\ttpTaskTypes() {\n return Object.keys(this.settings['ai.textprocessing_provider_preferences']).filter(type => !!this.getTaskType(type))\n\t\t},\n\t},\n\tmethods: {\n\t moveUp(i) {\n\t\t\tthis.settings['ai.translation_provider_preferences'].splice(\n\t\t\t Math.min(i - 1, 0),\n\t\t\t\t0,\n\t\t\t\t...this.settings['ai.translation_provider_preferences'].splice(i, 1)\n\t\t\t)\n\t\t\tthis.saveChanges()\n\t\t},\n\t\tmoveDown(i) {\n\t\t\tthis.settings['ai.translation_provider_preferences'].splice(\n\t\t\t\ti + 1,\n\t\t\t\t0,\n\t\t\t\t...this.settings['ai.translation_provider_preferences'].splice(i, 1)\n\t\t\t)\n\t\t\tthis.saveChanges()\n\t\t},\n\t\tasync saveChanges() {\n\t\t\tthis.loading = true\n\t\t\tconst data = { settings: this.settings }\n\t\t\ttry {\n\t\t\t\tawait axios.put(generateUrl('/settings/api/admin/ai'), data)\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error('could not save changes', err)\n\t\t\t}\n\t\t\tthis.loading = false\n\t\t},\n\t\tgetTaskType(type) {\n\t\t if (!Array.isArray(this.textProcessingTaskTypes)) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.textProcessingTaskTypes.find(taskType => taskType.class === type)\n\t\t},\n\t},\n}\n</script>\n<style scoped>\n.draggable__item {\n\tmargin-bottom: 5px;\n display: flex;\n align-items: center;\n}\n\n.draggable__item,\n.draggable__item * {\n cursor: grab;\n}\n\n.draggable__number {\n\tborder-radius: 20px;\n\tborder: 2px solid var(--color-primary-default);\n\tcolor: var(--color-primary-default);\n padding: 0px 7px;\n\tmargin-right: 3px;\n}\n\n.drag-vertical-icon {\n float: left;\n}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AdminAI.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AdminAI.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AdminAI.vue?vue&type=style&index=0&id=f950e528&prod&scoped=true&lang=css&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AdminAI.vue?vue&type=style&index=0&id=f950e528&prod&scoped=true&lang=css&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AdminAI.vue?vue&type=template&id=f950e528&scoped=true&\"\nimport script from \"./AdminAI.vue?vue&type=script&lang=js&\"\nexport * from \"./AdminAI.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AdminAI.vue?vue&type=style&index=0&id=f950e528&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"f950e528\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('NcSettingsSection',{attrs:{\"title\":_vm.t('settings', 'Machine translation'),\"description\":_vm.t('settings', 'Machine translation can be implemented by different apps. Here you can define the precedence of the machine translation apps you have installed at the moment.')}},[_c('draggable',{on:{\"change\":_vm.saveChanges},model:{value:(_vm.settings['ai.translation_provider_preferences']),callback:function ($$v) {_vm.$set(_vm.settings, 'ai.translation_provider_preferences', $$v)},expression:\"settings['ai.translation_provider_preferences']\"}},_vm._l((_vm.settings['ai.translation_provider_preferences']),function(providerClass,i){return _c('div',{key:providerClass,staticClass:\"draggable__item\"},[_c('DragVerticalIcon'),_vm._v(\" \"),_c('span',{staticClass:\"draggable__number\"},[_vm._v(_vm._s(i + 1))]),_vm._v(\" \"+_vm._s(_vm.translationProviders.find(p => p.class === providerClass)?.name)+\"\\n\\t\\t\\t\\t\"),_c('NcButton',{attrs:{\"aria-label\":\"Move up\",\"type\":\"tertiary\"},on:{\"click\":function($event){return _vm.moveUp(i)}},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('ArrowUpIcon')]},proxy:true}],null,true)}),_vm._v(\" \"),_c('NcButton',{attrs:{\"aria-label\":\"Move down\",\"type\":\"tertiary\"},on:{\"click\":function($event){return _vm.moveDown(i)}},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('ArrowDownIcon')]},proxy:true}],null,true)})],1)}),0)],1),_vm._v(\" \"),_c('NcSettingsSection',{attrs:{\"title\":_vm.t('settings', 'Speech-To-Text'),\"description\":_vm.t('settings', 'Speech-To-Text can be implemented by different apps. Here you can set which app should be used.')}},[_vm._l((_vm.sttProviders),function(provider){return [_c('NcCheckboxRadioSwitch',{key:provider.class,attrs:{\"checked\":_vm.settings['ai.stt_provider'],\"value\":provider.class,\"name\":\"stt_provider\",\"type\":\"radio\"},on:{\"update:checked\":[function($event){return _vm.$set(_vm.settings, 'ai.stt_provider', $event)},_vm.saveChanges]}},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(provider.name)+\"\\n\\t\\t\\t\")])]}),_vm._v(\" \"),(!_vm.hasStt)?[_c('NcCheckboxRadioSwitch',{attrs:{\"disabled\":\"\",\"type\":\"radio\"}},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'None of your currently installed apps provide Speech-To-Text functionality'))+\"\\n\\t\\t\\t\")])]:_vm._e()],2),_vm._v(\" \"),_c('NcSettingsSection',{attrs:{\"title\":_vm.t('settings', 'Text processing'),\"description\":_vm.t('settings', 'Text processing tasks can be implemented by different apps. Here you can set which app should be used for which task.')}},[_vm._l((_vm.tpTaskTypes),function(type){return [_c('div',{key:type},[_c('h3',[_vm._v(_vm._s(_vm.t('settings', 'Task:'))+\" \"+_vm._s(_vm.getTaskType(type).name))]),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.getTaskType(type).description))]),_vm._v(\" \"),_c('p',[_vm._v(\" \")]),_vm._v(\" \"),_c('NcSelect',{attrs:{\"clearable\":false,\"options\":_vm.textProcessingProviders.filter(p => p.taskType === type).map(p => p.class)},on:{\"input\":_vm.saveChanges},scopedSlots:_vm._u([{key:\"option\",fn:function({label}){return [_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(_vm.textProcessingProviders.find(p => p.class === label)?.name)+\"\\n\\t\\t\\t\\t\\t\")]}},{key:\"selected-option\",fn:function({label}){return [_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(_vm.textProcessingProviders.find(p => p.class === label)?.name)+\"\\n\\t\\t\\t\\t\\t\")]}}],null,true),model:{value:(_vm.settings['ai.textprocessing_provider_preferences'][type]),callback:function ($$v) {_vm.$set(_vm.settings['ai.textprocessing_provider_preferences'], type, $$v)},expression:\"settings['ai.textprocessing_provider_preferences'][type]\"}}),_vm._v(\" \"),_c('p',[_vm._v(\" \")])],1)]}),_vm._v(\" \"),(!_vm.hasTextProcessing)?[_c('p',[_vm._v(_vm._s(_vm.t('settings', 'None of your currently installed apps provide Text processing functionality')))])]:_vm._e()],2)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2016 Christoph Wurst <christoph@winzerhof-wurst.at>\n *\n * @author Christoph Wurst <christoph@winzerhof-wurst.at>\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport Vue from 'vue'\n\nimport ArtificialIntelligence from './components/AdminAI.vue'\n\n// eslint-disable-next-line camelcase\n__webpack_nonce__ = btoa(OC.requestToken)\n\nVue.prototype.t = t\n\n// Not used here but required for legacy templates\nwindow.OC = window.OC || {}\nwindow.OC.Settings = window.OC.Settings || {}\n\nconst View = Vue.extend(ArtificialIntelligence)\nnew View().$mount('#ai-settings')\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\n.draggable__item[data-v-f950e528] {\\n\\tmargin-bottom: 5px;\\n display: flex;\\n align-items: center;\\n}\\n.draggable__item[data-v-f950e528],\\n.draggable__item *[data-v-f950e528] {\\n cursor: grab;\\n}\\n.draggable__number[data-v-f950e528] {\\n\\tborder-radius: 20px;\\n\\tborder: 2px solid var(--color-primary-default);\\n\\tcolor: var(--color-primary-default);\\n padding: 0px 7px;\\n\\tmargin-right: 3px;\\n}\\n.drag-vertical-icon[data-v-f950e528] {\\n float: left;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AdminAI.vue\"],\"names\":[],\"mappings\":\";AAyJA;CACA,kBAAA;EACA,aAAA;EACA,mBAAA;AACA;AAEA;;EAEA,YAAA;AACA;AAEA;CACA,mBAAA;CACA,8CAAA;CACA,mCAAA;EACA,gBAAA;CACA,iBAAA;AACA;AAEA;EACA,WAAA;AACA\",\"sourcesContent\":[\"<template>\\n\\t<div>\\n\\t\\t<NcSettingsSection :title=\\\"t('settings', 'Machine translation')\\\"\\n\\t\\t\\t:description=\\\"t('settings', 'Machine translation can be implemented by different apps. Here you can define the precedence of the machine translation apps you have installed at the moment.')\\\">\\n\\t\\t\\t<draggable v-model=\\\"settings['ai.translation_provider_preferences']\\\" @change=\\\"saveChanges\\\">\\n\\t\\t\\t\\t<div v-for=\\\"(providerClass, i) in settings['ai.translation_provider_preferences']\\\" :key=\\\"providerClass\\\" class=\\\"draggable__item\\\">\\n\\t\\t\\t\\t\\t<DragVerticalIcon /> <span class=\\\"draggable__number\\\">{{ i + 1 }}</span> {{ translationProviders.find(p => p.class === providerClass)?.name }}\\n\\t\\t\\t\\t\\t<NcButton aria-label=\\\"Move up\\\" type=\\\"tertiary\\\" @click=\\\"moveUp(i)\\\">\\n\\t\\t\\t\\t\\t\\t<template #icon>\\n\\t\\t\\t\\t\\t\\t\\t<ArrowUpIcon />\\n\\t\\t\\t\\t\\t\\t</template>\\n\\t\\t\\t\\t\\t</NcButton>\\n\\t\\t\\t\\t\\t<NcButton aria-label=\\\"Move down\\\" type=\\\"tertiary\\\" @click=\\\"moveDown(i)\\\">\\n\\t\\t\\t\\t\\t\\t<template #icon>\\n\\t\\t\\t\\t\\t\\t\\t<ArrowDownIcon />\\n\\t\\t\\t\\t\\t\\t</template>\\n\\t\\t\\t\\t\\t</NcButton>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</draggable>\\n\\t\\t</NcSettingsSection>\\n\\t\\t<NcSettingsSection :title=\\\"t('settings', 'Speech-To-Text')\\\"\\n\\t\\t\\t:description=\\\"t('settings', 'Speech-To-Text can be implemented by different apps. Here you can set which app should be used.')\\\">\\n\\t\\t\\t<template v-for=\\\"provider in sttProviders\\\">\\n\\t\\t\\t\\t<NcCheckboxRadioSwitch :key=\\\"provider.class\\\"\\n\\t\\t\\t\\t\\t:checked.sync=\\\"settings['ai.stt_provider']\\\"\\n\\t\\t\\t\\t\\t:value=\\\"provider.class\\\"\\n\\t\\t\\t\\t\\tname=\\\"stt_provider\\\"\\n\\t\\t\\t\\t\\ttype=\\\"radio\\\"\\n\\t\\t\\t\\t\\t@update:checked=\\\"saveChanges\\\">\\n\\t\\t\\t\\t\\t{{ provider.name }}\\n\\t\\t\\t\\t</NcCheckboxRadioSwitch>\\n\\t\\t\\t</template>\\n\\t\\t\\t<template v-if=\\\"!hasStt\\\">\\n\\t\\t\\t\\t<NcCheckboxRadioSwitch disabled type=\\\"radio\\\">\\n\\t\\t\\t\\t\\t{{ t('settings', 'None of your currently installed apps provide Speech-To-Text functionality') }}\\n\\t\\t\\t\\t</NcCheckboxRadioSwitch>\\n\\t\\t\\t</template>\\n\\t\\t</NcSettingsSection>\\n\\t\\t<NcSettingsSection :title=\\\"t('settings', 'Text processing')\\\"\\n\\t\\t\\t:description=\\\"t('settings', 'Text processing tasks can be implemented by different apps. Here you can set which app should be used for which task.')\\\">\\n\\t\\t\\t<template v-for=\\\"type in tpTaskTypes\\\">\\n\\t\\t\\t\\t<div :key=\\\"type\\\">\\n\\t\\t\\t\\t\\t<h3>{{ t('settings', 'Task:') }} {{ getTaskType(type).name }}</h3>\\n\\t\\t\\t\\t\\t<p>{{ getTaskType(type).description }}</p>\\n\\t\\t\\t\\t\\t<p>&nbsp;</p>\\n\\t\\t\\t\\t\\t<NcSelect v-model=\\\"settings['ai.textprocessing_provider_preferences'][type]\\\"\\n\\t\\t\\t\\t\\t\\t:clearable=\\\"false\\\"\\n\\t\\t\\t\\t\\t\\t:options=\\\"textProcessingProviders.filter(p => p.taskType === type).map(p => p.class)\\\"\\n\\t\\t\\t\\t\\t\\t@input=\\\"saveChanges\\\">\\n\\t\\t\\t\\t\\t\\t<template #option=\\\"{label}\\\">\\n\\t\\t\\t\\t\\t\\t\\t{{ textProcessingProviders.find(p => p.class === label)?.name }}\\n\\t\\t\\t\\t\\t\\t</template>\\n\\t\\t\\t\\t\\t\\t<template #selected-option=\\\"{label}\\\">\\n\\t\\t\\t\\t\\t\\t\\t{{ textProcessingProviders.find(p => p.class === label)?.name }}\\n\\t\\t\\t\\t\\t\\t</template>\\n\\t\\t\\t\\t\\t</NcSelect>\\n\\t\\t\\t\\t\\t<p>&nbsp;</p>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</template>\\n\\t\\t\\t<template v-if=\\\"!hasTextProcessing\\\">\\n\\t\\t\\t\\t<p>{{ t('settings', 'None of your currently installed apps provide Text processing functionality') }}</p>\\n\\t\\t\\t</template>\\n\\t\\t</NcSettingsSection>\\n\\t</div>\\n</template>\\n\\n<script>\\nimport axios from '@nextcloud/axios'\\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'\\nimport NcSettingsSection from '@nextcloud/vue/dist/Components/NcSettingsSection.js'\\nimport NcSelect from '@nextcloud/vue/dist/Components/NcSelect.js'\\nimport NcButton from '@nextcloud/vue/dist/Components/NcButton.js'\\nimport draggable from 'vuedraggable'\\nimport DragVerticalIcon from 'vue-material-design-icons/DragVertical.vue'\\nimport ArrowDownIcon from 'vue-material-design-icons/ArrowDown.vue'\\nimport ArrowUpIcon from 'vue-material-design-icons/ArrowUp.vue'\\nimport { loadState } from '@nextcloud/initial-state'\\n\\nimport { generateUrl } from '@nextcloud/router'\\n\\nexport default {\\n\\tname: 'AdminAI',\\n\\tcomponents: {\\n\\t\\tNcCheckboxRadioSwitch,\\n\\t\\tNcSettingsSection,\\n\\t\\tNcSelect,\\n\\t\\tdraggable,\\n\\t\\tDragVerticalIcon,\\n\\t\\tArrowDownIcon,\\n\\t\\tArrowUpIcon,\\n\\t\\tNcButton\\n\\t},\\n\\tdata() {\\n\\t\\treturn {\\n\\t\\t\\tloading: false,\\n\\t\\t\\tdirty: false,\\n\\t\\t\\tgroups: [],\\n\\t\\t\\tloadingGroups: false,\\n\\t\\t\\tsttProviders: loadState('settings', 'ai-stt-providers'),\\n\\t\\t\\ttranslationProviders: loadState('settings', 'ai-translation-providers'),\\n\\t\\t\\ttextProcessingProviders: loadState('settings', 'ai-text-processing-providers'),\\n\\t\\t\\ttextProcessingTaskTypes: loadState('settings', 'ai-text-processing-task-types'),\\n\\t\\t\\tsettings: loadState('settings', 'ai-settings'),\\n\\t\\t}\\n\\t},\\n\\tcomputed: {\\n\\t\\thasStt() {\\n\\t\\t\\treturn this.sttProviders.length > 0\\n\\t\\t},\\n\\t\\thasTextProcessing() {\\n\\t\\t\\treturn Object.keys(this.settings['ai.textprocessing_provider_preferences']).length > 0 && Array.isArray(this.textProcessingTaskTypes)\\n\\t\\t},\\n\\t\\ttpTaskTypes() {\\n return Object.keys(this.settings['ai.textprocessing_provider_preferences']).filter(type => !!this.getTaskType(type))\\n\\t\\t},\\n\\t},\\n\\tmethods: {\\n\\t moveUp(i) {\\n\\t\\t\\tthis.settings['ai.translation_provider_preferences'].splice(\\n\\t\\t\\t Math.min(i - 1, 0),\\n\\t\\t\\t\\t0,\\n\\t\\t\\t\\t...this.settings['ai.translation_provider_preferences'].splice(i, 1)\\n\\t\\t\\t)\\n\\t\\t\\tthis.saveChanges()\\n\\t\\t},\\n\\t\\tmoveDown(i) {\\n\\t\\t\\tthis.settings['ai.translation_provider_preferences'].splice(\\n\\t\\t\\t\\ti + 1,\\n\\t\\t\\t\\t0,\\n\\t\\t\\t\\t...this.settings['ai.translation_provider_preferences'].splice(i, 1)\\n\\t\\t\\t)\\n\\t\\t\\tthis.saveChanges()\\n\\t\\t},\\n\\t\\tasync saveChanges() {\\n\\t\\t\\tthis.loading = true\\n\\t\\t\\tconst data = { settings: this.settings }\\n\\t\\t\\ttry {\\n\\t\\t\\t\\tawait axios.put(generateUrl('/settings/api/admin/ai'), data)\\n\\t\\t\\t} catch (err) {\\n\\t\\t\\t\\tconsole.error('could not save changes', err)\\n\\t\\t\\t}\\n\\t\\t\\tthis.loading = false\\n\\t\\t},\\n\\t\\tgetTaskType(type) {\\n\\t\\t if (!Array.isArray(this.textProcessingTaskTypes)) {\\n\\t\\t\\t\\treturn null\\n\\t\\t\\t}\\n\\t\\t\\treturn this.textProcessingTaskTypes.find(taskType => taskType.class === type)\\n\\t\\t},\\n\\t},\\n}\\n</script>\\n<style scoped>\\n.draggable__item {\\n\\tmargin-bottom: 5px;\\n display: flex;\\n align-items: center;\\n}\\n\\n.draggable__item,\\n.draggable__item * {\\n cursor: grab;\\n}\\n\\n.draggable__number {\\n\\tborder-radius: 20px;\\n\\tborder: 2px solid var(--color-primary-default);\\n\\tcolor: var(--color-primary-default);\\n padding: 0px 7px;\\n\\tmargin-right: 3px;\\n}\\n\\n.drag-vertical-icon {\\n float: left;\\n}\\n</style>\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","// The chunk loading function for additional chunks\n// Since all referenced chunks are already included\n// in this file, this function is empty here.\n__webpack_require__.e = () => (Promise.resolve());","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 1104;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t1104: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [7874], () => (__webpack_require__(64028)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","name","components","NcCheckboxRadioSwitch","NcSettingsSection","NcSelect","draggable","DragVerticalIcon","ArrowDownIcon","ArrowUpIcon","NcButton","data","loading","dirty","groups","loadingGroups","sttProviders","loadState","translationProviders","textProcessingProviders","textProcessingTaskTypes","settings","computed","hasStt","length","hasTextProcessing","Object","keys","Array","isArray","tpTaskTypes","filter","type","getTaskType","methods","moveUp","i","splice","Math","min","saveChanges","moveDown","axios","generateUrl","err","console","error","find","taskType","class","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","_vm","this","_c","_self","attrs","t","on","model","value","callback","$$v","$set","expression","_l","providerClass","_vm$translationProvid","key","staticClass","_v","_s","p","$event","scopedSlots","_u","fn","proxy","provider","_e","description","map","_ref","_vm$textProcessingPro","label","_ref2","_vm$textProcessingPro2","__webpack_nonce__","btoa","OC","requestToken","Vue","window","Settings","ArtificialIntelligence","$mount","___CSS_LOADER_EXPORT___","push","module","id","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","loaded","__webpack_modules__","call","m","O","result","chunkIds","priority","notFulfilled","Infinity","fulfilled","j","every","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","e","Promise","resolve","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","nmd","paths","children","b","document","baseURI","self","location","href","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","forEach","bind","nc","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"file":"settings-vue-settings-admin-ai.js?v=81b630b17b9903dcd6ba","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/apps/settings/src/components/AdminAI.vue","webpack:///nextcloud/apps/settings/src/components/AdminAI.vue?vue&type=script&lang=js&","webpack://nextcloud/./apps/settings/src/components/AdminAI.vue?cd30","webpack://nextcloud/./apps/settings/src/components/AdminAI.vue?91ad","webpack://nextcloud/./apps/settings/src/components/AdminAI.vue?cf22","webpack:///nextcloud/apps/settings/src/main-admin-ai.js","webpack:///nextcloud/apps/settings/src/components/AdminAI.vue?vue&type=style&index=0&id=a3ab164e&prod&scoped=true&lang=css&","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/ensure chunk","webpack:///nextcloud/webpack/runtime/global","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand","webpack:///nextcloud/webpack/runtime/make namespace object","webpack:///nextcloud/webpack/runtime/node module decorator","webpack:///nextcloud/webpack/runtime/runtimeId","webpack:///nextcloud/webpack/runtime/jsonp chunk loading","webpack:///nextcloud/webpack/runtime/nonce","webpack:///nextcloud/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","<template>\n\t<div>\n\t\t<NcSettingsSection :title=\"t('settings', 'Machine translation')\"\n\t\t\t:description=\"t('settings', 'Machine translation can be implemented by different apps. Here you can define the precedence of the machine translation apps you have installed at the moment.')\">\n\t\t\t<draggable v-model=\"settings['ai.translation_provider_preferences']\" @change=\"saveChanges\">\n\t\t\t\t<div v-for=\"(providerClass, i) in settings['ai.translation_provider_preferences']\" :key=\"providerClass\" class=\"draggable__item\">\n\t\t\t\t\t<DragVerticalIcon /> <span class=\"draggable__number\">{{ i + 1 }}</span> {{ translationProviders.find(p => p.class === providerClass)?.name }}\n\t\t\t\t\t<NcButton aria-label=\"Move up\" type=\"tertiary\" @click=\"moveUp(i)\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<ArrowUpIcon />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</NcButton>\n\t\t\t\t\t<NcButton aria-label=\"Move down\" type=\"tertiary\" @click=\"moveDown(i)\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<ArrowDownIcon />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</NcButton>\n\t\t\t\t</div>\n\t\t\t</draggable>\n\t\t</NcSettingsSection>\n\t\t<NcSettingsSection :title=\"t('settings', 'Speech-To-Text')\"\n\t\t\t:description=\"t('settings', 'Speech-To-Text can be implemented by different apps. Here you can set which app should be used.')\">\n\t\t\t<template v-for=\"provider in sttProviders\">\n\t\t\t\t<NcCheckboxRadioSwitch :key=\"provider.class\"\n\t\t\t\t\t:checked.sync=\"settings['ai.stt_provider']\"\n\t\t\t\t\t:value=\"provider.class\"\n\t\t\t\t\tname=\"stt_provider\"\n\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t@update:checked=\"saveChanges\">\n\t\t\t\t\t{{ provider.name }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t</template>\n\t\t\t<template v-if=\"!hasStt\">\n\t\t\t\t<NcCheckboxRadioSwitch disabled type=\"radio\">\n\t\t\t\t\t{{ t('settings', 'None of your currently installed apps provide Speech-To-Text functionality') }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t</template>\n\t\t</NcSettingsSection>\n\t\t<NcSettingsSection :title=\"t('settings', 'Text processing')\"\n\t\t\t:description=\"t('settings', 'Text processing tasks can be implemented by different apps. Here you can set which app should be used for which task.')\">\n\t\t\t<template v-for=\"type in tpTaskTypes\">\n\t\t\t\t<div :key=\"type\">\n\t\t\t\t\t<h3>{{ t('settings', 'Task:') }} {{ getTaskType(type).name }}</h3>\n\t\t\t\t\t<p>{{ getTaskType(type).description }}</p>\n\t\t\t\t\t<p>&nbsp;</p>\n\t\t\t\t\t<NcSelect v-model=\"settings['ai.textprocessing_provider_preferences'][type]\"\n\t\t\t\t\t\t:clearable=\"false\"\n\t\t\t\t\t\t:options=\"textProcessingProviders.filter(p => p.taskType === type).map(p => p.class)\"\n\t\t\t\t\t\t@input=\"saveChanges\">\n\t\t\t\t\t\t<template #option=\"{label}\">\n\t\t\t\t\t\t\t{{ textProcessingProviders.find(p => p.class === label)?.name }}\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<template #selected-option=\"{label}\">\n\t\t\t\t\t\t\t{{ textProcessingProviders.find(p => p.class === label)?.name }}\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</NcSelect>\n\t\t\t\t\t<p>&nbsp;</p>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<template v-if=\"!hasTextProcessing\">\n\t\t\t\t<p>{{ t('settings', 'None of your currently installed apps provide Text processing functionality') }}</p>\n\t\t\t</template>\n\t\t</NcSettingsSection>\n\t</div>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'\nimport NcSettingsSection from '@nextcloud/vue/dist/Components/NcSettingsSection.js'\nimport NcSelect from '@nextcloud/vue/dist/Components/NcSelect.js'\nimport NcButton from '@nextcloud/vue/dist/Components/NcButton.js'\nimport draggable from 'vuedraggable'\nimport DragVerticalIcon from 'vue-material-design-icons/DragVertical.vue'\nimport ArrowDownIcon from 'vue-material-design-icons/ArrowDown.vue'\nimport ArrowUpIcon from 'vue-material-design-icons/ArrowUp.vue'\nimport { loadState } from '@nextcloud/initial-state'\n\nimport { generateUrl } from '@nextcloud/router'\n\nexport default {\n\tname: 'AdminAI',\n\tcomponents: {\n\t\tNcCheckboxRadioSwitch,\n\t\tNcSettingsSection,\n\t\tNcSelect,\n\t\tdraggable,\n\t\tDragVerticalIcon,\n\t\tArrowDownIcon,\n\t\tArrowUpIcon,\n\t\tNcButton,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tloading: false,\n\t\t\tdirty: false,\n\t\t\tgroups: [],\n\t\t\tloadingGroups: false,\n\t\t\tsttProviders: loadState('settings', 'ai-stt-providers'),\n\t\t\ttranslationProviders: loadState('settings', 'ai-translation-providers'),\n\t\t\ttextProcessingProviders: loadState('settings', 'ai-text-processing-providers'),\n\t\t\ttextProcessingTaskTypes: loadState('settings', 'ai-text-processing-task-types'),\n\t\t\tsettings: loadState('settings', 'ai-settings'),\n\t\t}\n\t},\n\tcomputed: {\n\t\thasStt() {\n\t\t\treturn this.sttProviders.length > 0\n\t\t},\n\t\thasTextProcessing() {\n\t\t\treturn Object.keys(this.settings['ai.textprocessing_provider_preferences']).length > 0 && Array.isArray(this.textProcessingTaskTypes)\n\t\t},\n\t\ttpTaskTypes() {\n\t\t\treturn Object.keys(this.settings['ai.textprocessing_provider_preferences']).filter(type => !!this.getTaskType(type))\n\t\t},\n\t},\n\tmethods: {\n\t moveUp(i) {\n\t\t\tthis.settings['ai.translation_provider_preferences'].splice(\n\t\t\t Math.min(i - 1, 0),\n\t\t\t\t0,\n\t\t\t\t...this.settings['ai.translation_provider_preferences'].splice(i, 1)\n\t\t\t)\n\t\t\tthis.saveChanges()\n\t\t},\n\t\tmoveDown(i) {\n\t\t\tthis.settings['ai.translation_provider_preferences'].splice(\n\t\t\t\ti + 1,\n\t\t\t\t0,\n\t\t\t\t...this.settings['ai.translation_provider_preferences'].splice(i, 1)\n\t\t\t)\n\t\t\tthis.saveChanges()\n\t\t},\n\t\tasync saveChanges() {\n\t\t\tthis.loading = true\n\t\t\tconst data = { settings: this.settings }\n\t\t\ttry {\n\t\t\t\tawait axios.put(generateUrl('/settings/api/admin/ai'), data)\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error('could not save changes', err)\n\t\t\t}\n\t\t\tthis.loading = false\n\t\t},\n\t\tgetTaskType(type) {\n\t\t if (!Array.isArray(this.textProcessingTaskTypes)) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.textProcessingTaskTypes.find(taskType => taskType.class === type)\n\t\t},\n\t},\n}\n</script>\n<style scoped>\n.draggable__item {\n\tmargin-bottom: 5px;\n display: flex;\n align-items: center;\n}\n\n.draggable__item,\n.draggable__item * {\n cursor: grab;\n}\n\n.draggable__number {\n\tborder-radius: 20px;\n\tborder: 2px solid var(--color-primary-default);\n\tcolor: var(--color-primary-default);\n padding: 0px 7px;\n\tmargin-right: 3px;\n}\n\n.drag-vertical-icon {\n float: left;\n}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AdminAI.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AdminAI.vue?vue&type=script&lang=js&\"","\n import API from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AdminAI.vue?vue&type=style&index=0&id=a3ab164e&prod&scoped=true&lang=css&\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AdminAI.vue?vue&type=style&index=0&id=a3ab164e&prod&scoped=true&lang=css&\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./AdminAI.vue?vue&type=template&id=a3ab164e&scoped=true&\"\nimport script from \"./AdminAI.vue?vue&type=script&lang=js&\"\nexport * from \"./AdminAI.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AdminAI.vue?vue&type=style&index=0&id=a3ab164e&prod&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"a3ab164e\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[_c('NcSettingsSection',{attrs:{\"title\":_vm.t('settings', 'Machine translation'),\"description\":_vm.t('settings', 'Machine translation can be implemented by different apps. Here you can define the precedence of the machine translation apps you have installed at the moment.')}},[_c('draggable',{on:{\"change\":_vm.saveChanges},model:{value:(_vm.settings['ai.translation_provider_preferences']),callback:function ($$v) {_vm.$set(_vm.settings, 'ai.translation_provider_preferences', $$v)},expression:\"settings['ai.translation_provider_preferences']\"}},_vm._l((_vm.settings['ai.translation_provider_preferences']),function(providerClass,i){return _c('div',{key:providerClass,staticClass:\"draggable__item\"},[_c('DragVerticalIcon'),_vm._v(\" \"),_c('span',{staticClass:\"draggable__number\"},[_vm._v(_vm._s(i + 1))]),_vm._v(\" \"+_vm._s(_vm.translationProviders.find(p => p.class === providerClass)?.name)+\"\\n\\t\\t\\t\\t\"),_c('NcButton',{attrs:{\"aria-label\":\"Move up\",\"type\":\"tertiary\"},on:{\"click\":function($event){return _vm.moveUp(i)}},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('ArrowUpIcon')]},proxy:true}],null,true)}),_vm._v(\" \"),_c('NcButton',{attrs:{\"aria-label\":\"Move down\",\"type\":\"tertiary\"},on:{\"click\":function($event){return _vm.moveDown(i)}},scopedSlots:_vm._u([{key:\"icon\",fn:function(){return [_c('ArrowDownIcon')]},proxy:true}],null,true)})],1)}),0)],1),_vm._v(\" \"),_c('NcSettingsSection',{attrs:{\"title\":_vm.t('settings', 'Speech-To-Text'),\"description\":_vm.t('settings', 'Speech-To-Text can be implemented by different apps. Here you can set which app should be used.')}},[_vm._l((_vm.sttProviders),function(provider){return [_c('NcCheckboxRadioSwitch',{key:provider.class,attrs:{\"checked\":_vm.settings['ai.stt_provider'],\"value\":provider.class,\"name\":\"stt_provider\",\"type\":\"radio\"},on:{\"update:checked\":[function($event){return _vm.$set(_vm.settings, 'ai.stt_provider', $event)},_vm.saveChanges]}},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(provider.name)+\"\\n\\t\\t\\t\")])]}),_vm._v(\" \"),(!_vm.hasStt)?[_c('NcCheckboxRadioSwitch',{attrs:{\"disabled\":\"\",\"type\":\"radio\"}},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.t('settings', 'None of your currently installed apps provide Speech-To-Text functionality'))+\"\\n\\t\\t\\t\")])]:_vm._e()],2),_vm._v(\" \"),_c('NcSettingsSection',{attrs:{\"title\":_vm.t('settings', 'Text processing'),\"description\":_vm.t('settings', 'Text processing tasks can be implemented by different apps. Here you can set which app should be used for which task.')}},[_vm._l((_vm.tpTaskTypes),function(type){return [_c('div',{key:type},[_c('h3',[_vm._v(_vm._s(_vm.t('settings', 'Task:'))+\" \"+_vm._s(_vm.getTaskType(type).name))]),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.getTaskType(type).description))]),_vm._v(\" \"),_c('p',[_vm._v(\" \")]),_vm._v(\" \"),_c('NcSelect',{attrs:{\"clearable\":false,\"options\":_vm.textProcessingProviders.filter(p => p.taskType === type).map(p => p.class)},on:{\"input\":_vm.saveChanges},scopedSlots:_vm._u([{key:\"option\",fn:function({label}){return [_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(_vm.textProcessingProviders.find(p => p.class === label)?.name)+\"\\n\\t\\t\\t\\t\\t\")]}},{key:\"selected-option\",fn:function({label}){return [_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(_vm.textProcessingProviders.find(p => p.class === label)?.name)+\"\\n\\t\\t\\t\\t\\t\")]}}],null,true),model:{value:(_vm.settings['ai.textprocessing_provider_preferences'][type]),callback:function ($$v) {_vm.$set(_vm.settings['ai.textprocessing_provider_preferences'], type, $$v)},expression:\"settings['ai.textprocessing_provider_preferences'][type]\"}}),_vm._v(\" \"),_c('p',[_vm._v(\" \")])],1)]}),_vm._v(\" \"),(!_vm.hasTextProcessing)?[_c('p',[_vm._v(_vm._s(_vm.t('settings', 'None of your currently installed apps provide Text processing functionality')))])]:_vm._e()],2)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * @copyright Copyright (c) 2016 Christoph Wurst <christoph@winzerhof-wurst.at>\n *\n * @author Christoph Wurst <christoph@winzerhof-wurst.at>\n * @author John Molakvoæ <skjnldsv@protonmail.com>\n * @author Roeland Jago Douma <roeland@famdouma.nl>\n *\n * @license AGPL-3.0-or-later\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nimport Vue from 'vue'\n\nimport ArtificialIntelligence from './components/AdminAI.vue'\n\n// eslint-disable-next-line camelcase\n__webpack_nonce__ = btoa(OC.requestToken)\n\nVue.prototype.t = t\n\n// Not used here but required for legacy templates\nwindow.OC = window.OC || {}\nwindow.OC.Settings = window.OC.Settings || {}\n\nconst View = Vue.extend(ArtificialIntelligence)\nnew View().$mount('#ai-settings')\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\n.draggable__item[data-v-a3ab164e] {\\n\\tmargin-bottom: 5px;\\n display: flex;\\n align-items: center;\\n}\\n.draggable__item[data-v-a3ab164e],\\n.draggable__item *[data-v-a3ab164e] {\\n cursor: grab;\\n}\\n.draggable__number[data-v-a3ab164e] {\\n\\tborder-radius: 20px;\\n\\tborder: 2px solid var(--color-primary-default);\\n\\tcolor: var(--color-primary-default);\\n padding: 0px 7px;\\n\\tmargin-right: 3px;\\n}\\n.drag-vertical-icon[data-v-a3ab164e] {\\n float: left;\\n}\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./apps/settings/src/components/AdminAI.vue\"],\"names\":[],\"mappings\":\";AAyJA;CACA,kBAAA;EACA,aAAA;EACA,mBAAA;AACA;AAEA;;EAEA,YAAA;AACA;AAEA;CACA,mBAAA;CACA,8CAAA;CACA,mCAAA;EACA,gBAAA;CACA,iBAAA;AACA;AAEA;EACA,WAAA;AACA\",\"sourcesContent\":[\"<template>\\n\\t<div>\\n\\t\\t<NcSettingsSection :title=\\\"t('settings', 'Machine translation')\\\"\\n\\t\\t\\t:description=\\\"t('settings', 'Machine translation can be implemented by different apps. Here you can define the precedence of the machine translation apps you have installed at the moment.')\\\">\\n\\t\\t\\t<draggable v-model=\\\"settings['ai.translation_provider_preferences']\\\" @change=\\\"saveChanges\\\">\\n\\t\\t\\t\\t<div v-for=\\\"(providerClass, i) in settings['ai.translation_provider_preferences']\\\" :key=\\\"providerClass\\\" class=\\\"draggable__item\\\">\\n\\t\\t\\t\\t\\t<DragVerticalIcon /> <span class=\\\"draggable__number\\\">{{ i + 1 }}</span> {{ translationProviders.find(p => p.class === providerClass)?.name }}\\n\\t\\t\\t\\t\\t<NcButton aria-label=\\\"Move up\\\" type=\\\"tertiary\\\" @click=\\\"moveUp(i)\\\">\\n\\t\\t\\t\\t\\t\\t<template #icon>\\n\\t\\t\\t\\t\\t\\t\\t<ArrowUpIcon />\\n\\t\\t\\t\\t\\t\\t</template>\\n\\t\\t\\t\\t\\t</NcButton>\\n\\t\\t\\t\\t\\t<NcButton aria-label=\\\"Move down\\\" type=\\\"tertiary\\\" @click=\\\"moveDown(i)\\\">\\n\\t\\t\\t\\t\\t\\t<template #icon>\\n\\t\\t\\t\\t\\t\\t\\t<ArrowDownIcon />\\n\\t\\t\\t\\t\\t\\t</template>\\n\\t\\t\\t\\t\\t</NcButton>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</draggable>\\n\\t\\t</NcSettingsSection>\\n\\t\\t<NcSettingsSection :title=\\\"t('settings', 'Speech-To-Text')\\\"\\n\\t\\t\\t:description=\\\"t('settings', 'Speech-To-Text can be implemented by different apps. Here you can set which app should be used.')\\\">\\n\\t\\t\\t<template v-for=\\\"provider in sttProviders\\\">\\n\\t\\t\\t\\t<NcCheckboxRadioSwitch :key=\\\"provider.class\\\"\\n\\t\\t\\t\\t\\t:checked.sync=\\\"settings['ai.stt_provider']\\\"\\n\\t\\t\\t\\t\\t:value=\\\"provider.class\\\"\\n\\t\\t\\t\\t\\tname=\\\"stt_provider\\\"\\n\\t\\t\\t\\t\\ttype=\\\"radio\\\"\\n\\t\\t\\t\\t\\t@update:checked=\\\"saveChanges\\\">\\n\\t\\t\\t\\t\\t{{ provider.name }}\\n\\t\\t\\t\\t</NcCheckboxRadioSwitch>\\n\\t\\t\\t</template>\\n\\t\\t\\t<template v-if=\\\"!hasStt\\\">\\n\\t\\t\\t\\t<NcCheckboxRadioSwitch disabled type=\\\"radio\\\">\\n\\t\\t\\t\\t\\t{{ t('settings', 'None of your currently installed apps provide Speech-To-Text functionality') }}\\n\\t\\t\\t\\t</NcCheckboxRadioSwitch>\\n\\t\\t\\t</template>\\n\\t\\t</NcSettingsSection>\\n\\t\\t<NcSettingsSection :title=\\\"t('settings', 'Text processing')\\\"\\n\\t\\t\\t:description=\\\"t('settings', 'Text processing tasks can be implemented by different apps. Here you can set which app should be used for which task.')\\\">\\n\\t\\t\\t<template v-for=\\\"type in tpTaskTypes\\\">\\n\\t\\t\\t\\t<div :key=\\\"type\\\">\\n\\t\\t\\t\\t\\t<h3>{{ t('settings', 'Task:') }} {{ getTaskType(type).name }}</h3>\\n\\t\\t\\t\\t\\t<p>{{ getTaskType(type).description }}</p>\\n\\t\\t\\t\\t\\t<p>&nbsp;</p>\\n\\t\\t\\t\\t\\t<NcSelect v-model=\\\"settings['ai.textprocessing_provider_preferences'][type]\\\"\\n\\t\\t\\t\\t\\t\\t:clearable=\\\"false\\\"\\n\\t\\t\\t\\t\\t\\t:options=\\\"textProcessingProviders.filter(p => p.taskType === type).map(p => p.class)\\\"\\n\\t\\t\\t\\t\\t\\t@input=\\\"saveChanges\\\">\\n\\t\\t\\t\\t\\t\\t<template #option=\\\"{label}\\\">\\n\\t\\t\\t\\t\\t\\t\\t{{ textProcessingProviders.find(p => p.class === label)?.name }}\\n\\t\\t\\t\\t\\t\\t</template>\\n\\t\\t\\t\\t\\t\\t<template #selected-option=\\\"{label}\\\">\\n\\t\\t\\t\\t\\t\\t\\t{{ textProcessingProviders.find(p => p.class === label)?.name }}\\n\\t\\t\\t\\t\\t\\t</template>\\n\\t\\t\\t\\t\\t</NcSelect>\\n\\t\\t\\t\\t\\t<p>&nbsp;</p>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</template>\\n\\t\\t\\t<template v-if=\\\"!hasTextProcessing\\\">\\n\\t\\t\\t\\t<p>{{ t('settings', 'None of your currently installed apps provide Text processing functionality') }}</p>\\n\\t\\t\\t</template>\\n\\t\\t</NcSettingsSection>\\n\\t</div>\\n</template>\\n\\n<script>\\nimport axios from '@nextcloud/axios'\\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'\\nimport NcSettingsSection from '@nextcloud/vue/dist/Components/NcSettingsSection.js'\\nimport NcSelect from '@nextcloud/vue/dist/Components/NcSelect.js'\\nimport NcButton from '@nextcloud/vue/dist/Components/NcButton.js'\\nimport draggable from 'vuedraggable'\\nimport DragVerticalIcon from 'vue-material-design-icons/DragVertical.vue'\\nimport ArrowDownIcon from 'vue-material-design-icons/ArrowDown.vue'\\nimport ArrowUpIcon from 'vue-material-design-icons/ArrowUp.vue'\\nimport { loadState } from '@nextcloud/initial-state'\\n\\nimport { generateUrl } from '@nextcloud/router'\\n\\nexport default {\\n\\tname: 'AdminAI',\\n\\tcomponents: {\\n\\t\\tNcCheckboxRadioSwitch,\\n\\t\\tNcSettingsSection,\\n\\t\\tNcSelect,\\n\\t\\tdraggable,\\n\\t\\tDragVerticalIcon,\\n\\t\\tArrowDownIcon,\\n\\t\\tArrowUpIcon,\\n\\t\\tNcButton,\\n\\t},\\n\\tdata() {\\n\\t\\treturn {\\n\\t\\t\\tloading: false,\\n\\t\\t\\tdirty: false,\\n\\t\\t\\tgroups: [],\\n\\t\\t\\tloadingGroups: false,\\n\\t\\t\\tsttProviders: loadState('settings', 'ai-stt-providers'),\\n\\t\\t\\ttranslationProviders: loadState('settings', 'ai-translation-providers'),\\n\\t\\t\\ttextProcessingProviders: loadState('settings', 'ai-text-processing-providers'),\\n\\t\\t\\ttextProcessingTaskTypes: loadState('settings', 'ai-text-processing-task-types'),\\n\\t\\t\\tsettings: loadState('settings', 'ai-settings'),\\n\\t\\t}\\n\\t},\\n\\tcomputed: {\\n\\t\\thasStt() {\\n\\t\\t\\treturn this.sttProviders.length > 0\\n\\t\\t},\\n\\t\\thasTextProcessing() {\\n\\t\\t\\treturn Object.keys(this.settings['ai.textprocessing_provider_preferences']).length > 0 && Array.isArray(this.textProcessingTaskTypes)\\n\\t\\t},\\n\\t\\ttpTaskTypes() {\\n\\t\\t\\treturn Object.keys(this.settings['ai.textprocessing_provider_preferences']).filter(type => !!this.getTaskType(type))\\n\\t\\t},\\n\\t},\\n\\tmethods: {\\n\\t moveUp(i) {\\n\\t\\t\\tthis.settings['ai.translation_provider_preferences'].splice(\\n\\t\\t\\t Math.min(i - 1, 0),\\n\\t\\t\\t\\t0,\\n\\t\\t\\t\\t...this.settings['ai.translation_provider_preferences'].splice(i, 1)\\n\\t\\t\\t)\\n\\t\\t\\tthis.saveChanges()\\n\\t\\t},\\n\\t\\tmoveDown(i) {\\n\\t\\t\\tthis.settings['ai.translation_provider_preferences'].splice(\\n\\t\\t\\t\\ti + 1,\\n\\t\\t\\t\\t0,\\n\\t\\t\\t\\t...this.settings['ai.translation_provider_preferences'].splice(i, 1)\\n\\t\\t\\t)\\n\\t\\t\\tthis.saveChanges()\\n\\t\\t},\\n\\t\\tasync saveChanges() {\\n\\t\\t\\tthis.loading = true\\n\\t\\t\\tconst data = { settings: this.settings }\\n\\t\\t\\ttry {\\n\\t\\t\\t\\tawait axios.put(generateUrl('/settings/api/admin/ai'), data)\\n\\t\\t\\t} catch (err) {\\n\\t\\t\\t\\tconsole.error('could not save changes', err)\\n\\t\\t\\t}\\n\\t\\t\\tthis.loading = false\\n\\t\\t},\\n\\t\\tgetTaskType(type) {\\n\\t\\t if (!Array.isArray(this.textProcessingTaskTypes)) {\\n\\t\\t\\t\\treturn null\\n\\t\\t\\t}\\n\\t\\t\\treturn this.textProcessingTaskTypes.find(taskType => taskType.class === type)\\n\\t\\t},\\n\\t},\\n}\\n</script>\\n<style scoped>\\n.draggable__item {\\n\\tmargin-bottom: 5px;\\n display: flex;\\n align-items: center;\\n}\\n\\n.draggable__item,\\n.draggable__item * {\\n cursor: grab;\\n}\\n\\n.draggable__number {\\n\\tborder-radius: 20px;\\n\\tborder: 2px solid var(--color-primary-default);\\n\\tcolor: var(--color-primary-default);\\n padding: 0px 7px;\\n\\tmargin-right: 3px;\\n}\\n\\n.drag-vertical-icon {\\n float: left;\\n}\\n</style>\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","// The chunk loading function for additional chunks\n// Since all referenced chunks are already included\n// in this file, this function is empty here.\n__webpack_require__.e = () => (Promise.resolve());","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 1104;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t1104: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknextcloud\"] = self[\"webpackChunknextcloud\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [7874], () => (__webpack_require__(20529)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","name","components","NcCheckboxRadioSwitch","NcSettingsSection","NcSelect","draggable","DragVerticalIcon","ArrowDownIcon","ArrowUpIcon","NcButton","data","loading","dirty","groups","loadingGroups","sttProviders","loadState","translationProviders","textProcessingProviders","textProcessingTaskTypes","settings","computed","hasStt","length","hasTextProcessing","Object","keys","Array","isArray","tpTaskTypes","filter","type","getTaskType","methods","moveUp","i","splice","Math","min","saveChanges","moveDown","axios","generateUrl","err","console","error","find","taskType","class","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","_vm","this","_c","_self","attrs","t","on","model","value","callback","$$v","$set","expression","_l","providerClass","_vm$translationProvid","key","staticClass","_v","_s","p","$event","scopedSlots","_u","fn","proxy","provider","_e","description","map","_ref","_vm$textProcessingPro","label","_ref2","_vm$textProcessingPro2","__webpack_nonce__","btoa","OC","requestToken","Vue","window","Settings","ArtificialIntelligence","$mount","___CSS_LOADER_EXPORT___","push","module","id","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","loaded","__webpack_modules__","call","m","O","result","chunkIds","priority","notFulfilled","Infinity","fulfilled","j","every","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","e","Promise","resolve","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","nmd","paths","children","b","document","baseURI","self","location","href","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","forEach","bind","nc","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file