Make first day of the week customizable

New settings section 'Locale settings'
New setting 'First day of week'
New date picker reusable UI that uses the new setting
Meal planner now uses this new date picker
This commit is contained in:
Florian Dupret 2021-04-05 10:37:12 +02:00
commit 929b8eb774
8 changed files with 115 additions and 9 deletions

View file

@ -3,9 +3,6 @@
<v-card-text> <v-card-text>
<h2 class="mt-1 mb-1">{{ $t("settings.homepage.home-page") }}</h2> <h2 class="mt-1 mb-1">{{ $t("settings.homepage.home-page") }}</h2>
<v-row align="center" justify="center" dense class="mb-n7 pb-n5"> <v-row align="center" justify="center" dense class="mb-n7 pb-n5">
<v-col cols="1">
<LanguageMenu @select-lang="writeLang" :site-settings="true" />
</v-col>
<v-col cols="12" sm="3" md="2"> <v-col cols="12" sm="3" md="2">
<v-switch <v-switch
v-model="settings.showRecent" v-model="settings.showRecent"
@ -119,6 +116,25 @@
</v-col> </v-col>
</v-row> </v-row>
</v-card-text> </v-card-text>
<v-card-text>
<h2 class="mt-1 mb-4">{{$t('settings.locale-settings')}}</h2>
<v-row>
<v-col cols="1">
<LanguageMenu @select-lang="writeLang" :site-settings="true" />
</v-col>
<v-col sm="3">
<v-select
dense
prepend-icon="mdi-calendar-week-begin"
v-model="settings.firstDayOfWeek"
:items="allDays"
item-text="name"
item-value="value"
:label="$t('settings.first-day-of-week')"
/>
</v-col>
</v-row>
</v-card-text>
<v-card-actions> <v-card-actions>
<v-spacer></v-spacer> <v-spacer></v-spacer>
<v-btn color="success" @click="saveSettings" class="mr-2"> <v-btn color="success" @click="saveSettings" class="mr-2">
@ -145,6 +161,7 @@ export default {
return { return {
settings: { settings: {
language: "en", language: "en",
firstDayOfWeek: 0,
showRecent: null, showRecent: null,
cardsPerSection: null, cardsPerSection: null,
categories: [], categories: [],
@ -158,6 +175,38 @@ export default {
allCategories() { allCategories() {
return this.$store.getters.getAllCategories; return this.$store.getters.getAllCategories;
}, },
allDays() {
return [
{
name: this.$t('general.sunday'),
value: 0,
},
{
name: this.$t('general.monday'),
value: 1,
},
{
name: this.$t('general.tuesday'),
value: 2,
},
{
name: this.$t('general.wednesday'),
value: 3,
},
{
name: this.$t('general.thursday'),
value: 4,
},
{
name: this.$t('general.friday'),
value: 5,
},
{
name: this.$t('general.saturday'),
value: 6,
}
];
},
}, },
methods: { methods: {
@ -175,6 +224,7 @@ export default {
}, },
async saveSettings() { async saveSettings() {
await api.siteSettings.update(this.settings); await api.siteSettings.update(this.settings);
this.$store.commit("setLang", this.settings.language);
this.getOptions(); this.getOptions();
}, },
}, },

View file

@ -31,11 +31,11 @@
v-on="on" v-on="on"
></v-text-field> ></v-text-field>
</template> </template>
<v-date-picker <DatePicker
v-model="startDate" v-model="startDate"
no-title no-title
@input="menu2 = false" @input="menu2 = false"
></v-date-picker> />
</v-menu> </v-menu>
</v-col> </v-col>
<v-col cols="12" lg="6" md="6" sm="12"> <v-col cols="12" lg="6" md="6" sm="12">
@ -87,12 +87,14 @@
<script> <script>
const CREATE_EVENT = "created"; const CREATE_EVENT = "created";
import DatePicker from "../UI/DatePicker";
import { api } from "@/api"; import { api } from "@/api";
import utils from "@/utils"; import utils from "@/utils";
import MealPlanCard from "./MealPlanCard"; import MealPlanCard from "./MealPlanCard";
export default { export default {
components: { components: {
MealPlanCard, MealPlanCard,
DatePicker,
}, },
data() { data() {
return { return {

View file

@ -0,0 +1,30 @@
<template>
<v-date-picker
:first-day-of-week="firstDayOfWeek"
v-on="$listeners"
></v-date-picker>
</template>
<script>
import { api } from "@/api";
export default {
data() {
return {
firstDayOfWeek: 0,
};
},
mounted() {
this.getOptions();
},
methods: {
async getOptions() {
this.firstDayOfWeek = await api.siteSettings.get().firstDayOfWeek;
},
},
}
</script>
<style>
</style>

View file

@ -48,7 +48,14 @@
"apply": "Apply", "apply": "Apply",
"current-parenthesis": "(Current)", "current-parenthesis": "(Current)",
"users": "Users", "users": "Users",
"groups": "Groups" "groups": "Groups",
"sunday": "Sunday",
"monday": "Monday",
"tuesday": "Tuesday",
"wednesday": "Wednesday",
"thursday": "Thursday",
"friday": "Friday",
"saturday": "Saturday"
}, },
"page": { "page": {
"home-page": "Home Page", "home-page": "Home Page",
@ -215,7 +222,9 @@
"site-settings": "Site Settings", "site-settings": "Site Settings",
"manage-users": "Manage Users", "manage-users": "Manage Users",
"migrations": "Migrations", "migrations": "Migrations",
"profile": "Profile" "profile": "Profile",
"locale-settings": "Locale settings",
"first-day-of-week": "First day of the week"
}, },
"migration": { "migration": {
"recipe-migration": "Recipe Migration", "recipe-migration": "Recipe Migration",

View file

@ -46,7 +46,14 @@
"token": "Jeton", "token": "Jeton",
"field-required": "Champ obligatoire", "field-required": "Champ obligatoire",
"apply": "Appliquer", "apply": "Appliquer",
"current-parenthesis": "(Actuel)" "current-parenthesis": "(Actuel)",
"friday": "Vendredi",
"monday": "Lundi",
"saturday": "Samedi",
"sunday": "Dimanche",
"thursday": "Jeudi",
"tuesday": "Mardi",
"wednesday": "Mercredi"
}, },
"page": { "page": {
"home-page": "Accueil", "home-page": "Accueil",
@ -213,7 +220,9 @@
"manage-users": "Utilisateurs", "manage-users": "Utilisateurs",
"migrations": "Migrations", "migrations": "Migrations",
"profile": "Profil", "profile": "Profil",
"site-settings": "Paramètres site" "site-settings": "Paramètres site",
"locale-settings": "Paramètres de langue",
"first-day-of-week": "Premier jour de la semaine"
}, },
"migration": { "migration": {
"recipe-migration": "Migrer les recettes", "recipe-migration": "Migrer les recettes",

View file

@ -3,6 +3,7 @@ import { api } from "@/api";
const state = { const state = {
siteSettings: { siteSettings: {
language: "en", language: "en",
firstDayOfWeek: 0,
showRecent: true, showRecent: true,
cardsPerSection: 9, cardsPerSection: 9,
categories: [], categories: [],

View file

@ -9,6 +9,7 @@ class SiteSettings(SqlAlchemyBase, BaseMixins):
__tablename__ = "site_settings" __tablename__ = "site_settings"
id = sa.Column(sa.Integer, primary_key=True) id = sa.Column(sa.Integer, primary_key=True)
language = sa.Column(sa.String) language = sa.Column(sa.String)
first_day_of_week = sa.Column(sa.Integer)
categories = orm.relationship( categories = orm.relationship(
"Category", "Category",
secondary=site_settings2categories, secondary=site_settings2categories,
@ -21,12 +22,14 @@ class SiteSettings(SqlAlchemyBase, BaseMixins):
self, self,
session: Session = None, session: Session = None,
language="en", language="en",
first_day_of_week: int = 0,
categories: list = [], categories: list = [],
show_recent=True, show_recent=True,
cards_per_section: int = 9, cards_per_section: int = 9,
) -> None: ) -> None:
session.commit() session.commit()
self.language = language self.language = language
self.first_day_of_week = first_day_of_week
self.cards_per_section = cards_per_section self.cards_per_section = cards_per_section
self.show_recent = show_recent self.show_recent = show_recent
self.categories = [Category.get_ref(session=session, slug=cat.get("slug")) for cat in categories] self.categories = [Category.get_ref(session=session, slug=cat.get("slug")) for cat in categories]

View file

@ -8,6 +8,7 @@ from slugify import slugify
class SiteSettings(CamelModel): class SiteSettings(CamelModel):
language: str = "en" language: str = "en"
first_day_of_week: int = 0
show_recent: bool = True show_recent: bool = True
cards_per_section: int = 9 cards_per_section: int = 9
categories: Optional[list[CategoryBase]] = [] categories: Optional[list[CategoryBase]] = []
@ -18,6 +19,7 @@ class SiteSettings(CamelModel):
schema_extra = { schema_extra = {
"example": { "example": {
"language": "en", "language": "en",
"firstDayOfWeek": 0,
"showRecent": True, "showRecent": True,
"categories": [ "categories": [
{"id": 1, "name": "thanksgiving", "slug": "thanksgiving"}, {"id": 1, "name": "thanksgiving", "slug": "thanksgiving"},