diff --git a/src/i18n/en-ca/index.ts b/src/i18n/en-ca/index.ts index 61cd1d9..4c11085 100644 --- a/src/i18n/en-ca/index.ts +++ b/src/i18n/en-ca/index.ts @@ -137,6 +137,7 @@ export default { update: "update", modify: "modify", close: "close", + download: "download", }, misc: { or: "or", @@ -263,10 +264,12 @@ export default { expenses_title: "expenses accrued", }, print_report: { - company: "company", + title: "Download options", + company: "companies", type: "type", shifts: "shifts", expenses: "expenses", + options: "options", }, tooltip: { button_detailed_view: "detailed view", diff --git a/src/i18n/fr-ca/index.ts b/src/i18n/fr-ca/index.ts index 402646e..2ac860d 100644 --- a/src/i18n/fr-ca/index.ts +++ b/src/i18n/fr-ca/index.ts @@ -138,6 +138,7 @@ export default { update: "mettre à jour", modify: "modifier", close: "fermer", + download: "téléchargement", }, misc: { or: "ou", @@ -264,10 +265,12 @@ export default { expenses_title: "dépenses encourues" }, print_report: { - company: "compagnie", + title: "options de téléchargement", + company: "compagnies", type: "types de données", shifts: "quarts de travail", expenses: "dépenses", + options: "options", }, tooltip: { button_detailed_view: "vue détaillée", diff --git a/src/modules/timesheet-approval/components/overview-list.vue b/src/modules/timesheet-approval/components/overview-list.vue index 46153d8..14671d9 100644 --- a/src/modules/timesheet-approval/components/overview-list.vue +++ b/src/modules/timesheet-approval/components/overview-list.vue @@ -1,42 +1,37 @@ - diff --git a/src/modules/timesheet-approval/composables/use-timesheet-approval-api.ts b/src/modules/timesheet-approval/composables/use-timesheet-approval-api.ts index 39bb247..ffb74a9 100644 --- a/src/modules/timesheet-approval/composables/use-timesheet-approval-api.ts +++ b/src/modules/timesheet-approval/composables/use-timesheet-approval-api.ts @@ -26,21 +26,16 @@ export const useTimesheetApprovalApi = () => { timesheet_store.is_loading = false; }; - const getTimesheetApprovalCSVReport = async (report_filter_company: boolean[], report_filter_type: boolean[], year?: number, period_number?: number) => { + const getTimesheetApprovalCSVReport = async (report_filter_company: boolean[], report_filter_type: boolean[]) => { if (timesheet_store.pay_period === undefined) return; const [targo, solucom] = report_filter_company; const [shifts, expenses, holiday, vacation] = report_filter_type; const options = { - types: { shifts, expenses, holiday, vacation }, - companies: { targo, solucom }, + shifts, expenses, holiday, vacation, targo, solucom } as TimesheetApprovalCSVReportFilters; - await timesheet_store.getPayPeriodReportByYearAndPeriodNumber( - year ?? timesheet_store.pay_period.pay_year, - period_number ?? timesheet_store.pay_period.pay_period_no, - options - ); + await timesheet_store.getPayPeriodReport(options); }; return { diff --git a/src/modules/timesheet-approval/models/timesheet-approval-csv-report.models.ts b/src/modules/timesheet-approval/models/timesheet-approval-csv-report.models.ts index 3633813..572e1a6 100644 --- a/src/modules/timesheet-approval/models/timesheet-approval-csv-report.models.ts +++ b/src/modules/timesheet-approval/models/timesheet-approval-csv-report.models.ts @@ -1,25 +1,18 @@ -export interface TimesheetApprovalCSVReportFilters { - types: { - shifts: boolean; - expenses: boolean; - holiday: boolean; - vacation: boolean; - }; - companies: { - targo: boolean; - solucom: boolean; +export class TimesheetApprovalCSVReportFilters { + shifts: boolean; + expenses: boolean; + holiday: boolean; + vacation: boolean; + targo: boolean; + solucom: boolean; + + constructor() { + this.shifts = true; + this.expenses = true; + this.holiday = false; + this.vacation = false; + this.targo = true; + this.solucom = true; }; } -export const default_timesheet_approval_cvs_report_filters: TimesheetApprovalCSVReportFilters = { - types: { - shifts: true, - expenses: true, - holiday: true, - vacation: true, - }, - companies: { - targo: true, - solucom: true, - }, -}; \ No newline at end of file diff --git a/src/modules/timesheet-approval/services/timesheet-approval-service.ts b/src/modules/timesheet-approval/services/timesheet-approval-service.ts index 46b13e0..a72c561 100644 --- a/src/modules/timesheet-approval/services/timesheet-approval-service.ts +++ b/src/modules/timesheet-approval/services/timesheet-approval-service.ts @@ -4,12 +4,12 @@ import type { PayPeriodOverviewResponse } from "src/modules/timesheet-approval/m export const timesheetApprovalService = { getPayPeriodOverviews: async (year: number, period_number: number): Promise => { - const response = await api.get<{success: boolean, data: PayPeriodOverviewResponse, error? : string}>(`pay-periods/overview/${year}/${period_number}`); + const response = await api.get<{ success: boolean, data: PayPeriodOverviewResponse, error?: string }>(`pay-periods/overview/${year}/${period_number}`); return response.data.data; }, - getPayPeriodReportByYearAndPeriodNumber: async (year: number, period_number: number, report_filters?: TimesheetApprovalCSVReportFilters) => { - const response = await api.get(`csv/${year}/${period_number}`, { params: { report_filters, }}); - return response.data; + getPayPeriodReportByYearAndPeriodNumber: async (year: number, period_number: number, filters?: TimesheetApprovalCSVReportFilters) => { + const response = await api.get(`exports/csv/${year}/${period_number}`, { params: filters, responseType: 'arraybuffer' }); + return response; }, }; \ No newline at end of file diff --git a/src/pages/timesheet-approval-page.vue b/src/pages/timesheet-approval-page.vue index 562a618..2dc7a08 100644 --- a/src/pages/timesheet-approval-page.vue +++ b/src/pages/timesheet-approval-page.vue @@ -1,24 +1,22 @@ - \ No newline at end of file diff --git a/src/stores/timesheet-store.ts b/src/stores/timesheet-store.ts index 3eae467..d3b5d3d 100644 --- a/src/stores/timesheet-store.ts +++ b/src/stores/timesheet-store.ts @@ -3,7 +3,7 @@ import { defineStore } from 'pinia'; import { unwrapAndClone } from 'src/utils/unwrap-and-clone'; import { timesheetApprovalService } from 'src/modules/timesheet-approval/services/timesheet-approval-service'; import { timesheetService } from 'src/modules/timesheets/services/timesheet-service'; -import type { TimesheetOverview } from "src/modules/timesheet-approval/models/timesheet-overview.models"; +import type { PayPeriodOverviewResponse, TimesheetOverview } from "src/modules/timesheet-approval/models/timesheet-overview.models"; import type { PayPeriod } from 'src/modules/shared/models/pay-period.models'; import type { Timesheet } from 'src/modules/timesheets/models/timesheet.models'; import type { TimesheetApprovalCSVReportFilters } from 'src/modules/timesheet-approval/models/timesheet-approval-csv-report.models'; @@ -15,9 +15,11 @@ export const useTimesheetStore = defineStore('timesheet', () => { const timesheets = ref([]); const all_current_shifts = computed(() => timesheets.value.flatMap(week => week.days.flatMap(day => day.shifts)) ?? []); const initial_timesheets = ref([]); - + const pay_period_overviews = ref([]); - + const pay_period_infos = ref(); + const is_report_dialog_open = ref(false); + const is_details_dialog_open = ref(false); const selected_employee_name = ref(); const current_pay_period_overview = ref(); @@ -93,15 +95,12 @@ export const useTimesheetStore = defineStore('timesheet', () => { } }; - const getPayPeriodReportByYearAndPeriodNumber = async (year: number, period_number: number, report_filters?: TimesheetApprovalCSVReportFilters) => { + const getPayPeriodReport = async (report_filters: TimesheetApprovalCSVReportFilters) => { try { - const response = await timesheetApprovalService.getPayPeriodReportByYearAndPeriodNumber( - year, - period_number, - report_filters - ); + if (!pay_period.value) return false; + const response = await timesheetApprovalService.getPayPeriodReportByYearAndPeriodNumber(pay_period.value.pay_year, pay_period.value.pay_period_no, report_filters); pay_period_report.value = response; - return true; + return response.data; } catch (error) { console.error('There was an error retrieving the report CSV: ', error); // TODO: More in-depth error-handling here @@ -110,14 +109,28 @@ export const useTimesheetStore = defineStore('timesheet', () => { return false; }; + const openReportDialog = () => { + is_report_dialog_open.value = true; + is_loading.value = true; + + + is_loading.value = false; + }; + + const closeReportDialog = () => { + is_report_dialog_open.value = false; + }; + return { is_loading, + is_report_dialog_open, is_approval_grid_mode, is_details_dialog_open, search_filter, pay_period, pay_period_overviews, current_pay_period_overview, + pay_period_infos, selected_employee_name, timesheets, all_current_shifts, @@ -125,6 +138,8 @@ export const useTimesheetStore = defineStore('timesheet', () => { getPayPeriodByDateOrYearAndNumber, getTimesheetOverviews, getTimesheetsByOptionalEmployeeEmail, - getPayPeriodReportByYearAndPeriodNumber, + getPayPeriodReport, + openReportDialog, + closeReportDialog, }; }); \ No newline at end of file diff --git a/src/utils/boolean-utils.ts b/src/utils/boolean-utils.ts new file mode 100644 index 0000000..8335e2c --- /dev/null +++ b/src/utils/boolean-utils.ts @@ -0,0 +1,25 @@ +// export const createDefaultBooleanValue = (keys_list: PropertyKey[]): Record => +// keys_list.reduce((acc, mod) => { +// acc[mod] = false; +// return acc; +// }, {} as Record); + + +// export const toBooleanFromKeys = (keys_list: PropertyKey[], arr?: readonly PropertyKey[] | null): Record => { +// const result = createDefaultBooleanValue(keys_list); +// if (!arr || !Array.isArray(arr)) return result; +// for (const item of arr) { +// if (typeof item !== 'string') continue; +// const trimmed = item.trim(); +// if ((keys_list as readonly PropertyKey[]).includes(trimmed)) { +// result[trimmed as T] = true; +// } +// } +// return result; +// } + +export const toKeysFromBoolean = (boolean_values: Record): T[] => { + const values_array = Object.entries(boolean_values); + const values = values_array.filter(([_key, value]) => value === true); + return values.map(([key]) => key as T); +} \ No newline at end of file