Also refactor mobile UI/UX for timesheet: reduced header bloat, made only shifts scrollable, added left or right swipe to travel between pay periods, showing default 'no data' message when beyond 6-month-back 1-month-forward timesheet scope.
65 lines
2.3 KiB
TypeScript
65 lines
2.3 KiB
TypeScript
import { date } from "quasar";
|
|
import { computed, ref } from "vue";
|
|
import { defineStore } from "pinia";
|
|
import { useTimesheetStore } from "src/stores/timesheet-store";
|
|
import { Expense } from "src/modules/timesheets/models/expense.models";
|
|
import { ExpenseService } from "src/modules/timesheets/services/expense-service";
|
|
|
|
export const useExpensesStore = defineStore('expenses', () => {
|
|
const timesheet_store = useTimesheetStore();
|
|
const is_open = ref(false);
|
|
const is_loading = ref(false);
|
|
const is_showing_create_form = ref(true);
|
|
const mode = ref<'create' | 'update' | 'delete'>('create');
|
|
const current_expense = ref<Expense>(new Expense(date.formatDate(new Date(), 'YYYY-MM-DD')));
|
|
const initial_expense = ref<Expense>(new Expense(date.formatDate(new Date(), 'YYYY-MM-DD')));
|
|
const is_save_disabled = computed(() => JSON.stringify(current_expense.value) === JSON.stringify(initial_expense.value))
|
|
|
|
const open = (): void => {
|
|
is_open.value = true;
|
|
if (timesheet_store.pay_period !== undefined) {
|
|
current_expense.value = new Expense(date.formatDate(new Date(), 'YYYY-MM-DD'));
|
|
initial_expense.value = new Expense(date.formatDate(new Date(), 'YYYY-MM-DD'));
|
|
}
|
|
mode.value = 'create';
|
|
}
|
|
|
|
const close = () => {
|
|
is_open.value = false;
|
|
is_showing_create_form.value = true;
|
|
};
|
|
|
|
const upsertExpense = async (expense: Expense): Promise<boolean> => {
|
|
try {
|
|
if (expense.id < 0) {
|
|
const data = await ExpenseService.createExpense(expense);
|
|
return data.success;
|
|
}
|
|
const data = await ExpenseService.updateExpense(expense);
|
|
return data.success;
|
|
} catch (err) {
|
|
// setErrorFrom(err);
|
|
console.error(err);
|
|
return false;
|
|
}
|
|
};
|
|
|
|
const deleteExpenseById = async (expense_id: number): Promise<boolean> => {
|
|
const data = await ExpenseService.deleteExpenseById(expense_id);
|
|
return data.success;
|
|
}
|
|
|
|
return {
|
|
is_open,
|
|
is_loading,
|
|
is_showing_create_form,
|
|
mode,
|
|
current_expense,
|
|
initial_expense,
|
|
is_save_disabled,
|
|
open,
|
|
upsertExpense,
|
|
deleteExpenseById,
|
|
close,
|
|
};
|
|
}); |