mirror of
https://github.com/YunoHost/yunohost-portal.git
synced 2024-09-03 20:06:23 +02:00
edit: add language selector + theme selector
This commit is contained in:
parent
8ba8518d5b
commit
b428472579
4 changed files with 186 additions and 83 deletions
3
app.vue
3
app.vue
|
@ -33,7 +33,8 @@ body {
|
||||||
|
|
||||||
/* GLOBAL */
|
/* GLOBAL */
|
||||||
.btn,
|
.btn,
|
||||||
.select {
|
.select,
|
||||||
|
.input {
|
||||||
min-height: 2.5rem;
|
min-height: 2.5rem;
|
||||||
height: 2.5rem;
|
height: 2.5rem;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,8 @@
|
||||||
"change_password": "Change password",
|
"change_password": "Change password",
|
||||||
"confirm_new_password": "Confirm new password",
|
"confirm_new_password": "Confirm new password",
|
||||||
"current_password": "Current password",
|
"current_password": "Current password",
|
||||||
|
"edit_browser_settings": "Edit browser only settings",
|
||||||
|
"edit_personal_settings": "Edit personal information",
|
||||||
"footerlink_administration": "Administration",
|
"footerlink_administration": "Administration",
|
||||||
"footerlink_documentation": "Documentation",
|
"footerlink_documentation": "Documentation",
|
||||||
"footerlink_edit": "Edit my profile",
|
"footerlink_edit": "Edit my profile",
|
||||||
|
@ -20,6 +22,7 @@
|
||||||
"form_has_errors": "The form contains some errors",
|
"form_has_errors": "The form contains some errors",
|
||||||
"fullname": "Full name",
|
"fullname": "Full name",
|
||||||
"good_practices_about_user_password": "Pick a user password of at least 8 characters - though it is good practice to use longer ones (i.e. a passphrase) and/or use various kind of characters (uppercase, lowercase, digits and special characters).",
|
"good_practices_about_user_password": "Pick a user password of at least 8 characters - though it is good practice to use longer ones (i.e. a passphrase) and/or use various kind of characters (uppercase, lowercase, digits and special characters).",
|
||||||
|
"language": "Language",
|
||||||
"logged_out": "Logged out",
|
"logged_out": "Logged out",
|
||||||
"login": "Log in",
|
"login": "Log in",
|
||||||
"logout": "Log out",
|
"logout": "Log out",
|
||||||
|
@ -37,6 +40,7 @@
|
||||||
"remove": "Remove",
|
"remove": "Remove",
|
||||||
"save": "Save",
|
"save": "Save",
|
||||||
"skip_to_main_content": "Skip to main content",
|
"skip_to_main_content": "Skip to main content",
|
||||||
|
"theme": "Theme",
|
||||||
"username": "Username",
|
"username": "Username",
|
||||||
"v": {
|
"v": {
|
||||||
"email": "Invalid email: must be alphanumeric and '_.' characters only (e.g. someone{'@'}example.com, s0me-1{'@'}example.com)",
|
"email": "Invalid email: must be alphanumeric and '_.' characters only (e.g. someone{'@'}example.com, s0me-1{'@'}example.com)",
|
||||||
|
|
|
@ -39,7 +39,6 @@ export default defineNuxtConfig({
|
||||||
strategy: 'no_prefix',
|
strategy: 'no_prefix',
|
||||||
lazy: true,
|
lazy: true,
|
||||||
langDir: 'locales',
|
langDir: 'locales',
|
||||||
defaultLocale: 'en',
|
|
||||||
locales: locales as LocaleObject[],
|
locales: locales as LocaleObject[],
|
||||||
},
|
},
|
||||||
colorMode: {
|
colorMode: {
|
||||||
|
|
107
pages/edit.vue
107
pages/edit.vue
|
@ -5,7 +5,7 @@ import * as yup from 'yup'
|
||||||
import { pick, exclude } from '@/utils/common'
|
import { pick, exclude } from '@/utils/common'
|
||||||
import type { User } from '@/composables/states'
|
import type { User } from '@/composables/states'
|
||||||
|
|
||||||
const { t } = useI18n()
|
const { t, locale, locales } = useI18n()
|
||||||
|
|
||||||
useHead({
|
useHead({
|
||||||
title: t('footerlink_edit'),
|
title: t('footerlink_edit'),
|
||||||
|
@ -13,6 +13,54 @@ useHead({
|
||||||
|
|
||||||
const user = await useUser()
|
const user = await useUser()
|
||||||
|
|
||||||
|
// Browser
|
||||||
|
const localesAsOptions = computed(() => {
|
||||||
|
return locales.value.map((locale) => ({
|
||||||
|
text: locale.name,
|
||||||
|
value: locale.code,
|
||||||
|
}))
|
||||||
|
})
|
||||||
|
|
||||||
|
const colorMode = useColorMode()
|
||||||
|
const themesAsOptions = [
|
||||||
|
'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.charAt(0).toUpperCase() + theme.slice(1),
|
||||||
|
value: theme,
|
||||||
|
}))
|
||||||
|
// Server
|
||||||
const loading: Ref<boolean | null> = ref(false)
|
const loading: Ref<boolean | null> = ref(false)
|
||||||
const feedback: Ref<{
|
const feedback: Ref<{
|
||||||
variant: 'success' | 'warning' | 'error'
|
variant: 'success' | 'warning' | 'error'
|
||||||
|
@ -121,6 +169,49 @@ const onSubmit = handleSubmit(async (form) => {
|
||||||
<div>
|
<div>
|
||||||
<PageTitle :text="$t('footerlink_edit')" />
|
<PageTitle :text="$t('footerlink_edit')" />
|
||||||
|
|
||||||
|
<section class="mt-5">
|
||||||
|
<h2 class="text-3xl">{{ t('edit_browser_settings') }}</h2>
|
||||||
|
|
||||||
|
<form novalidate class="my-10" @submit.prevent>
|
||||||
|
<div role="group" class="flex 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="locale" 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 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="colorMode.preference"
|
||||||
|
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>
|
||||||
|
</form>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2 class="text-3xl">{{ t('edit_personal_settings') }}</h2>
|
||||||
|
|
||||||
<form novalidate class="my-10" @submit="onSubmit">
|
<form novalidate class="my-10" @submit="onSubmit">
|
||||||
<div class="lg:flex lg:justify-between">
|
<div class="lg:flex lg:justify-between">
|
||||||
<div class="lg:w-1/2 lg:me-20">
|
<div class="lg:w-1/2 lg:me-20">
|
||||||
|
@ -194,8 +285,15 @@ const onSubmit = handleSubmit(async (form) => {
|
||||||
/>
|
/>
|
||||||
</FormField>
|
</FormField>
|
||||||
|
|
||||||
<FormField name="confirmpassword" :label="$t('confirm_new_password')">
|
<FormField
|
||||||
<TextInput name="confirmpassword" type="password" class="w-full" />
|
name="confirmpassword"
|
||||||
|
:label="$t('confirm_new_password')"
|
||||||
|
>
|
||||||
|
<TextInput
|
||||||
|
name="confirmpassword"
|
||||||
|
type="password"
|
||||||
|
class="w-full"
|
||||||
|
/>
|
||||||
</FormField>
|
</FormField>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
</div>
|
</div>
|
||||||
|
@ -211,11 +309,12 @@ const onSubmit = handleSubmit(async (form) => {
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<div class="flex mt-10">
|
<div class="flex mt-10">
|
||||||
<NuxtLink to="/" class="btn ml-auto me-2">
|
<NuxtLink to="/" class="btn ms-auto me-2">
|
||||||
{{ $t('cancel') }}
|
{{ $t('cancel') }}
|
||||||
</NuxtLink>
|
</NuxtLink>
|
||||||
<SubmitButton :loading="loading" variant="success" />
|
<SubmitButton :loading="loading" variant="success" />
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
</section>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
Loading…
Add table
Reference in a new issue