{"version":3,"file":"AppstoreBrowse-DS32PQM9.chunk.mjs","sources":["../build/frontend/apps/appstore/src/components/AppstoreBrowse/OfficeSuiteSwitcherItem.vue","../build/frontend/apps/appstore/src/service/OfficeSuites.ts","../build/frontend/apps/appstore/src/components/AppstoreBrowse/OfficeSuiteSwitcher.vue","../build/frontend/apps/appstore/src/views/AppstoreBrowse.vue"],"sourcesContent":["<!--\n  - SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n  - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport type { OFFICE_SUITES } from '../../service/OfficeSuites.ts'\n\nimport { t } from '@nextcloud/l10n'\nimport { computed, useId } from 'vue'\nimport NcButton from '@nextcloud/vue/components/NcButton'\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'\nimport { useAppsStore } from '../../store/apps.ts'\nimport { canInstall } from '../../utils/appStatus.ts'\n\nconst selectedSuiteId = defineModel<string | null>('selected')\n\nconst { suite } = defineProps<{\n\tsuite: typeof OFFICE_SUITES[number]\n\tloading?: boolean\n}>()\n\nconst headerId = useId()\nconst store = useAppsStore()\n\nconst app = computed(() => store.getAppById(suite.appId))\nconst isInstalled = computed(() => !!app.value?.installed)\nconst cannotInstall = computed(() => !app.value || (!isInstalled.value && !canInstall(app.value!)))\n</script>\n\n<template>\n\t<div\n\t\t:class=\"[$style.officeSuiteSwitcherItem, {\n\t\t\t[$style.officeSuiteSwitcherItem_selected]: selectedSuiteId === suite.id,\n\t\t}]\"\n\t\t@click=\"selectedSuiteId = suite.id\">\n\t\t<div :class=\"$style.officeSuiteSwitcherItem__header\">\n\t\t\t<h3 :id=\"headerId\" :class=\"$style.officeSuiteSwitcherItem__title\">\n\t\t\t\t{{ suite.name }}\n\t\t\t\t<span v-if=\"isInstalled\">({{ t('appstore', 'installed') }})</span>\n\t\t\t</h3>\n\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\tv-model=\"selectedSuiteId\"\n\t\t\t\t:aria-labelledby=\"headerId\"\n\t\t\t\t:disabled=\"cannotInstall\"\n\t\t\t\t:loading=\"loading\"\n\t\t\t\ttype=\"radio\"\n\t\t\t\tname=\"office-suite\"\n\t\t\t\t:value=\"suite.id\"\n\t\t\t\t@click.stop />\n\t\t</div>\n\t\t<ul :aria-label=\"t('appstore', 'Features')\" :class=\"$style.officeSuiteSwitcherItem__features\">\n\t\t\t<li v-for=\"(feature, index) in suite.features\" :key=\"index\">\n\t\t\t\t{{ feature }}\n\t\t\t</li>\n\t\t</ul>\n\t\t<NcButton :href=\"suite.learnMoreUrl\" @click.stop>\n\t\t\t{{ t('appstore', 'Learn more') }}↗\n\t\t</NcButton>\n\t</div>\n</template>\n\n<style module>\n.officeSuiteSwitcherItem {\n\tflex: 1;\n\tbackground-color: var(--color-main-background);\n\tborder: 2px solid var(--color-border);\n\tborder-radius: var(--border-radius-large);\n\tpadding: 24px;\n\tcursor: pointer;\n\ttransition: all 0.2s ease;\n\tdisplay: flex;\n\tflex-direction: column;\n\n\t* {\n\t\tcursor: pointer;\n\t}\n\n\t&:hover {\n\t\tborder-color: var(--color-primary-element);\n\t\tbox-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n\t}\n}\n\n.officeSuiteSwitcherItem_selected {\n\tbackground: linear-gradient(135deg, var(--color-primary-element-light) 0%, var(--color-main-background) 100%);\n\tcolor: var(--color-main-text);\n\tborder-color: var(--color-primary-element);\n}\n\n.officeSuiteSwitcherItem__header {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: center;\n\tmargin-bottom: 16px;\n}\n\n.officeSuiteSwitcherItem__title {\n\tfont-size: 24px;\n\tfont-weight: 600;\n\tmargin: 0;\n}\n\n.officeSuiteSwitcherItem__features {\n\tlist-style: disc;\n\tpadding: 0;\n\tmargin: 0 0 1em 0;\n\tflex-grow: 1;\n\n\tli {\n\t\tpadding-block: var(--default-grid-baseline) 0;\n\t\tpadding-inline-start: 1em;\n\t\tline-height: 1.5;\n\t}\n}\n\n.officeSuiteSwitcherItem__link {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tcolor: var(--color-main-text);\n\ttext-decoration: none;\n\tfont-weight: 500;\n\tmargin-top: auto;\n\n\t&:hover {\n\t\ttext-decoration: underline;\n\t}\n}\n\n.officeSuiteSwitcherItem_selected .officeSuiteSwitcherItem__link {\n\tcolor: var(--color-main-text);\n}\n</style>\n","/*\n * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { t } from '@nextcloud/l10n'\n\nexport const OFFICE_SUITES = Object.freeze([\n\t{\n\t\tid: 'nextcloud-office',\n\t\tappId: 'eurooffice',\n\t\tname: 'Nextcloud Office',\n\t\tfeatures: [\n\t\t\tt('settings', 'Powered by Euro-Office'),\n\t\t\tt('settings', 'Good Nextcloud integration'),\n\t\t\tt('settings', 'Open source'),\n\t\t\tt('settings', 'Best performance'),\n\t\t\tt('settings', 'Limited ODF compatibility'),\n\t\t\tt('settings', 'Best Microsoft compatibility'),\n\t\t],\n\t\tlearnMoreUrl: 'https://github.com/Euro-Office',\n\t\tisPrimary: true,\n\t},\n\t{\n\t\tid: 'collabora-office',\n\t\tappId: 'richdocuments',\n\t\tname: 'Collabora Office',\n\t\tfeatures: [\n\t\t\tt('settings', 'Best Nextcloud integration'),\n\t\t\tt('settings', 'Open source'),\n\t\t\tt('settings', 'Good performance'),\n\t\t\tt('settings', 'Best security: documents never leave your server'),\n\t\t\tt('settings', 'Best ODF compatibility'),\n\t\t\tt('settings', 'Best support for legacy files'),\n\t\t],\n\t\tlearnMoreUrl: 'https://nextcloud.com/collaboraonline/',\n\t\tisPrimary: false,\n\t},\n])\n\n/**\n * Get office suite configuration by ID\n *\n * @param id - The suite ID\n * @return The suite configuration or undefined if not found\n */\nexport function getOfficeSuiteById(id: string) {\n\treturn OFFICE_SUITES.find((suite) => suite.id === id)\n}\n\n/**\n * Get office suite configuration by app ID\n *\n * @param appId - The app ID (richdocuments, onlyoffice, etc.)\n * @return The suite configuration or undefined if not found\n */\nexport function getOfficeSuiteByAppId(appId: string) {\n\treturn OFFICE_SUITES.find((suite) => suite.appId === appId)\n}\n","<!--\n  - SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n  - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport { showConfirmation } from '@nextcloud/dialogs'\nimport { loadState } from '@nextcloud/initial-state'\nimport { t } from '@nextcloud/l10n'\nimport { ref, watch } from 'vue'\nimport NcButton from '@nextcloud/vue/components/NcButton'\nimport NcNoteCard from '@nextcloud/vue/components/NcNoteCard'\nimport OfficeSuiteSwitcherItem from './OfficeSuiteSwitcherItem.vue'\nimport { OFFICE_SUITES } from '../../service/OfficeSuites.ts'\nimport { useAppsStore } from '../../store/apps.ts'\nimport { canDisable, needForceEnable } from '../../utils/appStatus.ts'\n\nconst store = useAppsStore()\nconst isAllInOne = loadState('appstore', 'isAllInOne', false)\n\nconst isProcessing = ref(false)\nconst selectedSuiteId = ref<string | null>(getInitialSuite())\nwatch(selectedSuiteId, onSuiteChanged)\n\n/**\n * Get the initially selected office suite based on the installed apps\n */\nfunction getInitialSuite() {\n\tfor (const suite of OFFICE_SUITES) {\n\t\tconst app = store.apps.find((a) => a.id === suite.appId && a.installed)\n\t\tif (app && app.active) {\n\t\t\treturn suite.id\n\t\t}\n\t}\n\treturn OFFICE_SUITES.find((s) => s.isPrimary)?.id ?? null\n}\n\n/**\n * Disable all office suites\n */\nfunction disableSuites() {\n\tselectedSuiteId.value = null\n}\n\n/**\n * Disable a specific office suite\n *\n * @param suite - The suite to disable\n */\nasync function disableSuite(suite: typeof OFFICE_SUITES[number]) {\n\tconst app = store.getAppById(suite.appId)\n\tif (!app) {\n\t\treturn\n\t}\n\n\tif (canDisable(app)) {\n\t\tawait store.disableApp(suite.appId)\n\t}\n}\n\n/**\n * Callback to handle office suite changes. Enables the selected suite and disables others.\n *\n * @param newSuiteId - The new selected suite ID\n * @param oldSuiteId - The previously selected suite ID\n */\nasync function onSuiteChanged(newSuiteId: string | null, oldSuiteId: string | null) {\n\tif (isProcessing.value || newSuiteId === oldSuiteId) {\n\t\treturn\n\t}\n\n\ttry {\n\t\tisProcessing.value = true\n\t\tconst suite = OFFICE_SUITES.find((s) => s.id === newSuiteId)\n\t\tif (!suite) {\n\t\t\t// No suite selected, disable all suites\n\t\t\tfor (const s of OFFICE_SUITES) {\n\t\t\t\tawait disableSuite(s)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tconst app = store.getAppById(suite.appId)!\n\t\tif (needForceEnable(app)) {\n\t\t\tconst result = await showConfirmation({\n\t\t\t\tname: t('appstore', 'Force enable {suite}?', { suite: suite.name }),\n\t\t\t\ttext: t('appstore', 'Enabling {suite} requires force enabling the app. This may cause issues with your Nextcloud instance. Are you sure you want to proceed?', { suite: suite.name }),\n\t\t\t\tlabelConfirm: t('appstore', 'Force enable'),\n\t\t\t\tlabelReject: t('appstore', 'Cancel'),\n\t\t\t\tseverity: 'warning',\n\t\t\t})\n\n\t\t\tif (result) {\n\t\t\t\tawait store.enableApp(suite.appId, true)\n\t\t\t} else {\n\t\t\t\t// Revert selection\n\t\t\t\tselectedSuiteId.value = oldSuiteId\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\t// Enable the selected suite and disable others\n\t\tfor (const s of OFFICE_SUITES) {\n\t\t\tif (s.id === newSuiteId) {\n\t\t\t\tawait store.enableApp(s.appId)\n\t\t\t} else {\n\t\t\t\tawait disableSuite(s)\n\t\t\t}\n\t\t}\n\t} finally {\n\t\tisProcessing.value = false\n\t}\n}\n</script>\n\n<template>\n\t<NcNoteCard v-if=\"isAllInOne\" type=\"info\">\n\t\t<p>{{ t('appstore', 'Office suite switching is managed through the Nextcloud All-in-One interface.') }}</p>\n\t\t<p>{{ t('appstore', 'Please use the AIO interface to switch between office suites.') }}</p>\n\t</NcNoteCard>\n\n\t<section v-else :class=\"$style.officeSuiteSwitcher\">\n\t\t<h3 :class=\"$style.officeSuiteSwitcher__title\">\n\t\t\t{{ t('appstore', 'Select your preferred office suite.') }}\n\t\t</h3>\n\t\t<p>{{ t('appstore', 'Please note that installing requires manual server setup.') }}</p>\n\t\t<fieldset :class=\"$style.officeSuiteSwitcher__cards\">\n\t\t\t<OfficeSuiteSwitcherItem\n\t\t\t\tv-for=\"suite in OFFICE_SUITES\"\n\t\t\t\t:key=\"suite.id\"\n\t\t\t\tv-model:selected=\"selectedSuiteId\"\n\t\t\t\t:class=\"$style.officeSuiteSwitcher__cardsItem\"\n\t\t\t\t:suite=\"suite\"\n\t\t\t\t:loading=\"isProcessing\" />\n\t\t</fieldset>\n\t\t<div :class=\"$style.officeSuiteSwitcher__actions\">\n\t\t\t<NcButton :disabled=\"!selectedSuiteId\" @click=\"disableSuites\">\n\t\t\t\t{{ t('appstore', 'Disable office suites') }}\n\t\t\t</NcButton>\n\t\t</div>\n\t</section>\n</template>\n\n<style module>\n.officeSuiteSwitcher {\n\tpadding: 20px;\n\tmargin-bottom: 30px;\n\n\th3 {\n\t\tmargin: 0px;\n\t}\n\n\tp {\n\t\tmargin: 8px 0;\n\n\t\t&:first-child {\n\t\t\tfont-weight: 600;\n\t\t}\n\t}\n}\n\n.officeSuiteSwitcher__cards {\n\tdisplay: flex;\n\tgap: 20px;\n\tmax-width: 1200px;\n}\n\n.officeSuiteSwitcher__cardsItem {\n\tflex: 1;\n}\n\n.officeSuiteSwitcher__actions {\n\tmargin-top: 16px;\n}\n\n.officeSuiteSwitcher__disableButton {\n\tbackground: transparent;\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius-small);\n\tpadding: 8px 12px;\n\tfont-weight: 600;\n\tcolor: var(--color-main-text);\n\tcursor: pointer;\n\ttransition: background 0.15s ease, border-color 0.15s ease;\n}\n\n.officeSuiteSwitcher__disableButton:disabled {\n\topacity: 0.5;\n\tcursor: default;\n}\n\n.officeSuiteSwitcher__disableButton:hover:not(:disabled) {\n\tborder-color: var(--color-primary-element);\n\tbackground: var(--color-background-dark);\n}\n\n@media (max-width: 768px) {\n\t.officeSuiteSwitcher__cards {\n\t\tflex-direction: column;\n\t}\n}\n</style>\n","<!--\n  - SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors\n  - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport { t } from '@nextcloud/l10n'\nimport { computed } from 'vue'\nimport { useRoute } from 'vue-router'\nimport NcButton from '@nextcloud/vue/components/NcButton'\nimport NcEmptyContent from '@nextcloud/vue/components/NcEmptyContent'\nimport NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'\nimport AppGrid from '../components/AppGrid/AppGrid.vue'\nimport OfficeSuiteSwitcher from '../components/AppstoreBrowse/OfficeSuiteSwitcher.vue'\nimport AppTable from '../components/AppTable/AppTable.vue'\nimport AppToolbar from '../components/AppToolbar.vue'\nimport { useFilteredApps } from '../composables/useFilteredApps.ts'\nimport { useAppsStore } from '../store/apps.ts'\nimport { useUserSettingsStore } from '../store/userSettings.ts'\n\nconst route = useRoute()\nconst store = useAppsStore()\nconst userSettings = useUserSettingsStore()\n\nconst currentCategory = computed(() => route.params!.category as string)\nconst apps = computed(() => {\n\tif (currentCategory.value === 'featured') {\n\t\treturn store.apps.filter((app) => app.level === 200)\n\t} else if (currentCategory.value === 'supported') {\n\t\treturn store.apps.filter((app) => app.level === 300)\n\t}\n\treturn store.getAppsByCategory(currentCategory.value)\n})\n\nconst visibleApps = useFilteredApps(apps)\n</script>\n\n<template>\n\t<AppToolbar />\n\n\t<!-- Apps list -->\n\t<NcEmptyContent\n\t\tv-if=\"store.isLoadingApps\"\n\t\t:name=\"t('appstore', 'Loading app list')\">\n\t\t<template #icon>\n\t\t\t<NcLoadingIcon :size=\"64\" />\n\t\t</template>\n\t</NcEmptyContent>\n\n\t<template v-else>\n\t\t<OfficeSuiteSwitcher v-if=\"currentCategory === 'office'\" />\n\n\t\t<component\n\t\t\t:is=\"userSettings.isGridView ? AppGrid : AppTable\"\n\t\t\tv-if=\"visibleApps.length\"\n\t\t\t:class=\"$style.appstoreBrowse\"\n\t\t\t:apps=\"visibleApps\" />\n\t\t<NcEmptyContent\n\t\t\tv-else\n\t\t\t:name=\"t('appstore', 'No matching apps found')\">\n\t\t\t<template #action>\n\t\t\t\t<NcButton variant=\"primary\" @click=\"$router.push({ query: $route.query, name: 'apps-search' })\">\n\t\t\t\t\t{{ t('appstore', 'Search everywhere') }}\n\t\t\t\t</NcButton>\n\t\t\t</template>\n\t\t</NcEmptyContent>\n\t</template>\n</template>\n\n<style module>\n.appstoreBrowse {\n\tmargin-bottom: var(--body-container-margin);\n}\n</style>\n"],"names":["selectedSuiteId","_useModel","__props","headerId","useId","store","useAppsStore","app","computed","isInstalled","cannotInstall","canInstall","_createElementBlock","_normalizeClass","$style","_cache","$event","_createElementVNode","_unref","_openBlock","_hoisted_2","_toDisplayString","t","_createVNode","NcCheckboxRadioSwitch","_Fragment","feature","index","NcButton","_createTextVNode","OFFICE_SUITES","isAllInOne","loadState","isProcessing","ref","getInitialSuite","watch","onSuiteChanged","suite","a","s","disableSuites","disableSuite","canDisable","newSuiteId","oldSuiteId","needForceEnable","showConfirmation","_createBlock","NcNoteCard","_renderList","OfficeSuiteSwitcherItem","route","useRoute","userSettings","useUserSettingsStore","currentCategory","apps","visibleApps","useFilteredApps","AppToolbar","NcEmptyContent","NcLoadingIcon","OfficeSuiteSwitcher","_resolveDynamicComponent","AppGrid","AppTable","$router","$route"],"mappings":"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"}