From 13b3cf9399a2867ed60225f469bc1b3720e2e579 Mon Sep 17 00:00:00 2001 From: Matthieu Haineault Date: Fri, 7 Nov 2025 16:50:37 -0500 Subject: [PATCH] feat(schedule-presets): implement store and service for schedule-presets. added schedule panel to profile menu --- src/i18n/en-ca/index.ts | 5 ++ src/i18n/fr-ca/index.ts | 6 ++ .../components/employee/menu-employee.vue | 13 ++++ .../shared/menu-panel-schedule-presets.vue | 45 +++++++++++++ .../profile/models/schedule-presets.models.ts | 27 ++++++++ .../services/schedule-presets-service.ts | 29 ++++++++ src/stores/schedule-presets.store.ts | 66 +++++++++++++++++++ 7 files changed, 191 insertions(+) create mode 100644 src/modules/profile/components/shared/menu-panel-schedule-presets.vue create mode 100644 src/modules/profile/models/schedule-presets.models.ts create mode 100644 src/modules/profile/services/schedule-presets-service.ts create mode 100644 src/stores/schedule-presets.store.ts diff --git a/src/i18n/en-ca/index.ts b/src/i18n/en-ca/index.ts index ae81e67..72b7612 100644 --- a/src/i18n/en-ca/index.ts +++ b/src/i18n/en-ca/index.ts @@ -66,6 +66,11 @@ export default { dark_mode: "dark", light_mode: "light", }, + schedule_presets: { + tab_title: "Schedule", + selected_schedule: "Selected Schedule Preset", + new_preset: "Build a new preset", + }, errors: { must_enter_birthdate: "You must enter a valid birthdate", } diff --git a/src/i18n/fr-ca/index.ts b/src/i18n/fr-ca/index.ts index c4ba08a..6d2fcc5 100644 --- a/src/i18n/fr-ca/index.ts +++ b/src/i18n/fr-ca/index.ts @@ -66,6 +66,12 @@ export default { dark_mode: "sombre", light_mode: "clair", }, + schedule_presets: { + tab_title: "horaire", + selected_schedule: "Horaire Sélectionné", + new_preset: "Construire un nouvel horaire", + + }, errors: { must_enter_birthdate: "Vous devez entrer une date de naissance valide", } diff --git a/src/modules/profile/components/employee/menu-employee.vue b/src/modules/profile/components/employee/menu-employee.vue index 698cff0..908eebc 100644 --- a/src/modules/profile/components/employee/menu-employee.vue +++ b/src/modules/profile/components/employee/menu-employee.vue @@ -7,11 +7,13 @@ import MenuPanelPreferences from 'src/modules/profile/components/shared/menu-panel-preferences.vue'; import MenuTemplate from 'src/modules/profile/components/shared/menu-template.vue'; import { default_employee_profile, type EmployeeProfile } from 'src/modules/employee-list/models/employee-profile.models'; +import MenuPanelSchedulePresets from 'src/modules/profile/components/shared/menu-panel-schedule-presets.vue'; const PanelNames = { PERSONAL_INFO: 'personal_info', EMPLOYEE_INFO: 'employee_info', PREFERENCES: 'references', + SCHEDULE_PRESETS: 'schedule_presets', }; const employee_profile = defineModel({ default: default_employee_profile }); @@ -44,6 +46,11 @@ icon="display_settings" :label="$q.screen.lt.md ? '' : $t('profile.preferences.tab_title')" /> + diff --git a/src/modules/profile/components/shared/menu-panel-schedule-presets.vue b/src/modules/profile/components/shared/menu-panel-schedule-presets.vue new file mode 100644 index 0000000..3f2d9cd --- /dev/null +++ b/src/modules/profile/components/shared/menu-panel-schedule-presets.vue @@ -0,0 +1,45 @@ + + + \ No newline at end of file diff --git a/src/modules/profile/models/schedule-presets.models.ts b/src/modules/profile/models/schedule-presets.models.ts new file mode 100644 index 0000000..03ed36d --- /dev/null +++ b/src/modules/profile/models/schedule-presets.models.ts @@ -0,0 +1,27 @@ +export interface SchedulePreset { + name: string; + is_default: boolean; + presets_shifts: ShiftPreset[]; +} + +class ShiftPreset { + week_day: Weekday; + preset_id: number; + sort_order: number; + type: string; + start_time: string; + end_time: string; + is_remote: boolean; + + constructor() { + this.week_day = ''; + this.preset_id = -1; + this.sort_order = -1; + this.type = ''; + this.start_time = ''; + this.end_time = ''; + this.is_remote = false; + } +} + +export type Weekday = 'SUN' | 'MON' | 'TUE' | 'WED' | 'THU' | 'FRI' | 'SAT' | ''; \ No newline at end of file diff --git a/src/modules/profile/services/schedule-presets-service.ts b/src/modules/profile/services/schedule-presets-service.ts new file mode 100644 index 0000000..aea7b2b --- /dev/null +++ b/src/modules/profile/services/schedule-presets-service.ts @@ -0,0 +1,29 @@ +import { api } from "src/boot/axios"; +import { SchedulePreset } from "src/modules/profile/models/schedule-presets.models"; + +export const SchedulePresetsService = { + createSchedulePresets: async (new_schedule: SchedulePreset) => { + const response = await api.post(`/schedule-presets/create/`, new_schedule); + return response.data; + }, + + updateSchedulePresets: async (preset_id: number, dto: Partial) => { + const response = await api.patch(`/schedule-presets/update/${preset_id}`, dto); + return response.data; + }, + + deleteSchedulePresets: async (preset_id: number) => { + const response = await api.delete(`/schedule-presets/delete/${preset_id}`); + return response.data; + }, + + findListOfSchedulePresets: async () => { + const response = await api.get(`/schedule-presets/find-list`); + return response.data; + }, + + applyPresets: async (preset_name: string, start_date: string) => { + const response = await api.post(`/schedule-presets/apply-presets/`, { preset: preset_name, start: start_date }); + return response.data; + }, +}; \ No newline at end of file diff --git a/src/stores/schedule-presets.store.ts b/src/stores/schedule-presets.store.ts new file mode 100644 index 0000000..fbd42c8 --- /dev/null +++ b/src/stores/schedule-presets.store.ts @@ -0,0 +1,66 @@ +import { defineStore } from "pinia"; +import { SchedulePreset } from "src/modules/profile/models/schedule-presets.models"; +import { SchedulePresetsService } from "src/modules/profile/services/schedule-presets-service"; +import { ref } from "vue"; + + +export const useSchedulePresetsStore = defineStore('schedule_presets_store', () => { + const schedule_presets = ref(); + + const createSchedulePreset = async (): Promise => { + try { + // const new_preset: SchedulePreset = ?? + // await SchedulePresetsService.createSchedulePresets(new_preset); + return true; + } catch (error) { + console.error('DEV ERROR || error while creating schedule preset: ', error); + return false; + } + } + + const updateSchedulePreset = async (): Promise => { + try { + return true; + } catch (error) { + console.error('DEV ERROR || error while updating schedule preset: ', error); + return false; + } + + } + + const deleteSchedulePreset = async (preset_id: number): Promise => { + try { + await SchedulePresetsService.deleteSchedulePresets(preset_id); + return true; + } catch (error) { + console.error('DEV ERROR || error while deleting schedule preset: ', error); + return false + } + } + + const findSchedulePresetList = async (): Promise => { + try { + return true; + } catch (error) { + console.error('DEV ERROR || error while searching for schedule presets: ', error); + return false + } + } + + const applySchedulePreset = async (): Promise => { + try { + return true; + } catch (error) { + console.error('DEV ERROR || error while building schedule: ', error); + return false + } + } + + return { + createSchedulePreset, + updateSchedulePreset, + deleteSchedulePreset, + findSchedulePresetList, + applySchedulePreset, + } +}) \ No newline at end of file