mirror of
https://github.com/YunoHost/yunohost-portal.git
synced 2024-09-03 20:06:23 +02:00
233 lines
6.3 KiB
Vue
233 lines
6.3 KiB
Vue
<script setup lang="ts">
|
|
const { t, locales, getBrowserLocale } = useI18n()
|
|
|
|
useHead({
|
|
title: t('footerlink_edit'),
|
|
})
|
|
|
|
const settings = await useSettings()
|
|
const preferedTheme = await usePreferedTheme()
|
|
const preferedLocale = usePreferedLocale()
|
|
|
|
const localesAsOptions = computed(() => {
|
|
const options = locales.value.map((locale) => ({
|
|
text: locale.name,
|
|
value: locale.code,
|
|
}))
|
|
const browserLocale = getBrowserLocale()
|
|
const browserLocaleName = locales.value.find(
|
|
(locale) => locale.code === browserLocale,
|
|
)?.name
|
|
options.unshift({
|
|
text: t('automatic', { name: browserLocaleName }),
|
|
value: 'auto',
|
|
})
|
|
|
|
return options
|
|
})
|
|
|
|
const { colors, sizes } = useThemeOverride()
|
|
|
|
const themesAsOptions = [
|
|
'auto',
|
|
'system',
|
|
'light',
|
|
'dark',
|
|
'cupcake',
|
|
'bumblebee',
|
|
'emerald',
|
|
'corporate',
|
|
'synthwave',
|
|
'retro',
|
|
'cyberpunk',
|
|
'valentine',
|
|
'halloween',
|
|
'garden',
|
|
'forest',
|
|
'aqua',
|
|
'lofi',
|
|
'pastel',
|
|
'fantasy',
|
|
'wireframe',
|
|
'black',
|
|
'luxury',
|
|
'dracula',
|
|
'cmyk',
|
|
'autumn',
|
|
'business',
|
|
'acid',
|
|
'lemonade',
|
|
'night',
|
|
'coffee',
|
|
'winter',
|
|
'dim',
|
|
'nord',
|
|
'sunset',
|
|
].map((theme) => ({
|
|
text:
|
|
theme !== 'auto'
|
|
? theme.charAt(0).toUpperCase() + theme.slice(1)
|
|
: t('automatic', { name: settings.value.portal_theme }),
|
|
value: theme,
|
|
}))
|
|
</script>
|
|
|
|
<template>
|
|
<div>
|
|
<PageTitle :text="$t('footerlink_edit')" />
|
|
|
|
<div class="lg:flex lg:justify-between">
|
|
<section
|
|
class="lg:w-1/2 lg:me-20 h-full card card-bordered border-base-300 my-10"
|
|
>
|
|
<div class="card-header bg-base-300 py-4 px-8">
|
|
<h2 class="text-3xl">{{ t('edit_personal_settings') }}</h2>
|
|
</div>
|
|
|
|
<UserInfoForm class="p-8" />
|
|
</section>
|
|
|
|
<section class="lg:w-1/2 card card-bordered border-base-300 my-10">
|
|
<div class="card-header bg-base-300 py-4 px-8">
|
|
<h2 class="text-3xl">{{ $t('change_password') }}</h2>
|
|
</div>
|
|
|
|
<UserPasswordForm class="p-8" />
|
|
</section>
|
|
</div>
|
|
|
|
<section class="card card-bordered border-base-300 my-10">
|
|
<div class="card-header bg-base-300 py-4 px-8">
|
|
<h2 class="text-3xl">{{ t('edit_browser_settings') }}</h2>
|
|
</div>
|
|
|
|
<form class="p-8" novalidate @submit.prevent>
|
|
<div role="group" class="flex flex-wrap align mb-3">
|
|
<!-- eslint-disable-next-line vuejs-accessibility/label-has-for -->
|
|
<label for="language" class="label me-3">{{ t('language') }}</label>
|
|
<select
|
|
id="language"
|
|
v-model="preferedLocale"
|
|
class="select select-bordered"
|
|
>
|
|
<option disabled selected>{{ t('language') }}</option>
|
|
<option
|
|
v-for="option in localesAsOptions"
|
|
:key="option.value"
|
|
:value="option.value"
|
|
>
|
|
{{ option.text }}
|
|
</option>
|
|
</select>
|
|
</div>
|
|
|
|
<div role="group" class="flex flex-wrap align">
|
|
<!-- eslint-disable-next-line vuejs-accessibility/label-has-for -->
|
|
<label for="theme" class="label me-3">{{ t('theme') }}</label>
|
|
<select
|
|
id="theme"
|
|
v-model="preferedTheme"
|
|
class="select select-bordered"
|
|
>
|
|
<option disabled selected>{{ t('theme') }}</option>
|
|
<option
|
|
v-for="option in themesAsOptions"
|
|
:key="option.value"
|
|
:value="option.value"
|
|
>
|
|
{{ option.text }}
|
|
</option>
|
|
</select>
|
|
</div>
|
|
|
|
<fieldset class="theme-override mt-8">
|
|
<legend class="text-xl mb-6">{{ $t('theming.override') }}</legend>
|
|
|
|
<div
|
|
v-for="(_, colorName) in colors"
|
|
:key="colorName"
|
|
class="flex flex-wrap mb-2"
|
|
>
|
|
<FormField
|
|
:name="`color-picker-${colorName}`"
|
|
:label="
|
|
$t('theming.color_picker', {
|
|
colorName: $t(`theming.colors.${colorName}`),
|
|
})
|
|
"
|
|
sr-hide-label
|
|
>
|
|
<!-- eslint-disable-next-line vuejs-accessibility/form-control-has-label -->
|
|
<input
|
|
:id="`color-picker-${colorName}`"
|
|
v-model="colors[colorName]"
|
|
type="color"
|
|
class="inline-block w-8 h-8 -mr-8 cursor-pointer"
|
|
/>
|
|
<div
|
|
:class="'bg-' + colorName"
|
|
class="inline-block w-8 h-8 pointer-events-none border border-base-300"
|
|
/>
|
|
</FormField>
|
|
|
|
<FormField
|
|
:name="`color-hex-${colorName}`"
|
|
:label="
|
|
$t('theming.color_hex', {
|
|
colorName: $t(`theming.colors.${colorName}`),
|
|
})
|
|
"
|
|
sr-hide-label
|
|
>
|
|
<input
|
|
:id="`color-hex-${colorName}`"
|
|
v-model="colors[colorName]"
|
|
size="7"
|
|
class="input input-bordered px-2 font-mono ml-3"
|
|
/>
|
|
</FormField>
|
|
|
|
<span class="ml-3" aria-hidden>
|
|
{{ $t(`theming.colors.${colorName}`) }}
|
|
</span>
|
|
</div>
|
|
|
|
<div v-for="(_, sizeName) in sizes" :key="sizeName" class="flex mb-2">
|
|
<FormField
|
|
:name="`size-${sizeName}`"
|
|
:label="
|
|
$t('theming.size', {
|
|
sizeName: $t(`theming.sizes.${sizeName}`),
|
|
})
|
|
"
|
|
sr-hide-label
|
|
>
|
|
<!-- eslint-disable-next-line vuejs-accessibility/form-control-has-label -->
|
|
<input
|
|
:id="`size-${sizeName}`"
|
|
v-model="sizes[sizeName]"
|
|
type="number"
|
|
size="6"
|
|
class="input input-bordered inline-block pe-1"
|
|
/>
|
|
<span class="ml-3" aria-hidden>
|
|
{{ $t(`theming.sizes.${sizeName}`) }}
|
|
</span>
|
|
</FormField>
|
|
</div>
|
|
</fieldset>
|
|
</form>
|
|
</section>
|
|
</div>
|
|
</template>
|
|
|
|
<style scoped>
|
|
.card .card-header {
|
|
border-top-left-radius: var(--rounded-box);
|
|
border-top-right-radius: var(--rounded-box);
|
|
}
|
|
.theme-override input.input {
|
|
min-height: 2rem;
|
|
height: 2rem;
|
|
}
|
|
</style>
|