diff --git a/src/i18n/en-ca/index.ts b/src/i18n/en-ca/index.ts
index 85bf7a6..4a15e21 100644
--- a/src/i18n/en-ca/index.ts
+++ b/src/i18n/en-ca/index.ts
@@ -70,6 +70,7 @@ export default {
supervisor: "Supervisor",
company: "Company",
is_supervisor: "is a supervisor",
+ expected_daily_hours: "Expected Daily Hours",
active: "active",
inactive: "inactive",
},
@@ -81,7 +82,11 @@ export default {
access_label: "access",
details_label: "details",
schedule_label: "schedule",
+ can_be_entered_later: "OPTIONAL: can be entered later",
enter_delete_input: "type 'DELETE' to remove",
+ banked_hours: "available banked hours",
+ sick_hours: "available PTO hours",
+ vacation_hours: "available vacation hours",
schedule_presets: {
preset_list_placeholder: "Select a schedule",
preset_name_placeholder: "schedule preset name",
diff --git a/src/i18n/fr-ca/index.ts b/src/i18n/fr-ca/index.ts
index ea06f72..889de99 100644
--- a/src/i18n/fr-ca/index.ts
+++ b/src/i18n/fr-ca/index.ts
@@ -70,6 +70,7 @@ export default {
supervisor: "superviseur",
company: "Compagnie",
is_supervisor: "est un superviseur",
+ expected_daily_hours: "Heures quotidiennes attendues",
active: "actif",
inactive: "inactif",
},
@@ -81,7 +82,11 @@ export default {
access_label: "accès",
details_label: "détails",
schedule_label: "horaire",
+ can_be_entered_later: "FACULTATIF: peut être entré plus tard",
enter_delete_input: "tappez 'SUPPRIMER' pour confirmer",
+ banked_hours: "heures en banque disponibles",
+ sick_hours: "heures d'absence payées disponibles",
+ vacation_hours: "heures de vacances disponibles",
schedule_presets: {
preset_list_placeholder: "Sélectionner un horaire",
preset_name_placeholder: "nom de l'horaire",
diff --git a/src/modules/employee-list/components/add-modify-dialog-form-input.vue b/src/modules/employee-list/components/add-modify-dialog-form-input.vue
new file mode 100644
index 0000000..6c77b95
--- /dev/null
+++ b/src/modules/employee-list/components/add-modify-dialog-form-input.vue
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+ {{ label }}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/modules/employee-list/components/add-modify-dialog-form-select.vue b/src/modules/employee-list/components/add-modify-dialog-form-select.vue
new file mode 100644
index 0000000..d9357c1
--- /dev/null
+++ b/src/modules/employee-list/components/add-modify-dialog-form-select.vue
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+ {{ label }}
+
+
+
+
\ No newline at end of file
diff --git a/src/modules/employee-list/components/add-modify-dialog-form.vue b/src/modules/employee-list/components/add-modify-dialog-form.vue
index d1db2c4..e8bc481 100644
--- a/src/modules/employee-list/components/add-modify-dialog-form.vue
+++ b/src/modules/employee-list/components/add-modify-dialog-form.vue
@@ -2,6 +2,9 @@
setup
lang="ts"
>
+ import AddModifyDialogFormInput from 'src/modules/employee-list/components/add-modify-dialog-form-input.vue';
+ import AddModifyDialogFormSelect from 'src/modules/employee-list/components/add-modify-dialog-form-select.vue';
+
import { ref, computed } from 'vue';
import { useEmployeeStore } from 'src/stores/employee-store';
@@ -20,7 +23,7 @@
return supervisors.map(supervisor => supervisor.first_name + ' ' + supervisor.last_name);
})
- const setLastWorkDay = (date: string | number | null) => {
+ const setLastWorkDay = (date: string | number | null | undefined) => {
if (typeof date === 'string' && date.length > 0) {
employee_store.employee.last_work_day = date;
}
@@ -54,260 +57,124 @@
class="q-ma-xs"
:class="$q.screen.lt.sm ? 'column' : 'row'"
>
-
-
-
- {{ $t('profile.personal.first_name') }}
-
-
-
+ :label="$t('profile.personal.first_name')"
+ />
-
-
-
- {{ $t('profile.personal.last_name') }}
-
-
-
+ :label="$t('profile.personal.last_name')"
+ />
-
-
-
- {{ $t('profile.employee.email') }}
-
-
-
+ :label="$t('profile.employee.email')"
+ />
-
-
-
- {{ $t('profile.personal.phone_number') }}
-
-
-
+ :label="$t('profile.personal.phone_number')"
+ />
-
-
-
- {{ $t('profile.employee.job_title') }}
-
-
-
+ :label="$t('profile.employee.job_title')"
+ />
-
-
-
- {{ $t('profile.employee.company') }}
-
-
-
+ :label="$t('profile.employee.company')"
+ />
-
-
-
- {{ $t('profile.employee.supervisor') }}
-
-
-
+ :label="$t('profile.employee.supervisor')"
+ />
-
-
-
- {{ $t('profile.employee.bankroll_id') }}
-
-
-
+ :label="$t('profile.employee.bankroll_id')"
+ :placeholder="$t('employee_management.can_be_entered_later')"
+ />
+
+
+
+
+
-
-
-
- {{ $t('profile.employee.hired_date') }}
-
-
+ />
-
-
-
-
-
-
-
-
-
-
-
-
- {{ $t('profile.employee.fired_date') }}
-
-
-
-
-
-
-
-
-
-
-
+ />
diff --git a/src/modules/employee-list/components/employee-list-table-item.vue b/src/modules/employee-list/components/employee-list-table-item.vue
index a94d980..1aef68e 100644
--- a/src/modules/employee-list/components/employee-list-table-item.vue
+++ b/src/modules/employee-list/components/employee-list-table-item.vue
@@ -4,7 +4,7 @@
>
import { useQuasar } from 'quasar';
import type { EmployeeProfile } from 'src/modules/employee-list/models/employee-profile.models';
-import { ref } from 'vue';
+ import { ref } from 'vue';
const q = useQuasar();
const is_mouseover = ref(false);
@@ -22,7 +22,7 @@ import { ref } from 'vue';
const getItemStyle = (): string => {
const active_style = row.last_work_day === null ? '' : 'opacity: 0.6;';
const dark_style = q.dark.isActive ? 'border: 2px solid var(--q-accent);' : '';
- const hover_style = isManagement ? (is_mouseover.value ? `transform: scale(1.1); z-index: 2;` :'transform: scale(1) skew(0)') : '';
+ const hover_style = isManagement ? (is_mouseover.value ? `transform: scale(1.1); z-index: 2;` : 'transform: scale(1) skew(0)') : '';
return `${active_style} ${dark_style} ${hover_style}`;
}
@@ -36,7 +36,7 @@ import { ref } from 'vue';
-
{{ row.job_title }}
+
+
{{ row.job_title }}
- {{ row.email }}
+
+
+ {{ row.phone_number }}
+
+
+
extension:
+
+
{{ row.email }}
-
\ No newline at end of file
diff --git a/src/modules/employee-list/components/employee-list-table.vue b/src/modules/employee-list/components/employee-list-table.vue
index 5af2c2a..6b574ce 100644
--- a/src/modules/employee-list/components/employee-list-table.vue
+++ b/src/modules/employee-list/components/employee-list-table.vue
@@ -19,7 +19,7 @@
const is_management = auth_store.user?.user_module_access.includes('employee_management') ?? false;
- const visible_columns = ref<(keyof EmployeeProfile)[]>(['first_name', 'email', 'job_title', 'last_work_day']);
+ const visible_columns = ref<(keyof EmployeeProfile)[]>(['first_name', 'email', 'job_title', 'phone_number', 'last_work_day']);
const table_grid_container = ref(null);
@@ -28,6 +28,10 @@
hide_inactive_users: true,
});
+ const { maxHeight } = defineProps<{
+ maxHeight: number;
+ }>();
+
const filterEmployeeRows = (rows: readonly EmployeeProfile[], terms: EmployeeListFilters, _cols: readonly QTableColumn[]): EmployeeProfile[] => {
let result = [...rows];
@@ -63,7 +67,7 @@
-
+
\ No newline at end of file
diff --git a/src/modules/employee-list/models/employee-profile.models.ts b/src/modules/employee-list/models/employee-profile.models.ts
index ff92bc9..ec414ff 100644
--- a/src/modules/employee-list/models/employee-profile.models.ts
+++ b/src/modules/employee-list/models/employee-profile.models.ts
@@ -4,6 +4,13 @@ import type { UserModuleAccess } from "src/modules/shared/models/user.models";
export type ModuleAccessPreset = 'admin' | 'supervisor' | 'employee' | 'none';
export type CompanyNames = 'Targo' | 'Solucom';
+export interface PaidTimeOff {
+ sick_hours: number;
+ vacation_hours: number;
+ banked_hours: number;
+ last_updated: string;
+}
+
export class EmployeeProfile {
first_name: string;
last_name: string;
@@ -14,7 +21,9 @@ export class EmployeeProfile {
phone_number: string;
first_work_day: string;
last_work_day?: string | null;
- external_payroll_id: number;
+ external_payroll_id?: number;
+ daily_expected_hours?: number;
+ paid_time_off?: PaidTimeOff;
residence: string;
birth_date: string;
is_supervisor: boolean;
@@ -34,7 +43,6 @@ export class EmployeeProfile {
this.residence = '';
this.birth_date = '';
this.is_supervisor = false;
- this.external_payroll_id = 999;
this.user_module_access = ['dashboard',];
}
}
@@ -80,11 +88,24 @@ export const employee_list_columns: QTableColumn[] = [
align: 'left',
sortable: true,
},
+ {
+ name: 'phone_number',
+ label: 'employee_list.table.phone_number',
+ field: 'phone_number',
+ align: 'left',
+ sortable: true,
+ },
{
name: 'job_title',
label: 'employee_list.table.role',
field: 'job_title',
align: 'left',
+ },
+ {
+ name: 'expected_daily_hours',
+ label: 'employee_list.table.expected_daily_hours',
+ field: 'daily_expected_hours',
+ align: 'left',
},
{
name: 'last_work_day',
diff --git a/src/modules/timesheet-approval/components/overview-list-item.vue b/src/modules/timesheet-approval/components/overview-list-item.vue
index b943aec..f770ef3 100644
--- a/src/modules/timesheet-approval/components/overview-list-item.vue
+++ b/src/modules/timesheet-approval/components/overview-list-item.vue
@@ -7,9 +7,8 @@
const modelApproval = defineModel();
- const { row, index = 0 } = defineProps<{
+ const { row } = defineProps<{
row: TimesheetApprovalOverview;
- index?: number;
}>();
const emit = defineEmits<{
@@ -26,7 +25,7 @@
>
timesheet_store.pay_period_overviews.filter(overview => overview));
const overview_filters = ref({
is_showing_inactive: false,
- is_showing_team_only: false,
+ is_showing_team_only: true,
supervisors: [],
name_search_string: '',
});
@@ -88,12 +88,14 @@ import { useUiStore } from 'src/stores/ui-store';
return result;
};
- const getListViewTimeClass = (column_name: OverviewColumns, value: number) => {
- if(WARNING_COLUMNS.includes(column_name) && value > 0)
- return 'bg-warning text-white rounded-5';
+ const getListViewTimeCss = (column_name: OverviewColumns, value: number): { classes: string, style: string } => {
+ if (WARNING_COLUMNS.includes(column_name) && value > 0)
+ return { classes: 'bg-warning text-white rounded-5', style: '' };
- if(NEGATIVE_COLUMNS.includes(column_name) && value > 0)
- return 'bg-negative text-white text-bold rounded-5';
+ if (NEGATIVE_COLUMNS.includes(column_name) && value > 0)
+ return { classes: 'bg-negative text-white text-bold rounded-5', style: '' };
+
+ return { classes: '', style: '' }
}
@@ -104,6 +106,7 @@ import { useUiStore } from 'src/stores/ui-store';
dense
row-key="email"
color="accent"
+ separator="none"
hide-pagination
:rows="overview_rows"
:columns="pay_period_overview_columns"
@@ -123,7 +126,7 @@ import { useUiStore } from 'src/stores/ui-store';
:loading-label="$t('shared.label.loading')"
table-header-style="min-width: 80xp; max-width: 80px;"
:style="overview_rows.length > 0 ? `max-height: ${maxHeight - (ui_store.user_preferences.is_timesheet_approval_grid ? 0 : 20)}px;` : ''"
- :table-style="{ tableLayout: 'fixed'}"
+ :table-style="{ tableLayout: 'fixed' }"
@row-click="(_evt, row: TimesheetApprovalOverview) => onClickedDetails(row)"
>
@@ -278,17 +281,16 @@ import { useUiStore } from 'src/stores/ui-store';
{{ props.row.employee_last_name }}
-
+
{{
getHoursMinutesStringFromHoursFloat((props.value[Number(props.col.name.slice(-1,)) -
- 1]) ?? 0) }}
+ 1]) ?? 0) }}
@@ -296,7 +298,6 @@ import { useUiStore } from 'src/stores/ui-store';
{{ getHoursMinutesStringFromHoursFloat(props.value) }}
@@ -305,7 +306,7 @@ import { useUiStore } from 'src/stores/ui-store';
{{ TIME_COLUMNS.includes(props.col.name) ?
getHoursMinutesStringFromHoursFloat(props.value) : props.value }}
@@ -320,7 +321,6 @@ import { useUiStore } from 'src/stores/ui-store';
onClickApproveAll(props.row.email, is_approved)"
@@ -347,7 +347,10 @@ import { useUiStore } from 'src/stores/ui-store';
-