feat(approvals): Create timesheet approval page, begin scaffolding and building store, services, api, set up backend connecting logic

This commit is contained in:
Nicolas Drolet 2025-08-08 17:03:19 -04:00
parent 5a4cba5588
commit c1ce7e36cb
8 changed files with 36 additions and 34 deletions

View File

@ -13,8 +13,8 @@
// Tip: Use the "Theme Builder" on Quasar's documentation website. // Tip: Use the "Theme Builder" on Quasar's documentation website.
$primary: #019547; $primary: #019547;
$secondary: #EFFFEF; $secondary: #DAE0E7;
$accent: #4ada86; $accent: #81AFE3;
$dark-font: #305530; $dark-font: #305530;
$dark: #323232; $dark: #323232;

View File

@ -32,8 +32,8 @@ export default {
userMenuCalendar: 'Calendar', userMenuCalendar: 'Calendar',
}, },
notFoundPage: { notFoundPage: {
pageTitle: 'Oops. Nothing here...', pageText: 'We cannot seem to find the page you are looking for, sorry!',
backButton: 'Go to the home page', backButton: 'Take me back!',
}, },
loginPage: { loginPage: {
title: 'Log in to Targo', title: 'Log in to Targo',

View File

@ -171,8 +171,8 @@ export default {
userMenuCalendar: 'Calendrier annuel', userMenuCalendar: 'Calendrier annuel',
}, },
notFoundPage: { notFoundPage: {
pageTitle: 'Oops. Rien ici...', pageText: 'On ne semble pas trouver la page que vous cherchez, désolé!',
backButton: 'Aller à la page daccueil', backButton: 'Je veux retourner en arrière!',
}, },
notificationDialog: { notificationDialog: {
notice: 'Notification', notice: 'Notification',

View File

@ -1,5 +1,5 @@
import { useAuthStore } from "../../../stores/auth-store"; import { useAuthStore } from "../../../stores/auth-store";
import type { User } from "src/modules/users/types/user-interface"; import type { User } from "src/modules/shared/types/user-interface";
export const useAuthApi = () => { export const useAuthApi = () => {
const authStore = useAuthStore(); const authStore = useAuthStore();

View File

@ -1,8 +1,8 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, watch } from 'vue'; import { ref, watch } from 'vue';
import { useAuthApi } from '../composables/use-auth-api'; import { useAuthApi } from '../composables/use-auth-api';
import type { User } from 'src/modules/users/types/user-interface'; import type { User } from 'src/modules/shared/types/user-interface';
import { useRouter } from 'vue-router'; import { useRouter } from 'vue-router';
const authApi = useAuthApi(); const authApi = useAuthApi();

View File

@ -1,4 +1,4 @@
import type { User } from "src/modules/users/types/user-interface"; import type { User } from "src/modules/shared/types/user-interface";
export interface AuthState { export interface AuthState {
token: string; token: string;

View File

@ -3,25 +3,21 @@
</script> </script>
<template> <template>
<div class="fullscreen bg-blue text-white text-center q-pa-md flex flex-center"> <q-layout view="hHh lpR fFf">
<div> <q-page-container>
<div style="font-size: 30vh"> <q-page padding class="column justify-center items-center bg-secondary">
404 <q-card class="col-shrink rounded-20">
</div> <q-img src="src/assets/line-truck-1.jpg" height="20vh">
<div class="absolute-bottom text-h4 text-center text-weight-bolder justify-center items-center row">
<div class="text-h2" style="opacity:.4"> <div class="q-pr-md text-primary text-h3 text-weight-bolder">404</div>
Oops. Nothing here... PAGE NOT FOUND
</div>
<q-btn
class="q-mt-xl"
color="white"
text-color="blue"
unelevated
to="/"
label="Go Home"
no-caps
/>
</div>
</div> </div>
</q-img>
<q-card-section class="text-center text-h5 text-primary">
{{$t('notFoundPage.pageText')}}
</q-card-section>
</q-card>
</q-page>
</q-page-container>
</q-layout>
</template> </template>

View File

@ -1,4 +1,5 @@
import type { RouteRecordRaw } from 'vue-router'; import type { RouteRecordRaw } from 'vue-router';
import { RouteNames } from './router-constants';
const routes: RouteRecordRaw[] = [ const routes: RouteRecordRaw[] = [
{ {
@ -8,22 +9,27 @@ const routes: RouteRecordRaw[] = [
children: [ children: [
{ {
path: '', path: '',
name: 'dashboard', name: RouteNames.DASHBOARD,
component: () => import('src/pages/test-page.vue'), component: () => import('src/pages/test-page.vue'),
}, },
{
path: 'timesheet-approvals',
name: RouteNames.TIMESHEET_APPROVALS,
component: () => import('src/modules/timesheet-approval/pages/timesheet-approval.vue'),
},
], ],
}, },
{ {
path: '/v1/login', path: '/v1/login',
name: 'login', name: RouteNames.LOGIN,
component: () => import('src/modules/auth/pages/auth-login.vue'), component: () => import('src/modules/auth/pages/auth-login.vue'),
meta: { requiresAuth: false }, meta: { requiresAuth: false },
}, },
{ {
path: '/login-success', path: '/login-success',
name: 'login-success', name: RouteNames.LOGIN_SUCCESS,
component: () => import('src/modules/auth/pages/auth-login-popup-success.vue'), component: () => import('src/modules/auth/pages/auth-login-popup-success.vue'),
meta: { requiresAuth: false }, meta: { requiresAuth: false },
}, },