From 62a5cb09734c7fab82edbfd07bea0be3d4b8c808 Mon Sep 17 00:00:00 2001 From: Peter Ringelmann Date: Tue, 5 May 2026 14:30:01 +0200 Subject: [PATCH 1/3] fix(core): prompt for password once when installing recommended apps Wire the password-confirmation interceptors into the recommendedapps entry point and switch the installer to a single bulk enable call so the strict password confirmation on enableApps is satisfied. Fixes #60068 -e Signed-off-by: Peter Ringelmann --- core/src/components/setup/RecommendedApps.vue | 62 ++++++++++--------- core/src/recommendedapps.js | 4 ++ 2 files changed, 38 insertions(+), 28 deletions(-) diff --git a/core/src/components/setup/RecommendedApps.vue b/core/src/components/setup/RecommendedApps.vue index 9021fb89fa3db..1abb6ffba1664 100644 --- a/core/src/components/setup/RecommendedApps.vue +++ b/core/src/components/setup/RecommendedApps.vue @@ -62,8 +62,8 @@ import axios from '@nextcloud/axios' import { loadState } from '@nextcloud/initial-state' import { t } from '@nextcloud/l10n' +import { PwdConfirmationMode } from '@nextcloud/password-confirmation' import { generateUrl, imagePath } from '@nextcloud/router' -import pLimit from 'p-limit' import NcButton from '@nextcloud/vue/components/NcButton' import NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch' import logger from '../../logger.js' @@ -147,35 +147,41 @@ export default { }, methods: { - installApps() { - this.installingApps = true - - const limit = pLimit(1) - const installing = this.recommendedApps + async installApps() { + const apps = this.recommendedApps .filter((app) => !app.active && app.isCompatible && app.canInstall && app.isSelected) - .map((app) => limit(async () => { - logger.info(`installing ${app.id}`) - app.loading = true - return axios.post(generateUrl('settings/apps/enable'), { appIds: [app.id], groups: [] }) - .catch((error) => { - logger.error(`could not install ${app.id}`, { error }) - app.isSelected = false - app.installationError = true - }) - .then(() => { - logger.info(`installed ${app.id}`) - app.loading = false - app.active = true - }) - })) - logger.debug(`installing ${installing.length} recommended apps`) - Promise.all(installing) - .then(() => { - logger.info('all recommended apps installed, redirecting …') - - window.location = this.defaultPageUrl + if (apps.length === 0) { + return + } + + this.installingApps = true + apps.forEach((app) => { + app.loading = true + }) + const appIds = apps.map((app) => app.id) + logger.debug(`installing ${apps.length} recommended apps`, { appIds }) + + try { + await axios.post( + generateUrl('settings/apps/enable'), + { appIds, groups: [] }, + { confirmPassword: PwdConfirmationMode.Strict }, + ) + apps.forEach((app) => { + app.loading = false + app.active = true }) - .catch((error) => logger.error('could not install recommended apps', { error })) + logger.info('all recommended apps installed, redirecting …') + window.location = this.defaultPageUrl + } catch (error) { + logger.error('could not install recommended apps', { error }) + apps.forEach((app) => { + app.loading = false + app.isSelected = false + app.installationError = true + }) + this.installingApps = false + } }, customIcon(appId) { diff --git a/core/src/recommendedapps.js b/core/src/recommendedapps.js index 5c2ea255eb742..693dbae8dd455 100644 --- a/core/src/recommendedapps.js +++ b/core/src/recommendedapps.js @@ -4,11 +4,15 @@ */ import { getCSPNonce } from '@nextcloud/auth' +import axios from '@nextcloud/axios' import { translate as t } from '@nextcloud/l10n' +import { addPasswordConfirmationInterceptors } from '@nextcloud/password-confirmation' import Vue from 'vue' import RecommendedApps from './components/setup/RecommendedApps.vue' import logger from './logger.js' +addPasswordConfirmationInterceptors(axios) + __webpack_nonce__ = getCSPNonce() Vue.mixin({ From b2d69b22b6af5c5ebe32748f1a6bc362ff842f15 Mon Sep 17 00:00:00 2001 From: Peter Ringelmann Date: Wed, 6 May 2026 12:11:14 +0200 Subject: [PATCH 2/3] chore: extend E2E tests -e Signed-off-by: Peter Ringelmann --- cypress/e2e/core/setup.ts | 66 +++++++++++++++++++++++++++++++++++---- 1 file changed, 60 insertions(+), 6 deletions(-) diff --git a/cypress/e2e/core/setup.ts b/cypress/e2e/core/setup.ts index dfc2bcabbb7d7..c733ac978c948 100644 --- a/cypress/e2e/core/setup.ts +++ b/cypress/e2e/core/setup.ts @@ -4,6 +4,9 @@ */ import { randomString } from '../../support/utils/randomString.ts' +import { handlePasswordConfirmation } from '../core-utils.ts' + +type RecommendedAppsMode = 'skip' | 'install-success' | 'install-failure' /** * DO NOT RENAME THIS FILE to .cy.ts ⚠️ @@ -30,6 +33,22 @@ describe('Can install Nextcloud', { testIsolation: true, retries: 0 }, () => { sharedSetup() }) + it('Sqlite - Install recommended apps (success)', () => { + cy.visit('/') + cy.get('[data-cy-setup-form]').should('be.visible') + cy.get('[data-cy-setup-form-field="dbtype-sqlite"] input').check({ force: true }) + + sharedSetup('install-success') + }) + + it('Sqlite - Install recommended apps (failure)', () => { + cy.visit('/') + cy.get('[data-cy-setup-form]').should('be.visible') + cy.get('[data-cy-setup-form-field="dbtype-sqlite"] input').check({ force: true }) + + sharedSetup('install-failure') + }) + it('MySQL', () => { cy.visit('/') cy.get('[data-cy-setup-form]').should('be.visible') @@ -110,8 +129,12 @@ describe('Can install Nextcloud', { testIsolation: true, retries: 0 }, () => { /** * Shared admin setup function for the Nextcloud setup + * + * @param mode How to handle the recommended apps screen at the end of the + * install assistant: skip it, exercise the install button with a + * stubbed success response, or stub a failure response. */ -function sharedSetup() { +function sharedSetup(mode: RecommendedAppsMode = 'skip') { const randAdmin = 'admin-' + randomString(10) // mock appstore @@ -140,10 +163,41 @@ function sharedSetup() { .should('be.visible') }) - // Skip the setup apps - cy.get('[data-cy-setup-recommended-apps-skip]').click() + if (mode === 'skip') { + // Skip the setup apps + cy.get('[data-cy-setup-recommended-apps-skip]').click() - // Go to files - cy.visit('/apps/files/') - cy.get('[data-cy-files-content]').should('be.visible') + // Go to files + cy.visit('/apps/files/') + cy.get('[data-cy-files-content]').should('be.visible') + return + } + + // Stub the bulk enable endpoint so we exercise the frontend flow without + // hitting the real app store. + cy.intercept('POST', '**/settings/apps/enable', mode === 'install-success' + ? { statusCode: 200, body: { data: { update_required: false } } } + : { statusCode: 500, body: { data: { message: 'Forced failure' } } }).as('enableApps') + + cy.get('[data-cy-setup-recommended-apps-install]').click() + + // The strict password-confirmation dialog must appear and must result in a + // Basic auth header on the enable request. + cy.findByRole('dialog', { name: 'Authentication required' }) + .should('be.visible') + handlePasswordConfirmation(randAdmin) + cy.wait('@enableApps') + .its('request.headers.authorization') + .should('match', /^Basic /) + + if (mode === 'install-success') { + // Frontend redirects via window.location to the default page. + cy.location('pathname', { timeout: 10000 }) + .should('not.include', '/core/apps/recommended') + } else { + // Stay on the recommended-apps page and surface the per-app error state. + cy.location('pathname').should('include', '/core/apps/recommended') + cy.get('[data-cy-setup-recommended-apps]') + .should('contain.text', 'App download or installation failed') + } } From f7d5b380070105303779a86f208c53863e381010 Mon Sep 17 00:00:00 2001 From: Peter Ringelmann Date: Wed, 6 May 2026 13:18:43 +0200 Subject: [PATCH 3/3] chore(assets): recompile assets chore(assets): recompile assets Signed-off-by: Peter Ringelmann [skip ci] --- dist/core-recommendedapps.js | 4 ++-- dist/core-recommendedapps.js.map | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dist/core-recommendedapps.js b/dist/core-recommendedapps.js index a6613624b22f2..874cf1258f320 100644 --- a/dist/core-recommendedapps.js +++ b/dist/core-recommendedapps.js @@ -1,2 +1,2 @@ -(()=>{"use strict";var e,t={24598(e,t,n){var i=n(21777),o=n(53334),a=n(85471),r=n(19051),s=n(81222),d=n(63814);function c(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 l(e,t,n){return e.set(u(e,t),n),n}function p(e,t){return e.get(u(e,t))}function u(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 h(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 m{constructor(e){h(this,"value",void 0),h(this,"next",void 0),this.value=e}}var A=new WeakMap,f=new WeakMap,g=new WeakMap;class v{constructor(){c(this,A,void 0),c(this,f,void 0),c(this,g,void 0),this.clear()}enqueue(e){var t;const n=new m(e);p(A,this)?(p(f,this).next=n,l(f,this,n)):(l(A,this,n),l(f,this,n)),l(g,this,(t=p(g,this),++t))}dequeue(){var e;const t=p(A,this);if(t)return l(A,this,p(A,this).next),l(g,this,(e=p(g,this),--e)),t.value}peek(){if(p(A,this))return p(A,this).value}clear(){l(A,this,void 0),l(f,this,void 0),l(g,this,0)}get size(){return p(g,this)}*[Symbol.iterator](){let e=p(A,this);for(;e;)yield e.value,e=e.next}*drain(){for(;p(A,this);)yield this.dequeue()}}function b(e){let t=!1;if("object"==typeof e&&({concurrency:e,rejectOnClear:t=!1}=e),C(e),"boolean"!=typeof t)throw new TypeError("Expected `rejectOnClear` to be a boolean");const n=new v;let i=0;const o=()=>{i0&&(i++,n.dequeue().run())},a=async(e,t,n)=>{const a=(async()=>e(...n))();t(a);try{await a}catch{}i--,o()},r=(t,...r)=>new Promise((s,d)=>{((t,r,s,d)=>{const c={reject:s};new Promise(e=>{c.run=e,n.enqueue(c)}).then(a.bind(void 0,t,r,d)),ii},pendingCount:{get:()=>n.size},clearQueue:{value(){if(!t)return void n.clear();const e=AbortSignal.abort().reason;for(;n.size>0;)n.dequeue().reject(e)}},concurrency:{get:()=>e,set(t){C(t),e=t,queueMicrotask(()=>{for(;i0;)o()})}},map:{async value(e,t){const n=Array.from(e,(e,n)=>this(t,e,n));return Promise.all(n)}}}),r}function C(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 y=n(74095),w=n(32073),x=n(35947);const _=null===(k=(0,i.HW)())?(0,x.YK)().setApp("core").build():(0,x.YK)().setApp("core").setUid(k.uid).build();var k;(0,x.YK)().setApp("unified-search").detectUser().build();const S={calendar:{description:(0,o.t)("core","Schedule work & meetings, synced with all your devices."),icon:(0,d.d0)("core","places/calendar.svg")},contacts:{description:(0,o.t)("core","Keep your colleagues and friends in one place without leaking their private info."),icon:(0,d.d0)("core","places/contacts.svg")},mail:{description:(0,o.t)("core","Simple email app nicely integrated with Files, Contacts and Calendar."),icon:(0,d.d0)("core","actions/mail.svg")},spreed:{description:(0,o.t)("core","Chatting, video calls, screen sharing, online meetings and web conferencing – in your browser and with mobile apps."),icon:(0,d.d0)("core","apps/spreed.svg")},richdocuments:{name:"Nextcloud Office",description:(0,o.t)("core","Collaborative documents, spreadsheets and presentations, built on Collabora Online."),icon:(0,d.d0)("core","apps/richdocuments.svg")},notes:{description:(0,o.t)("core","Distraction free note taking app."),icon:(0,d.d0)("core","apps/notes.svg")},richdocumentscode:{hidden:!0}},I=Object.keys(S),j={name:"RecommendedApps",components:{NcCheckboxRadioSwitch:w.A,NcButton:y.A},data:()=>({showInstallButton:!1,installingApps:!1,loadingApps:!0,loadingAppsError:!1,apps:[],defaultPageUrl:(0,s.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 r.Ay.get((0,d.Jv)("settings/apps/list"));_.info(`${e.apps.length} apps fetched`),this.apps=e.apps.map(e=>Object.assign(e,{loading:!1,installationError:!1,isSelected:e.isCompatible})),_.debug(`${this.recommendedApps.length} recommended apps found`,{apps:this.recommendedApps}),this.showInstallButton=!0}catch(e){_.error("could not fetch app list",{error:e}),this.loadingAppsError=!0}finally{this.loadingApps=!1}},methods:{installApps(){this.installingApps=!0;const e=b(1),t=this.recommendedApps.filter(e=>!e.active&&e.isCompatible&&e.canInstall&&e.isSelected).map(t=>e(async()=>(_.info(`installing ${t.id}`),t.loading=!0,r.Ay.post((0,d.Jv)("settings/apps/enable"),{appIds:[t.id],groups:[]}).catch(e=>{_.error(`could not install ${t.id}`,{error:e}),t.isSelected=!1,t.installationError=!0}).then(()=>{_.info(`installed ${t.id}`),t.loading=!1,t.active=!0}))));_.debug(`installing ${t.length} recommended apps`),Promise.all(t).then(()=>{_.info("all recommended apps installed, redirecting …"),window.location=this.defaultPageUrl}).catch(e=>_.error("could not install recommended apps",{error:e}))},customIcon:e=>e in S&&S[e].icon?S[e].icon:(_.warn(`no app icon for recommended app ${e}`),(0,d.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:(_.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),P=n.n(O),B=n(97825),E=n.n(B),T=n(77659),N=n.n(T),D=n(55056),$=n.n(D),Y=n(10540),U=n.n(Y),q=n(41113),M=n.n(q),R=n(12803),z={};z.styleTagTransform=M(),z.setAttributes=$(),z.insert=N().bind(null,"head"),z.domAPI=E(),z.insertStyleElement=U(),P()(R.A,z),R.A&&R.A.locals&&R.A.locals;var W=(0,n(14486).A)(j,function(){var e=this,t=e._self._c;return t("div",{staticClass:"guest-box",attrs:{"data-cy-setup-recommended-apps":""}},[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:{"model-value":n.isSelected||n.active,disabled:!n.isCompatible||n.active,loading:n.loading},on:{"update:modelValue":function(t){return e.toggleSelect(n.id)}}})]],2)}),e._v(" "),t("div",{staticClass:"dialog-row"},[e.showInstallButton&&!e.installingApps?t("NcButton",{attrs:{"data-cy-setup-recommended-apps-skip":"",href:e.defaultPageUrl,variant:"tertiary"}},[e._v("\n\t\t\t"+e._s(e.t("core","Skip"))+"\n\t\t")]):e._e(),e._v(" "),e.showInstallButton?t("NcButton",{attrs:{"data-cy-setup-recommended-apps-install":"",disabled:e.installingApps||!e.isAnyAppSelected,variant:"primary"},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,"73d013bf",null);const F=W.exports;n.nc=(0,i.aV)(),a.Ay.mixin({methods:{t:o.Tl}}),(new(a.Ay.extend(F))).$mount("#recommended-apps"),_.debug("recommended apps view rendered")},12803(e,t,n){n.d(t,{A:()=>s});var i=n(71354),o=n.n(i),a=n(76314),r=n.n(a)()(o());r.push([e.id,".dialog-row[data-v-73d013bf]{display:flex;justify-content:end;margin-top:8px}p.loading[data-v-73d013bf],p.loading-error[data-v-73d013bf]{height:100px}p[data-v-73d013bf]:last-child{margin-top:10px}.text-center[data-v-73d013bf]{text-align:center}.app[data-v-73d013bf]{display:flex;flex-direction:row}.app img[data-v-73d013bf]{height:50px;width:50px;filter:var(--background-invert-if-dark)}.app img[data-v-73d013bf],.app .info[data-v-73d013bf]{padding:12px}.app .info h3[data-v-73d013bf],.app .info p[data-v-73d013bf]{text-align:start}.app .info h3[data-v-73d013bf]{margin-top:0}.app .checkbox-radio-switch[data-v-73d013bf]{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",sourcesContent:["\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"],sourceRoot:""}]);const s=r}},n={};function i(e){var o=n[e];if(void 0!==o)return o.exports;var a=n[e]={id:e,loaded:!1,exports:{}};return t[e].call(a.exports,a,a.exports,i),a.loaded=!0,a.exports}i.m=t,e=[],i.O=(t,n,o,a)=>{if(!n){var r=1/0;for(l=0;l=a)&&Object.keys(i.O).every(e=>i.O[e](n[d]))?n.splice(d--,1):(s=!1,a0&&e[l-1][2]>a;l--)e[l]=e[l-1];e[l]=[n,o,a]},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.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="undefined"!=typeof document&&document.baseURI||self.location.href;var e={2696:0};i.O.j=t=>0===e[t];var t=(t,n)=>{var o,a,[r,s,d]=n,c=0;if(r.some(t=>0!==e[t])){for(o in s)i.o(s,o)&&(i.m[o]=s[o]);if(d)var l=d(i)}for(t&&t(n);ci(24598));o=i.O(o)})(); -//# sourceMappingURL=core-recommendedapps.js.map?v=cb3c11ca97d8173b4354 \ No newline at end of file +(()=>{"use strict";var t,e={22317(t,e,n){var a=n(21777),i=n(19051),o=n(53334),s=n(77690),r=n(85471),d=n(81222),p=n(63814),c=n(74095),l=n(32073),A=n(35947);const m=null===(u=(0,a.HW)())?(0,A.YK)().setApp("core").build():(0,A.YK)().setApp("core").setUid(u.uid).build();var u;(0,A.YK)().setApp("unified-search").detectUser().build();const g={calendar:{description:(0,o.t)("core","Schedule work & meetings, synced with all your devices."),icon:(0,p.d0)("core","places/calendar.svg")},contacts:{description:(0,o.t)("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.t)("core","Simple email app nicely integrated with Files, Contacts and Calendar."),icon:(0,p.d0)("core","actions/mail.svg")},spreed:{description:(0,o.t)("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,o.t)("core","Collaborative documents, spreadsheets and presentations, built on Collabora Online."),icon:(0,p.d0)("core","apps/richdocuments.svg")},notes:{description:(0,o.t)("core","Distraction free note taking app."),icon:(0,p.d0)("core","apps/notes.svg")},richdocumentscode:{hidden:!0}},h=Object.keys(g),v={name:"RecommendedApps",components:{NcCheckboxRadioSwitch:l.A,NcButton:c.A},data:()=>({showInstallButton:!1,installingApps:!1,loadingApps:!0,loadingAppsError:!1,apps:[],defaultPageUrl:(0,d.C)("core","defaultPageUrl")}),computed:{recommendedApps(){return this.apps.filter(t=>h.includes(t.id))},isAnyAppSelected(){return this.recommendedApps.some(t=>t.isSelected)}},async mounted(){try{const{data:t}=await i.Ay.get((0,p.Jv)("settings/apps/list"));m.info(`${t.apps.length} apps fetched`),this.apps=t.apps.map(t=>Object.assign(t,{loading:!1,installationError:!1,isSelected:t.isCompatible})),m.debug(`${this.recommendedApps.length} recommended apps found`,{apps:this.recommendedApps}),this.showInstallButton=!0}catch(t){m.error("could not fetch app list",{error:t}),this.loadingAppsError=!0}finally{this.loadingApps=!1}},methods:{async installApps(){const t=this.recommendedApps.filter(t=>!t.active&&t.isCompatible&&t.canInstall&&t.isSelected);if(0===t.length)return;this.installingApps=!0,t.forEach(t=>{t.loading=!0});const e=t.map(t=>t.id);m.debug(`installing ${t.length} recommended apps`,{appIds:e});try{await i.Ay.post((0,p.Jv)("settings/apps/enable"),{appIds:e,groups:[]},{confirmPassword:s.mH.Strict}),t.forEach(t=>{t.loading=!1,t.active=!0}),m.info("all recommended apps installed, redirecting …"),window.location=this.defaultPageUrl}catch(e){m.error("could not install recommended apps",{error:e}),t.forEach(t=>{t.loading=!1,t.isSelected=!1,t.installationError=!0}),this.installingApps=!1}},customIcon:t=>t in g&&g[t].icon?g[t].icon:(m.warn(`no app icon for recommended app ${t}`),(0,p.d0)("core","places/default-app-icon.svg")),customName:t=>t.id in g&&g[t.id].name||t.name,customDescription:t=>t in g?g[t].description:(m.warn(`no app description for recommended app ${t}`),""),isHidden:t=>t in g&&!!g[t].hidden,toggleSelect(t){if(!(t in g)||!this.showInstallButton)return;const e=this.apps.findIndex(e=>e.id===t);this.$set(this.apps[e],"isSelected",!this.apps[e].isSelected)}}};var f=n(85072),C=n.n(f),b=n(97825),y=n.n(b),x=n(77659),_=n.n(x),w=n(55056),S=n.n(w),k=n(10540),I=n.n(k),B=n(41113),O=n.n(B),E=n(28094),P={};P.styleTagTransform=O(),P.setAttributes=S(),P.insert=_().bind(null,"head"),P.domAPI=y(),P.insertStyleElement=I(),C()(E.A,P),E.A&&E.A.locals&&E.A.locals;var j=(0,n(14486).A)(v,function(){var t=this,e=t._self._c;return e("div",{staticClass:"guest-box",attrs:{"data-cy-setup-recommended-apps":""}},[e("h2",[t._v(t._s(t.t("core","Recommended apps")))]),t._v(" "),t.loadingApps?e("p",{staticClass:"loading text-center"},[t._v("\n\t\t"+t._s(t.t("core","Loading apps …"))+"\n\t")]):t.loadingAppsError?e("p",{staticClass:"loading-error text-center"},[t._v("\n\t\t"+t._s(t.t("core","Could not fetch list of apps from the App Store."))+"\n\t")]):t._e(),t._v(" "),t._l(t.recommendedApps,function(n){return e("div",{key:n.id,staticClass:"app"},[t.isHidden(n.id)?t._e():[e("img",{attrs:{src:t.customIcon(n.id),alt:""}}),t._v(" "),e("div",{staticClass:"info"},[e("h3",[t._v(t._s(t.customName(n)))]),t._v(" "),e("p",{domProps:{textContent:t._s(t.customDescription(n.id))}}),t._v(" "),n.installationError?e("p",[e("strong",[t._v(t._s(t.t("core","App download or installation failed")))])]):n.isCompatible?n.canInstall?t._e():e("p",[e("strong",[t._v(t._s(t.t("core","Cannot install this app")))])]):e("p",[e("strong",[t._v(t._s(t.t("core","Cannot install this app because it is not compatible")))])])]),t._v(" "),e("NcCheckboxRadioSwitch",{attrs:{"model-value":n.isSelected||n.active,disabled:!n.isCompatible||n.active,loading:n.loading},on:{"update:modelValue":function(e){return t.toggleSelect(n.id)}}})]],2)}),t._v(" "),e("div",{staticClass:"dialog-row"},[t.showInstallButton&&!t.installingApps?e("NcButton",{attrs:{"data-cy-setup-recommended-apps-skip":"",href:t.defaultPageUrl,variant:"tertiary"}},[t._v("\n\t\t\t"+t._s(t.t("core","Skip"))+"\n\t\t")]):t._e(),t._v(" "),t.showInstallButton?e("NcButton",{attrs:{"data-cy-setup-recommended-apps-install":"",disabled:t.installingApps||!t.isAnyAppSelected,variant:"primary"},on:{click:function(e){return e.stopPropagation(),e.preventDefault(),t.installApps.apply(null,arguments)}}},[t._v("\n\t\t\t"+t._s(t.installingApps?t.t("core","Installing apps …"):t.t("core","Install recommended apps"))+"\n\t\t")]):t._e()],1)],2)},[],!1,null,"262d65ec",null);const D=j.exports;(0,s.IF)(i.Ay),n.nc=(0,a.aV)(),r.Ay.mixin({methods:{t:o.Tl}}),(new(r.Ay.extend(D))).$mount("#recommended-apps"),m.debug("recommended apps view rendered")},28094(t,e,n){n.d(e,{A:()=>r});var a=n(71354),i=n.n(a),o=n(76314),s=n.n(o)()(i());s.push([t.id,".dialog-row[data-v-262d65ec]{display:flex;justify-content:end;margin-top:8px}p.loading[data-v-262d65ec],p.loading-error[data-v-262d65ec]{height:100px}p[data-v-262d65ec]:last-child{margin-top:10px}.text-center[data-v-262d65ec]{text-align:center}.app[data-v-262d65ec]{display:flex;flex-direction:row}.app img[data-v-262d65ec]{height:50px;width:50px;filter:var(--background-invert-if-dark)}.app img[data-v-262d65ec],.app .info[data-v-262d65ec]{padding:12px}.app .info h3[data-v-262d65ec],.app .info p[data-v-262d65ec]{text-align:start}.app .info h3[data-v-262d65ec]{margin-top:0}.app .checkbox-radio-switch[data-v-262d65ec]{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",sourcesContent:["\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"],sourceRoot:""}]);const r=s}},n={};function a(t){var i=n[t];if(void 0!==i)return i.exports;var o=n[t]={id:t,loaded:!1,exports:{}};return e[t].call(o.exports,o,o.exports,a),o.loaded=!0,o.exports}a.m=e,t=[],a.O=(e,n,i,o)=>{if(!n){var s=1/0;for(c=0;c=o)&&Object.keys(a.O).every(t=>a.O[t](n[d]))?n.splice(d--,1):(r=!1,o0&&t[c-1][2]>o;c--)t[c]=t[c-1];t[c]=[n,i,o]},a.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return a.d(e,{a:e}),e},a.d=(t,e)=>{for(var n in e)a.o(e,n)&&!a.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},a.e=()=>Promise.resolve(),a.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),a.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},a.nmd=t=>(t.paths=[],t.children||(t.children=[]),t),a.j=2696,(()=>{a.b="undefined"!=typeof document&&document.baseURI||self.location.href;var t={2696:0};a.O.j=e=>0===t[e];var e=(e,n)=>{var i,o,[s,r,d]=n,p=0;if(s.some(e=>0!==t[e])){for(i in r)a.o(r,i)&&(a.m[i]=r[i]);if(d)var c=d(a)}for(e&&e(n);pa(22317));i=a.O(i)})(); +//# sourceMappingURL=core-recommendedapps.js.map?v=76c218941be9abfbb5e0 \ No newline at end of file diff --git a/dist/core-recommendedapps.js.map b/dist/core-recommendedapps.js.map index 0ed787e4dfb25..e20ee9930226f 100644 --- a/dist/core-recommendedapps.js.map +++ b/dist/core-recommendedapps.js.map @@ -1 +1 @@ -{"version":3,"file":"core-recommendedapps.js?v=cb3c11ca97d8173b4354","mappings":"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","sources":["webpack:///nextcloud/webpack/runtime/chunk loaded","webpack:///nextcloud/node_modules/yocto-queue/index.js","webpack:///nextcloud/node_modules/p-limit/index.js","webpack:///nextcloud/core/src/logger.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?14f3","webpack://nextcloud/./core/src/components/setup/RecommendedApps.vue?84e8","webpack://nextcloud/./core/src/components/setup/RecommendedApps.vue?5f06","webpack:///nextcloud/core/src/recommendedapps.js","webpack:///nextcloud/core/src/components/setup/RecommendedApps.vue?vue&type=style&index=0&id=73d013bf&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/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, fn, priority] = deferred[i];\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};","/*\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\t* drain() {\n\t\twhile (this.#head) {\n\t\t\tyield this.dequeue();\n\t\t}\n\t}\n}\n","import Queue from 'yocto-queue';\n\nexport default function pLimit(concurrency) {\n\tlet rejectOnClear = false;\n\n\tif (typeof concurrency === 'object') {\n\t\t({concurrency, rejectOnClear = false} = concurrency);\n\t}\n\n\tvalidateConcurrency(concurrency);\n\n\tif (typeof rejectOnClear !== 'boolean') {\n\t\tthrow new TypeError('Expected `rejectOnClear` to be a boolean');\n\t}\n\n\tconst queue = new Queue();\n\tlet activeCount = 0;\n\n\tconst resumeNext = () => {\n\t\t// Process the next queued function if we're under the concurrency limit\n\t\tif (activeCount < concurrency && queue.size > 0) {\n\t\t\tactiveCount++;\n\t\t\tqueue.dequeue().run();\n\t\t}\n\t};\n\n\tconst next = () => {\n\t\tactiveCount--;\n\t\tresumeNext();\n\t};\n\n\tconst run = async (function_, resolve, arguments_) => {\n\t\t// Execute the function and capture the result promise\n\t\tconst result = (async () => function_(...arguments_))();\n\n\t\t// Resolve immediately with the promise (don't wait for completion)\n\t\tresolve(result);\n\n\t\t// Wait for the function to complete (success or failure)\n\t\t// We catch errors here to prevent unhandled rejections,\n\t\t// but the original promise rejection is preserved for the caller\n\t\ttry {\n\t\t\tawait result;\n\t\t} catch {}\n\n\t\t// Decrement active count and process next queued function\n\t\tnext();\n\t};\n\n\tconst enqueue = (function_, resolve, reject, arguments_) => {\n\t\tconst queueItem = {reject};\n\n\t\t// Queue the internal resolve function instead of the run function\n\t\t// to preserve the asynchronous execution context.\n\t\tnew Promise(internalResolve => { // eslint-disable-line promise/param-names\n\t\t\tqueueItem.run = internalResolve;\n\t\t\tqueue.enqueue(queueItem);\n\t\t}).then(run.bind(undefined, function_, resolve, arguments_)); // eslint-disable-line promise/prefer-await-to-then\n\n\t\t// Start processing immediately if we haven't reached the concurrency limit\n\t\tif (activeCount < concurrency) {\n\t\t\tresumeNext();\n\t\t}\n\t};\n\n\tconst generator = (function_, ...arguments_) => new Promise((resolve, reject) => {\n\t\tenqueue(function_, resolve, reject, 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\tif (!rejectOnClear) {\n\t\t\t\t\tqueue.clear();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst abortError = AbortSignal.abort().reason;\n\n\t\t\t\twhile (queue.size > 0) {\n\t\t\t\t\tqueue.dequeue().reject(abortError);\n\t\t\t\t}\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\tmap: {\n\t\t\tasync value(iterable, function_) {\n\t\t\t\tconst promises = Array.from(iterable, (value, index) => this(function_, value, index));\n\t\t\t\treturn Promise.all(promises);\n\t\t\t},\n\t\t},\n\t});\n\n\treturn generator;\n}\n\nexport function limitFunction(function_, options) {\n\tconst limit = pLimit(options);\n\n\treturn (...arguments_) => limit(() => function_(...arguments_));\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\nimport { getCurrentUser } from '@nextcloud/auth'\nimport { getLoggerBuilder } from '@nextcloud/logger'\n\n/**\n *\n * @param user\n */\nfunction 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","\n\n\n\n\n\n\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=73d013bf&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=73d013bf&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=73d013bf&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=73d013bf&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 \"73d013bf\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"guest-box\",attrs:{\"data-cy-setup-recommended-apps\":\"\"}},[_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:{\"model-value\":app.isSelected || app.active,\"disabled\":!app.isCompatible || app.active,\"loading\":app.loading},on:{\"update:modelValue\":function($event){return _vm.toggleSelect(app.id)}}})]:_vm._e()],2)}),_vm._v(\" \"),_c('div',{staticClass:\"dialog-row\"},[(_vm.showInstallButton && !_vm.installingApps)?_c('NcButton',{attrs:{\"data-cy-setup-recommended-apps-skip\":\"\",\"href\":_vm.defaultPageUrl,\"variant\":\"tertiary\"}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('core', 'Skip'))+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.showInstallButton)?_c('NcButton',{attrs:{\"data-cy-setup-recommended-apps-install\":\"\",\"disabled\":_vm.installingApps || !_vm.isAnyAppSelected,\"variant\":\"primary\"},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 }","/**\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'\nimport RecommendedApps from './components/setup/RecommendedApps.vue'\nimport logger from './logger.js'\n\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-73d013bf]{display:flex;justify-content:end;margin-top:8px}p.loading[data-v-73d013bf],p.loading-error[data-v-73d013bf]{height:100px}p[data-v-73d013bf]:last-child{margin-top:10px}.text-center[data-v-73d013bf]{text-align:center}.app[data-v-73d013bf]{display:flex;flex-direction:row}.app img[data-v-73d013bf]{height:50px;width:50px;filter:var(--background-invert-if-dark)}.app img[data-v-73d013bf],.app .info[data-v-73d013bf]{padding:12px}.app .info h3[data-v-73d013bf],.app .info p[data-v-73d013bf]{text-align:start}.app .info h3[data-v-73d013bf]{margin-top:0}.app .checkbox-radio-switch[data-v-73d013bf]{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\",\"sourcesContent\":[\"\\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\"],\"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__.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 = (typeof document !== 'undefined' && 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, moreModules, runtime] = data;\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 = globalThis[\"webpackChunknextcloud_ui_legacy\"] = globalThis[\"webpackChunknextcloud_ui_legacy\"] || [];\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__(24598)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","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","drain","pLimit","concurrency","rejectOnClear","validateConcurrency","TypeError","queue","activeCount","resumeNext","run","async","function_","resolve","arguments_","result","generator","Promise","reject","queueItem","internalResolve","then","bind","Object","defineProperties","get","pendingCount","clearQueue","abortError","AbortSignal","abort","reason","set","newConcurrency","queueMicrotask","map","iterable","promises","Array","from","index","all","Number","isInteger","POSITIVE_INFINITY","user","getCurrentUser","getLoggerBuilder","setApp","build","setUid","uid","detectUser","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","length","assign","loading","installationError","isCompatible","debug","error","methods","installApps","limit","installing","active","canInstall","post","appIds","groups","catch","window","location","customIcon","appId","warn","customName","customDescription","isHidden","toggleSelect","findIndex","$set","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","component","_vm","_c","_self","staticClass","attrs","_v","_s","_e","_l","key","domProps","on","$event","stopPropagation","preventDefault","apply","arguments","__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","obj","prop","prototype","hasOwnProperty","toStringTag","nmd","paths","children","b","document","baseURI","self","href","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","globalThis","forEach","nc","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"core-recommendedapps.js?v=76c218941be9abfbb5e0","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","webpack:///nextcloud/core/src/components/setup/RecommendedApps.vue?vue&type=script&lang=js","webpack://nextcloud/./core/src/components/setup/RecommendedApps.vue?90b8","webpack://nextcloud/./core/src/components/setup/RecommendedApps.vue?84e8","webpack://nextcloud/./core/src/components/setup/RecommendedApps.vue?5f06","webpack:///nextcloud/core/src/recommendedapps.js","webpack:///nextcloud/core/src/components/setup/RecommendedApps.vue?vue&type=style&index=0&id=262d65ec&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/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, fn, priority] = deferred[i];\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\n/**\n *\n * @param user\n */\nfunction 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","\n\n\n\n\n\n\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=262d65ec&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=262d65ec&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=262d65ec&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=262d65ec&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 \"262d65ec\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"guest-box\",attrs:{\"data-cy-setup-recommended-apps\":\"\"}},[_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:{\"model-value\":app.isSelected || app.active,\"disabled\":!app.isCompatible || app.active,\"loading\":app.loading},on:{\"update:modelValue\":function($event){return _vm.toggleSelect(app.id)}}})]:_vm._e()],2)}),_vm._v(\" \"),_c('div',{staticClass:\"dialog-row\"},[(_vm.showInstallButton && !_vm.installingApps)?_c('NcButton',{attrs:{\"data-cy-setup-recommended-apps-skip\":\"\",\"href\":_vm.defaultPageUrl,\"variant\":\"tertiary\"}},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.t('core', 'Skip'))+\"\\n\\t\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.showInstallButton)?_c('NcButton',{attrs:{\"data-cy-setup-recommended-apps-install\":\"\",\"disabled\":_vm.installingApps || !_vm.isAnyAppSelected,\"variant\":\"primary\"},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 }","/**\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 axios from '@nextcloud/axios'\nimport { translate as t } from '@nextcloud/l10n'\nimport { addPasswordConfirmationInterceptors } from '@nextcloud/password-confirmation'\nimport Vue from 'vue'\nimport RecommendedApps from './components/setup/RecommendedApps.vue'\nimport logger from './logger.js'\n\naddPasswordConfirmationInterceptors(axios)\n\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-262d65ec]{display:flex;justify-content:end;margin-top:8px}p.loading[data-v-262d65ec],p.loading-error[data-v-262d65ec]{height:100px}p[data-v-262d65ec]:last-child{margin-top:10px}.text-center[data-v-262d65ec]{text-align:center}.app[data-v-262d65ec]{display:flex;flex-direction:row}.app img[data-v-262d65ec]{height:50px;width:50px;filter:var(--background-invert-if-dark)}.app img[data-v-262d65ec],.app .info[data-v-262d65ec]{padding:12px}.app .info h3[data-v-262d65ec],.app .info p[data-v-262d65ec]{text-align:start}.app .info h3[data-v-262d65ec]{margin-top:0}.app .checkbox-radio-switch[data-v-262d65ec]{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\",\"sourcesContent\":[\"\\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\"],\"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__.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 = (typeof document !== 'undefined' && 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, moreModules, runtime] = data;\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 = globalThis[\"webpackChunknextcloud_ui_legacy\"] = globalThis[\"webpackChunknextcloud_ui_legacy\"] || [];\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__(22317)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","user","getCurrentUser","getLoggerBuilder","setApp","build","setUid","uid","detectUser","recommended","calendar","description","t","icon","imagePath","contacts","mail","spreed","richdocuments","name","notes","richdocumentscode","hidden","recommendedIds","Object","keys","components","NcCheckboxRadioSwitch","NcButton","data","showInstallButton","installingApps","loadingApps","loadingAppsError","apps","defaultPageUrl","loadState","computed","recommendedApps","filter","app","includes","id","isAnyAppSelected","some","isSelected","mounted","axios","get","generateUrl","logger","info","length","map","assign","loading","installationError","isCompatible","debug","error","methods","installApps","active","canInstall","forEach","appIds","post","groups","confirmPassword","PwdConfirmationMode","Strict","window","location","customIcon","appId","warn","customName","customDescription","isHidden","toggleSelect","index","findIndex","$set","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","component","_vm","this","_c","_self","staticClass","attrs","_v","_s","_e","_l","key","domProps","on","$event","stopPropagation","preventDefault","apply","arguments","addPasswordConfirmationInterceptors","__webpack_nonce__","getCSPNonce","Vue","mixin","extend","RecommendedApps","$mount","___CSS_LOADER_EXPORT___","push","module","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","loaded","__webpack_modules__","call","m","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","fulfilled","j","every","splice","r","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","e","Promise","resolve","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","value","nmd","paths","children","b","document","baseURI","self","href","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","globalThis","bind","nc","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file