-(()=>{"use strict";var e,t={28327:(e,t,n)=>{var i=n(21777),o=n(53334),r=n(85471),s=n(35947);const a=null===(c=(0,i.HW)())?(0,s.YK)().setApp("core").build():(0,s.YK)().setApp("core").setUid(c.uid).build();var c;(0,s.YK)().setApp("unified-search").detectUser().build();var l=n(65043),p=n(63814),d=n(32981);function u(e,t,n){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.set(e,n)}function h(e,t,n){return e.set(m(e,t),n),n}function A(e,t){return e.get(m(e,t))}function m(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}function v(e,t,n){return(t=function(e){var t=function(e){if("object"!=typeof e||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class f{constructor(e){v(this,"value",void 0),v(this,"next",void 0),this.value=e}}var g=new WeakMap,C=new WeakMap,b=new WeakMap;class y{constructor(){u(this,g,void 0),u(this,C,void 0),u(this,b,void 0),this.clear()}enqueue(e){var t;const n=new f(e);A(g,this)?(A(C,this).next=n,h(C,this,n)):(h(g,this,n),h(C,this,n)),h(b,this,(t=A(b,this),++t))}dequeue(){var e;const t=A(g,this);if(t)return h(g,this,A(g,this).next),h(b,this,(e=A(b,this),--e)),t.value}peek(){if(A(g,this))return A(g,this).value}clear(){h(g,this,void 0),h(C,this,void 0),h(b,this,0)}get size(){return A(b,this)}*[Symbol.iterator](){let e=A(g,this);for(;e;)yield e.value,e=e.next}}function w(e){_(e);const t=new y;let n=0;const i=()=>{n<e&&t.size>0&&(t.dequeue()(),n++)},o=async(e,t,o)=>{const r=(async()=>e(...o))();t(r);try{await r}catch{}n--,i()},r=function(r){for(var s=arguments.length,a=new Array(s>1?s-1:0),c=1;c<s;c++)a[c-1]=arguments[c];return new Promise((s=>{((r,s,a)=>{new Promise((e=>{t.enqueue(e)})).then(o.bind(void 0,r,s,a)),(async()=>{await Promise.resolve(),n<e&&i()})()})(r,s,a)}))};return Object.defineProperties(r,{activeCount:{get:()=>n},pendingCount:{get:()=>t.size},clearQueue:{value(){t.clear()}},concurrency:{get:()=>e,set(o){_(o),e=o,queueMicrotask((()=>{for(;n<e&&t.size>0;)i()}))}}}),r}function _(e){if(!Number.isInteger(e)&&e!==Number.POSITIVE_INFINITY||!(e>0))throw new TypeError("Expected `concurrency` to be a number from 1 and up")}var x=n(32073),k=n(70995);const S={calendar:{description:(0,o.Tl)("core","Schedule work & meetings, synced with all your devices."),icon:(0,p.d0)("core","places/calendar.svg")},contacts:{description:(0,o.Tl)("core","Keep your colleagues and friends in one place without leaking their private info."),icon:(0,p.d0)("core","places/contacts.svg")},mail:{description:(0,o.Tl)("core","Simple email app nicely integrated with Files, Contacts and Calendar."),icon:(0,p.d0)("core","actions/mail.svg")},spreed:{description:(0,o.Tl)("core","Chatting, video calls, screensharing, online meetings and web conferencing – in your browser and with mobile apps."),icon:(0,p.d0)("core","apps/spreed.svg")},richdocuments:{name:"Nextcloud Office",description:(0,o.Tl)("core","Collaborative documents, spreadsheets and presentations, built on Collabora Online."),icon:(0,p.d0)("core","apps/richdocuments.svg")},notes:{description:(0,o.Tl)("core","Distraction free note taking app."),icon:(0,p.d0)("core","apps/notes.svg")},richdocumentscode:{hidden:!0}},I=Object.keys(S),P={name:"RecommendedApps",components:{NcCheckboxRadioSwitch:x.A,NcButton:k.A},data:()=>({showInstallButton:!1,installingApps:!1,loadingApps:!0,loadingAppsError:!1,apps:[],defaultPageUrl:(0,d.C)("core","defaultPageUrl")}),computed:{recommendedApps(){return this.apps.filter((e=>I.includes(e.id)))},isAnyAppSelected(){return this.recommendedApps.some((e=>e.isSelected))}},async mounted(){try{const{data:e}=await l.Ay.get((0,p.Jv)("settings/apps/list"));a.info(`${e.apps.length} apps fetched`),this.apps=e.apps.map((e=>Object.assign(e,{loading:!1,installationError:!1,isSelected:e.isCompatible}))),a.debug(`${this.recommendedApps.length} recommended apps found`,{apps:this.recommendedApps}),this.showInstallButton=!0}catch(e){a.error("could not fetch app list",{error:e}),this.loadingAppsError=!0}finally{this.loadingApps=!1}},methods:{installApps(){this.installingApps=!0;const e=w(1),t=this.recommendedApps.filter((e=>!e.active&&e.isCompatible&&e.canInstall&&e.isSelected)).map((t=>e((async()=>(a.info(`installing ${t.id}`),t.loading=!0,l.Ay.post((0,p.Jv)("settings/apps/enable"),{appIds:[t.id],groups:[]}).catch((e=>{a.error(`could not install ${t.id}`,{error:e}),t.isSelected=!1,t.installationError=!0})).then((()=>{a.info(`installed ${t.id}`),t.loading=!1,t.active=!0})))))));a.debug(`installing ${t.length} recommended apps`),Promise.all(t).then((()=>{a.info("all recommended apps installed, redirecting …"),window.location=this.defaultPageUrl})).catch((e=>a.error("could not install recommended apps",{error:e})))},customIcon:e=>e in S&&S[e].icon?S[e].icon:(a.warn(`no app icon for recommended app ${e}`),(0,p.d0)("core","places/default-app-icon.svg")),customName:e=>e.id in S&&S[e.id].name||e.name,customDescription:e=>e in S?S[e].description:(a.warn(`no app description for recommended app ${e}`),""),isHidden:e=>e in S&&!!S[e].hidden,toggleSelect(e){if(!(e in S)||!this.showInstallButton)return;const t=this.apps.findIndex((t=>t.id===e));this.$set(this.apps[t],"isSelected",!this.apps[t].isSelected)}}};var O=n(85072),B=n.n(O),T=n(97825),j=n.n(T),E=n(77659),N=n.n(E),D=n(55056),$=n.n(D),Y=n(10540),U=n.n(Y),M=n(41113),R=n.n(M),q=n(6099),z={};z.styleTagTransform=R(),z.setAttributes=$(),z.insert=N().bind(null,"head"),z.domAPI=j(),z.insertStyleElement=U(),B()(q.A,z),q.A&&q.A.locals&&q.A.locals;const F=(0,n(14486).A)(P,(function(){var e=this,t=e._self._c;return t("div",{staticClass:"guest-box"},[t("h2",[e._v(e._s(e.t("core","Recommended apps")))]),e._v(" "),e.loadingApps?t("p",{staticClass:"loading text-center"},[e._v("\n\t\t"+e._s(e.t("core","Loading apps …"))+"\n\t")]):e.loadingAppsError?t("p",{staticClass:"loading-error text-center"},[e._v("\n\t\t"+e._s(e.t("core","Could not fetch list of apps from the App Store."))+"\n\t")]):e._e(),e._v(" "),e._l(e.recommendedApps,(function(n){return t("div",{key:n.id,staticClass:"app"},[e.isHidden(n.id)?e._e():[t("img",{attrs:{src:e.customIcon(n.id),alt:""}}),e._v(" "),t("div",{staticClass:"info"},[t("h3",[e._v(e._s(e.customName(n)))]),e._v(" "),t("p",{domProps:{textContent:e._s(e.customDescription(n.id))}}),e._v(" "),n.installationError?t("p",[t("strong",[e._v(e._s(e.t("core","App download or installation failed")))])]):n.isCompatible?n.canInstall?e._e():t("p",[t("strong",[e._v(e._s(e.t("core","Cannot install this app")))])]):t("p",[t("strong",[e._v(e._s(e.t("core","Cannot install this app because it is not compatible")))])])]),e._v(" "),t("NcCheckboxRadioSwitch",{attrs:{checked:n.isSelected||n.active,disabled:!n.isCompatible||n.active,loading:n.loading},on:{"update:checked":function(t){return e.toggleSelect(n.id)}}})]],2)})),e._v(" "),t("div",{staticClass:"dialog-row"},[e.showInstallButton&&!e.installingApps?t("NcButton",{attrs:{type:"tertiary",role:"link",href:e.defaultPageUrl}},[e._v("\n\t\t\t"+e._s(e.t("core","Skip"))+"\n\t\t")]):e._e(),e._v(" "),e.showInstallButton?t("NcButton",{attrs:{type:"primary",disabled:e.installingApps||!e.isAnyAppSelected},on:{click:function(t){return t.stopPropagation(),t.preventDefault(),e.installApps.apply(null,arguments)}}},[e._v("\n\t\t\t"+e._s(e.installingApps?e.t("core","Installing apps …"):e.t("core","Install recommended apps"))+"\n\t\t")]):e._e()],1)],2)}),[],!1,null,"6cc6c86c",null).exports;n.nc=(0,i.aV)(),r.Ay.mixin({methods:{t:o.Tl}}),(new(r.Ay.extend(F))).$mount("#recommended-apps"),a.debug("recommended apps view rendered")},6099:(e,t,n)=>{n.d(t,{A:()=>a});var i=n(71354),o=n.n(i),r=n(76314),s=n.n(r)()(o());s.push([e.id,".dialog-row[data-v-6cc6c86c]{display:flex;justify-content:end;margin-top:8px}p.loading[data-v-6cc6c86c],p.loading-error[data-v-6cc6c86c]{height:100px}p[data-v-6cc6c86c]:last-child{margin-top:10px}.text-center[data-v-6cc6c86c]{text-align:center}.app[data-v-6cc6c86c]{display:flex;flex-direction:row}.app img[data-v-6cc6c86c]{height:50px;width:50px;filter:var(--background-invert-if-dark)}.app img[data-v-6cc6c86c],.app .info[data-v-6cc6c86c]{padding:12px}.app .info h3[data-v-6cc6c86c],.app .info p[data-v-6cc6c86c]{text-align:start}.app .info h3[data-v-6cc6c86c]{margin-top:0}.app .checkbox-radio-switch[data-v-6cc6c86c]{margin-inline-start:auto;padding:0 2px}","",{version:3,sources:["webpack://./core/src/components/setup/RecommendedApps.vue"],names:[],mappings:"AACA,6BACC,YAAA,CACA,mBAAA,CACA,cAAA,CAIA,4DAEC,YAAA,CAGD,8BACC,eAAA,CAIF,8BACC,iBAAA,CAGD,sBACC,YAAA,CACA,kBAAA,CAEA,0BACC,WAAA,CACA,UAAA,CACA,uCAAA,CAGD,sDACC,YAAA,CAIA,6DACC,gBAAA,CAGD,+BACC,YAAA,CAIF,6CACC,wBAAA,CACA,aAAA",sourceRoot:""}]);const a=s}},n={};function i(e){var o=n[e];if(void 0!==o)return o.exports;var r=n[e]={id:e,loaded:!1,exports:{}};return t[e].call(r.exports,r,r.exports,i),r.loaded=!0,r.exports}i.m=t,e=[],i.O=(t,n,o,r)=>{if(!n){var s=1/0;for(p=0;p<e.length;p++){n=e[p][0],o=e[p][1],r=e[p][2];for(var a=!0,c=0;c<n.length;c++)(!1&r||s>=r)&&Object.keys(i.O).every((e=>i.O[e](n[c])))?n.splice(c--,1):(a=!1,r<s&&(s=r));if(a){e.splice(p--,1);var l=o();void 0!==l&&(t=l)}}return t}r=r||0;for(var p=e.length;p>0&&e[p-1][2]>r;p--)e[p]=e[p-1];e[p]=[n,o,r]},i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var n in t)i.o(t,n)&&!i.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},i.e=()=>Promise.resolve(),i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),i.j=2696,(()=>{i.b=document.baseURI||self.location.href;var e={2696:0};i.O.j=t=>0===e[t];var t=(t,n)=>{var o,r,s=n[0],a=n[1],c=n[2],l=0;if(s.some((t=>0!==e[t]))){for(o in a)i.o(a,o)&&(i.m[o]=a[o]);if(c)var p=c(i)}for(t&&t(n);l<s.length;l++)r=s[l],i.o(e,r)&&e[r]&&e[r][0](),e[r]=0;return i.O(p)},n=self.webpackChunknextcloud=self.webpackChunknextcloud||[];n.forEach(t.bind(null,0)),n.push=t.bind(null,n.push.bind(n))})(),i.nc=void 0;var o=i.O(void 0,[4208],(()=>i(28327)));o=i.O(o)})();
-//# sourceMappingURL=core-recommendedapps.js.map?v=d1b0833931c33d43297d
\ No newline at end of file
+(()=>{"use strict";var e,t={8126:(e,t,n)=>{var i=n(21777),a=n(53334),o=n(85471),r=n(35947);const s=null===(c=(0,i.HW)())?(0,r.YK)().setApp("core").build():(0,r.YK)().setApp("core").setUid(c.uid).build();var c;(0,r.YK)().setApp("unified-search").detectUser().build();var l=n(65043),p=n(63814),d=n(32981);function u(e,t,n){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.set(e,n)}function h(e,t,n){return e.set(m(e,t),n),n}function A(e,t){return e.get(m(e,t))}function m(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}function v(e,t,n){return(t=function(e){var t=function(e){if("object"!=typeof e||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class f{constructor(e){v(this,"value",void 0),v(this,"next",void 0),this.value=e}}var g=new WeakMap,C=new WeakMap,b=new WeakMap;class y{constructor(){u(this,g,void 0),u(this,C,void 0),u(this,b,void 0),this.clear()}enqueue(e){var t;const n=new f(e);A(g,this)?(A(C,this).next=n,h(C,this,n)):(h(g,this,n),h(C,this,n)),h(b,this,(t=A(b,this),++t))}dequeue(){var e;const t=A(g,this);if(t)return h(g,this,A(g,this).next),h(b,this,(e=A(b,this),--e)),t.value}peek(){if(A(g,this))return A(g,this).value}clear(){h(g,this,void 0),h(C,this,void 0),h(b,this,0)}get size(){return A(b,this)}*[Symbol.iterator](){let e=A(g,this);for(;e;)yield e.value,e=e.next}}function w(e){_(e);const t=new y;let n=0;const i=()=>{n<e&&t.size>0&&(t.dequeue()(),n++)},a=async(e,t,a)=>{const o=(async()=>e(...a))();t(o);try{await o}catch{}n--,i()},o=function(o){for(var r=arguments.length,s=new Array(r>1?r-1:0),c=1;c<r;c++)s[c-1]=arguments[c];return new Promise((r=>{((o,r,s)=>{new Promise((e=>{t.enqueue(e)})).then(a.bind(void 0,o,r,s)),(async()=>{await Promise.resolve(),n<e&&i()})()})(o,r,s)}))};return Object.defineProperties(o,{activeCount:{get:()=>n},pendingCount:{get:()=>t.size},clearQueue:{value(){t.clear()}},concurrency:{get:()=>e,set(a){_(a),e=a,queueMicrotask((()=>{for(;n<e&&t.size>0;)i()}))}}}),o}function _(e){if(!Number.isInteger(e)&&e!==Number.POSITIVE_INFINITY||!(e>0))throw new TypeError("Expected `concurrency` to be a number from 1 and up")}var x=n(32073),k=n(70995);const S={calendar:{description:(0,a.Tl)("core","Schedule work & meetings, synced with all your devices."),icon:(0,p.d0)("core","places/calendar.svg")},contacts:{description:(0,a.Tl)("core","Keep your colleagues and friends in one place without leaking their private info."),icon:(0,p.d0)("core","places/contacts.svg")},mail:{description:(0,a.Tl)("core","Simple email app nicely integrated with Files, Contacts and Calendar."),icon:(0,p.d0)("core","actions/mail.svg")},spreed:{description:(0,a.Tl)("core","Chatting, video calls, screen sharing, online meetings and web conferencing – in your browser and with mobile apps."),icon:(0,p.d0)("core","apps/spreed.svg")},richdocuments:{name:"Nextcloud Office",description:(0,a.Tl)("core","Collaborative documents, spreadsheets and presentations, built on Collabora Online."),icon:(0,p.d0)("core","apps/richdocuments.svg")},notes:{description:(0,a.Tl)("core","Distraction free note taking app."),icon:(0,p.d0)("core","apps/notes.svg")},richdocumentscode:{hidden:!0}},I=Object.keys(S),P={name:"RecommendedApps",components:{NcCheckboxRadioSwitch:x.A,NcButton:k.A},data:()=>({showInstallButton:!1,installingApps:!1,loadingApps:!0,loadingAppsError:!1,apps:[],defaultPageUrl:(0,d.C)("core","defaultPageUrl")}),computed:{recommendedApps(){return this.apps.filter((e=>I.includes(e.id)))},isAnyAppSelected(){return this.recommendedApps.some((e=>e.isSelected))}},async mounted(){try{const{data:e}=await l.Ay.get((0,p.Jv)("settings/apps/list"));s.info(`${e.apps.length} apps fetched`),this.apps=e.apps.map((e=>Object.assign(e,{loading:!1,installationError:!1,isSelected:e.isCompatible}))),s.debug(`${this.recommendedApps.length} recommended apps found`,{apps:this.recommendedApps}),this.showInstallButton=!0}catch(e){s.error("could not fetch app list",{error:e}),this.loadingAppsError=!0}finally{this.loadingApps=!1}},methods:{installApps(){this.installingApps=!0;const e=w(1),t=this.recommendedApps.filter((e=>!e.active&&e.isCompatible&&e.canInstall&&e.isSelected)).map((t=>e((async()=>(s.info(`installing ${t.id}`),t.loading=!0,l.Ay.post((0,p.Jv)("settings/apps/enable"),{appIds:[t.id],groups:[]}).catch((e=>{s.error(`could not install ${t.id}`,{error:e}),t.isSelected=!1,t.installationError=!0})).then((()=>{s.info(`installed ${t.id}`),t.loading=!1,t.active=!0})))))));s.debug(`installing ${t.length} recommended apps`),Promise.all(t).then((()=>{s.info("all recommended apps installed, redirecting …"),window.location=this.defaultPageUrl})).catch((e=>s.error("could not install recommended apps",{error:e})))},customIcon:e=>e in S&&S[e].icon?S[e].icon:(s.warn(`no app icon for recommended app ${e}`),(0,p.d0)("core","places/default-app-icon.svg")),customName:e=>e.id in S&&S[e.id].name||e.name,customDescription:e=>e in S?S[e].description:(s.warn(`no app description for recommended app ${e}`),""),isHidden:e=>e in S&&!!S[e].hidden,toggleSelect(e){if(!(e in S)||!this.showInstallButton)return;const t=this.apps.findIndex((t=>t.id===e));this.$set(this.apps[t],"isSelected",!this.apps[t].isSelected)}}};var O=n(85072),B=n.n(O),T=n(97825),j=n.n(T),E=n(77659),N=n.n(E),D=n(55056),$=n.n(D),Y=n(10540),U=n.n(Y),M=n(41113),R=n.n(M),q=n(17858),z={};z.styleTagTransform=R(),z.setAttributes=$(),z.insert=N().bind(null,"head"),z.domAPI=j(),z.insertStyleElement=U(),B()(q.A,z),q.A&&q.A.locals&&q.A.locals;const F=(0,n(14486).A)(P,(function(){var e=this,t=e._self._c;return t("div",{staticClass:"guest-box"},[t("h2",[e._v(e._s(e.t("core","Recommended apps")))]),e._v(" "),e.loadingApps?t("p",{staticClass:"loading text-center"},[e._v("\n\t\t"+e._s(e.t("core","Loading apps …"))+"\n\t")]):e.loadingAppsError?t("p",{staticClass:"loading-error text-center"},[e._v("\n\t\t"+e._s(e.t("core","Could not fetch list of apps from the App Store."))+"\n\t")]):e._e(),e._v(" "),e._l(e.recommendedApps,(function(n){return t("div",{key:n.id,staticClass:"app"},[e.isHidden(n.id)?e._e():[t("img",{attrs:{src:e.customIcon(n.id),alt:""}}),e._v(" "),t("div",{staticClass:"info"},[t("h3",[e._v(e._s(e.customName(n)))]),e._v(" "),t("p",{domProps:{textContent:e._s(e.customDescription(n.id))}}),e._v(" "),n.installationError?t("p",[t("strong",[e._v(e._s(e.t("core","App download or installation failed")))])]):n.isCompatible?n.canInstall?e._e():t("p",[t("strong",[e._v(e._s(e.t("core","Cannot install this app")))])]):t("p",[t("strong",[e._v(e._s(e.t("core","Cannot install this app because it is not compatible")))])])]),e._v(" "),t("NcCheckboxRadioSwitch",{attrs:{checked:n.isSelected||n.active,disabled:!n.isCompatible||n.active,loading:n.loading},on:{"update:checked":function(t){return e.toggleSelect(n.id)}}})]],2)})),e._v(" "),t("div",{staticClass:"dialog-row"},[e.showInstallButton&&!e.installingApps?t("NcButton",{attrs:{type:"tertiary",role:"link",href:e.defaultPageUrl}},[e._v("\n\t\t\t"+e._s(e.t("core","Skip"))+"\n\t\t")]):e._e(),e._v(" "),e.showInstallButton?t("NcButton",{attrs:{type:"primary",disabled:e.installingApps||!e.isAnyAppSelected},on:{click:function(t){return t.stopPropagation(),t.preventDefault(),e.installApps.apply(null,arguments)}}},[e._v("\n\t\t\t"+e._s(e.installingApps?e.t("core","Installing apps …"):e.t("core","Install recommended apps"))+"\n\t\t")]):e._e()],1)],2)}),[],!1,null,"2917aac0",null).exports;n.nc=(0,i.aV)(),o.Ay.mixin({methods:{t:a.Tl}}),(new(o.Ay.extend(F))).$mount("#recommended-apps"),s.debug("recommended apps view rendered")},17858:(e,t,n)=>{n.d(t,{A:()=>s});var i=n(71354),a=n.n(i),o=n(76314),r=n.n(o)()(a());r.push([e.id,".dialog-row[data-v-2917aac0]{display:flex;justify-content:end;margin-top:8px}p.loading[data-v-2917aac0],p.loading-error[data-v-2917aac0]{height:100px}p[data-v-2917aac0]:last-child{margin-top:10px}.text-center[data-v-2917aac0]{text-align:center}.app[data-v-2917aac0]{display:flex;flex-direction:row}.app img[data-v-2917aac0]{height:50px;width:50px;filter:var(--background-invert-if-dark)}.app img[data-v-2917aac0],.app .info[data-v-2917aac0]{padding:12px}.app .info h3[data-v-2917aac0],.app .info p[data-v-2917aac0]{text-align:start}.app .info h3[data-v-2917aac0]{margin-top:0}.app .checkbox-radio-switch[data-v-2917aac0]{margin-inline-start:auto;padding:0 2px}","",{version:3,sources:["webpack://./core/src/components/setup/RecommendedApps.vue"],names:[],mappings:"AACA,6BACC,YAAA,CACA,mBAAA,CACA,cAAA,CAIA,4DAEC,YAAA,CAGD,8BACC,eAAA,CAIF,8BACC,iBAAA,CAGD,sBACC,YAAA,CACA,kBAAA,CAEA,0BACC,WAAA,CACA,UAAA,CACA,uCAAA,CAGD,sDACC,YAAA,CAIA,6DACC,gBAAA,CAGD,+BACC,YAAA,CAIF,6CACC,wBAAA,CACA,aAAA",sourceRoot:""}]);const s=r}},n={};function i(e){var a=n[e];if(void 0!==a)return a.exports;var o=n[e]={id:e,loaded:!1,exports:{}};return t[e].call(o.exports,o,o.exports,i),o.loaded=!0,o.exports}i.m=t,e=[],i.O=(t,n,a,o)=>{if(!n){var r=1/0;for(p=0;p<e.length;p++){n=e[p][0],a=e[p][1],o=e[p][2];for(var s=!0,c=0;c<n.length;c++)(!1&o||r>=o)&&Object.keys(i.O).every((e=>i.O[e](n[c])))?n.splice(c--,1):(s=!1,o<r&&(r=o));if(s){e.splice(p--,1);var l=a();void 0!==l&&(t=l)}}return t}o=o||0;for(var p=e.length;p>0&&e[p-1][2]>o;p--)e[p]=e[p-1];e[p]=[n,a,o]},i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var n in t)i.o(t,n)&&!i.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},i.e=()=>Promise.resolve(),i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),i.j=2696,(()=>{i.b=document.baseURI||self.location.href;var e={2696:0};i.O.j=t=>0===e[t];var t=(t,n)=>{var a,o,r=n[0],s=n[1],c=n[2],l=0;if(r.some((t=>0!==e[t]))){for(a in s)i.o(s,a)&&(i.m[a]=s[a]);if(c)var p=c(i)}for(t&&t(n);l<r.length;l++)o=r[l],i.o(e,o)&&e[o]&&e[o][0](),e[o]=0;return i.O(p)},n=self.webpackChunknextcloud=self.webpackChunknextcloud||[];n.forEach(t.bind(null,0)),n.push=t.bind(null,n.push.bind(n))})(),i.nc=void 0;var a=i.O(void 0,[4208],(()=>i(8126)));a=i.O(a)})();
+//# sourceMappingURL=core-recommendedapps.js.map?v=7a90f101fe8b6296cf6a
\ No newline at end of file
-{"version":3,"file":"core-recommendedapps.js?v=d1b0833931c33d43297d","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/core/src/logger.js","webpack://nextcloud/./core/src/components/setup/RecommendedApps.vue?5f06","webpack:///nextcloud/node_modules/yocto-queue/index.js","webpack:///nextcloud/node_modules/p-limit/index.js","webpack:///nextcloud/core/src/components/setup/RecommendedApps.vue","webpack:///nextcloud/core/src/components/setup/RecommendedApps.vue?vue&type=script&lang=js","webpack://nextcloud/./core/src/components/setup/RecommendedApps.vue?397a","webpack://nextcloud/./core/src/components/setup/RecommendedApps.vue?84e8","webpack:///nextcloud/core/src/recommendedapps.js","webpack:///nextcloud/core/src/components/setup/RecommendedApps.vue?vue&type=style&index=0&id=6cc6c86c&prod&lang=scss&scoped=true","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};","/**\n * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { getCurrentUser } from '@nextcloud/auth'\nimport { getLoggerBuilder } from '@nextcloud/logger'\n\nconst getLogger = user => {\n\tif (user === null) {\n\t\treturn getLoggerBuilder()\n\t\t\t.setApp('core')\n\t\t\t.build()\n\t}\n\treturn getLoggerBuilder()\n\t\t.setApp('core')\n\t\t.setUid(user.uid)\n\t\t.build()\n}\n\nexport default getLogger(getCurrentUser())\n\nexport const unifiedSearchLogger = getLoggerBuilder()\n\t.setApp('unified-search')\n\t.detectUser()\n\t.build()\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"guest-box\"},[_c('h2',[_vm._v(_vm._s(_vm.t('core', 'Recommended apps')))]),_vm._v(\" \"),(_vm.loadingApps)?_c('p',{staticClass:\"loading text-center\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('core', 'Loading apps …'))+\"\\n\\t\")]):(_vm.loadingAppsError)?_c('p',{staticClass:\"loading-error text-center\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('core', 'Could not fetch list of apps from the App Store.'))+\"\\n\\t\")]):_vm._e(),_vm._v(\" \"),_vm._l((_vm.recommendedApps),function(app){return _c('div',{key:app.id,staticClass:\"app\"},[(!_vm.isHidden(app.id))?[_c('img',{attrs:{\"src\":_vm.customIcon(app.id),\"alt\":\"\"}}),_vm._v(\" \"),_c('div',{staticClass:\"info\"},[_c('h3',[_vm._v(_vm._s(_vm.customName(app)))]),_vm._v(\" \"),_c('p',{domProps:{\"textContent\":_vm._s(_vm.customDescription(app.id))}}),_vm._v(\" \"),(app.installationError)?_c('p',[_c('strong',[_vm._v(_vm._s(_vm.t('core', 'App download or installation failed')))])]):(!app.isCompatible)?_c('p',[_c('strong',[_vm._v(_vm._s(_vm.t('core', 'Cannot install this app because it is not compatible')))])]):(!app.canInstall)?_c('p',[_c('strong',[_vm._v(_vm._s(_vm.t('core', 'Cannot install this app')))])]):_vm._e()]),_vm._v(\" \"),_c('NcCheckboxRadioSwitch',{attrs:{\"checked\":app.isSelected || app.active,\"disabled\":!app.isCompatible || app.active,\"loading\":app.loading},on:{\"update:checked\":function($event){return _vm.toggleSelect(app.id)}}})]:_vm._e()],2)}),_vm._v(\" \"),_c('div',{staticClass:\"dialog-row\"},[(_vm.showInstallButton && !_vm.installingApps)?_c('NcButton',{attrs:{\"type\":\"tertiary\",\"role\":\"link\",\"href\":_vm.defaultPageUrl}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('core', 'Skip'))+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.showInstallButton)?_c('NcButton',{attrs:{\"type\":\"primary\",\"disabled\":_vm.installingApps || !_vm.isAnyAppSelected},on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.installApps.apply(null, arguments)}}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.installingApps ? _vm.t('core', 'Installing apps …') : _vm.t('core', 'Install recommended apps'))+\"\\n\\t\\t\")]):_vm._e()],1)],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/*\nHow it works:\n`this.#head` is an instance of `Node` which keeps track of its current value and nests another instance of `Node` that keeps the value that comes after it. When a value is provided to `.enqueue()`, the code needs to iterate through `this.#head`, going deeper and deeper to find the last value. However, iterating through every single item is slow. This problem is solved by saving a reference to the last value as `this.#tail` so that it can reference it to add a new value.\n*/\n\nclass Node {\n\tvalue;\n\tnext;\n\n\tconstructor(value) {\n\t\tthis.value = value;\n\t}\n}\n\nexport default class Queue {\n\t#head;\n\t#tail;\n\t#size;\n\n\tconstructor() {\n\t\tthis.clear();\n\t}\n\n\tenqueue(value) {\n\t\tconst node = new Node(value);\n\n\t\tif (this.#head) {\n\t\t\tthis.#tail.next = node;\n\t\t\tthis.#tail = node;\n\t\t} else {\n\t\t\tthis.#head = node;\n\t\t\tthis.#tail = node;\n\t\t}\n\n\t\tthis.#size++;\n\t}\n\n\tdequeue() {\n\t\tconst current = this.#head;\n\t\tif (!current) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#head = this.#head.next;\n\t\tthis.#size--;\n\t\treturn current.value;\n\t}\n\n\tpeek() {\n\t\tif (!this.#head) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this.#head.value;\n\n\t\t// TODO: Node.js 18.\n\t\t// return this.#head?.value;\n\t}\n\n\tclear() {\n\t\tthis.#head = undefined;\n\t\tthis.#tail = undefined;\n\t\tthis.#size = 0;\n\t}\n\n\tget size() {\n\t\treturn this.#size;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tlet current = this.#head;\n\n\t\twhile (current) {\n\t\t\tyield current.value;\n\t\t\tcurrent = current.next;\n\t\t}\n\t}\n}\n","import Queue from 'yocto-queue';\n\nexport default function pLimit(concurrency) {\n\tvalidateConcurrency(concurrency);\n\n\tconst queue = new Queue();\n\tlet activeCount = 0;\n\n\tconst resumeNext = () => {\n\t\tif (activeCount < concurrency && queue.size > 0) {\n\t\t\tqueue.dequeue()();\n\t\t\t// Since `pendingCount` has been decreased by one, increase `activeCount` by one.\n\t\t\tactiveCount++;\n\t\t}\n\t};\n\n\tconst next = () => {\n\t\tactiveCount--;\n\n\t\tresumeNext();\n\t};\n\n\tconst run = async (function_, resolve, arguments_) => {\n\t\tconst result = (async () => function_(...arguments_))();\n\n\t\tresolve(result);\n\n\t\ttry {\n\t\t\tawait result;\n\t\t} catch {}\n\n\t\tnext();\n\t};\n\n\tconst enqueue = (function_, resolve, arguments_) => {\n\t\t// Queue `internalResolve` instead of the `run` function\n\t\t// to preserve asynchronous context.\n\t\tnew Promise(internalResolve => {\n\t\t\tqueue.enqueue(internalResolve);\n\t\t}).then(\n\t\t\trun.bind(undefined, function_, resolve, arguments_),\n\t\t);\n\n\t\t(async () => {\n\t\t\t// This function needs to wait until the next microtask before comparing\n\t\t\t// `activeCount` to `concurrency`, because `activeCount` is updated asynchronously\n\t\t\t// after the `internalResolve` function is dequeued and called. The comparison in the if-statement\n\t\t\t// needs to happen asynchronously as well to get an up-to-date value for `activeCount`.\n\t\t\tawait Promise.resolve();\n\n\t\t\tif (activeCount < concurrency) {\n\t\t\t\tresumeNext();\n\t\t\t}\n\t\t})();\n\t};\n\n\tconst generator = (function_, ...arguments_) => new Promise(resolve => {\n\t\tenqueue(function_, resolve, arguments_);\n\t});\n\n\tObject.defineProperties(generator, {\n\t\tactiveCount: {\n\t\t\tget: () => activeCount,\n\t\t},\n\t\tpendingCount: {\n\t\t\tget: () => queue.size,\n\t\t},\n\t\tclearQueue: {\n\t\t\tvalue() {\n\t\t\t\tqueue.clear();\n\t\t\t},\n\t\t},\n\t\tconcurrency: {\n\t\t\tget: () => concurrency,\n\n\t\t\tset(newConcurrency) {\n\t\t\t\tvalidateConcurrency(newConcurrency);\n\t\t\t\tconcurrency = newConcurrency;\n\n\t\t\t\tqueueMicrotask(() => {\n\t\t\t\t\t// eslint-disable-next-line no-unmodified-loop-condition\n\t\t\t\t\twhile (activeCount < concurrency && queue.size > 0) {\n\t\t\t\t\t\tresumeNext();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t});\n\n\treturn generator;\n}\n\nfunction validateConcurrency(concurrency) {\n\tif (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) {\n\t\tthrow new TypeError('Expected `concurrency` to be a number from 1 and up');\n\t}\n}\n","<!--\n - SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<div class=\"guest-box\">\n\t\t<h2>{{ t('core', 'Recommended apps') }}</h2>\n\t\t<p v-if=\"loadingApps\" class=\"loading text-center\">\n\t\t\t{{ t('core', 'Loading apps …') }}\n\t\t</p>\n\t\t<p v-else-if=\"loadingAppsError\" class=\"loading-error text-center\">\n\t\t\t{{ t('core', 'Could not fetch list of apps from the App Store.') }}\n\t\t</p>\n\n\t\t<div v-for=\"app in recommendedApps\" :key=\"app.id\" class=\"app\">\n\t\t\t<template v-if=\"!isHidden(app.id)\">\n\t\t\t\t<img :src=\"customIcon(app.id)\" alt=\"\">\n\t\t\t\t<div class=\"info\">\n\t\t\t\t\t<h3>{{ customName(app) }}</h3>\n\t\t\t\t\t<p v-text=\"customDescription(app.id)\" />\n\t\t\t\t\t<p v-if=\"app.installationError\">\n\t\t\t\t\t\t<strong>{{ t('core', 'App download or installation failed') }}</strong>\n\t\t\t\t\t</p>\n\t\t\t\t\t<p v-else-if=\"!app.isCompatible\">\n\t\t\t\t\t\t<strong>{{ t('core', 'Cannot install this app because it is not compatible') }}</strong>\n\t\t\t\t\t</p>\n\t\t\t\t\t<p v-else-if=\"!app.canInstall\">\n\t\t\t\t\t\t<strong>{{ t('core', 'Cannot install this app') }}</strong>\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t\t<NcCheckboxRadioSwitch :checked=\"app.isSelected || app.active\"\n\t\t\t\t\t:disabled=\"!app.isCompatible || app.active\"\n\t\t\t\t\t:loading=\"app.loading\"\n\t\t\t\t\t@update:checked=\"toggleSelect(app.id)\" />\n\t\t\t</template>\n\t\t</div>\n\n\t\t<div class=\"dialog-row\">\n\t\t\t<NcButton v-if=\"showInstallButton && !installingApps\"\n\t\t\t\ttype=\"tertiary\"\n\t\t\t\trole=\"link\"\n\t\t\t\t:href=\"defaultPageUrl\">\n\t\t\t\t{{ t('core', 'Skip') }}\n\t\t\t</NcButton>\n\n\t\t\t<NcButton v-if=\"showInstallButton\"\n\t\t\t\ttype=\"primary\"\n\t\t\t\t:disabled=\"installingApps || !isAnyAppSelected\"\n\t\t\t\t@click.stop.prevent=\"installApps\">\n\t\t\t\t{{ installingApps ? t('core', 'Installing apps …') : t('core', 'Install recommended apps') }}\n\t\t\t</NcButton>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport { generateUrl, imagePath } from '@nextcloud/router'\nimport { loadState } from '@nextcloud/initial-state'\nimport pLimit from 'p-limit'\nimport { translate as t } from '@nextcloud/l10n'\n\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'\nimport NcButton from '@nextcloud/vue/dist/Components/NcButton.js'\n\nimport logger from '../../logger.js'\n\nconst recommended = {\n\tcalendar: {\n\t\tdescription: t('core', 'Schedule work & meetings, synced with all your devices.'),\n\t\ticon: imagePath('core', 'places/calendar.svg'),\n\t},\n\tcontacts: {\n\t\tdescription: t('core', 'Keep your colleagues and friends in one place without leaking their private info.'),\n\t\ticon: imagePath('core', 'places/contacts.svg'),\n\t},\n\tmail: {\n\t\tdescription: t('core', 'Simple email app nicely integrated with Files, Contacts and Calendar.'),\n\t\ticon: imagePath('core', 'actions/mail.svg'),\n\t},\n\tspreed: {\n\t\tdescription: t('core', 'Chatting, video calls, screensharing, online meetings and web conferencing – in your browser and with mobile apps.'),\n\t\ticon: imagePath('core', 'apps/spreed.svg'),\n\t},\n\trichdocuments: {\n\t\tname: 'Nextcloud Office',\n\t\tdescription: t('core', 'Collaborative documents, spreadsheets and presentations, built on Collabora Online.'),\n\t\ticon: imagePath('core', 'apps/richdocuments.svg'),\n\t},\n\tnotes: {\n\t\tdescription: t('core', 'Distraction free note taking app.'),\n\t\ticon: imagePath('core', 'apps/notes.svg'),\n\t},\n\trichdocumentscode: {\n\t\thidden: true,\n\t},\n}\nconst recommendedIds = Object.keys(recommended)\n\nexport default {\n\tname: 'RecommendedApps',\n\tcomponents: {\n\t\tNcCheckboxRadioSwitch,\n\t\tNcButton,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tshowInstallButton: false,\n\t\t\tinstallingApps: false,\n\t\t\tloadingApps: true,\n\t\t\tloadingAppsError: false,\n\t\t\tapps: [],\n\t\t\tdefaultPageUrl: loadState('core', 'defaultPageUrl'),\n\t\t}\n\t},\n\tcomputed: {\n\t\trecommendedApps() {\n\t\t\treturn this.apps.filter(app => recommendedIds.includes(app.id))\n\t\t},\n\t\tisAnyAppSelected() {\n\t\t\treturn this.recommendedApps.some(app => app.isSelected)\n\t\t},\n\t},\n\tasync mounted() {\n\t\ttry {\n\t\t\tconst { data } = await axios.get(generateUrl('settings/apps/list'))\n\t\t\tlogger.info(`${data.apps.length} apps fetched`)\n\n\t\t\tthis.apps = data.apps.map(app => Object.assign(app, { loading: false, installationError: false, isSelected: app.isCompatible }))\n\t\t\tlogger.debug(`${this.recommendedApps.length} recommended apps found`, { apps: this.recommendedApps })\n\n\t\t\tthis.showInstallButton = true\n\t\t} catch (error) {\n\t\t\tlogger.error('could not fetch app list', { error })\n\n\t\t\tthis.loadingAppsError = true\n\t\t} finally {\n\t\t\tthis.loadingApps = false\n\t\t}\n\t},\n\tmethods: {\n\t\tinstallApps() {\n\t\t\tthis.installingApps = true\n\n\t\t\tconst limit = pLimit(1)\n\t\t\tconst installing = this.recommendedApps\n\t\t\t\t.filter(app => !app.active && app.isCompatible && app.canInstall && app.isSelected)\n\t\t\t\t.map(app => limit(async () => {\n\t\t\t\t\tlogger.info(`installing ${app.id}`)\n\t\t\t\t\tapp.loading = true\n\t\t\t\t\treturn axios.post(generateUrl('settings/apps/enable'), { appIds: [app.id], groups: [] })\n\t\t\t\t\t\t.catch(error => {\n\t\t\t\t\t\t\tlogger.error(`could not install ${app.id}`, { error })\n\t\t\t\t\t\t\tapp.isSelected = false\n\t\t\t\t\t\t\tapp.installationError = true\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\tlogger.info(`installed ${app.id}`)\n\t\t\t\t\t\t\tapp.loading = false\n\t\t\t\t\t\t\tapp.active = true\n\t\t\t\t\t\t})\n\t\t\t\t}))\n\t\t\tlogger.debug(`installing ${installing.length} recommended apps`)\n\t\t\tPromise.all(installing)\n\t\t\t\t.then(() => {\n\t\t\t\t\tlogger.info('all recommended apps installed, redirecting …')\n\n\t\t\t\t\twindow.location = this.defaultPageUrl\n\t\t\t\t})\n\t\t\t\t.catch(error => logger.error('could not install recommended apps', { error }))\n\t\t},\n\t\tcustomIcon(appId) {\n\t\t\tif (!(appId in recommended) || !recommended[appId].icon) {\n\t\t\t\tlogger.warn(`no app icon for recommended app ${appId}`)\n\t\t\t\treturn imagePath('core', 'places/default-app-icon.svg')\n\t\t\t}\n\t\t\treturn recommended[appId].icon\n\t\t},\n\t\tcustomName(app) {\n\t\t\tif (!(app.id in recommended)) {\n\t\t\t\treturn app.name\n\t\t\t}\n\t\t\treturn recommended[app.id].name || app.name\n\t\t},\n\t\tcustomDescription(appId) {\n\t\t\tif (!(appId in recommended)) {\n\t\t\t\tlogger.warn(`no app description for recommended app ${appId}`)\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn recommended[appId].description\n\t\t},\n\t\tisHidden(appId) {\n\t\t\tif (!(appId in recommended)) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn !!recommended[appId].hidden\n\t\t},\n\t\ttoggleSelect(appId) {\n\t\t\t// disable toggle when installButton is disabled\n\t\t\tif (!(appId in recommended) || !this.showInstallButton) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst index = this.apps.findIndex(app => app.id === appId)\n\t\t\tthis.$set(this.apps[index], 'isSelected', !this.apps[index].isSelected)\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.dialog-row {\n\tdisplay: flex;\n\tjustify-content: end;\n\tmargin-top: 8px;\n}\n\np {\n\t&.loading,\n\t&.loading-error {\n\t\theight: 100px;\n\t}\n\n\t&:last-child {\n\t\tmargin-top: 10px;\n\t}\n}\n\n.text-center {\n\ttext-align: center;\n}\n\n.app {\n\tdisplay: flex;\n\tflex-direction: row;\n\n\timg {\n\t\theight: 50px;\n\t\twidth: 50px;\n\t\tfilter: var(--background-invert-if-dark);\n\t}\n\n\timg, .info {\n\t\tpadding: 12px;\n\t}\n\n\t.info {\n\t\th3, p {\n\t\t\ttext-align: start;\n\t\t}\n\n\t\th3 {\n\t\t\tmargin-top: 0;\n\t\t}\n\t}\n\n\t.checkbox-radio-switch {\n\t\tmargin-inline-start: auto;\n\t\tpadding: 0 2px;\n\t}\n}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RecommendedApps.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!./RecommendedApps.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/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RecommendedApps.vue?vue&type=style&index=0&id=6cc6c86c&prod&lang=scss&scoped=true\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\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/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RecommendedApps.vue?vue&type=style&index=0&id=6cc6c86c&prod&lang=scss&scoped=true\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./RecommendedApps.vue?vue&type=template&id=6cc6c86c&scoped=true\"\nimport script from \"./RecommendedApps.vue?vue&type=script&lang=js\"\nexport * from \"./RecommendedApps.vue?vue&type=script&lang=js\"\nimport style0 from \"./RecommendedApps.vue?vue&type=style&index=0&id=6cc6c86c&prod&lang=scss&scoped=true\"\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 \"6cc6c86c\",\n null\n \n)\n\nexport default component.exports","/**\n * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { getCSPNonce } from '@nextcloud/auth'\nimport { translate as t } from '@nextcloud/l10n'\nimport Vue from 'vue'\n\nimport logger from './logger.js'\nimport RecommendedApps from './components/setup/RecommendedApps.vue'\n\n// eslint-disable-next-line camelcase\n__webpack_nonce__ = getCSPNonce()\n\nVue.mixin({\n\tmethods: {\n\t\tt,\n\t},\n})\n\nconst View = Vue.extend(RecommendedApps)\nnew View().$mount('#recommended-apps')\n\nlogger.debug('recommended apps view rendered')\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, `.dialog-row[data-v-6cc6c86c]{display:flex;justify-content:end;margin-top:8px}p.loading[data-v-6cc6c86c],p.loading-error[data-v-6cc6c86c]{height:100px}p[data-v-6cc6c86c]:last-child{margin-top:10px}.text-center[data-v-6cc6c86c]{text-align:center}.app[data-v-6cc6c86c]{display:flex;flex-direction:row}.app img[data-v-6cc6c86c]{height:50px;width:50px;filter:var(--background-invert-if-dark)}.app img[data-v-6cc6c86c],.app .info[data-v-6cc6c86c]{padding:12px}.app .info h3[data-v-6cc6c86c],.app .info p[data-v-6cc6c86c]{text-align:start}.app .info h3[data-v-6cc6c86c]{margin-top:0}.app .checkbox-radio-switch[data-v-6cc6c86c]{margin-inline-start:auto;padding:0 2px}`, \"\",{\"version\":3,\"sources\":[\"webpack://./core/src/components/setup/RecommendedApps.vue\"],\"names\":[],\"mappings\":\"AACA,6BACC,YAAA,CACA,mBAAA,CACA,cAAA,CAIA,4DAEC,YAAA,CAGD,8BACC,eAAA,CAIF,8BACC,iBAAA,CAGD,sBACC,YAAA,CACA,kBAAA,CAEA,0BACC,WAAA,CACA,UAAA,CACA,uCAAA,CAGD,sDACC,YAAA,CAIA,6DACC,gBAAA,CAGD,+BACC,YAAA,CAIF,6CACC,wBAAA,CACA,aAAA\",\"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 = 2696;","__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\t2696: 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, [4208], () => (__webpack_require__(28327)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","user","getCurrentUser","getLoggerBuilder","setApp","build","setUid","uid","detectUser","Node","constructor","value","_defineProperty","this","_head","WeakMap","_tail","_size","Queue","_classPrivateFieldInitSpec","clear","enqueue","_this$size","node","_classPrivateFieldGet","next","_classPrivateFieldSet","dequeue","_this$size3","current","peek","undefined","size","Symbol","iterator","pLimit","concurrency","validateConcurrency","queue","activeCount","resumeNext","run","async","function_","resolve","arguments_","result","generator","_len","arguments","length","Array","_key","Promise","internalResolve","then","bind","Object","defineProperties","get","pendingCount","clearQueue","set","newConcurrency","queueMicrotask","Number","isInteger","POSITIVE_INFINITY","TypeError","recommended","calendar","description","t","icon","imagePath","contacts","mail","spreed","richdocuments","name","notes","richdocumentscode","hidden","recommendedIds","keys","components","NcCheckboxRadioSwitch","NcButton","data","showInstallButton","installingApps","loadingApps","loadingAppsError","apps","defaultPageUrl","loadState","computed","recommendedApps","filter","app","includes","id","isAnyAppSelected","some","isSelected","mounted","axios","generateUrl","logger","info","map","assign","loading","installationError","isCompatible","debug","error","methods","installApps","limit","installing","active","canInstall","post","appIds","groups","catch","all","window","location","customIcon","appId","warn","customName","customDescription","isHidden","toggleSelect","index","findIndex","$set","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","_vm","_c","_self","staticClass","_v","_s","_e","_l","key","attrs","domProps","on","$event","stopPropagation","preventDefault","apply","__webpack_nonce__","getCSPNonce","Vue","mixin","extend","RecommendedApps","$mount","___CSS_LOADER_EXPORT___","push","module","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","loaded","__webpack_modules__","call","m","O","chunkIds","fn","priority","notFulfilled","Infinity","i","fulfilled","j","every","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","e","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","toStringTag","nmd","paths","children","b","document","baseURI","self","href","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","forEach","nc","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"file":"core-recommendedapps.js?v=7a90f101fe8b6296cf6a","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/core/src/logger.js","webpack://nextcloud/./core/src/components/setup/RecommendedApps.vue?5f06","webpack:///nextcloud/node_modules/yocto-queue/index.js","webpack:///nextcloud/node_modules/p-limit/index.js","webpack:///nextcloud/core/src/components/setup/RecommendedApps.vue","webpack:///nextcloud/core/src/components/setup/RecommendedApps.vue?vue&type=script&lang=js","webpack://nextcloud/./core/src/components/setup/RecommendedApps.vue?e65b","webpack://nextcloud/./core/src/components/setup/RecommendedApps.vue?84e8","webpack:///nextcloud/core/src/recommendedapps.js","webpack:///nextcloud/core/src/components/setup/RecommendedApps.vue?vue&type=style&index=0&id=2917aac0&prod&lang=scss&scoped=true","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};","/**\n * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { getCurrentUser } from '@nextcloud/auth'\nimport { getLoggerBuilder } from '@nextcloud/logger'\n\nconst getLogger = user => {\n\tif (user === null) {\n\t\treturn getLoggerBuilder()\n\t\t\t.setApp('core')\n\t\t\t.build()\n\t}\n\treturn getLoggerBuilder()\n\t\t.setApp('core')\n\t\t.setUid(user.uid)\n\t\t.build()\n}\n\nexport default getLogger(getCurrentUser())\n\nexport const unifiedSearchLogger = getLoggerBuilder()\n\t.setApp('unified-search')\n\t.detectUser()\n\t.build()\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"guest-box\"},[_c('h2',[_vm._v(_vm._s(_vm.t('core', 'Recommended apps')))]),_vm._v(\" \"),(_vm.loadingApps)?_c('p',{staticClass:\"loading text-center\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('core', 'Loading apps …'))+\"\\n\\t\")]):(_vm.loadingAppsError)?_c('p',{staticClass:\"loading-error text-center\"},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.t('core', 'Could not fetch list of apps from the App Store.'))+\"\\n\\t\")]):_vm._e(),_vm._v(\" \"),_vm._l((_vm.recommendedApps),function(app){return _c('div',{key:app.id,staticClass:\"app\"},[(!_vm.isHidden(app.id))?[_c('img',{attrs:{\"src\":_vm.customIcon(app.id),\"alt\":\"\"}}),_vm._v(\" \"),_c('div',{staticClass:\"info\"},[_c('h3',[_vm._v(_vm._s(_vm.customName(app)))]),_vm._v(\" \"),_c('p',{domProps:{\"textContent\":_vm._s(_vm.customDescription(app.id))}}),_vm._v(\" \"),(app.installationError)?_c('p',[_c('strong',[_vm._v(_vm._s(_vm.t('core', 'App download or installation failed')))])]):(!app.isCompatible)?_c('p',[_c('strong',[_vm._v(_vm._s(_vm.t('core', 'Cannot install this app because it is not compatible')))])]):(!app.canInstall)?_c('p',[_c('strong',[_vm._v(_vm._s(_vm.t('core', 'Cannot install this app')))])]):_vm._e()]),_vm._v(\" \"),_c('NcCheckboxRadioSwitch',{attrs:{\"checked\":app.isSelected || app.active,\"disabled\":!app.isCompatible || app.active,\"loading\":app.loading},on:{\"update:checked\":function($event){return _vm.toggleSelect(app.id)}}})]:_vm._e()],2)}),_vm._v(\" \"),_c('div',{staticClass:\"dialog-row\"},[(_vm.showInstallButton && !_vm.installingApps)?_c('NcButton',{attrs:{\"type\":\"tertiary\",\"role\":\"link\",\"href\":_vm.defaultPageUrl}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('core', 'Skip'))+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.showInstallButton)?_c('NcButton',{attrs:{\"type\":\"primary\",\"disabled\":_vm.installingApps || !_vm.isAnyAppSelected},on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.installApps.apply(null, arguments)}}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.installingApps ? _vm.t('core', 'Installing apps …') : _vm.t('core', 'Install recommended apps'))+\"\\n\\t\\t\")]):_vm._e()],1)],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/*\nHow it works:\n`this.#head` is an instance of `Node` which keeps track of its current value and nests another instance of `Node` that keeps the value that comes after it. When a value is provided to `.enqueue()`, the code needs to iterate through `this.#head`, going deeper and deeper to find the last value. However, iterating through every single item is slow. This problem is solved by saving a reference to the last value as `this.#tail` so that it can reference it to add a new value.\n*/\n\nclass Node {\n\tvalue;\n\tnext;\n\n\tconstructor(value) {\n\t\tthis.value = value;\n\t}\n}\n\nexport default class Queue {\n\t#head;\n\t#tail;\n\t#size;\n\n\tconstructor() {\n\t\tthis.clear();\n\t}\n\n\tenqueue(value) {\n\t\tconst node = new Node(value);\n\n\t\tif (this.#head) {\n\t\t\tthis.#tail.next = node;\n\t\t\tthis.#tail = node;\n\t\t} else {\n\t\t\tthis.#head = node;\n\t\t\tthis.#tail = node;\n\t\t}\n\n\t\tthis.#size++;\n\t}\n\n\tdequeue() {\n\t\tconst current = this.#head;\n\t\tif (!current) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#head = this.#head.next;\n\t\tthis.#size--;\n\t\treturn current.value;\n\t}\n\n\tpeek() {\n\t\tif (!this.#head) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this.#head.value;\n\n\t\t// TODO: Node.js 18.\n\t\t// return this.#head?.value;\n\t}\n\n\tclear() {\n\t\tthis.#head = undefined;\n\t\tthis.#tail = undefined;\n\t\tthis.#size = 0;\n\t}\n\n\tget size() {\n\t\treturn this.#size;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tlet current = this.#head;\n\n\t\twhile (current) {\n\t\t\tyield current.value;\n\t\t\tcurrent = current.next;\n\t\t}\n\t}\n}\n","import Queue from 'yocto-queue';\n\nexport default function pLimit(concurrency) {\n\tvalidateConcurrency(concurrency);\n\n\tconst queue = new Queue();\n\tlet activeCount = 0;\n\n\tconst resumeNext = () => {\n\t\tif (activeCount < concurrency && queue.size > 0) {\n\t\t\tqueue.dequeue()();\n\t\t\t// Since `pendingCount` has been decreased by one, increase `activeCount` by one.\n\t\t\tactiveCount++;\n\t\t}\n\t};\n\n\tconst next = () => {\n\t\tactiveCount--;\n\n\t\tresumeNext();\n\t};\n\n\tconst run = async (function_, resolve, arguments_) => {\n\t\tconst result = (async () => function_(...arguments_))();\n\n\t\tresolve(result);\n\n\t\ttry {\n\t\t\tawait result;\n\t\t} catch {}\n\n\t\tnext();\n\t};\n\n\tconst enqueue = (function_, resolve, arguments_) => {\n\t\t// Queue `internalResolve` instead of the `run` function\n\t\t// to preserve asynchronous context.\n\t\tnew Promise(internalResolve => {\n\t\t\tqueue.enqueue(internalResolve);\n\t\t}).then(\n\t\t\trun.bind(undefined, function_, resolve, arguments_),\n\t\t);\n\n\t\t(async () => {\n\t\t\t// This function needs to wait until the next microtask before comparing\n\t\t\t// `activeCount` to `concurrency`, because `activeCount` is updated asynchronously\n\t\t\t// after the `internalResolve` function is dequeued and called. The comparison in the if-statement\n\t\t\t// needs to happen asynchronously as well to get an up-to-date value for `activeCount`.\n\t\t\tawait Promise.resolve();\n\n\t\t\tif (activeCount < concurrency) {\n\t\t\t\tresumeNext();\n\t\t\t}\n\t\t})();\n\t};\n\n\tconst generator = (function_, ...arguments_) => new Promise(resolve => {\n\t\tenqueue(function_, resolve, arguments_);\n\t});\n\n\tObject.defineProperties(generator, {\n\t\tactiveCount: {\n\t\t\tget: () => activeCount,\n\t\t},\n\t\tpendingCount: {\n\t\t\tget: () => queue.size,\n\t\t},\n\t\tclearQueue: {\n\t\t\tvalue() {\n\t\t\t\tqueue.clear();\n\t\t\t},\n\t\t},\n\t\tconcurrency: {\n\t\t\tget: () => concurrency,\n\n\t\t\tset(newConcurrency) {\n\t\t\t\tvalidateConcurrency(newConcurrency);\n\t\t\t\tconcurrency = newConcurrency;\n\n\t\t\t\tqueueMicrotask(() => {\n\t\t\t\t\t// eslint-disable-next-line no-unmodified-loop-condition\n\t\t\t\t\twhile (activeCount < concurrency && queue.size > 0) {\n\t\t\t\t\t\tresumeNext();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t});\n\n\treturn generator;\n}\n\nfunction validateConcurrency(concurrency) {\n\tif (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) {\n\t\tthrow new TypeError('Expected `concurrency` to be a number from 1 and up');\n\t}\n}\n","<!--\n - SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<div class=\"guest-box\">\n\t\t<h2>{{ t('core', 'Recommended apps') }}</h2>\n\t\t<p v-if=\"loadingApps\" class=\"loading text-center\">\n\t\t\t{{ t('core', 'Loading apps …') }}\n\t\t</p>\n\t\t<p v-else-if=\"loadingAppsError\" class=\"loading-error text-center\">\n\t\t\t{{ t('core', 'Could not fetch list of apps from the App Store.') }}\n\t\t</p>\n\n\t\t<div v-for=\"app in recommendedApps\" :key=\"app.id\" class=\"app\">\n\t\t\t<template v-if=\"!isHidden(app.id)\">\n\t\t\t\t<img :src=\"customIcon(app.id)\" alt=\"\">\n\t\t\t\t<div class=\"info\">\n\t\t\t\t\t<h3>{{ customName(app) }}</h3>\n\t\t\t\t\t<p v-text=\"customDescription(app.id)\" />\n\t\t\t\t\t<p v-if=\"app.installationError\">\n\t\t\t\t\t\t<strong>{{ t('core', 'App download or installation failed') }}</strong>\n\t\t\t\t\t</p>\n\t\t\t\t\t<p v-else-if=\"!app.isCompatible\">\n\t\t\t\t\t\t<strong>{{ t('core', 'Cannot install this app because it is not compatible') }}</strong>\n\t\t\t\t\t</p>\n\t\t\t\t\t<p v-else-if=\"!app.canInstall\">\n\t\t\t\t\t\t<strong>{{ t('core', 'Cannot install this app') }}</strong>\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t\t<NcCheckboxRadioSwitch :checked=\"app.isSelected || app.active\"\n\t\t\t\t\t:disabled=\"!app.isCompatible || app.active\"\n\t\t\t\t\t:loading=\"app.loading\"\n\t\t\t\t\t@update:checked=\"toggleSelect(app.id)\" />\n\t\t\t</template>\n\t\t</div>\n\n\t\t<div class=\"dialog-row\">\n\t\t\t<NcButton v-if=\"showInstallButton && !installingApps\"\n\t\t\t\ttype=\"tertiary\"\n\t\t\t\trole=\"link\"\n\t\t\t\t:href=\"defaultPageUrl\">\n\t\t\t\t{{ t('core', 'Skip') }}\n\t\t\t</NcButton>\n\n\t\t\t<NcButton v-if=\"showInstallButton\"\n\t\t\t\ttype=\"primary\"\n\t\t\t\t:disabled=\"installingApps || !isAnyAppSelected\"\n\t\t\t\t@click.stop.prevent=\"installApps\">\n\t\t\t\t{{ installingApps ? t('core', 'Installing apps …') : t('core', 'Install recommended apps') }}\n\t\t\t</NcButton>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport { generateUrl, imagePath } from '@nextcloud/router'\nimport { loadState } from '@nextcloud/initial-state'\nimport pLimit from 'p-limit'\nimport { translate as t } from '@nextcloud/l10n'\n\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'\nimport NcButton from '@nextcloud/vue/dist/Components/NcButton.js'\n\nimport logger from '../../logger.js'\n\nconst recommended = {\n\tcalendar: {\n\t\tdescription: t('core', 'Schedule work & meetings, synced with all your devices.'),\n\t\ticon: imagePath('core', 'places/calendar.svg'),\n\t},\n\tcontacts: {\n\t\tdescription: t('core', 'Keep your colleagues and friends in one place without leaking their private info.'),\n\t\ticon: imagePath('core', 'places/contacts.svg'),\n\t},\n\tmail: {\n\t\tdescription: t('core', 'Simple email app nicely integrated with Files, Contacts and Calendar.'),\n\t\ticon: imagePath('core', 'actions/mail.svg'),\n\t},\n\tspreed: {\n\t\tdescription: t('core', 'Chatting, video calls, screen sharing, online meetings and web conferencing – in your browser and with mobile apps.'),\n\t\ticon: imagePath('core', 'apps/spreed.svg'),\n\t},\n\trichdocuments: {\n\t\tname: 'Nextcloud Office',\n\t\tdescription: t('core', 'Collaborative documents, spreadsheets and presentations, built on Collabora Online.'),\n\t\ticon: imagePath('core', 'apps/richdocuments.svg'),\n\t},\n\tnotes: {\n\t\tdescription: t('core', 'Distraction free note taking app.'),\n\t\ticon: imagePath('core', 'apps/notes.svg'),\n\t},\n\trichdocumentscode: {\n\t\thidden: true,\n\t},\n}\nconst recommendedIds = Object.keys(recommended)\n\nexport default {\n\tname: 'RecommendedApps',\n\tcomponents: {\n\t\tNcCheckboxRadioSwitch,\n\t\tNcButton,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tshowInstallButton: false,\n\t\t\tinstallingApps: false,\n\t\t\tloadingApps: true,\n\t\t\tloadingAppsError: false,\n\t\t\tapps: [],\n\t\t\tdefaultPageUrl: loadState('core', 'defaultPageUrl'),\n\t\t}\n\t},\n\tcomputed: {\n\t\trecommendedApps() {\n\t\t\treturn this.apps.filter(app => recommendedIds.includes(app.id))\n\t\t},\n\t\tisAnyAppSelected() {\n\t\t\treturn this.recommendedApps.some(app => app.isSelected)\n\t\t},\n\t},\n\tasync mounted() {\n\t\ttry {\n\t\t\tconst { data } = await axios.get(generateUrl('settings/apps/list'))\n\t\t\tlogger.info(`${data.apps.length} apps fetched`)\n\n\t\t\tthis.apps = data.apps.map(app => Object.assign(app, { loading: false, installationError: false, isSelected: app.isCompatible }))\n\t\t\tlogger.debug(`${this.recommendedApps.length} recommended apps found`, { apps: this.recommendedApps })\n\n\t\t\tthis.showInstallButton = true\n\t\t} catch (error) {\n\t\t\tlogger.error('could not fetch app list', { error })\n\n\t\t\tthis.loadingAppsError = true\n\t\t} finally {\n\t\t\tthis.loadingApps = false\n\t\t}\n\t},\n\tmethods: {\n\t\tinstallApps() {\n\t\t\tthis.installingApps = true\n\n\t\t\tconst limit = pLimit(1)\n\t\t\tconst installing = this.recommendedApps\n\t\t\t\t.filter(app => !app.active && app.isCompatible && app.canInstall && app.isSelected)\n\t\t\t\t.map(app => limit(async () => {\n\t\t\t\t\tlogger.info(`installing ${app.id}`)\n\t\t\t\t\tapp.loading = true\n\t\t\t\t\treturn axios.post(generateUrl('settings/apps/enable'), { appIds: [app.id], groups: [] })\n\t\t\t\t\t\t.catch(error => {\n\t\t\t\t\t\t\tlogger.error(`could not install ${app.id}`, { error })\n\t\t\t\t\t\t\tapp.isSelected = false\n\t\t\t\t\t\t\tapp.installationError = true\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\tlogger.info(`installed ${app.id}`)\n\t\t\t\t\t\t\tapp.loading = false\n\t\t\t\t\t\t\tapp.active = true\n\t\t\t\t\t\t})\n\t\t\t\t}))\n\t\t\tlogger.debug(`installing ${installing.length} recommended apps`)\n\t\t\tPromise.all(installing)\n\t\t\t\t.then(() => {\n\t\t\t\t\tlogger.info('all recommended apps installed, redirecting …')\n\n\t\t\t\t\twindow.location = this.defaultPageUrl\n\t\t\t\t})\n\t\t\t\t.catch(error => logger.error('could not install recommended apps', { error }))\n\t\t},\n\t\tcustomIcon(appId) {\n\t\t\tif (!(appId in recommended) || !recommended[appId].icon) {\n\t\t\t\tlogger.warn(`no app icon for recommended app ${appId}`)\n\t\t\t\treturn imagePath('core', 'places/default-app-icon.svg')\n\t\t\t}\n\t\t\treturn recommended[appId].icon\n\t\t},\n\t\tcustomName(app) {\n\t\t\tif (!(app.id in recommended)) {\n\t\t\t\treturn app.name\n\t\t\t}\n\t\t\treturn recommended[app.id].name || app.name\n\t\t},\n\t\tcustomDescription(appId) {\n\t\t\tif (!(appId in recommended)) {\n\t\t\t\tlogger.warn(`no app description for recommended app ${appId}`)\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn recommended[appId].description\n\t\t},\n\t\tisHidden(appId) {\n\t\t\tif (!(appId in recommended)) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn !!recommended[appId].hidden\n\t\t},\n\t\ttoggleSelect(appId) {\n\t\t\t// disable toggle when installButton is disabled\n\t\t\tif (!(appId in recommended) || !this.showInstallButton) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst index = this.apps.findIndex(app => app.id === appId)\n\t\t\tthis.$set(this.apps[index], 'isSelected', !this.apps[index].isSelected)\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.dialog-row {\n\tdisplay: flex;\n\tjustify-content: end;\n\tmargin-top: 8px;\n}\n\np {\n\t&.loading,\n\t&.loading-error {\n\t\theight: 100px;\n\t}\n\n\t&:last-child {\n\t\tmargin-top: 10px;\n\t}\n}\n\n.text-center {\n\ttext-align: center;\n}\n\n.app {\n\tdisplay: flex;\n\tflex-direction: row;\n\n\timg {\n\t\theight: 50px;\n\t\twidth: 50px;\n\t\tfilter: var(--background-invert-if-dark);\n\t}\n\n\timg, .info {\n\t\tpadding: 12px;\n\t}\n\n\t.info {\n\t\th3, p {\n\t\t\ttext-align: start;\n\t\t}\n\n\t\th3 {\n\t\t\tmargin-top: 0;\n\t\t}\n\t}\n\n\t.checkbox-radio-switch {\n\t\tmargin-inline-start: auto;\n\t\tpadding: 0 2px;\n\t}\n}\n</style>\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RecommendedApps.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!./RecommendedApps.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/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RecommendedApps.vue?vue&type=style&index=0&id=2917aac0&prod&lang=scss&scoped=true\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\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/sass-loader/dist/cjs.js!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RecommendedApps.vue?vue&type=style&index=0&id=2917aac0&prod&lang=scss&scoped=true\";\n export default content && content.locals ? content.locals : undefined;\n","import { render, staticRenderFns } from \"./RecommendedApps.vue?vue&type=template&id=2917aac0&scoped=true\"\nimport script from \"./RecommendedApps.vue?vue&type=script&lang=js\"\nexport * from \"./RecommendedApps.vue?vue&type=script&lang=js\"\nimport style0 from \"./RecommendedApps.vue?vue&type=style&index=0&id=2917aac0&prod&lang=scss&scoped=true\"\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 \"2917aac0\",\n null\n \n)\n\nexport default component.exports","/**\n * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { getCSPNonce } from '@nextcloud/auth'\nimport { translate as t } from '@nextcloud/l10n'\nimport Vue from 'vue'\n\nimport logger from './logger.js'\nimport RecommendedApps from './components/setup/RecommendedApps.vue'\n\n// eslint-disable-next-line camelcase\n__webpack_nonce__ = getCSPNonce()\n\nVue.mixin({\n\tmethods: {\n\t\tt,\n\t},\n})\n\nconst View = Vue.extend(RecommendedApps)\nnew View().$mount('#recommended-apps')\n\nlogger.debug('recommended apps view rendered')\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, `.dialog-row[data-v-2917aac0]{display:flex;justify-content:end;margin-top:8px}p.loading[data-v-2917aac0],p.loading-error[data-v-2917aac0]{height:100px}p[data-v-2917aac0]:last-child{margin-top:10px}.text-center[data-v-2917aac0]{text-align:center}.app[data-v-2917aac0]{display:flex;flex-direction:row}.app img[data-v-2917aac0]{height:50px;width:50px;filter:var(--background-invert-if-dark)}.app img[data-v-2917aac0],.app .info[data-v-2917aac0]{padding:12px}.app .info h3[data-v-2917aac0],.app .info p[data-v-2917aac0]{text-align:start}.app .info h3[data-v-2917aac0]{margin-top:0}.app .checkbox-radio-switch[data-v-2917aac0]{margin-inline-start:auto;padding:0 2px}`, \"\",{\"version\":3,\"sources\":[\"webpack://./core/src/components/setup/RecommendedApps.vue\"],\"names\":[],\"mappings\":\"AACA,6BACC,YAAA,CACA,mBAAA,CACA,cAAA,CAIA,4DAEC,YAAA,CAGD,8BACC,eAAA,CAIF,8BACC,iBAAA,CAGD,sBACC,YAAA,CACA,kBAAA,CAEA,0BACC,WAAA,CACA,UAAA,CACA,uCAAA,CAGD,sDACC,YAAA,CAIA,6DACC,gBAAA,CAGD,+BACC,YAAA,CAIF,6CACC,wBAAA,CACA,aAAA\",\"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 = 2696;","__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\t2696: 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, [4208], () => (__webpack_require__(8126)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","user","getCurrentUser","getLoggerBuilder","setApp","build","setUid","uid","detectUser","Node","constructor","value","_defineProperty","this","_head","WeakMap","_tail","_size","Queue","_classPrivateFieldInitSpec","clear","enqueue","_this$size","node","_classPrivateFieldGet","next","_classPrivateFieldSet","dequeue","_this$size3","current","peek","undefined","size","Symbol","iterator","pLimit","concurrency","validateConcurrency","queue","activeCount","resumeNext","run","async","function_","resolve","arguments_","result","generator","_len","arguments","length","Array","_key","Promise","internalResolve","then","bind","Object","defineProperties","get","pendingCount","clearQueue","set","newConcurrency","queueMicrotask","Number","isInteger","POSITIVE_INFINITY","TypeError","recommended","calendar","description","t","icon","imagePath","contacts","mail","spreed","richdocuments","name","notes","richdocumentscode","hidden","recommendedIds","keys","components","NcCheckboxRadioSwitch","NcButton","data","showInstallButton","installingApps","loadingApps","loadingAppsError","apps","defaultPageUrl","loadState","computed","recommendedApps","filter","app","includes","id","isAnyAppSelected","some","isSelected","mounted","axios","generateUrl","logger","info","map","assign","loading","installationError","isCompatible","debug","error","methods","installApps","limit","installing","active","canInstall","post","appIds","groups","catch","all","window","location","customIcon","appId","warn","customName","customDescription","isHidden","toggleSelect","index","findIndex","$set","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","_vm","_c","_self","staticClass","_v","_s","_e","_l","key","attrs","domProps","on","$event","stopPropagation","preventDefault","apply","__webpack_nonce__","getCSPNonce","Vue","mixin","extend","RecommendedApps","$mount","___CSS_LOADER_EXPORT___","push","module","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","loaded","__webpack_modules__","call","m","O","chunkIds","fn","priority","notFulfilled","Infinity","i","fulfilled","j","every","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","e","g","globalThis","Function","obj","prop","prototype","hasOwnProperty","toStringTag","nmd","paths","children","b","document","baseURI","self","href","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","forEach","nc","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file