From faa239784bd0bf1ba0a0eec54de38c042a47c3dc Mon Sep 17 00:00:00 2001 From: Nicolas Drolet Date: Tue, 16 Dec 2025 11:06:59 -0500 Subject: [PATCH] refactor(timesheet): redo expense dialog to work with Expansion Items, improve UI/UX --- src/css/app.scss | 12 +++ .../components/main-layout-left-drawer.vue | 2 +- .../composables/use-employee-api.ts | 3 - .../shared/components/language-switch.vue | 1 - .../components/expense-dialog-form.vue | 79 ++++++------------- .../components/expense-dialog-header.vue | 14 ++-- .../components/expense-dialog-list-item.vue | 35 ++++---- .../components/expense-dialog-list.vue | 2 +- .../timesheets/components/expense-dialog.vue | 61 ++++++++++---- .../mobile/expense-dialog-form-mobile.vue | 3 +- .../expense-dialog-list-item-mobile.vue | 12 ++- .../timesheets/services/shift-service.ts | 1 - src/modules/timesheets/utils/expense.util.ts | 25 ------ src/modules/timesheets/utils/shift.util.ts | 4 - src/router/index.ts | 2 +- src/stores/expense-store.ts | 12 +-- src/stores/timesheet-store.ts | 1 - src/stores/ui-store.ts | 1 - src/utils/date-and-time-utils.ts | 3 +- src/utils/deep-equal.ts | 41 ---------- 20 files changed, 117 insertions(+), 197 deletions(-) delete mode 100644 src/utils/deep-equal.ts diff --git a/src/css/app.scss b/src/css/app.scss index 1ade66d..2e7ae8b 100644 --- a/src/css/app.scss +++ b/src/css/app.scss @@ -52,4 +52,16 @@ body.body--dark { .q-btn--push:active::before { border-bottom-width: 1px; +} + +/* Chrome, Safari, Edge, Opera */ +input::-webkit-outer-spin-button, +input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} + +/* Firefox */ +input[type=number] { + -moz-appearance: textfield; } \ No newline at end of file diff --git a/src/layouts/components/main-layout-left-drawer.vue b/src/layouts/components/main-layout-left-drawer.vue index 01e7ed3..5d5de81 100644 --- a/src/layouts/components/main-layout-left-drawer.vue +++ b/src/layouts/components/main-layout-left-drawer.vue @@ -24,7 +24,7 @@ auth_store.logout(); router.push({ name: 'login' }).catch(err => { - console.log('could not log you out: ', err); + console.error('could not log you out: ', err); }) } diff --git a/src/modules/employee-list/composables/use-employee-api.ts b/src/modules/employee-list/composables/use-employee-api.ts index 90efd81..b613fd0 100644 --- a/src/modules/employee-list/composables/use-employee-api.ts +++ b/src/modules/employee-list/composables/use-employee-api.ts @@ -38,10 +38,7 @@ export const useEmployeeListApi = () => { weekday.is_error = isShiftOverlap(weekday.shifts); } - console.log('current preset: ', preset); - if (preset.weekdays.some(weekday => weekday.is_error)) { - console.log('overlap!'); return; } diff --git a/src/modules/shared/components/language-switch.vue b/src/modules/shared/components/language-switch.vue index 5fde2a1..e2ca11c 100644 --- a/src/modules/shared/components/language-switch.vue +++ b/src/modules/shared/components/language-switch.vue @@ -10,7 +10,6 @@ const setDisplayLanguage = (locale: MessageLanguages) => { if (ui_store.user_preferences !== undefined) { ui_store.user_preferences.display_language = locale; - console.log('triggered language change: ', ui_store.user_preferences.display_language); } } diff --git a/src/modules/timesheets/components/expense-dialog-form.vue b/src/modules/timesheets/components/expense-dialog-form.vue index 325ea56..0b66600 100644 --- a/src/modules/timesheets/components/expense-dialog-form.vue +++ b/src/modules/timesheets/components/expense-dialog-form.vue @@ -2,15 +2,15 @@ setup lang="ts" > + import { date } from 'quasar'; import { useI18n } from 'vue-i18n'; - import { computed, ref, watch } from 'vue'; - import { deepEqual } from 'src/utils/deep-equal'; + import { computed, ref } from 'vue'; import { useUiStore } from 'src/stores/ui-store'; import { useExpensesStore } from 'src/stores/expense-store'; import { useTimesheetStore } from 'src/stores/timesheet-store'; import { useExpensesApi } from 'src/modules/timesheets/composables/use-expense-api'; - import { convertToMonetaryAmount, getExpenseIcon, useExpenseRules } from 'src/modules/timesheets/utils/expense.util'; - import { type ExpenseType, TYPES_WITH_AMOUNT_ONLY } from 'src/modules/timesheets/models/expense.models'; + import { getExpenseIcon, useExpenseRules } from 'src/modules/timesheets/utils/expense.util'; + import { Expense, type ExpenseType, TYPES_WITH_AMOUNT_ONLY } from 'src/modules/timesheets/models/expense.models'; interface ExpenseOption { label: string; @@ -26,7 +26,6 @@ const files = defineModel('files'); const is_navigator_open = ref(false); - const is_initial_expense = ref(true); const COMMENT_MAX_LENGTH = 280; const rules = useExpenseRules(t); @@ -40,15 +39,9 @@ { label: t('timesheet.expense.types.MILEAGE'), value: 'MILEAGE', icon: getExpenseIcon('MILEAGE') }, { label: t('timesheet.expense.types.ON_CALL'), value: 'ON_CALL', icon: getExpenseIcon('ON_CALL') }, ] + const expense_selected = ref(expense_options.find(expense => expense.value == expenses_store.current_expense.type)); - const expense_monetary_string = ref(expenses_store.current_expense.amount.toString()); - - const emit = defineEmits<{ - 'onClickUpdateCancel': [void]; - 'onClickSaveUpdates': [void]; - }>(); - const openDatePicker = () => { is_navigator_open.value = true; if (expenses_store.current_expense.date === undefined) { @@ -64,21 +57,10 @@ const requestExpenseCreationOrUpdate = async () => { await expenses_api.upsertExpense(expenses_store.current_expense); - if (expenses_store.current_expense.id) { - emit('onClickSaveUpdates'); - } - + expenses_store.is_showing_create_form = true; + expenses_store.mode = 'create'; + expenses_store.current_expense = new Expense(date.formatDate(new Date(), 'YYYY-MM-DD')); }; - - const saveAndConvert = () => { - expenses_store.current_expense.amount = convertToMonetaryAmount(expense_monetary_string.value); - expense_monetary_string.value = expenses_store.current_expense.amount.toString(); - console.log('current expense amount: ', expenses_store.current_expense.amount); - } - - watch(expenses_store.current_expense, () => { - is_initial_expense.value = deepEqual(expenses_store.current_expense, expenses_store.initial_expense); - });