diff --git a/src/assets/targo-default-avatar.png b/src/assets/targo-default-avatar.png new file mode 100644 index 0000000..1893831 Binary files /dev/null and b/src/assets/targo-default-avatar.png differ 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 @@ + + + + + + © 2025 Targo Communications inc. + + + + \ 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 @@ + + + + + + + + {{ notifAmount }} + + + + + {{ currentUser.firstName }} {{ currentUser.lastName }} + {{ notifAmount }} new messages + + + \ 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 @@ + + + + + + + + + + + + + {{ $t('navBar.userMenuShiftValidation') }} + + + + + + + + + + {{ $t('navBar.userMenuEmployeeList') }} + + + + + + + + + + {{ $t('navBar.userMenuProfile') }} + + + + + + + + + + {{ $t('navBar.userMenuHelp') }} + + + + + + + + + + + {{ $t('navBar.userMenuLogout') }} + + + + + \ 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 @@ + + + + + + + + + + {{ timesheetStore.currentPayPeriod?.label }} + + \ 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