mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-06-07 18:44:08 +00:00
rdv: add fr locale to fullcalendar + colorise users calendars
This commit is contained in:
parent
ca9738b55a
commit
a54434a677
@ -17,10 +17,12 @@
|
|||||||
import ConcernedGroups from 'ChillActivityAssets/vuejs/Activity/components/ConcernedGroups.vue';
|
import ConcernedGroups from 'ChillActivityAssets/vuejs/Activity/components/ConcernedGroups.vue';
|
||||||
import CalendarUserSelector from '../_components/CalendarUserSelector/CalendarUserSelector.vue';
|
import CalendarUserSelector from '../_components/CalendarUserSelector/CalendarUserSelector.vue';
|
||||||
import '@fullcalendar/core/vdom' // solves problem with Vite
|
import '@fullcalendar/core/vdom' // solves problem with Vite
|
||||||
|
import frLocale from '@fullcalendar/core/locales/fr';
|
||||||
import FullCalendar from '@fullcalendar/vue3'
|
import FullCalendar from '@fullcalendar/vue3'
|
||||||
import dayGridPlugin from '@fullcalendar/daygrid'
|
import dayGridPlugin from '@fullcalendar/daygrid'
|
||||||
import interactionPlugin from '@fullcalendar/interaction'
|
import interactionPlugin from '@fullcalendar/interaction'
|
||||||
import timeGridPlugin from '@fullcalendar/timegrid'
|
import timeGridPlugin from '@fullcalendar/timegrid'
|
||||||
|
import listPlugin from '@fullcalendar/list';
|
||||||
|
|
||||||
const currentEvent = {
|
const currentEvent = {
|
||||||
events: [{
|
events: [{
|
||||||
@ -52,7 +54,8 @@ export default {
|
|||||||
current: currentEvent
|
current: currentEvent
|
||||||
},
|
},
|
||||||
calendarOptions: {
|
calendarOptions: {
|
||||||
plugins: [ dayGridPlugin, interactionPlugin, timeGridPlugin ],
|
locale: frLocale,
|
||||||
|
plugins: [ dayGridPlugin, interactionPlugin, timeGridPlugin, listPlugin ],
|
||||||
initialView: 'timeGridWeek',
|
initialView: 'timeGridWeek',
|
||||||
initialDate: window.startDate !== undefined ? window.startDate : new Date(),
|
initialDate: window.startDate !== undefined ? window.startDate : new Date(),
|
||||||
eventSources: window.startDate !== undefined ? [currentEvent] : [],
|
eventSources: window.startDate !== undefined ? [currentEvent] : [],
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
import { personMessages } from 'ChillPersonAssets/vuejs/_js/i18n'
|
import { personMessages } from 'ChillPersonAssets/vuejs/_js/i18n'
|
||||||
import { calendarEventMessages } from '../_components/CalendarEvent/js/i18n'
|
|
||||||
import { calendarUserSelectorMessages } from '../_components/CalendarUserSelector/js/i18n';
|
import { calendarUserSelectorMessages } from '../_components/CalendarUserSelector/js/i18n';
|
||||||
|
|
||||||
const appMessages = {
|
const appMessages = {
|
||||||
fr: {
|
fr: {
|
||||||
|
choose_your_date: "Sélectionnez votre plage",
|
||||||
activity: {
|
activity: {
|
||||||
add_persons: "Ajouter des personnes concernées",
|
add_persons: "Ajouter des personnes concernées",
|
||||||
bloc_persons: "Usagers",
|
bloc_persons: "Usagers",
|
||||||
@ -16,7 +16,6 @@ const appMessages = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Object.assign(appMessages.fr, personMessages.fr);
|
Object.assign(appMessages.fr, personMessages.fr);
|
||||||
Object.assign(appMessages.fr, calendarEventMessages.fr);
|
|
||||||
Object.assign(appMessages.fr, calendarUserSelectorMessages.fr);
|
Object.assign(appMessages.fr, calendarUserSelectorMessages.fr);
|
||||||
|
|
||||||
export {
|
export {
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
:model-value="value"
|
:model-value="value"
|
||||||
@select="selectUsers"
|
@select="selectUsers"
|
||||||
@remove="unSelectUsers"
|
@remove="unSelectUsers"
|
||||||
|
@close="coloriseSelectedValues"
|
||||||
:options="options">
|
:options="options">
|
||||||
</VueMultiselect>
|
</VueMultiselect>
|
||||||
</div>
|
</div>
|
||||||
@ -25,7 +26,20 @@ import { fetchCalendarRanges } from './js/api'
|
|||||||
import VueMultiselect from 'vue-multiselect';
|
import VueMultiselect from 'vue-multiselect';
|
||||||
import { whoami } from 'ChillPersonAssets/vuejs/AccompanyingCourse/api';
|
import { whoami } from 'ChillPersonAssets/vuejs/AccompanyingCourse/api';
|
||||||
|
|
||||||
const COLORS = ['red', 'green', 'yellow', 'blue', 'orange', 'white', 'grey'];
|
const COLORS = [ /* from https://colorbrewer2.org/#type=qualitative&scheme=Set3&n=12 */
|
||||||
|
'#8dd3c7',
|
||||||
|
'#ffffb3',
|
||||||
|
'#bebada',
|
||||||
|
'#fb8072',
|
||||||
|
'#80b1d3',
|
||||||
|
'#fdb462',
|
||||||
|
'#b3de69',
|
||||||
|
'#fccde5',
|
||||||
|
'#d9d9d9',
|
||||||
|
'#bc80bd',
|
||||||
|
'#ccebc5',
|
||||||
|
'#ffed6f'
|
||||||
|
];
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'CalendarUserSelector',
|
name: 'CalendarUserSelector',
|
||||||
@ -50,10 +64,12 @@ export default {
|
|||||||
|
|
||||||
results.forEach(i => {
|
results.forEach(i => {
|
||||||
if (!(users.some(j => i.user.id === j.id))){
|
if (!(users.some(j => i.user.id === j.id))){
|
||||||
|
let ratio = Math.floor(users.length / COLORS.length);
|
||||||
|
let colorIndex = users.length - ratio * COLORS.length;
|
||||||
users.push({
|
users.push({
|
||||||
id: i.user.id,
|
id: i.user.id,
|
||||||
username: i.user.username,
|
username: i.user.username,
|
||||||
color: COLORS[users.length] //TODO manage case where indice is larger than COLORS; Do something recursive with a max. value
|
color: COLORS[colorIndex]
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -73,20 +89,18 @@ export default {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
console.log(users)
|
|
||||||
this.users.loaded = users;
|
this.users.loaded = users;
|
||||||
this.options = users;
|
this.options = users;
|
||||||
|
|
||||||
console.log(calendarEvents)
|
|
||||||
this.calendarEvents.loaded = calendarEvents;
|
this.calendarEvents.loaded = calendarEvents;
|
||||||
whoami().then(me => new Promise((resolve, reject) => {
|
whoami().then(me => new Promise((resolve, reject) => {
|
||||||
let currentUser = users.find(u => u.id === me.id);
|
let currentUser = users.find(u => u.id === me.id);
|
||||||
this.value = currentUser;
|
this.value = currentUser;
|
||||||
this.selectUsers(currentUser);
|
this.selectUsers(currentUser);
|
||||||
|
|
||||||
resolve();
|
resolve();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|
||||||
resolve()
|
resolve()
|
||||||
}))
|
}))
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
@ -96,12 +110,30 @@ export default {
|
|||||||
transName(value) {
|
transName(value) {
|
||||||
return `${value.username}`;
|
return `${value.username}`;
|
||||||
},
|
},
|
||||||
|
coloriseSelectedValues() { //TODO cette function doit être exécutée au bon moment, après sélection (normalement avec @input)
|
||||||
|
let tags = document.querySelectorAll('div.multiselect__tags-wrap')[0];
|
||||||
|
|
||||||
|
if (tags.hasChildNodes()) {
|
||||||
|
let children = tags.childNodes;
|
||||||
|
for (let i = 0; i < children.length; i++) {
|
||||||
|
let child = children[i];
|
||||||
|
if (child.nodeType === Node.ELEMENT_NODE) {
|
||||||
|
this.users.selected.forEach(u => {
|
||||||
|
if (child.firstChild.innerText == u.username) {
|
||||||
|
child.style.background = u.color;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
selectEvents() {
|
selectEvents() {
|
||||||
let selectedUsersId = this.users.selected.map(a => a.id);
|
let selectedUsersId = this.users.selected.map(a => a.id);
|
||||||
this.calendarEvents.selected = this.calendarEvents.loaded.filter(a => selectedUsersId.includes(a.id));
|
this.calendarEvents.selected = this.calendarEvents.loaded.filter(a => selectedUsersId.includes(a.id));
|
||||||
},
|
},
|
||||||
selectUsers(value) {
|
selectUsers(value) {
|
||||||
this.users.selected.push(value);
|
this.users.selected.push(value);
|
||||||
|
this.coloriseSelectedValues();
|
||||||
this.selectEvents();
|
this.selectEvents();
|
||||||
this.updateEventsSource();
|
this.updateEventsSource();
|
||||||
},
|
},
|
||||||
|
Loading…
x
Reference in New Issue
Block a user