From 1f94d6a90026d1ff791b342b4b8398d14fa4ee8b Mon Sep 17 00:00:00 2001 From: Nicolas Drolet Date: Fri, 8 Aug 2025 17:04:54 -0400 Subject: [PATCH] eat(approvals): add and define components and other files related to timesheet approval page --- src/assets/targo-default-avatar.png | Bin 0 -> 2411 bytes .../components/_shared/user-container-add.vue | 0 .../_shared/user-container-update.vue | 0 .../components/_shared/user-container.vue | 0 .../components/customer/customer-profile.vue | 0 .../components/employee/employee-profile.vue | 0 .../supervisor-crew-profile-list-item.vue | 0 .../supervisor-crew-profile-list.vue | 0 .../components/supervisor/supervisor-crew.vue | 0 .../employee-list/composables/use-accounts.ts | 0 .../composables/use-user-validation.ts | 0 .../employee-list/composables/use-users.ts | 0 .../employee-list/employee-constants.ts | 0 src/modules/employee-list/employee-store.ts | 0 .../employee-list/pages/user-add-page.vue | 0 .../pages/user-profile-wrapper.vue | 0 .../employee-list/services/user-service.ts | 0 .../components/navigation/footer-bar.vue | 12 ++ .../navigation/header-bar-avatar.vue | 28 ++++ .../components/navigation/header-bar.vue | 22 +++ .../components/navigation/right-drawer.vue | 88 ++++++++++++ .../shared/types/pay-period-interface.ts | 7 + src/modules/shared/types/user-interface.ts | 6 + .../timesheet-approval-period-picker.vue | 16 +++ .../pages/timesheet-approval.vue | 9 ++ .../services/services-timesheet-approval.ts | 20 +++ .../timesheet-approval-test-constants.ts | 133 ++++++++++++++++++ ...-pay-period-employee-overview-interface.ts | 11 ++ ...-approval-pay-period-overview-interface.ts | 6 + src/router/router-constants.ts | 9 ++ src/stores/auth-store.ts | 39 +++++ src/stores/timesheet-store.ts | 18 +++ src/stores/ui-store.ts | 11 ++ src/utils/has-required-role.ts | 7 + 34 files changed, 442 insertions(+) create mode 100644 src/assets/targo-default-avatar.png create mode 100644 src/modules/employee-list/components/_shared/user-container-add.vue create mode 100644 src/modules/employee-list/components/_shared/user-container-update.vue create mode 100644 src/modules/employee-list/components/_shared/user-container.vue create mode 100644 src/modules/employee-list/components/customer/customer-profile.vue create mode 100644 src/modules/employee-list/components/employee/employee-profile.vue create mode 100644 src/modules/employee-list/components/supervisor/supervisor-crew-profile-list-item.vue create mode 100644 src/modules/employee-list/components/supervisor/supervisor-crew-profile-list.vue create mode 100644 src/modules/employee-list/components/supervisor/supervisor-crew.vue create mode 100644 src/modules/employee-list/composables/use-accounts.ts create mode 100644 src/modules/employee-list/composables/use-user-validation.ts create mode 100644 src/modules/employee-list/composables/use-users.ts create mode 100644 src/modules/employee-list/employee-constants.ts create mode 100644 src/modules/employee-list/employee-store.ts create mode 100644 src/modules/employee-list/pages/user-add-page.vue create mode 100644 src/modules/employee-list/pages/user-profile-wrapper.vue create mode 100644 src/modules/employee-list/services/user-service.ts create mode 100644 src/modules/shared/components/navigation/footer-bar.vue create mode 100644 src/modules/shared/components/navigation/header-bar-avatar.vue create mode 100644 src/modules/shared/components/navigation/header-bar.vue create mode 100644 src/modules/shared/components/navigation/right-drawer.vue create mode 100644 src/modules/shared/types/pay-period-interface.ts create mode 100644 src/modules/shared/types/user-interface.ts create mode 100644 src/modules/timesheet-approval/components/timesheet-approval-period-picker.vue create mode 100644 src/modules/timesheet-approval/pages/timesheet-approval.vue create mode 100644 src/modules/timesheet-approval/services/services-timesheet-approval.ts create mode 100644 src/modules/timesheet-approval/timesheet-approval-test-constants.ts create mode 100644 src/modules/timesheet-approval/types/timesheet-approval-pay-period-employee-overview-interface.ts create mode 100644 src/modules/timesheet-approval/types/timesheet-approval-pay-period-overview-interface.ts create mode 100644 src/router/router-constants.ts create mode 100644 src/stores/auth-store.ts create mode 100644 src/stores/timesheet-store.ts create mode 100644 src/stores/ui-store.ts create mode 100644 src/utils/has-required-role.ts diff --git a/src/assets/targo-default-avatar.png b/src/assets/targo-default-avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..18938311d7d0520b0855b95377660cddf4d6e920 GIT binary patch literal 2411 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 literal 0 HcmV?d00001 diff --git a/src/modules/employee-list/components/_shared/user-container-add.vue b/src/modules/employee-list/components/_shared/user-container-add.vue new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/employee-list/components/_shared/user-container-update.vue b/src/modules/employee-list/components/_shared/user-container-update.vue new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/employee-list/components/_shared/user-container.vue b/src/modules/employee-list/components/_shared/user-container.vue new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/employee-list/components/customer/customer-profile.vue b/src/modules/employee-list/components/customer/customer-profile.vue new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/employee-list/components/employee/employee-profile.vue b/src/modules/employee-list/components/employee/employee-profile.vue new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/employee-list/components/supervisor/supervisor-crew-profile-list-item.vue b/src/modules/employee-list/components/supervisor/supervisor-crew-profile-list-item.vue new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/employee-list/components/supervisor/supervisor-crew-profile-list.vue b/src/modules/employee-list/components/supervisor/supervisor-crew-profile-list.vue new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/employee-list/components/supervisor/supervisor-crew.vue b/src/modules/employee-list/components/supervisor/supervisor-crew.vue new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/employee-list/composables/use-accounts.ts b/src/modules/employee-list/composables/use-accounts.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/employee-list/composables/use-user-validation.ts b/src/modules/employee-list/composables/use-user-validation.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/employee-list/composables/use-users.ts b/src/modules/employee-list/composables/use-users.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/employee-list/employee-constants.ts b/src/modules/employee-list/employee-constants.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/employee-list/employee-store.ts b/src/modules/employee-list/employee-store.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/employee-list/pages/user-add-page.vue b/src/modules/employee-list/pages/user-add-page.vue new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/employee-list/pages/user-profile-wrapper.vue b/src/modules/employee-list/pages/user-profile-wrapper.vue new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/employee-list/services/user-service.ts b/src/modules/employee-list/services/user-service.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/shared/components/navigation/footer-bar.vue b/src/modules/shared/components/navigation/footer-bar.vue new file mode 100644 index 0000000..dbcbf9c --- /dev/null +++ b/src/modules/shared/components/navigation/footer-bar.vue @@ -0,0 +1,12 @@ + + + \ No newline at end of file diff --git a/src/modules/shared/components/navigation/header-bar-avatar.vue b/src/modules/shared/components/navigation/header-bar-avatar.vue new file mode 100644 index 0000000..fea344d --- /dev/null +++ b/src/modules/shared/components/navigation/header-bar-avatar.vue @@ -0,0 +1,28 @@ + + + \ No newline at end of file diff --git a/src/modules/shared/components/navigation/header-bar.vue b/src/modules/shared/components/navigation/header-bar.vue new file mode 100644 index 0000000..253fd61 --- /dev/null +++ b/src/modules/shared/components/navigation/header-bar.vue @@ -0,0 +1,22 @@ + + + + diff --git a/src/modules/shared/components/navigation/right-drawer.vue b/src/modules/shared/components/navigation/right-drawer.vue new file mode 100644 index 0000000..49700c6 --- /dev/null +++ b/src/modules/shared/components/navigation/right-drawer.vue @@ -0,0 +1,88 @@ + + + \ No newline at end of file diff --git a/src/modules/shared/types/pay-period-interface.ts b/src/modules/shared/types/pay-period-interface.ts new file mode 100644 index 0000000..7f9e3a3 --- /dev/null +++ b/src/modules/shared/types/pay-period-interface.ts @@ -0,0 +1,7 @@ +export interface PayPeriod { + period_number: number; + start_date: string; + end_date: string; + year: number; + label: string; +}; \ No newline at end of file diff --git a/src/modules/shared/types/user-interface.ts b/src/modules/shared/types/user-interface.ts new file mode 100644 index 0000000..f83f3af --- /dev/null +++ b/src/modules/shared/types/user-interface.ts @@ -0,0 +1,6 @@ +export interface User { + firstName: string; + lastName: string; + email: string; + role: string; +} \ No newline at end of file diff --git a/src/modules/timesheet-approval/components/timesheet-approval-period-picker.vue b/src/modules/timesheet-approval/components/timesheet-approval-period-picker.vue new file mode 100644 index 0000000..f61624d --- /dev/null +++ b/src/modules/timesheet-approval/components/timesheet-approval-period-picker.vue @@ -0,0 +1,16 @@ + + + \ No newline at end of file diff --git a/src/modules/timesheet-approval/pages/timesheet-approval.vue b/src/modules/timesheet-approval/pages/timesheet-approval.vue new file mode 100644 index 0000000..7e0f5d3 --- /dev/null +++ b/src/modules/timesheet-approval/pages/timesheet-approval.vue @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/src/modules/timesheet-approval/services/services-timesheet-approval.ts b/src/modules/timesheet-approval/services/services-timesheet-approval.ts new file mode 100644 index 0000000..b0d1750 --- /dev/null +++ b/src/modules/timesheet-approval/services/services-timesheet-approval.ts @@ -0,0 +1,20 @@ +import { api } from "src/boot/axios"; +import { mock_pay_period_employee_overviews, mock_pay_periods } from "../timesheet-approval-test-constants"; +import { PayPeriod } from "src/modules/shared/types/pay-period-interface"; + +export const timesheetApprovalService = { + getCurrentPayPeriod: async () :Promise => { + // TODO: REMOVE MOCK DATA PEFORE PUSHING TO PROD + return await api.get(`/pay-periods/date/${new Date()}`) || mock_pay_periods[0]; + }, + + getAllPayPeriods: async () => { + // TODO: REMOVE MOCK DATA PEFORE PUSHING TO PROD + return await api.get(`/pay-periods/`) || mock_pay_periods; + }, + + getPayPeriodEmployeeOverviews: async (period_number: number) => { + // TODO: REMOVE MOCK DATA PEFORE PUSHING TO PROD + return await api.get(`/pay-periods/${period_number}/overview`) || mock_pay_period_employee_overviews; + }, +}; \ No newline at end of file diff --git a/src/modules/timesheet-approval/timesheet-approval-test-constants.ts b/src/modules/timesheet-approval/timesheet-approval-test-constants.ts new file mode 100644 index 0000000..31df98e --- /dev/null +++ b/src/modules/timesheet-approval/timesheet-approval-test-constants.ts @@ -0,0 +1,133 @@ +import { PayPeriod } from "../shared/types/pay-period-interface"; +import { PayPeriodEmployeeOverview } from "./types/timesheet-approval-pay-period-employee-overview-interface" + +export const mock_pay_period_employee_overviews: PayPeriodEmployeeOverview[] = [ + { + "employee_id": 'EMP-001', + "employee_name": 'Alice Johnson', + "regular_hours": 75, + "evening_hours": 12, + "emergency_hours": 3, + "overtime_hours": 5, + "expenses": 120.50, + "mileage": 45, + "is_approved": false + }, + { + "employee_id": 'EMP-002', + "employee_name": 'Brian Smith', + "regular_hours": 80, + "evening_hours": 8, + "emergency_hours": 0, + "overtime_hours": 2, + "expenses": 75.00, + "mileage": 12, + "is_approved": true + }, + { + "employee_id": 'EMP-003', + "employee_name": 'Chloe Ramirez', + "regular_hours": 68, + "evening_hours": 15, + "emergency_hours": 1, + "overtime_hours": 0, + "expenses": 200.00, + "mileage": 88, + "is_approved": false + }, + { + "employee_id": 'EMP-004', + "employee_name": 'David Lee', + "regular_hours": 82, + "evening_hours": 5, + "emergency_hours": 4, + "overtime_hours": 6, + "expenses": 50.75, + "mileage": 20, + "is_approved": true + }, + { + "employee_id": 'EMP-005', + "employee_name": 'Emily Carter', + "regular_hours": 78, + "evening_hours": 10, + "emergency_hours": 2, + "overtime_hours": 3, + "expenses": 95.25, + "mileage": 60, + "is_approved": false + } +]; + +export const mock_pay_periods: PayPeriod[] = [ + { + "period_number": 15, + "start_date": "2025-07-27", + "end_date": "2025-08-09", + "year": 2025, + "label": "2025-07-27 → 2025-08-09" + }, + { + "period_number": 14, + "start_date": "2025-07-13", + "end_date": "2025-07-26", + "year": 2025, + "label": "2025-07-13 → 2025-07-26" + }, + { + "period_number": 13, + "start_date": "2025-06-29", + "end_date": "2025-07-12", + "year": 2025, + "label": "2025-06-29 → 2025-07-12" + }, + { + "period_number": 12, + "start_date": "2025-06-15", + "end_date": "2025-06-28", + "year": 2025, + "label": "2025-06-15 → 2025-06-28" + }, + { + "period_number": 11, + "start_date": "2025-06-01", + "end_date": "2025-06-14", + "year": 2025, + "label": "2025-06-01 → 2025-06-14" + }, + { + "period_number": 10, + "start_date": "2025-05-18", + "end_date": "2025-05-31", + "year": 2025, + "label": "2025-05-18 → 2025-05-31" + }, + { + "period_number": 9, + "start_date": "2025-05-04", + "end_date": "2025-05-17", + "year": 2025, + "label": "2025-05-04 → 2025-05-17" + }, + { + "period_number": 8, + "start_date": "2025-04-20", + "end_date": "2025-05-03", + "year": 2025, + "label": "2025-04-20 → 2025-05-03" + }, + { + "period_number": 7, + "start_date": "2025-04-06", + "end_date": "2025-04-19", + "year": 2025, + "label": "2025-04-06 → 2025-04-19" + }, + { + "period_number": 6, + "start_date": "2025-03-23", + "end_date": "2025-04-05", + "year": 2025, + "label": "2025-03-23 → 2025-04-05" + } +] diff --git a/src/modules/timesheet-approval/types/timesheet-approval-pay-period-employee-overview-interface.ts b/src/modules/timesheet-approval/types/timesheet-approval-pay-period-employee-overview-interface.ts new file mode 100644 index 0000000..f935687 --- /dev/null +++ b/src/modules/timesheet-approval/types/timesheet-approval-pay-period-employee-overview-interface.ts @@ -0,0 +1,11 @@ +export interface PayPeriodEmployeeOverview { + employee_id: string; + employee_name: string; + regular_hours: number; + evening_hours: number; + emergency_hours: number; + overtime_hours: number; + expenses: number; + mileage: number; + is_approved: boolean; +}; \ No newline at end of file diff --git a/src/modules/timesheet-approval/types/timesheet-approval-pay-period-overview-interface.ts b/src/modules/timesheet-approval/types/timesheet-approval-pay-period-overview-interface.ts new file mode 100644 index 0000000..130ee40 --- /dev/null +++ b/src/modules/timesheet-approval/types/timesheet-approval-pay-period-overview-interface.ts @@ -0,0 +1,6 @@ +export interface PayPeriodOverview { + period_number: number; + start_date: string; + end_date: string; + label: string; +}; \ No newline at end of file diff --git a/src/router/router-constants.ts b/src/router/router-constants.ts new file mode 100644 index 0000000..b264bf2 --- /dev/null +++ b/src/router/router-constants.ts @@ -0,0 +1,9 @@ +export enum RouteNames { + /* eslint-disable */ + LOGIN = 'login', + LOGIN_SUCCESS = 'login-success', + DASHBOARD = 'dashboard', + TIMESHEET_APPROVALS = 'timesheet-approvals', + EMPLOYEE_LIST = 'employee-list', + PROFILE = 'user/profile', +} \ No newline at end of file diff --git a/src/stores/auth-store.ts b/src/stores/auth-store.ts new file mode 100644 index 0000000..19a601e --- /dev/null +++ b/src/stores/auth-store.ts @@ -0,0 +1,39 @@ +import { computed, ref } from "vue"; +import { defineStore } from "pinia"; +import { AuthService } from "../modules/auth/services/services-auth"; +import type { User } from "src/modules/shared/types/user-interface"; + +const defaultUser: User = { + firstName: 'Unknown', + lastName: 'Unknown', + email: 'guest@guest.com', + role: 'guest' + }; + +export const useAuthStore = defineStore('auth', () => { + const user = ref (defaultUser); + const authError = ref(""); + const isAuthorizedUser = computed(() => user.value.role !== 'guest'); + + const login = () => { + //TODO: manage customer login process + }; + + const oidcLogin = () => { + const oidcPopup = AuthService.oidcLogin(); + if (!oidcPopup) { + authError.value = "You have popups blocked on this website!"; + } + }; + + const logout = () => { + user.value = defaultUser; + }; + + const setUser = (currentUser: User) => { + user.value = currentUser; + }; + + return { user, authError, isAuthorizedUser, login, oidcLogin, logout, setUser }; +}); + diff --git a/src/stores/timesheet-store.ts b/src/stores/timesheet-store.ts new file mode 100644 index 0000000..5dfe974 --- /dev/null +++ b/src/stores/timesheet-store.ts @@ -0,0 +1,18 @@ +import { defineStore } from 'pinia'; +import { ref } from 'vue'; +import type { PayPeriod } from 'src/modules/shared/types/pay-period-interface'; +import { timesheetApprovalService } from 'src/modules/timesheet-approval/services/services-timesheet-approval'; + +export const useTimesheetStore = defineStore('timesheet', () => { + const payPeriods = ref([]); + const currentPayPeriod = ref(); + + const getCurrentPayPeriod = async () => { + if (!currentPayPeriod.value) { + currentPayPeriod.value = await timesheetApprovalService.getCurrentPayPeriod(); + } + return currentPayPeriod.value; + } + + return { payPeriods, currentPayPeriod, getCurrentPayPeriod}; +}); diff --git a/src/stores/ui-store.ts b/src/stores/ui-store.ts new file mode 100644 index 0000000..5743f8f --- /dev/null +++ b/src/stores/ui-store.ts @@ -0,0 +1,11 @@ +import { defineStore } from 'pinia'; +import { ref } from 'vue'; + +export const useUiStore = defineStore('ui', () => { + const isRightDrawerOpen = ref(true); + const toggleRightDrawer = () => { + isRightDrawerOpen.value = !isRightDrawerOpen.value; + } + + return { isRightDrawerOpen, toggleRightDrawer }; +}); diff --git a/src/utils/has-required-role.ts b/src/utils/has-required-role.ts new file mode 100644 index 0000000..dbd7056 --- /dev/null +++ b/src/utils/has-required-role.ts @@ -0,0 +1,7 @@ +import { useAuthStore } from "src/stores/auth-store"; + +export const hasRequiredRole = (...requiredRoles: string[] ) => { + const currentUserRole = useAuthStore().user.role; + + return requiredRoles.includes(currentUserRole); +}; \ No newline at end of file