From a1b6748d95678b258ae2e804ac625289851700d2 Mon Sep 17 00:00:00 2001 From: Nicolas Drolet Date: Tue, 2 Dec 2025 09:20:05 -0500 Subject: [PATCH] feat(user-management): add popup with basic functionality to add or edit user info and module access --- src/i18n/en-ca/index.ts | 15 ++ src/i18n/fr-ca/index.ts | 14 + src/layouts/main-layout.vue | 4 - .../components/employee-list-table-item.vue | 9 +- .../components/employee-list-table.vue | 2 + .../employee/add-modify-dialog-form.vue | 244 ++++++++++++++++++ .../components/employee/add-modify-dialog.vue | 23 ++ .../employee-list-add-modify-dialog.vue | 16 -- .../models/employee-profile.models.ts | 26 +- src/pages/employee-list-page.vue | 4 +- src/stores/employee-store.ts | 31 ++- 11 files changed, 357 insertions(+), 31 deletions(-) create mode 100644 src/modules/employee-list/components/employee/add-modify-dialog-form.vue create mode 100644 src/modules/employee-list/components/employee/add-modify-dialog.vue delete mode 100644 src/modules/employee-list/components/employee/employee-list-add-modify-dialog.vue diff --git a/src/i18n/en-ca/index.ts b/src/i18n/en-ca/index.ts index 1b03a4a..f9d38f0 100644 --- a/src/i18n/en-ca/index.ts +++ b/src/i18n/en-ca/index.ts @@ -58,6 +58,21 @@ export default { company: "company", supervisor: "supervisor", hired_date: "hiring date", + bankroll_id: "payroll ID", + module_access: { + dashboard: "Dashboard", + employee_list: "employee list", + employee_management: "employee management", + personal_profile: "profile", + timesheets: "timesheets", + timesheets_approval: "timesheet approval", + user_access: "module access", + presets: "access presets", + preset_admin: "admin", + preset_employee: "employee", + uncheck_all: "remove all", + + }, }, preferences: { tab_title: "preferences", diff --git a/src/i18n/fr-ca/index.ts b/src/i18n/fr-ca/index.ts index 929145d..4b25d4c 100644 --- a/src/i18n/fr-ca/index.ts +++ b/src/i18n/fr-ca/index.ts @@ -58,6 +58,20 @@ export default { company: "compagnie", supervisor: "nom du superviseur", hired_date: "date d'embauche", + bankroll_id: "identifiant de paie", + module_access: { + dashboard: "accueil", + employee_list: "liste employés", + employee_management: "gestion employés", + personal_profile: "profil", + timesheets: "feuilles de temps", + timesheets_approval: "valider feuilles de temps", + user_access: "accès aux modules", + presets: "accès prédéfinis", + preset_admin: "administrateur", + preset_employee: "employé", + uncheck_all: "aucun accès", + }, }, preferences: { tab_title: "préférences", diff --git a/src/layouts/main-layout.vue b/src/layouts/main-layout.vue index d202b83..97163be 100644 --- a/src/layouts/main-layout.vue +++ b/src/layouts/main-layout.vue @@ -16,20 +16,16 @@ const user_preferences = ref(ui_store.user_preferences); onMounted(async () => { - console.log('current preferences on load: ', ui_store.user_preferences); if (ui_store.user_preferences.id === -1) { - console.log('fetching preferences'); await ui_store.getUserPreferences(); } }); watch(user_preferences, async () => { if (ui_store.user_preferences.id !== -1) { - console.log('triggered watcher'); await ui_store.updateUserPreferences(t); return } - console.log('watcher triggered but store has no preferences') await ui_store.getUserPreferences(); }, {deep: true}); diff --git a/src/modules/employee-list/components/employee-list-table-item.vue b/src/modules/employee-list/components/employee-list-table-item.vue index d7472d0..ca2b4cb 100644 --- a/src/modules/employee-list/components/employee-list-table-item.vue +++ b/src/modules/employee-list/components/employee-list-table-item.vue @@ -49,12 +49,17 @@ class="col-grow text-center text-h6 text-weight-medium text-uppercase q-pb-none" style="line-height: 0.8em;" > -
{{ row.first_name }} {{ row.last_name }}
+
+ {{ row.first_name }} {{ row.last_name }} +
-
{{ row.job_title }}
+
{{ row.job_title }}
diff --git a/src/modules/employee-list/components/employee-list-table.vue b/src/modules/employee-list/components/employee-list-table.vue index bbfb6bb..e500814 100644 --- a/src/modules/employee-list/components/employee-list-table.vue +++ b/src/modules/employee-list/components/employee-list-table.vue @@ -71,6 +71,7 @@ @@ -82,6 +83,7 @@ icon="person_add" :label="$t('shared.label.add')" class="text-uppercase" + @click.stop="_evt => employee_store.openAddModifyDialog()" /> diff --git a/src/modules/employee-list/components/employee/add-modify-dialog-form.vue b/src/modules/employee-list/components/employee/add-modify-dialog-form.vue new file mode 100644 index 0000000..92aec5c --- /dev/null +++ b/src/modules/employee-list/components/employee/add-modify-dialog-form.vue @@ -0,0 +1,244 @@ + + + \ No newline at end of file diff --git a/src/modules/employee-list/components/employee/add-modify-dialog.vue b/src/modules/employee-list/components/employee/add-modify-dialog.vue new file mode 100644 index 0000000..29fa55c --- /dev/null +++ b/src/modules/employee-list/components/employee/add-modify-dialog.vue @@ -0,0 +1,23 @@ + + + \ No newline at end of file diff --git a/src/modules/employee-list/components/employee/employee-list-add-modify-dialog.vue b/src/modules/employee-list/components/employee/employee-list-add-modify-dialog.vue deleted file mode 100644 index 1cf6ab7..0000000 --- a/src/modules/employee-list/components/employee/employee-list-add-modify-dialog.vue +++ /dev/null @@ -1,16 +0,0 @@ - - - \ No newline at end of file diff --git a/src/modules/employee-list/models/employee-profile.models.ts b/src/modules/employee-list/models/employee-profile.models.ts index 2d1ee8b..ed8f7e2 100644 --- a/src/modules/employee-list/models/employee-profile.models.ts +++ b/src/modules/employee-list/models/employee-profile.models.ts @@ -1,4 +1,7 @@ -import type { QTableColumn } from "quasar"; +import type { QSelectOption, QTableColumn } from "quasar"; + +export type ModuleAccessName = 'dashboard' | 'employee_list' | 'employee_management' | 'personal_profile' | 'timesheets' | 'timesheets_approval'; +export type ModuleAccessPreset = 'admin' | 'employee' | 'none'; export class EmployeeProfile { first_name: string; @@ -10,9 +13,11 @@ export class EmployeeProfile { phone_number: string; first_work_day: string; last_work_day: string; + external_payroll_id: number; residence: string; birth_date: string; - + user_module_access: ModuleAccessName[]; + constructor() { this.first_name = ''; this.last_name = ''; @@ -25,6 +30,8 @@ export class EmployeeProfile { this.last_work_day = ''; this.residence = ''; this.birth_date = ''; + this.external_payroll_id = -1; + this.user_module_access = ['dashboard',]; } } @@ -67,6 +74,21 @@ export const employee_list_columns: QTableColumn[] = [ }, ]; +export const employee_access_options: QSelectOption[] = [ + { label: 'dashboard', value: 'dashboard' }, + { label: 'employee_list', value: 'employee_list' }, + { label: 'employee_management', value: 'employee_management' }, + { label: 'personal_profile', value: 'personal_profile' }, + { label: 'timesheets', value: 'timesheets' }, + { label: 'timesheets_approval', value: 'timesheets_approval' }, +] + +export const employee_access_presets: Record = { + 'admin' : ['dashboard', 'employee_list', 'employee_management', 'personal_profile', 'timesheets', 'timesheets_approval'], + 'employee' : ['dashboard', 'timesheets', 'personal_profile', 'employee_list'], + 'none' : [], +} + export const getCompanyName = (company_code: number) => { switch (company_code) { case 271583: return 'Targo'; diff --git a/src/pages/employee-list-page.vue b/src/pages/employee-list-page.vue index bbe9828..60a6d75 100644 --- a/src/pages/employee-list-page.vue +++ b/src/pages/employee-list-page.vue @@ -3,13 +3,13 @@ lang="ts" > import EmployeeListTable from 'src/modules/employee-list/components/employee-list-table.vue'; - import EmployeeListAddModifyDialog from 'src/modules/employee-list/components/employee/employee-list-add-modify-dialog.vue'; + import AddModifyDialog from 'src/modules/employee-list/components/employee/add-modify-dialog.vue'; import PageHeaderTemplate from 'src/modules/shared/components/page-header-template.vue';