Merge branch 'dev/nicolas/timesheet-gui-refactor' of git.targo.ca:Targo/targo_frontend into dev/nicolas/timesheet-gui-refactor

This commit is contained in:
Nicolas Drolet 2025-11-07 17:04:23 -05:00
commit 8e24d36b56
7 changed files with 191 additions and 0 deletions

View File

@ -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",
}

View File

@ -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",
}

View File

@ -5,6 +5,7 @@
import MenuPanelPersonal from 'src/modules/profile/components/employee/menu-panel-personal.vue';
import MenuPanelEmployee from 'src/modules/profile/components/employee/menu-panel-employee.vue';
import MenuPanelPreferences from 'src/modules/profile/components/shared/menu-panel-preferences.vue';
import MenuPanelSchedulePresets from 'src/modules/profile/components/shared/menu-panel-schedule-presets.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 { useAuthStore } from 'src/stores/auth-store';
@ -15,6 +16,7 @@
PERSONAL_INFO: 'personal_info',
EMPLOYEE_INFO: 'employee_info',
PREFERENCES: 'references',
SCHEDULE_PRESETS: 'schedule_presets',
};
const employee_profile = defineModel<EmployeeProfile>({ default: default_employee_profile });
@ -47,6 +49,11 @@
icon="display_settings"
:label="$q.screen.lt.md ? '' : $t('profile.preferences.tab_title')"
/>
<q-tab
:name="PanelNames.SCHEDULE_PRESETS"
icon="list_alt"
:label="$q.screen.lt.md ? '' : $t('profile.schedule_presets.tab_title')"
/>
</template>
<template #panels>
@ -70,6 +77,12 @@
>
<MenuPanelPreferences />
</q-tab-panel>
<q-tab-panel
:name="PanelNames.SCHEDULE_PRESETS"
class="q-pa-none"
>
<MenuPanelSchedulePresets />
</q-tab-panel>
</template>
</MenuTemplate>
</q-card>

View File

@ -0,0 +1,45 @@
<script setup lang="ts">
const model = defineModel<string>();
</script>
<template>
<q-form class="q-pa-md column fit">
<div
class="col-auto text-uppercase rounded-5"
style="line-height: 1em;"
>{{ $t('profile.schedule_presets.selected_schedule') }}</div>
<!-- where the selected preset schedule will be displayed-->
<q-card
flat
class="col-auto column justify-center items-center content-center q-mb-lg q-pa-md"
style="border: solid #AAA 1px;"
>
<!-- will display the list of schedules by name -->
<q-select v-model="model" />
<!-- will display a list with details about the selected schedule -->
<q-card-section>
<q-list>
</q-list>
</q-card-section>
</q-card>
<div
class="col-auto text-uppercase rounded-5"
style="line-height: 1em;"
>{{ $t('profile.schedule_presets.new_preset') }}</div>
<!-- where the user will be able to create a new preset schedule -->
<q-card
flat
class="col-auto column justify-center items-center content-center q-mb-lg q-pa-md"
style="border: solid #AAA 1px;"
>
<q-form>
</q-form>
</q-card>
</q-form>
</template>

View File

@ -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' | '';

View File

@ -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<SchedulePreset>) => {
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;
},
};

View File

@ -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<SchedulePreset>();
const createSchedulePreset = async (): Promise<boolean> => {
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<boolean> => {
try {
return true;
} catch (error) {
console.error('DEV ERROR || error while updating schedule preset: ', error);
return false;
}
}
const deleteSchedulePreset = async (preset_id: number): Promise<boolean> => {
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<boolean> => {
try {
return true;
} catch (error) {
console.error('DEV ERROR || error while searching for schedule presets: ', error);
return false
}
}
const applySchedulePreset = async (): Promise<boolean> => {
try {
return true;
} catch (error) {
console.error('DEV ERROR || error while building schedule: ', error);
return false
}
}
return {
createSchedulePreset,
updateSchedulePreset,
deleteSchedulePreset,
findSchedulePresetList,
applySchedulePreset,
}
})