diff --git a/src/css/app.scss b/src/css/app.scss index 2e7ae8b..ab0be1e 100644 --- a/src/css/app.scss +++ b/src/css/app.scss @@ -2,7 +2,7 @@ @each $size in (1, 2, 3, 4, 5, 10, 15, 20, 25, 50, 75, 100, 200) { .rounded-#{$size} { border-radius: #{$size}px !important; - } + } } .text-fb-blue { diff --git a/src/i18n/en-ca/index.ts b/src/i18n/en-ca/index.ts index 20c57bd..e15536a 100644 --- a/src/i18n/en-ca/index.ts +++ b/src/i18n/en-ca/index.ts @@ -107,6 +107,12 @@ export default { }, }, + error :{ + not_found_header: "page not found", + not_found_description: "You may have entered the wrong URL, or you may not have access to this page", + go_back: "go back", + }, + login: { page_header: "account login", email: "e-mail", @@ -230,6 +236,10 @@ export default { timesheet: { page_header: "Timesheet", + week: "week", + total_hours: "total hours: ", + current_shifts: "shifts worked", + apply_preset: "auto-fill", apply_preset_day: "Apply schedule to day", apply_preset_week: "Apply schedule to week", nav_button: { @@ -294,7 +304,7 @@ export default { SHIFT_OVERLAP: "An overlaps occured between 2 or more shifts", SHIFT_OVERLAP_SHORT: "Overlap", INVALID_SHIFT: "A shift contains missing or corrupted data", - SHIFT_TIME_REQUIRED: "Time required", + SHIFT_TIME_REQUIRED: "Time missing", SHIFT_TYPE_REQUIRED: "Shift type required", SHIFT_NOT_FOUND: "Shift missing or deleted", PAY_PERIOD_NOT_FOUND: "No pay period matching given dates", @@ -308,15 +318,6 @@ export default { timesheet_approvals: { page_title: "Validation cartes de temps", - table: { - full_name: "full name", - email: "email address", - is_approved: "approval", - expenses: "expenses", - mileage: "mileage", - verified: "approved", - unverified: "pending", - }, chart: { hours_worked_title: "hours worked", expenses_title: "expenses accrued", @@ -329,6 +330,16 @@ export default { expenses: "expenses", options: "options", }, + table: { + full_name: "full name", + email: "email address", + is_approved: "approval", + expenses: "expenses", + mileage: "mileage", + verified: "approved", + unverified: "pending", + inactive: "inactive", + }, tooltip: { button_detailed_view: "detailed view", }, diff --git a/src/i18n/fr-ca/index.ts b/src/i18n/fr-ca/index.ts index d2f9093..61e9e2a 100644 --- a/src/i18n/fr-ca/index.ts +++ b/src/i18n/fr-ca/index.ts @@ -107,6 +107,12 @@ export default { }, }, + error :{ + not_found_header: "page introuvable", + not_found_description: "Vous avez possiblement entré une mauvaise addresse URL, ou vous n'avez pas accès à cette section du site", + go_back: "retour en arrière", + }, + login: { page_header: "connexion au compte", email: "courriel", @@ -231,6 +237,10 @@ export default { timesheet: { page_header: "Carte de temps", + week: "semaine", + total_hours: "heures totales: ", + current_shifts: "quarts entrées", + apply_preset: "auto-remplir", apply_preset_day: "Appliquer horaire pour la journée", apply_preset_week: "Appliquer horaire pour la semaine", nav_button: { @@ -295,7 +305,7 @@ export default { SHIFT_OVERLAP: "Il y a un chevauchement entre deux ou plusieurs quarts", SHIFT_OVERLAP_SHORT: "Chevauchement", INVALID_SHIFT: "Un quart de travail contient des données manquantes ou corrompues", - SHIFT_TIME_REQUIRED: "Heure requise", + SHIFT_TIME_REQUIRED: "Heures manquantes", SHIFT_TYPE_REQUIRED: "Type requis", SHIFT_NOT_FOUND: "Quart de travail manquant ou supprimé", PAY_PERIOD_NOT_FOUND: "Aucune période de paie ne correspond aux dates fournies", @@ -309,15 +319,6 @@ export default { timesheet_approvals: { page_title: "Validation cartes de temps", - table: { - full_name: "nom complet", - email: "courriel", - is_approved: "approuvé", - expenses: "dépenses", - mileage: "kilométrage", - verified: "approuvé", - unverified: "à vérifier", - }, chart: { hours_worked_title: "heures travaillées", expenses_title: "dépenses encourues" @@ -330,6 +331,16 @@ export default { expenses: "dépenses", options: "options", }, + table: { + full_name: "nom complet", + email: "courriel", + is_approved: "approuvé", + expenses: "dépenses", + mileage: "kilométrage", + verified: "approuvé", + unverified: "à vérifier", + inactive: "inactif", + }, tooltip: { button_detailed_view: "vue détaillée", }, diff --git a/src/layouts/components/main-layout-header-bar.vue b/src/layouts/components/main-layout-header-bar.vue index 0d4beb8..31d67da 100644 --- a/src/layouts/components/main-layout-header-bar.vue +++ b/src/layouts/components/main-layout-header-bar.vue @@ -3,7 +3,7 @@ setup > import { useUiStore } from 'src/stores/ui-store'; - import HeaderBarNotification from './main-layout-header-bar-notification.vue'; + // import HeaderBarNotification from './main-layout-header-bar-notification.vue'; const uiStore = useUiStore(); @@ -29,7 +29,7 @@ - + diff --git a/src/layouts/components/main-layout-left-drawer.vue b/src/layouts/components/main-layout-left-drawer.vue index 5d5de81..01472c3 100644 --- a/src/layouts/components/main-layout-left-drawer.vue +++ b/src/layouts/components/main-layout-left-drawer.vue @@ -7,7 +7,7 @@ import { useUiStore } from 'src/stores/ui-store'; import { ref } from 'vue'; import { RouteNames } from 'src/router/router-constants'; - import { CAN_APPROVE_PAY_PERIODS } from 'src/modules/shared/models/user.models'; + import { ModuleNames } from 'src/modules/shared/models/user.models'; const auth_store = useAuthStore(); const ui_store = useUiStore(); @@ -32,155 +32,109 @@ \ No newline at end of file diff --git a/src/layouts/main-layout.vue b/src/layouts/main-layout.vue index 97163be..6c730c9 100644 --- a/src/layouts/main-layout.vue +++ b/src/layouts/main-layout.vue @@ -2,16 +2,15 @@ lang="ts" setup > - import { RouterView } from 'vue-router'; import HeaderBar from 'src/layouts/components/main-layout-header-bar.vue'; import FooterBar from 'src/layouts/components/main-layout-footer-bar.vue'; import LeftDrawer from 'src/layouts/components/main-layout-left-drawer.vue'; - import { useUiStore } from 'src/stores/ui-store'; + import { onMounted, watch, ref } from 'vue'; - import { useI18n } from 'vue-i18n'; - - const { t } = useI18n(); + import { RouterView } from 'vue-router'; + import { useUiStore } from 'src/stores/ui-store'; + const ui_store = useUiStore(); const user_preferences = ref(ui_store.user_preferences); @@ -23,7 +22,7 @@ watch(user_preferences, async () => { if (ui_store.user_preferences.id !== -1) { - await ui_store.updateUserPreferences(t); + await ui_store.updateUserPreferences(); return } await ui_store.getUserPreferences(); diff --git a/src/modules/employee-list/components/add-modify-dialog-access.vue b/src/modules/employee-list/components/add-modify-dialog-access.vue index 1dbb15c..516e5b1 100644 --- a/src/modules/employee-list/components/add-modify-dialog-access.vue +++ b/src/modules/employee-list/components/add-modify-dialog-access.vue @@ -5,12 +5,13 @@ import { ref } from 'vue'; import { unwrapAndClone } from 'src/utils/unwrap-and-clone'; import { useEmployeeStore } from 'src/stores/employee-store'; - import { employee_access_options, type ModuleAccessPreset, type ModuleAccessName, employee_access_presets, getEmployeeAccessOptionIcon } from 'src/modules/employee-list/models/employee-profile.models'; + import { employee_access_options, type ModuleAccessPreset, employee_access_presets, getEmployeeAccessOptionIcon } from 'src/modules/employee-list/models/employee-profile.models'; + import type { UserModuleAccess } from 'src/modules/shared/models/user.models'; const employee_store = useEmployeeStore(); const preset_preview = ref(); - const toggleInSelected = (value: ModuleAccessName) => { + const toggleInSelected = (value: UserModuleAccess) => { const i = employee_store.employee.user_module_access.indexOf(value); if (i === -1) employee_store.employee.user_module_access.push(value); else employee_store.employee.user_module_access.splice(i, 1); @@ -21,7 +22,7 @@ } - const getPreviewBackgroundColor = (name: ModuleAccessName) => { + const getPreviewBackgroundColor = (name: UserModuleAccess) => { if (employee_access_presets[preset_preview.value!].includes(name)) { if (!employee_store.employee.user_module_access.includes(name)) return 'bg-info text-white'; @@ -33,7 +34,7 @@ return 'bg-dark'; }; - const getBackgroundColor = (name: ModuleAccessName) => { + const getBackgroundColor = (name: UserModuleAccess) => { if (employee_store.employee.user_module_access.includes(name)) return 'bg-accent text-white'; return 'bg-dark'; @@ -142,8 +143,12 @@ class="row full-width cursor-pointer flex-center q-pa-sm rounded-5 no-wrap shadow-5" :class="preset_preview !== undefined ? getPreviewBackgroundColor(option.value) : getBackgroundColor(option.value)" @click="toggleInSelected(option.value)" - > - + > + {{ $t('employee_management.module_access.' + option.value) }} diff --git a/src/modules/employee-list/composables/use-employee-api.ts b/src/modules/employee-list/composables/use-employee-api.ts index b613fd0..60bd474 100644 --- a/src/modules/employee-list/composables/use-employee-api.ts +++ b/src/modules/employee-list/composables/use-employee-api.ts @@ -48,8 +48,7 @@ export const useEmployeeListApi = () => { // Build a backend-compatible SchedulePreset instance const backend_preset = new SchedulePreset( preset.id, - preset.name, - preset.is_default, + preset.name, preset_shifts ); diff --git a/src/modules/employee-list/models/employee-profile.models.ts b/src/modules/employee-list/models/employee-profile.models.ts index b53dc9a..ff92bc9 100644 --- a/src/modules/employee-list/models/employee-profile.models.ts +++ b/src/modules/employee-list/models/employee-profile.models.ts @@ -1,6 +1,6 @@ import type { QSelectOption, QTableColumn } from "quasar"; +import type { UserModuleAccess } from "src/modules/shared/models/user.models"; -export type ModuleAccessName = 'dashboard' | 'employee_list' | 'employee_management' | 'personal_profile' | 'timesheets' | 'timesheets_approval'; export type ModuleAccessPreset = 'admin' | 'supervisor' | 'employee' | 'none'; export type CompanyNames = 'Targo' | 'Solucom'; @@ -18,7 +18,7 @@ export class EmployeeProfile { residence: string; birth_date: string; is_supervisor: boolean; - user_module_access: ModuleAccessName[]; + user_module_access: UserModuleAccess[]; preset_id?: number | null; constructor() { @@ -100,7 +100,7 @@ export const employee_list_columns: QTableColumn[] = [ }, ]; -export const employee_access_options: QSelectOption[] = [ +export const employee_access_options: QSelectOption[] = [ { label: 'dashboard', value: 'dashboard' }, { label: 'employee_list', value: 'employee_list' }, { label: 'personal_profile', value: 'personal_profile' }, @@ -109,14 +109,14 @@ export const employee_access_options: QSelectOption[] = [ { label: 'timesheets_approval', value: 'timesheets_approval' }, ] -export const employee_access_presets: Record = { +export const employee_access_presets: Record = { 'admin' : ['dashboard', 'employee_list', 'employee_management', 'personal_profile', 'timesheets', 'timesheets_approval'], 'supervisor' : ['dashboard', 'employee_list', 'personal_profile', 'timesheets', 'timesheets_approval'], 'employee' : ['dashboard', 'timesheets', 'personal_profile', 'employee_list'], 'none' : [], } -export const getEmployeeAccessOptionIcon = (module: ModuleAccessName): string => { +export const getEmployeeAccessOptionIcon = (module: UserModuleAccess): string => { switch (module) { case 'dashboard': return 'home'; case 'employee_list' : return 'groups'; diff --git a/src/modules/employee-list/models/schedule-presets.models.ts b/src/modules/employee-list/models/schedule-presets.models.ts index 20c6185..1f3c85a 100644 --- a/src/modules/employee-list/models/schedule-presets.models.ts +++ b/src/modules/employee-list/models/schedule-presets.models.ts @@ -9,13 +9,11 @@ export type PresetManagerMode = 'create' | 'update' | 'copy' | 'delete'; export class SchedulePreset { id: number; name: string; - is_default: boolean; shifts: SchedulePresetShift[]; - constructor(id?: number, name?: string, is_default?: boolean, shifts?: SchedulePresetShift[]) { + constructor(id?: number, name?: string, shifts?: SchedulePresetShift[]) { this.id = id ?? -1; this.name = name ?? 'default'; - this.is_default = is_default ?? false; this.shifts = shifts ?? []; } } @@ -27,7 +25,7 @@ export class SchedulePresetShift { start_time: string; end_time: string; is_remote: boolean; - + constructor(weekday: Weekday) { this.preset_id = -1; this.week_day = weekday; @@ -41,13 +39,11 @@ export class SchedulePresetShift { export class SchedulePresetFrontend { id: number; name: string; - is_default: boolean; weekdays: WeekdayPresetShifts[]; constructor(schedule_preset?: SchedulePreset) { this.id = schedule_preset?.id ?? -1; this.name = schedule_preset?.name ?? ''; - this.is_default = schedule_preset?.is_default ?? false; this.weekdays = WEEKDAYS.map(day => ({ day, is_error: false, diff --git a/src/modules/profile/components/employee/menu-employee.vue b/src/modules/profile/components/employee/menu-employee.vue index 1637ee1..7d666ba 100644 --- a/src/modules/profile/components/employee/menu-employee.vue +++ b/src/modules/profile/components/employee/menu-employee.vue @@ -25,7 +25,7 @@