Skip to content

Commit

Permalink
Add layout with menu, tests setup and update form
Browse files Browse the repository at this point in the history
  • Loading branch information
arnaud-morvan committed Jan 28, 2025
1 parent cbe0480 commit a4f90db
Show file tree
Hide file tree
Showing 12 changed files with 147 additions and 39 deletions.
8 changes: 4 additions & 4 deletions frontend/index.html
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
<!DOCTYPE html>
<!doctype html>
<html lang="">
<head>
<meta charset="UTF-8">
<link rel="icon" href="/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite App</title>
</head>
<body>
Expand Down
18 changes: 18 additions & 0 deletions frontend/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
"@primevue/forms": "^4.2.5",
"@primevue/themes": "^4.2.5",
"pinia": "^2.3.0",
"primeicons": "^7.0.0",
"primelocale": "^1.5.0",
"primevue": "^4.2.5",
"vue": "^3.5.13",
"vue-i18n": "^10.0.5",
Expand Down
16 changes: 2 additions & 14 deletions frontend/src/App.vue
Original file line number Diff line number Diff line change
@@ -1,17 +1,5 @@
<script setup lang="ts">
import { RouterView } from 'vue-router'
</script>
<script setup lang="ts"></script>

<template>
<header></header>
<div class="locale-changer">
<select v-model="$i18n.locale">
<option v-for="locale in $i18n.availableLocales" :key="`locale-${locale}`" :value="locale">
{{ locale }}
</option>
</select>
</div>
<main>
<RouterView />
</main>
<RouterView />
</template>
25 changes: 25 additions & 0 deletions frontend/src/layouts/BaseLayout.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<script setup lang="ts">
import { useI18n } from 'vue-i18n'
import { RouterView } from 'vue-router'
import Menubar from 'primevue/menubar'
import { Select } from 'primevue'
const { t } = useI18n()
const menuItems = [
{ label: t('Synchronize'), icon: 'pi pi-sync', command: () => {} },
{ label: t('Operations log'), icon: 'pi pi-list', command: () => {} },
{ label: t('User guide'), icon: 'pi pi-book', command: () => {} },
]
</script>

<template>
<Menubar :model="menuItems">
<template #end>
<Select :options="$i18n.availableLocales" v-model="$i18n.locale"></Select>
</template>
</Menubar>
<main>
<RouterView />
</main>
</template>
9 changes: 7 additions & 2 deletions frontend/src/locales/fr.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
{
"Source dataset": "Jeux de données source",
"Source dataset": "Jeu de données source",
"Source layer": "Couche source",
"Target platform": "Plateforme destination",
"Synchronize": "Synchroniser",
"Synchronization of datasets between platforms": "Synchronisation de jeux de données entre plateformes"
"Synchronization of datasets between platforms": "Synchronisation de jeux de données entre plateformes",
"Operations log": "Journal des opérations",
"User guide": "Guide d'utilisation",
"Metadata": "Métadonnées",
"Layers": "Couches",
"Styles": "Styles"
}
22 changes: 20 additions & 2 deletions frontend/src/main.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
import Aura from '@primevue/themes/aura'
import { createPinia } from 'pinia'
import PrimeVue from 'primevue/config'
import { createApp } from 'vue'
import PrimeVue, { usePrimeVue, type PrimeVueLocaleOptions } from 'primevue/config'
import { createApp, watch } from 'vue'
import App from './App.vue'
import './assets/main.css'
import router from './router'
import { createI18n } from 'vue-i18n'
import frMessages from './locales/fr.json'
import primeEnMessages from 'primelocale/en.json'
import primeFrMessages from 'primelocale/fr.json'
import 'primeicons/primeicons.css'

function detectBrowserLanguage() {
const availableLocales = ['en', 'fr']
Expand All @@ -29,6 +32,12 @@ const app = createApp(App)
app.use(createPinia())
app.use(router)
app.use(i18n)

const primeLocales = {
en: primeEnMessages.en as unknown as PrimeVueLocaleOptions,
fr: primeFrMessages.fr as unknown as PrimeVueLocaleOptions,
}

app.use(PrimeVue, {
theme: {
preset: Aura,
Expand All @@ -39,6 +48,15 @@ app.use(PrimeVue, {
},
},
},
locale: primeLocales[i18n.global.locale],
})

watch(
() => i18n.global.locale, // Observe la langue actuelle de Vue I18n
(newLocale) => {
const primevue = usePrimeVue()
primevue.config.locale = primeLocales[newLocale] || primeLocales.en
},
)

app.mount('#app')
35 changes: 25 additions & 10 deletions frontend/src/router/index.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,36 @@
import { createRouter, createWebHistory } from 'vue-router'
import FormView from '../views/FormView.vue'
import BaseLayout from '@/layouts/BaseLayout.vue'

const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
routes: [
{
path: '/',
name: 'home',
component: FormView,
},
{
path: '/about',
name: 'about',
// route level code-splitting
// this generates a separate chunk (About.[hash].js) for this route
// which is lazy-loaded when the route is visited.
component: () => import('../views/AboutView.vue'),
component: BaseLayout,
children: [
{
path: '',
redirect() {
return {
name: 'synchronize',
}
},
},
{
path: 'synchronize',
name: 'synchronize',
component: FormView,
},
{
path: 'about',
name: 'about',
// route level code-splitting
// this generates a separate chunk (About.[hash].js) for this route
// which is lazy-loaded when the route is visited.
component: () => import('../views/AboutView.vue'),
},
],
},
],
})
Expand Down
8 changes: 8 additions & 0 deletions frontend/src/tests/setup.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { config } from '@vue/test-utils'
import PrimeVue from 'primevue/config'

config.global.mocks = {
$t: (key: string) => key,
}

config.global.plugins = [PrimeVue]
31 changes: 24 additions & 7 deletions frontend/src/views/FormView.vue
Original file line number Diff line number Diff line change
@@ -1,7 +1,16 @@
<script setup lang="ts">
import { Form, FormField } from '@primevue/forms'
import { Button } from 'primevue'
import { Button, ToggleSwitch } from 'primevue'
import InputText from 'primevue/inputtext'
import { ref } from 'vue'
const parameters = ref({
sourceDataset: null,
targetPlatform: null,
contentMetadata: true,
contentLayers: true,
contentStyles: true,
})
</script>

<template>
Expand All @@ -12,15 +21,23 @@ import InputText from 'primevue/inputtext'
<Form class="flex flex-col gap-5">
<FormField name="sourceDataset" class="flex gap-5 items-center">
<label for="sourceDataset" class="w-36">{{ $t('Source dataset') }}</label>
<InputText id="sourceDataset" placeholder="" />
</FormField>
<FormField name="sourceLayer" class="flex gap-5 items-center">
<label for="sourceLayer" class="w-36">{{ $t('Source layer') }}</label>
<InputText id="sourceLayer" placeholder="" />
<InputText id="sourceDataset" placeholder="" v-model="parameters.sourceDataset" />
</FormField>
<FormField name="targetPlatform" class="flex gap-5 items-center">
<label for="targetPlatform" class="w-36">{{ $t('Target platform') }}</label>
<InputText id="targetPlatform" placeholder="" />
<InputText id="targetPlatform" placeholder="" v-model="parameters.targetPlatform" />
</FormField>
<FormField name="contentMetadata" class="flex gap-5 items-center">
<label for="contentMetadata" class="w-36">{{ $t('Metadata') }}</label>
<ToggleSwitch id="contentMetadata" placeholder="" v-model="parameters.contentMetadata" />
</FormField>
<FormField name="contentLayers" class="flex gap-5 items-center">
<label for="contentLayers" class="w-36">{{ $t('Layers') }}</label>
<ToggleSwitch id="contentLayers" placeholder="" v-model="parameters.contentLayers" />
</FormField>
<FormField name="contentStyles" class="flex gap-5 items-center">
<label for="contentStyles" class="w-36">{{ $t('Styles') }}</label>
<ToggleSwitch id="contentStyles" placeholder="" v-model="parameters.contentStyles" />
</FormField>
<Button :label="$t('Synchronize')" class="mt-5" />
</Form>
Expand Down
11 changes: 11 additions & 0 deletions frontend/src/views/__test__/FormView.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { describe, it, expect } from 'vitest'

import { mount } from '@vue/test-utils'
import FormView from '../FormView.vue'

describe('FormView', () => {
it('renders properly', () => {
const wrapper = mount(FormView)
expect(wrapper.text()).toContain('Synchronization of datasets between platforms')
})
})
1 change: 1 addition & 0 deletions frontend/vitest.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ export default mergeConfig(
environment: 'jsdom',
exclude: [...configDefaults.exclude, 'e2e/**'],
root: fileURLToPath(new URL('./', import.meta.url)),
setupFiles: './src/tests/setup.ts',
},
}),
)

0 comments on commit a4f90db

Please sign in to comment.