mirror of
https://github.com/nextcloud/server.git
synced 2026-02-03 20:41:22 -05:00
1 line
No EOL
37 KiB
Text
1 line
No EOL
37 KiB
Text
{"version":3,"file":"theming-settings-admin.mjs","sources":["../build/frontend/apps/theming/src/components/AdminSectionAppMenu.vue","../build/frontend/apps/theming/src/composables/useAdminThemingValue.ts","../build/frontend/apps/theming/src/components/admin/TextField.vue","../build/frontend/apps/theming/src/components/AdminSectionTheming.vue","../build/frontend/apps/theming/src/components/admin/ColorPickerField.vue","../build/frontend/apps/theming/src/components/admin/FileInputField.vue","../build/frontend/apps/theming/src/components/AdminSectionThemingAdvanced.vue","../build/frontend/apps/theming/src/views/AdminTheming.vue","../build/frontend/apps/theming/src/settings-admin.ts"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport type { INavigationEntry } from '../../../../core/src/types/navigation.ts'\nimport type { AdminThemingParameters } from '../types.d.ts'\n\nimport axios from '@nextcloud/axios'\nimport { showError } from '@nextcloud/dialogs'\nimport { loadState } from '@nextcloud/initial-state'\nimport { t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport { ref, useId, watch } from 'vue'\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'\nimport NcSelect from '@nextcloud/vue/components/NcSelect'\nimport NcSettingsSection from '@nextcloud/vue/components/NcSettingsSection'\nimport AppOrderSelector from './AppOrderSelector.vue'\nimport { logger } from '../utils/logger.ts'\n\nconst idGlobalDefaultApp = useId()\nconst { defaultApps } = loadState<AdminThemingParameters>('theming', 'adminThemingParameters')\n\n/**\n * All enabled apps which can be navigated\n */\nconst allApps = loadState<INavigationEntry[]>('core', 'apps')\n\t.map(({ id, name, icon }) => ({ label: name, id, icon }))\n\n/**\n * Currently selected app, wrapps the setter\n */\nconst selectedApps = ref(defaultApps.map((id) => allApps.find((app) => app.id === id)!).filter(Boolean))\nwatch(selectedApps, async (value) => {\n\ttry {\n\t\tawait saveSetting('defaultApps', value.map((app) => app.id))\n\t} catch (error) {\n\t\tlogger.error('Could not set global default apps', { error })\n\t\tshowError(t('theming', 'Could not set global default apps'))\n\t}\n})\n\nconst hasCustomDefaultApp = ref(defaultApps.length > 0)\nwatch(hasCustomDefaultApp, (checked) => {\n\tselectedApps.value = checked\n\t\t? allApps.filter((app) => ['dashboard', 'files'].includes(app.id))\n\t\t: []\n})\n\n/**\n * @param key - The setting key\n * @param value - The setting value\n */\nasync function saveSetting(key: string, value: unknown) {\n\tconst url = generateUrl('/apps/theming/ajax/updateAppMenu')\n\treturn await axios.put(url, {\n\t\tsetting: key,\n\t\tvalue,\n\t})\n}\n</script>\n\n<template>\n\t<NcSettingsSection :name=\"t('theming', 'Navigation bar settings')\">\n\t\t<h3>{{ t('theming', 'Default app') }}</h3>\n\t\t<p class=\"info-note\">\n\t\t\t{{ t('theming', 'The default app is the app that is e.g. opened after login or when the logo in the menu is clicked.') }}\n\t\t</p>\n\n\t\t<NcCheckboxRadioSwitch v-model=\"hasCustomDefaultApp\" type=\"switch\">\n\t\t\t{{ t('theming', 'Use custom default app') }}\n\t\t</NcCheckboxRadioSwitch>\n\n\t\t<section v-if=\"hasCustomDefaultApp\" :aria-labelledby=\"idGlobalDefaultApp\">\n\t\t\t<h4 :id=\"idGlobalDefaultApp\">\n\t\t\t\t{{ t('theming', 'Global default app') }}\n\t\t\t</h4>\n\t\t\t<NcSelect\n\t\t\t\tv-model=\"selectedApps\"\n\t\t\t\tkeepOpen\n\t\t\t\tmultiple\n\t\t\t\t:placeholder=\"t('theming', 'Global default apps')\"\n\t\t\t\t:options=\"allApps\" />\n\n\t\t\t<h5>{{ t('theming', 'Default app priority') }}</h5>\n\t\t\t<p class=\"info-note\">\n\t\t\t\t{{ t('theming', 'If an app is not enabled for a user, the next app with lower priority is used.') }}\n\t\t\t</p>\n\t\t\t<AppOrderSelector v-model=\"selectedApps\" />\n\t\t</section>\n\t</NcSettingsSection>\n</template>\n\n<style scoped lang=\"scss\">\nh3, h4 {\n\tfont-weight: bold;\n}\n\nh4, h5 {\n\tmargin-block-start: 12px;\n}\n\n.info-note {\n\tcolor: var(--color-text-maxcontrast);\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 type { MaybeRef, MaybeRefOrGetter, Ref } from 'vue'\n\nimport axios, { isAxiosError } from '@nextcloud/axios'\nimport { showError } from '@nextcloud/dialogs'\nimport { generateUrl } from '@nextcloud/router'\nimport { watchDebounced } from '@vueuse/core'\nimport { isReadonly, isRef, readonly, ref, toValue } from 'vue'\nimport { logger } from '../utils/logger.ts'\n\n/**\n * @param name - The property name\n * @param modelValue - The model value\n * @param defaultValue - The default value\n */\nexport function useAdminThemingValue<T>(name: MaybeRefOrGetter<string>, modelValue: Ref<T>, defaultValue: MaybeRef<T>) {\n\tlet resetted = false\n\tconst isSaving = ref(false)\n\tconst isSaved = ref(false)\n\n\twatchDebounced(modelValue, async () => {\n\t\tif (isSaving.value) {\n\t\t\treturn\n\t\t}\n\n\t\tif (resetted) {\n\t\t\tresetted = false\n\t\t\treturn\n\t\t}\n\n\t\tisSaving.value = true\n\t\tisSaved.value = false\n\t\ttry {\n\t\t\tawait setValue(toValue(name), toValue(modelValue))\n\t\t\tisSaved.value = true\n\t\t\twindow.setTimeout(() => {\n\t\t\t\tisSaved.value = false\n\t\t\t}, 2000)\n\t\t} finally {\n\t\t\tisSaving.value = false\n\t\t}\n\t}, { debounce: 800, flush: 'sync' })\n\n\t/**\n\t * Reset to default value\n\t */\n\tasync function reset() {\n\t\tisSaving.value = true\n\t\tisSaved.value = false\n\t\ttry {\n\t\t\tconst result = await resetValue(toValue(name))\n\t\t\tif (result && isRef(defaultValue) && !isReadonly(defaultValue)) {\n\t\t\t\tdefaultValue.value = result as T\n\t\t\t}\n\t\t\tresetted = true\n\t\t\tmodelValue.value = toValue(defaultValue)\n\t\t} finally {\n\t\t\tisSaving.value = false\n\t\t}\n\t}\n\n\treturn {\n\t\tisSaving: readonly(isSaving),\n\t\tisSaved: readonly(isSaved),\n\t\treset,\n\t}\n}\n\n/**\n * @param setting - The setting name\n * @param value - The setting value\n */\nasync function setValue(setting: string, value: unknown) {\n\tconst url = generateUrl('/apps/theming/ajax/updateStylesheet')\n\ttry {\n\t\tawait axios.post(url, {\n\t\t\tsetting,\n\t\t\tvalue: String(value),\n\t\t})\n\t} catch (error) {\n\t\tlogger.error('Failed to save changes', { error, setting, value })\n\t\tif (isAxiosError(error) && error.response?.data?.data?.message) {\n\t\t\tshowError(error.response.data.data.message)\n\t\t}\n\t\tthrow error\n\t}\n}\n\n/**\n * Reset theming value for a given setting\n *\n * @param setting - The setting name\n */\nasync function resetValue(setting: string) {\n\tconst url = generateUrl('/apps/theming/ajax/undoChanges')\n\ttry {\n\t\tconst { data } = await axios.post<{ data: { value?: string } }>(url, { setting })\n\t\treturn data.data.value\n\t} catch (error) {\n\t\tlogger.error('Failed to reset theming value', { error, setting })\n\t\tif (isAxiosError(error) && error.response?.data?.data?.message) {\n\t\t\tshowError(error.response.data.data.message)\n\t\t\treturn false\n\t\t}\n\t\tthrow error\n\t}\n}\n","<!--\n - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport type { AdminThemingParameters } from '../../types.d.ts'\n\nimport { loadState } from '@nextcloud/initial-state'\nimport { watchDebounced } from '@vueuse/core'\nimport { ref, toRef } from 'vue'\nimport NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'\nimport NcTextField from '@nextcloud/vue/components/NcTextField'\nimport { useAdminThemingValue } from '../../composables/useAdminThemingValue.ts'\n\nconst props = withDefaults(defineProps<{\n\tname: keyof AdminThemingParameters\n\tlabel: string\n\tdefaultValue: string\n\ttype?: 'text' | 'url'\n}>(), {\n\ttype: 'text',\n})\n\nconst modelValue = ref(loadState<AdminThemingParameters>('theming', 'adminThemingParameters')[props.name].toString())\n\nconst {\n\tisSaving,\n\tisSaved,\n\treset,\n} = useAdminThemingValue(toRef(() => props.name), modelValue, toRef(() => props.defaultValue))\n\nwatchDebounced(modelValue, (value) => {\n\tif (props.type === 'url' && value.includes('\"')) {\n\t\ttry {\n\t\t\tconst url = new URL(value)\n\t\t\turl.pathname = url.pathname.replaceAll(/\"/g, '%22')\n\t\t\tmodelValue.value = url.href\n\t\t} catch {\n\t\t\t// invalid URL, do nothing\n\t\t\treturn\n\t\t}\n\t}\n}, { debounce: 600 })\n</script>\n\n<template>\n\t<NcTextField\n\t\tv-model=\"modelValue\"\n\t\t:label\n\t\t:readonly=\"isSaving\"\n\t\t:success=\"isSaved\"\n\t\t:type\n\t\t:showTrailingButton=\"modelValue !== defaultValue\"\n\t\t:trailingButtonIcon=\"defaultValue ? 'undo' : 'close'\"\n\t\t@trailingButtonClick=\"reset\">\n\t\t<template v-if=\"isSaving\" #icon>\n\t\t\t<NcLoadingIcon />\n\t\t</template>\n\t</NcTextField>\n</template>\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 type { AdminThemingInfo } from '../types.d.ts'\n\nimport { loadState } from '@nextcloud/initial-state'\nimport { t } from '@nextcloud/l10n'\nimport NcSettingsSection from '@nextcloud/vue/components/NcSettingsSection'\nimport TextField from './admin/TextField.vue'\n\nconst ADMIN_INFO = loadState<AdminThemingInfo>('theming', 'adminThemingInfo')\n</script>\n\n<template>\n\t<NcSettingsSection\n\t\t:name=\"t('theming', 'Theming')\"\n\t\t:description=\"t('theming', 'Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users.')\"\n\t\t:docUrl=\"ADMIN_INFO.docUrl\"\n\t\tdata-admin-theming-settings>\n\t\t<div :class=\"$style.adminSectionTheming\">\n\t\t\t<!-- Name, web link, slogan... fields -->\n\t\t\t<TextField\n\t\t\t\tname=\"name\"\n\t\t\t\t:label=\"t('theming', 'Name')\"\n\t\t\t\tdefaultValue=\"Nextcloud\"\n\t\t\t\tmaxlength=\"250\" />\n\t\t\t<TextField\n\t\t\t\tname=\"url\"\n\t\t\t\t:label=\"t('theming', 'Web link')\"\n\t\t\t\tdefaultValue=\"https://nextcloud.com\"\n\t\t\t\tplaceholder=\"https://…\"\n\t\t\t\ttype=\"url\"\n\t\t\t\tmaxlength=\"500\" />\n\t\t\t<TextField\n\t\t\t\tname=\"slogan\"\n\t\t\t\t:label=\"t('theming', 'Slogan')\"\n\t\t\t\t:defaultValue=\"t('settings', 'a safe home for all your data')\"\n\t\t\t\tmaxlength=\"500\" />\n\t\t\t<hr>\n\n\t\t\t<TextField\n\t\t\t\tname=\"legalNoticeUrl\"\n\t\t\t\t:label=\"t('theming', 'Legal notice link')\"\n\t\t\t\tdefaultValue=\"\"\n\t\t\t\ttype=\"url\"\n\t\t\t\tplaceholder=\"https://…\"\n\t\t\t\tmaxlength=\"500\" />\n\t\t\t<TextField\n\t\t\t\tname=\"privacyPolicyUrl\"\n\t\t\t\t:label=\"t('theming', 'Privacy policy link')\"\n\t\t\t\tdefaultValue=\"\"\n\t\t\t\ttype=\"url\"\n\t\t\t\tplaceholder=\"https://…\"\n\t\t\t\tmaxlength=\"500\" />\n\t\t</div>\n\t</NcSettingsSection>\n</template>\n\n<style module>\n.adminSectionTheming {\n\tmax-width: 650px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: calc(2 * var(--default-grid-baseline));\n}\n</style>\n","<!--\n - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport type { AdminThemingParameters } from '../../types.d.ts'\n\nimport { mdiPaletteOutline, mdiUndo } from '@mdi/js'\nimport { loadState } from '@nextcloud/initial-state'\nimport { t } from '@nextcloud/l10n'\nimport { computed, ref, toRef, useId, watch } from 'vue'\nimport NcButton from '@nextcloud/vue/components/NcButton'\nimport NcColorPicker from '@nextcloud/vue/components/NcColorPicker'\nimport NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'\nimport NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'\nimport { useAdminThemingValue } from '../../composables/useAdminThemingValue.js'\nimport { getTextColor } from '../../utils/color.ts'\n\nconst props = defineProps<{\n\tname: keyof AdminThemingParameters\n\tlabel: string\n\tdefaultValue: string\n}>()\n\nconst emit = defineEmits<{\n\tupdated: []\n}>()\n\nconst id = useId()\n\nconst modelValue = ref(loadState<AdminThemingParameters>('theming', 'adminThemingParameters')[props.name] as string)\nconst previewColor = ref(modelValue.value)\nwatch(modelValue, (v) => {\n\tpreviewColor.value = v\n})\n\nconst {\n\tisSaving,\n\treset,\n} = useAdminThemingValue(() => props.name, modelValue, toRef(props, 'defaultValue'))\nwatch(isSaving, (v) => !v && emit('updated'))\n\nconst textColor = computed(() => getTextColor(previewColor.value))\n</script>\n\n<template>\n\t<div :class=\"$style.colorPickerField\">\n\t\t<div :class=\"$style.colorPickerField__row\">\n\t\t\t<NcColorPicker\n\t\t\t\t:id\n\t\t\t\tv-model=\"previewColor\"\n\t\t\t\tadvancedFields\n\t\t\t\t@submit=\"modelValue = $event!\">\n\t\t\t\t<NcButton\n\t\t\t\t\t:class=\"$style.colorPickerField__button\"\n\t\t\t\t\tsize=\"large\"\n\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t:style=\"{\n\t\t\t\t\t\t'--color-primary-element': previewColor,\n\t\t\t\t\t\t'--color-primary-element-text': textColor,\n\t\t\t\t\t\t'--color-primary-element-hover': 'color-mix(in srgb, var(--color-primary-element) 70%, var(--color-primary-element-text))',\n\t\t\t\t\t}\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<NcLoadingIcon v-if=\"isSaving\" :appearance=\"textColor === '#ffffff' ? 'light' : 'dark'\" />\n\t\t\t\t\t\t<NcIconSvgWrapper v-else :path=\"mdiPaletteOutline\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ label }}\n\t\t\t\t</NcButton>\n\t\t\t</NcColorPicker>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"modelValue !== defaultValue\"\n\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t:aria-label=\"t('theming', 'Reset to default')\"\n\t\t\t\t:title=\"t('theming', 'Reset to default')\"\n\t\t\t\t@click=\"reset\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcIconSvgWrapper :path=\"mdiUndo\" />\n\t\t\t\t</template>\n\t\t\t</NcButton>\n\t\t</div>\n\t\t<p :class=\"$style.colorPickerField__description\">\n\t\t\t<slot name=\"description\" />\n\t\t</p>\n\t</div>\n</template>\n\n<style module>\n.colorPickerField {\n\tdisplay: flex;\n\tflex-direction: column;\n}\n\n.colorPickerField__row {\n\tdisplay: flex;\n\tflex-direction: row;\n\talign-items: center;\n\tgap: calc(1.5 * var(--default-grid-baseline));\n}\n\n.colorPickerField__button {\n\tmin-width: clamp(200px, 25vw, 300px) !important;\n}\n\n.colorPickerField__description {\n\tcolor: var(--color-text-maxcontrast);\n\tmargin-block: calc(0.5 * var(--default-grid-baseline)) var(--default-grid-baseline);\n}\n\n.colorPickerField__description:empty {\n\tdisplay: none;\n}\n</style>\n","<!--\n - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport type { AdminThemingParameters } from '../../types.d.ts'\n\nimport { mdiImageOutline, mdiUndo } from '@mdi/js'\nimport axios from '@nextcloud/axios'\nimport { showError } from '@nextcloud/dialogs'\nimport { loadState } from '@nextcloud/initial-state'\nimport { t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport { computed, ref, useTemplateRef } from 'vue'\nimport NcButton from '@nextcloud/vue/components/NcButton'\nimport NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'\nimport NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'\n\nconst props = defineProps<{\n\tname: string\n\tlabel: string\n\tdisabled?: boolean\n}>()\n\nconst emit = defineEmits<{\n\tupdated: []\n}>()\n\nconst isSaving = ref(false)\nconst mime = ref(loadState<AdminThemingParameters>('theming', 'adminThemingParameters')[props.name + 'Mime'] as string)\n\nconst inputElement = useTemplateRef('input')\n\nconst background = computed(() => {\n\tconst baseUrl = generateUrl('/apps/theming/image/{key}', { key: props.name })\n\treturn `url(${baseUrl}?v=${Date.now()}&m=${encodeURIComponent(mime.value)})`\n})\n\n/**\n * Open the file picker dialog\n */\nfunction pickFile() {\n\tif (isSaving.value) {\n\t\treturn\n\t}\n\tinputElement.value!.files = null\n\tinputElement.value!.click()\n}\n\n/**\n * Handle file input change event\n */\nasync function onChange() {\n\tif (!inputElement.value!.files?.[0]) {\n\t\treturn\n\t}\n\n\tconst file = inputElement.value!.files[0]!\n\tif (file.type && !file.type.startsWith('image/')) {\n\t\tshowError(t('theming', 'Non image file selected'))\n\t\treturn\n\t}\n\n\tisSaving.value = true\n\n\tconst formData = new FormData()\n\tformData.append('image', file)\n\tformData.append('key', props.name)\n\n\ttry {\n\t\tawait axios.post(generateUrl('/apps/theming/ajax/uploadImage'), formData, {\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'multipart/form-data',\n\t\t\t},\n\t\t})\n\t\tmime.value = file.type\n\t\temit('updated')\n\t} finally {\n\t\tisSaving.value = false\n\t}\n}\n\n/**\n * Reset the image to default\n */\nasync function resetToDefault() {\n\tif (isSaving.value) {\n\t\treturn\n\t}\n\n\tisSaving.value = true\n\ttry {\n\t\tawait axios.post(generateUrl('/apps/theming/ajax/undoChanges'), {\n\t\t\tsetting: props.name,\n\t\t})\n\t\tmime.value = ''\n\t\temit('updated')\n\t} finally {\n\t\tisSaving.value = false\n\t}\n}\n</script>\n\n<template>\n\t<div :class=\"$style.fileInputField\">\n\t\t<NcButton\n\t\t\t:class=\"$style.fileInputField__button\"\n\t\t\talignment=\"start\"\n\t\t\t:disabled\n\t\t\tsize=\"large\"\n\t\t\t@click=\"pickFile\">\n\t\t\t<template #icon>\n\t\t\t\t<NcLoadingIcon v-if=\"isSaving\" />\n\t\t\t\t<NcIconSvgWrapper v-else :path=\"mdiImageOutline\" />\n\t\t\t</template>\n\t\t\t{{ label }}\n\t\t</NcButton>\n\n\t\t<div\n\t\t\tv-if=\"mime.startsWith('image/')\"\n\t\t\t:class=\"$style.fileInputField__preview\"\n\t\t\trole=\"img\"\n\t\t\t:aria-label=\"t('theming', 'Preview of the selected image')\" />\n\n\t\t<NcButton\n\t\t\tv-if=\"mime && !disabled\"\n\t\t\t:aria-label=\"t('theming', 'Reset to default')\"\n\t\t\t:title=\"t('theming', 'Reset to default')\"\n\t\t\tsize=\"large\"\n\t\t\tvariant=\"tertiary\"\n\t\t\t@click=\"resetToDefault\">\n\t\t\t<template #icon>\n\t\t\t\t<NcIconSvgWrapper :path=\"mdiUndo\" />\n\t\t\t</template>\n\t\t</NcButton>\n\t\t<input\n\t\t\tref=\"input\"\n\t\t\tclass=\"hidden-visually\"\n\t\t\taria-hidden=\"true\"\n\t\t\t:disabled\n\t\t\ttype=\"file\"\n\t\t\taccept=\"image/*\"\n\t\t\t:name\n\t\t\t@change=\"onChange\">\n\t</div>\n</template>\n\n<style module>\n.fileInputField {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: calc(1.5 * var(--default-grid-baseline));\n}\n\n.fileInputField__button {\n\tmin-width: clamp(200px, 25vw, 300px) !important;\n}\n\n.fileInputField__preview {\n\theight: var(--clickable-area-large);\n\twidth: calc(var(--clickable-area-large) / 9 * 16);\n\tbackground: v-bind('background');\n\tbackground-size: contain;\n\tbackground-repeat: no-repeat;\n\tbackground-position: center;\n\tborder: 2px solid var(--color-border-maxcontrast);\n\tborder-radius: var(--border-radius-element);\n}\n</style>\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 type { AdminThemingInfo, AdminThemingParameters } from '../types.d.ts'\n\nimport axios, { isAxiosError } from '@nextcloud/axios'\nimport { showError } from '@nextcloud/dialogs'\nimport { loadState } from '@nextcloud/initial-state'\nimport { t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport { ref, watch } from 'vue'\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'\nimport NcSettingsSection from '@nextcloud/vue/components/NcSettingsSection'\nimport ColorPickerField from './admin/ColorPickerField.vue'\nimport FileInputField from './admin/FileInputField.vue'\nimport { useAdminThemingValue } from '../composables/useAdminThemingValue.ts'\nimport { logger } from '../utils/logger.ts'\nimport { refreshStyles } from '../utils/refreshStyles.ts'\n\nconst { defaultBackgroundColor } = loadState<AdminThemingInfo>('theming', 'adminThemingInfo')\nconst adminThemingParameters = loadState<AdminThemingParameters>('theming', 'adminThemingParameters')\n\nconst userThemingDisabled = ref(adminThemingParameters.disableUserTheming)\nconst { isSaving } = useAdminThemingValue('disableUserTheming', userThemingDisabled, false)\n\nconst isRemovingBackgroundImage = ref(false)\nconst removeBackgroundImage = ref(adminThemingParameters.backgroundMime === 'backgroundColor')\nwatch(removeBackgroundImage, toggleBackground)\n\n/**\n * Remove the background image and set the background to backgroundColor\n *\n * @param value - Whether to remove the background image or restore it\n */\nasync function toggleBackground(value: boolean) {\n\tisRemovingBackgroundImage.value = true\n\ttry {\n\t\tif (value) {\n\t\t\tawait axios.post(generateUrl('/apps/theming/ajax/undoChanges'), {\n\t\t\t\tsetting: 'background',\n\t\t\t})\n\t\t\tawait axios.post(generateUrl('/apps/theming/ajax/updateStylesheet'), {\n\t\t\t\tsetting: 'backgroundMime',\n\t\t\t\tvalue: 'backgroundColor',\n\t\t\t})\n\t\t} else {\n\t\t\tawait axios.post(generateUrl('/apps/theming/ajax/undoChanges'), {\n\t\t\t\tsetting: 'backgroundMime',\n\t\t\t})\n\t\t}\n\t\tawait refreshStyles()\n\t} catch (error) {\n\t\tlogger.error('Failed to remove background image', { error })\n\t\tif (isAxiosError(error) && error.response?.data?.data?.message) {\n\t\t\tshowError(error.response.data.data.message)\n\t\t\treturn\n\t\t}\n\t\tthrow error\n\t} finally {\n\t\tisRemovingBackgroundImage.value = false\n\t}\n}\n</script>\n\n<template>\n\t<NcSettingsSection :name=\"t('theming', 'Background and color')\">\n\t\t<div :class=\"$style.adminSectionThemingAdvanced\">\n\t\t\t<!-- primary color -->\n\t\t\t<ColorPickerField\n\t\t\t\tname=\"primaryColor\"\n\t\t\t\t:label=\"t('theming', 'Primary color')\"\n\t\t\t\tdefaultValue=\"#00679e\"\n\t\t\t\t@updated=\"refreshStyles\">\n\t\t\t\t<template #description>\n\t\t\t\t\t{{ t('theming', 'Set the default primary color, used to highlight important elements.') }}\n\t\t\t\t\t{{ t('theming', 'The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements.') }}\n\t\t\t\t</template>\n\t\t\t</ColorPickerField>\n\t\t\t<!-- background color -->\n\t\t\t<ColorPickerField\n\t\t\t\tname=\"backgroundColor\"\n\t\t\t\t:label=\"t('theming', 'Background color')\"\n\t\t\t\t:defaultValue=\"defaultBackgroundColor\"\n\t\t\t\t@updated=\"refreshStyles\">\n\t\t\t\t<template #description>\n\t\t\t\t\t{{ t('theming', 'When no background image is set the background color will be used.') }}\n\t\t\t\t\t{{ t('theming', 'Otherwise the background color is by default generated from the background image, but can be adjusted to fine tune the color of the navigation icons.') }}\n\t\t\t\t</template>\n\t\t\t</ColorPickerField>\n\t\t\t<!-- background and logo -->\n\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\tv-model=\"removeBackgroundImage\"\n\t\t\t\ttype=\"switch\"\n\t\t\t\t:loading=\"isRemovingBackgroundImage\"\n\t\t\t\t:description=\"t('theming', 'Use a plain background color instead of a background image.')\">\n\t\t\t\t{{ t('theming', 'Remove background image') }}\n\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t<FileInputField\n\t\t\t\tname=\"background\"\n\t\t\t\t:disabled=\"removeBackgroundImage\"\n\t\t\t\t:label=\"t('theming', 'Background image')\"\n\t\t\t\t@updated=\"refreshStyles\" />\n\t\t\t<FileInputField\n\t\t\t\tname=\"favicon\"\n\t\t\t\t:label=\"t('theming', 'Favicon')\" />\n\t\t\t<FileInputField\n\t\t\t\tname=\"logo\"\n\t\t\t\t:label=\"t('theming', 'Logo')\"\n\t\t\t\t@updated=\"refreshStyles\" />\n\t\t\t<FileInputField\n\t\t\t\tname=\"logoheader\"\n\t\t\t\t:label=\"t('theming', 'Navigation bar logo')\"\n\t\t\t\t@updated=\"refreshStyles\" />\n\t\t\t<hr>\n\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\tv-model=\"userThemingDisabled\"\n\t\t\t\ttype=\"switch\"\n\t\t\t\t:loading=\"isSaving\"\n\t\t\t\t:description=\"t('theming', 'Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on.')\">\n\t\t\t\t{{ t('theming', 'Disable user theming') }}\n\t\t\t</NcCheckboxRadioSwitch>\n\t\t</div>\n\t</NcSettingsSection>\n</template>\n\n<style module>\n.adminSectionThemingAdvanced {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: calc(2 * var(--default-grid-baseline));\n\tmax-width: 650px;\n}\n</style>\n","<!--\n - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<NcNoteCard\n\t\tv-if=\"!isThemeable\"\n\t\t:text=\"notThemeableErrorMessage\"\n\t\tshowAlert\n\t\ttype=\"error\" />\n\t<template v-else>\n\t\t<AdminSectionTheming />\n\t\t<AdminSectionThemingAdvanced />\n\t</template>\n\t<AdminSectionAppMenu />\n</template>\n\n<script setup lang=\"ts\">\nimport type { AdminThemingInfo } from '../types.d.ts'\n\nimport { loadState } from '@nextcloud/initial-state'\nimport NcNoteCard from '@nextcloud/vue/components/NcNoteCard'\nimport AdminSectionAppMenu from '../components/AdminSectionAppMenu.vue'\nimport AdminSectionTheming from '../components/AdminSectionTheming.vue'\nimport AdminSectionThemingAdvanced from '../components/AdminSectionThemingAdvanced.vue'\n\nconst { isThemeable, notThemeableErrorMessage } = loadState<AdminThemingInfo>('theming', 'adminThemingInfo')\n</script>\n","/*!\n * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { createApp } from 'vue'\nimport AdminTheming from './views/AdminTheming.vue'\n\nimport 'vite/modulepreload-polyfill'\n\nconst app = createApp(AdminTheming)\napp.config.idPrefix = 'settings'\napp.mount('#settings-admin-theming')\n"],"names":["idGlobalDefaultApp","useId","defaultApps","loadState","allApps","id","name","icon","selectedApps","ref","app","watch","value","saveSetting","error","logger","showError","t","hasCustomDefaultApp","checked","key","url","generateUrl","axios","_createBlock","_unref","NcSettingsSection","_createElementVNode","_hoisted_1","_toDisplayString","_createVNode","NcCheckboxRadioSwitch","$event","_createElementBlock","_hoisted_3","NcSelect","_hoisted_4","AppOrderSelector","useAdminThemingValue","modelValue","defaultValue","resetted","isSaving","isSaved","watchDebounced","setValue","toValue","reset","result","resetValue","isRef","isReadonly","readonly","setting","isAxiosError","data","props","__props","toRef","NcTextField","NcLoadingIcon","ADMIN_INFO","_normalizeClass","$style","TextField","emit","__emit","previewColor","v","textColor","computed","getTextColor","NcColorPicker","_cache","NcButton","_normalizeStyle","NcIconSvgWrapper","mdiPaletteOutline","_createTextVNode","mdiUndo","_renderSlot","_ctx","mime","inputElement","useTemplateRef","background","pickFile","onChange","file","formData","resetToDefault","mdiImageOutline","defaultBackgroundColor","adminThemingParameters","userThemingDisabled","isRemovingBackgroundImage","removeBackgroundImage","toggleBackground","refreshStyles","ColorPickerField","FileInputField","isThemeable","notThemeableErrorMessage","_Fragment","AdminSectionTheming","AdminSectionThemingAdvanced","NcNoteCard","AdminSectionAppMenu","createApp","AdminTheming"],"mappings":"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"} |