refactor: employee new img dialog

This commit is contained in:
puriphatt 2024-09-11 16:53:08 +07:00
parent 893b0a8c2a
commit 685ad0cc54
7 changed files with 254 additions and 57 deletions

View file

@ -95,7 +95,7 @@ watch(
name="mdi-passport" name="mdi-passport"
style="background-color: var(--surface-3)" style="background-color: var(--surface-3)"
/> />
{{ $t(`${title}`) }} {{ title }}
</div> </div>
<div class="col-12 row q-col-gutter-sm"> <div class="col-12 row q-col-gutter-sm">

View file

@ -1,5 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { calculateAge, dateFormat } from 'src/utils/datetime'; import { calculateAge, dateFormat } from 'src/utils/datetime';
import { baseUrl } from 'src/stores/utils';
import PersonCard from 'components/shared/PersonCard.vue'; import PersonCard from 'components/shared/PersonCard.vue';
import KebabAction from '../shared/KebabAction.vue'; import KebabAction from '../shared/KebabAction.vue';
@ -121,7 +122,7 @@ defineEmits<{
<q-avatar size="md"> <q-avatar size="md">
<q-img <q-img
:src=" :src="
props.row.profileImageUrl || `${baseUrl}/employee/${props.row.id}/image/${props.row.selectedImage}` ||
'/images/employee-avatar.png' '/images/employee-avatar.png'
" "
class="text-center" class="text-center"
@ -248,7 +249,10 @@ defineEmits<{
$i18n.locale === 'eng' $i18n.locale === 'eng'
? `${props.row.firstNameEN} ${props.row.lastNameEN} `.trim() ? `${props.row.firstNameEN} ${props.row.lastNameEN} `.trim()
: `${props.row.firstName} ${props.row.lastName} `.trim(), : `${props.row.firstName} ${props.row.lastName} `.trim(),
img: props.row.profileImageUrl || '/images/employee-avatar.png', img:
`${baseUrl}/employee/${props.row.id}/image/${props.row.selectedImage}` ||
'/images/employee-avatar.png',
fallbackImg: '/images/employee-avatar.png',
male: props.row.gender === 'male', male: props.row.gender === 'male',
female: props.row.gender === 'female', female: props.row.gender === 'female',
detail: [ detail: [

View file

@ -273,7 +273,7 @@ onMounted(() => {
'-' + ' ' + scope.opt.customer.lastName '-' + ' ' + scope.opt.customer.lastName
}} }}
{{ $t('address') }} {{ $t('general.address') }}
{{ {{
$i18n.locale === 'eng' $i18n.locale === 'eng'
? `${scope.opt.addressEN || ''} ${scope.opt.subDistrict.nameEN || ''} ${scope.opt.district.nameEN || ''} ${scope.opt.province.nameEN || ''}` ? `${scope.opt.addressEN || ''} ${scope.opt.subDistrict.nameEN || ''} ${scope.opt.district.nameEN || ''} ${scope.opt.province.nameEN || ''}`

View file

@ -483,7 +483,11 @@ async function openHistory(id: string) {
async function editCustomerForm(id: string) { async function editCustomerForm(id: string) {
await customerFormStore.assignFormData(id); await customerFormStore.assignFormData(id);
await fetchListOfOptionBranch(); await fetchListOfOptionBranch();
await fetchImageList(id, customerFormData.value.selectedImage || ''); await fetchImageList(
id,
customerFormData.value.selectedImage || '',
'customer',
);
customerFormState.value.dialogType = 'edit'; customerFormState.value.dialogType = 'edit';
customerFormState.value.drawerModal = true; customerFormState.value.drawerModal = true;
customerFormState.value.editCustomerId = id; customerFormState.value.editCustomerId = id;
@ -491,6 +495,11 @@ async function editCustomerForm(id: string) {
async function editEmployeeFormPersonal(id: string) { async function editEmployeeFormPersonal(id: string) {
await employeeFormStore.assignFormDataEmployee(id); await employeeFormStore.assignFormDataEmployee(id);
await fetchImageList(
id,
currentFromDataEmployee.value.selectedImage || '',
'employee',
);
employeeFormState.value.isEmployeeEdit = true; employeeFormState.value.isEmployeeEdit = true;
employeeFormState.value.dialogType = 'edit'; employeeFormState.value.dialogType = 'edit';
employeeFormState.value.drawerModal = true; employeeFormState.value.drawerModal = true;
@ -506,6 +515,7 @@ function employeeConfirmUnsave(close = true) {
message: t('form.warning.unsave'), message: t('form.warning.unsave'),
action: () => { action: () => {
employeeFormStore.resetFormDataEmployee(); employeeFormStore.resetFormDataEmployee();
onCreateImageList.value = { selectedImage: '', list: [] };
employeeFormState.value.editReadonly = true; employeeFormState.value.editReadonly = true;
employeeFormState.value.dialogModal = !close; employeeFormState.value.dialogModal = !close;
employeeFormState.value.drawerModal = !close; employeeFormState.value.drawerModal = !close;
@ -572,12 +582,20 @@ function returnCountryCode(country: string) {
return tempValue?.value; return tempValue?.value;
} }
async function fetchImageList(id: string, selectedName: string) { async function fetchImageList(
const res = await customerStore.fetchImageListById(id); id: string,
selectedName: string,
type: 'customer' | 'employee',
) {
const res =
type === 'customer'
? await customerStore.fetchImageListById(id)
: await employeeStore.fetchImageListById(id);
imageList.value = { imageList.value = {
selectedImage: selectedName, selectedImage: selectedName,
list: res.map((n: string) => `customer/${id}/image/${n}`), list: res.map((n: string) => `${type}/${id}/image/${n}`),
}; };
return res; return res;
} }
@ -1354,12 +1372,17 @@ const emptyCreateDialog = ref(false);
:columns-employee="columnsEmployee" :columns-employee="columnsEmployee"
@history="(item: any) => {}" @history="(item: any) => {}"
@view=" @view="
(item: any) => { async (item: any) => {
employeeFormState.drawerModal = true; employeeFormState.drawerModal = true;
employeeFormState.isEmployeeEdit = false; employeeFormState.isEmployeeEdit = false;
employeeFormStore.assignFormDataEmployee( employeeFormStore.assignFormDataEmployee(
item.id, item.id,
); );
await fetchImageList(
item.id,
item.selectedImage || '',
'employee',
);
} }
" "
@edit=" @edit="
@ -1548,10 +1571,15 @@ const emptyCreateDialog = ref(false);
:field-selected="fieldSelected" :field-selected="fieldSelected"
@history="(item: any) => {}" @history="(item: any) => {}"
@view=" @view="
(item: any) => { async (item: any) => {
employeeFormState.drawerModal = true; employeeFormState.drawerModal = true;
employeeFormState.isEmployeeEdit = false; employeeFormState.isEmployeeEdit = false;
employeeFormStore.assignFormDataEmployee(item.id); employeeFormStore.assignFormDataEmployee(item.id);
await fetchImageList(
item.id,
item.selectedImage || '',
'employee',
);
} }
" "
@edit="(item: any) => editEmployeeFormPersonal(item.id)" @edit="(item: any) => editEmployeeFormPersonal(item.id)"
@ -1702,7 +1730,12 @@ const emptyCreateDialog = ref(false);
no-app-box no-app-box
width="40vw" width="40vw"
height="250px" height="250px"
:close="() => (emptyCreateDialog = false)" :close="
() => {
emptyCreateDialog = false;
onCreateImageList = { selectedImage: '', list: [] };
}
"
> >
<div class="full-height row q-pa-md"> <div class="full-height row q-pa-md">
<ItemCard <ItemCard
@ -1730,10 +1763,16 @@ const emptyCreateDialog = ref(false);
:on-open=" :on-open="
async () => { async () => {
customerFormStore.resetForm(customerFormState.dialogType === 'create'); customerFormStore.resetForm(customerFormState.dialogType === 'create');
onCreateImageList = { selectedImage: '', list: [] };
await fetchListOfOptionBranch(); await fetchListOfOptionBranch();
} }
" "
:on-close="() => (customerFormState.dialogModal = false)" :on-close="
() => {
customerFormState.dialogModal = false;
onCreateImageList = { selectedImage: '', list: [] };
}
"
> >
<template #header> <template #header>
<DialogHeader <DialogHeader
@ -2036,7 +2075,6 @@ const emptyCreateDialog = ref(false);
</DialogContainer> </DialogContainer>
<!-- add employee --> <!-- add employee -->
<DialogForm <DialogForm
hideFooter hideFooter
:title="$t('form.title.create', { name: $t('customer.employee') })" :title="$t('form.title.create', { name: $t('customer.employee') })"
@ -2045,7 +2083,7 @@ const emptyCreateDialog = ref(false);
:submit=" :submit="
async () => { async () => {
if (employeeFormState.currentTab === 'personalInfo') { if (employeeFormState.currentTab === 'personalInfo') {
await employeeFormStore.submitPersonal(); await employeeFormStore.submitPersonal(onCreateImageList);
employeeFormState.isEmployeeEdit = false; employeeFormState.isEmployeeEdit = false;
employeeFormState.dialogType = 'info'; employeeFormState.dialogType = 'info';
} }
@ -2125,8 +2163,15 @@ const emptyCreateDialog = ref(false);
:menu="formMenuIconEmployee" :menu="formMenuIconEmployee"
:toggleTitle="$t('status.title')" :toggleTitle="$t('status.title')"
hideFade hideFade
@view="employeeFormState.imageDialog = true" @view="
@edit="dialogEmployeeImageUpload && dialogEmployeeImageUpload.browse()" () => {
employeeFormState.imageDialog = true;
employeeFormState.isImageEdit = false;
}
"
@edit="
employeeFormState.imageDialog = employeeFormState.isImageEdit = true
"
@update:toggle-status=" @update:toggle-status="
() => { () => {
currentFromDataEmployee.status = currentFromDataEmployee.status =
@ -2679,6 +2724,7 @@ const emptyCreateDialog = ref(false);
await fetchImageList( await fetchImageList(
customerFormState.editCustomerId, customerFormState.editCustomerId,
customerFormData.selectedImage || '', customerFormData.selectedImage || '',
'customer',
); );
} }
" "
@ -2691,7 +2737,11 @@ const emptyCreateDialog = ref(false);
customerFormState.editCustomerId, customerFormState.editCustomerId,
name, name,
); );
await fetchImageList(customerFormState.editCustomerId, name); await fetchImageList(
customerFormState.editCustomerId,
name,
'customer',
);
} }
" "
@submit=" @submit="
@ -2768,16 +2818,70 @@ const emptyCreateDialog = ref(false);
v-model:dialog-state="employeeFormState.imageDialog" v-model:dialog-state="employeeFormState.imageDialog"
v-model:file="currentFromDataEmployee.image" v-model:file="currentFromDataEmployee.image"
v-model:image-url="employeeFormState.profileUrl" v-model:image-url="employeeFormState.profileUrl"
:hidden-footer=" v-model:data-list="imageList"
!currentFromDataEmployee.image || !employeeFormState.profileUrl v-model:on-create-data-list="onCreateImageList"
:on-create="employeeFormState.dialogModal"
:hiddenFooter="!employeeFormState.isImageEdit"
@add-image="
async (v) => {
if (!v) return;
if (!currentFromDataEmployee.id) return;
await employeeStore.addImageList(
v,
currentFromDataEmployee.id,
Date.now(),
);
await fetchImageList(
currentFromDataEmployee.id,
currentFromDataEmployee.selectedImage || '',
'employee',
);
}
" "
clear-button @remove-image="
@save=" async (v) => {
async () => { if (!v) return;
await employeeFormStore.submitPersonal(); if (!currentFromDataEmployee.id) return;
const name = v.split('/').pop() || '';
await employeeStore.deleteImageByName(currentFromDataEmployee.id, name);
await fetchImageList(currentFromDataEmployee.id, name, 'employee');
}
"
@submit="
async (v) => {
if (employeeFormState.dialogModal) {
employeeFormState.profileUrl = v;
employeeFormState.imageDialog = false;
} else {
refreshImageState = true;
employeeFormState.dialogType = 'edit';
currentFromDataEmployee.selectedImage = v;
imageList ? (imageList.selectedImage = v) : '';
employeeFormState.profileUrl = `${baseUrl}/employee/${currentFromDataEmployee.id && currentFromDataEmployee.id}/image/${v}`;
employeeFormStore.resetFormDataEmployee();
await employeeFormStore.submitPersonal();
employeeFormState.imageDialog = false;
refreshImageState = false;
employeeFormState.isEmployeeEdit = false;
employeeFormState.dialogType = 'info';
await fetchListEmployee();
}
} }
" "
> >
<template #title>
<span
v-if="!employeeFormState.dialogModal"
class="justify-center flex text-bold"
>
{{ $t('general.image') }}
{{
$i18n.locale === 'eng'
? `${currentFromDataEmployee.firstNameEN} ${currentFromDataEmployee.lastNameEN}`
: `${currentFromDataEmployee.firstName} ${currentFromDataEmployee.lastName}`
}}
</span>
</template>
<template #error> <template #error>
<div class="full-height full-width" style="background: white"> <div class="full-height full-width" style="background: white">
<div <div
@ -3194,10 +3298,14 @@ const emptyCreateDialog = ref(false);
<div class="q-px-lg q-pt-lg surface-2"> <div class="q-px-lg q-pt-lg surface-2">
<ProfileBanner <ProfileBanner
hideFade hideFade
:readonly="!employeeFormState.isEmployeeEdit" @view="
@view="employeeFormState.imageDialog = true" () => {
employeeFormState.imageDialog = true;
employeeFormState.isImageEdit = false;
}
"
@edit=" @edit="
dialogEmployeeImageUpload && dialogEmployeeImageUpload.browse() employeeFormState.imageDialog = employeeFormState.isImageEdit = true
" "
@update:toggle-status=" @update:toggle-status="
(v) => { (v) => {
@ -3225,7 +3333,11 @@ const emptyCreateDialog = ref(false);
: '-' : '-'
" "
:caption="currentFromDataEmployee.code" :caption="currentFromDataEmployee.code"
:img="employeeFormState.profileUrl || '/images/employee-avatar.png'" :img="
`${baseUrl}/employee/${currentFromDataEmployee.id}/image/${currentFromDataEmployee.selectedImage}`.concat(
refreshImageState ? `?ts=${Date.now()}` : '',
) || null
"
:fallbackImg="'/images/employee-avatar.png'" :fallbackImg="'/images/employee-avatar.png'"
:tabs-list="[ :tabs-list="[
{ {
@ -3436,7 +3548,7 @@ const emptyCreateDialog = ref(false);
dense dense
outlined outlined
separator separator
:title="'customerEmployee.form.group.passport'" :title="$t('customerEmployee.form.group.passport')"
:readonly="!employeeFormState.isEmployeeEdit" :readonly="!employeeFormState.isEmployeeEdit"
v-model:passport-type="currentFromDataEmployee.passportType" v-model:passport-type="currentFromDataEmployee.passportType"
v-model:passport-number="currentFromDataEmployee.passportNumber" v-model:passport-number="currentFromDataEmployee.passportNumber"
@ -3575,7 +3687,7 @@ const emptyCreateDialog = ref(false);
outlined outlined
separator separator
ocr ocr
:title="'customerEmployee.form.group.passport'" :title="$t('customerEmployee.form.group.passport')"
:readonly="!employeeFormState.isEmployeeEdit" :readonly="!employeeFormState.isEmployeeEdit"
v-model:passport-type=" v-model:passport-type="
currentFromDataEmployee.passportType currentFromDataEmployee.passportType

View file

@ -9,9 +9,10 @@ import useCustomerStore from 'stores/customer';
import useEmployeeStore from 'stores/employee'; import useEmployeeStore from 'stores/employee';
import useFlowStore from 'stores/flow'; import useFlowStore from 'stores/flow';
import { baseUrl } from 'src/stores/utils';
export const useCustomerForm = defineStore('form-customer', () => { export const useCustomerForm = defineStore('form-customer', () => {
const { t } = useI18n(); const { t } = useI18n();
const apiBaseUrl = import.meta.env.VITE_API_BASE_URL;
const customerStore = useCustomerStore(); const customerStore = useCustomerStore();
const branchStore = useMyBranch(); const branchStore = useMyBranch();
@ -133,8 +134,8 @@ export const useCustomerForm = defineStore('form-customer', () => {
state.value.dialogType = 'edit'; state.value.dialogType = 'edit';
state.value.editCustomerId = id; state.value.editCustomerId = id;
state.value.editCustomerCode = data.code; state.value.editCustomerCode = data.code;
state.value.customerImageUrl = `${apiBaseUrl}/customer/${id}/image/${data.selectedImage}`; state.value.customerImageUrl = `${baseUrl}/customer/${id}/image/${data.selectedImage}`;
state.value.defaultCustomerImageUrl = `${apiBaseUrl}/customer/${id}/image/${data.selectedImage}`; state.value.defaultCustomerImageUrl = `${baseUrl}/customer/${id}/image/${data.selectedImage}`;
resetFormData.registeredBranchId = data.registeredBranchId; resetFormData.registeredBranchId = data.registeredBranchId;
resetFormData.code = data.code || ''; resetFormData.code = data.code || '';
@ -487,6 +488,7 @@ export const useEmployeeForm = defineStore('form-employee', () => {
currentTab: string; currentTab: string;
dialogModal: boolean; dialogModal: boolean;
drawerModal: boolean; drawerModal: boolean;
isImageEdit: boolean;
currentEmployeeCode: string; currentEmployeeCode: string;
currentEmployee: Employee | null; currentEmployee: Employee | null;
@ -519,6 +521,7 @@ export const useEmployeeForm = defineStore('form-employee', () => {
| undefined; | undefined;
ocr: boolean; ocr: boolean;
}>({ }>({
isImageEdit: false,
currentIndex: -1, currentIndex: -1,
statusSavePersonal: false, statusSavePersonal: false,
drawerModal: false, drawerModal: false,
@ -541,7 +544,6 @@ export const useEmployeeForm = defineStore('form-employee', () => {
const defaultFormData: EmployeeCreate = { const defaultFormData: EmployeeCreate = {
id: '', id: '',
code: '', code: '',
image: null,
customerBranchId: '', customerBranchId: '',
nrcNo: '', nrcNo: '',
dateOfBirth: null, dateOfBirth: null,
@ -623,6 +625,7 @@ export const useEmployeeForm = defineStore('form-employee', () => {
motherLastNameEN: '', motherLastNameEN: '',
motherBirthPlace: '', motherBirthPlace: '',
}, },
image: null,
}; };
let resetEmployeeData = structuredClone(defaultFormData); let resetEmployeeData = structuredClone(defaultFormData);
@ -650,6 +653,9 @@ export const useEmployeeForm = defineStore('form-employee', () => {
resetEmployeeData = structuredClone(defaultFormData); resetEmployeeData = structuredClone(defaultFormData);
state.value.statusSavePersonal = false; state.value.statusSavePersonal = false;
state.value.profileUrl = ''; state.value.profileUrl = '';
} else {
resetEmployeeData.selectedImage =
currentFromDataEmployee.value.selectedImage;
} }
currentFromDataEmployee.value = structuredClone(resetEmployeeData); currentFromDataEmployee.value = structuredClone(resetEmployeeData);
} }
@ -790,16 +796,22 @@ export const useEmployeeForm = defineStore('form-employee', () => {
await assignFormDataEmployee(currentFromDataEmployee.value.id); await assignFormDataEmployee(currentFromDataEmployee.value.id);
} }
async function submitPersonal() { async function submitPersonal(imgList?: {
selectedImage: string;
list: { url: string; imgFile: File | null; name: string }[];
}) {
if (state.value.dialogType === 'create') { if (state.value.dialogType === 'create') {
const res = await employeeStore.create({ const res = await employeeStore.create(
...currentFromDataEmployee.value, {
customerBranchId: state.value.formDataEmployeeOwner?.id || '', ...currentFromDataEmployee.value,
customerBranchId: state.value.formDataEmployeeOwner?.id || '',
employeeWork: [], employeeWork: [],
employeeCheckup: [], employeeCheckup: [],
employeeOtherInfo: undefined, employeeOtherInfo: undefined,
}); },
imgList,
);
if (res) { if (res) {
await assignFormDataEmployee(res.id); await assignFormDataEmployee(res.id);
@ -898,7 +910,6 @@ export const useEmployeeForm = defineStore('form-employee', () => {
}), }),
) )
: [], : [],
image: null,
}; };
currentFromDataEmployee.value = structuredClone(resetEmployeeData); currentFromDataEmployee.value = structuredClone(resetEmployeeData);
@ -908,7 +919,8 @@ export const useEmployeeForm = defineStore('form-employee', () => {
state.value.currentEmployeeCode = payload.code; state.value.currentEmployeeCode = payload.code;
state.value.profileUrl = profileImageUrl || ''; state.value.profileUrl =
`${baseUrl}/employee/${id}/image/${_data.selectedImage}` || '';
profileImageUrl profileImageUrl
? (state.value.profileSubmit = true) ? (state.value.profileSubmit = true)

View file

@ -63,25 +63,81 @@ const useEmployeeStore = defineStore('api-employee', () => {
return false; return false;
} }
async function create(data: EmployeeCreate) { async function fetchImageListById(
id: string,
flow?: {
sessionId?: string;
refTransactionId?: string;
transactionId?: string;
},
) {
const res = await api.get(`/employee/${id}/image`, {
headers: {
'X-Session-Id': flow?.sessionId,
'X-Rtid': flow?.refTransactionId || flowStore.rtid,
'X-Tid': flow?.transactionId,
},
});
if (!res) return false;
if (res.status === 200) return res.data;
if (res.status === 204) return null;
return false;
}
async function addImageList(file: File, customerId: string, name: string) {
await api
.put(`/employee/${customerId}/image/${name}`, file, {
headers: { 'Content-Type': file.type },
onUploadProgress: (e) => console.log(e),
})
.catch((e) => console.error(e));
return name;
}
async function deleteImageByName(
id: string,
name: string,
flow?: {
sessionId?: string;
refTransactionId?: string;
transactionId?: string;
},
) {
const res = await api.delete(`/employee/${id}/image/${name}`, {
headers: {
'X-Session-Id': flow?.sessionId,
'X-Rtid': flow?.refTransactionId || flowStore.rtid,
'X-Tid': flow?.transactionId,
},
});
if (!res) return false;
}
async function create(
data: EmployeeCreate,
imgList: {
selectedImage: string;
list: { url: string; imgFile: File | null; name: string }[];
},
) {
const { id, code, image, file, zipCode, ...payload } = data; const { id, code, image, file, zipCode, ...payload } = data;
const res = await api.post< const res = await api.post<
Employee & { profileImageUrl: string; profileImageUploadUrl: string } Employee & { profileImageUrl: string; profileImageUploadUrl: string }
>('/employee', payload, { >(
headers: { 'X-Rtid': flowStore.rtid }, '/employee',
}); { ...payload, selectedImage: imgList.selectedImage },
{
headers: { 'X-Rtid': flowStore.rtid },
},
);
if (!res) return false; if (!res) return false;
if (res.data.id) { if (res.data.id) {
if (image) {
await api
.put(`/employee/${res.data.id}/image`, image, {
headers: { 'Content-Type': image?.type },
onUploadProgress: (e) => console.log(e),
})
.catch((e) => console.error(e));
}
if (file) { if (file) {
const attachmentUpload = file.map(async ({ group, file }) => { const attachmentUpload = file.map(async ({ group, file }) => {
if (file) { if (file) {
@ -97,6 +153,13 @@ const useEmployeeStore = defineStore('api-employee', () => {
}); });
await Promise.all(attachmentUpload); await Promise.all(attachmentUpload);
} }
if (imgList.list.length > 0 && res.data.id) {
for (let index = 0; index < imgList.list.length; index++) {
const imgFile = imgList.list[index].imgFile;
if (imgFile)
await addImageList(imgFile, res.data.id, imgList.list[index].name);
}
}
} }
return res.data; return res.data;
@ -392,7 +455,7 @@ const useEmployeeStore = defineStore('api-employee', () => {
fetch(res.data) fetch(res.data)
.then(async (res) => await res.blob()) .then(async (res) => await res.blob())
.then((blob) => { .then((blob) => {
let a = document.createElement('a'); const a = document.createElement('a');
a.download = filename; a.download = filename;
a.href = window.URL.createObjectURL(blob); a.href = window.URL.createObjectURL(blob);
a.click(); a.click();
@ -434,6 +497,11 @@ const useEmployeeStore = defineStore('api-employee', () => {
fetchById, fetchById,
fetchList, fetchList,
fetchImageListById,
addImageList,
deleteImageByName,
create, create,
editById, editById,
deleteById, deleteById,

View file

@ -5,6 +5,7 @@ import { User } from '../user/types';
import { Customer, CustomerBranch } from '../customer/types'; import { Customer, CustomerBranch } from '../customer/types';
export type Employee = { export type Employee = {
selectedImage?: string;
id: string; id: string;
code: string; code: string;
nrcNo: string; nrcNo: string;
@ -50,7 +51,6 @@ export type Employee = {
subDistrict: SubDistrict | null; subDistrict: SubDistrict | null;
district: District | null; district: District | null;
province: Province | null; province: Province | null;
profileImageUrl: string | null;
customerBranch: CustomerBranch & { customer: Customer }; customerBranch: CustomerBranch & { customer: Customer };
employeeWork?: EmployeeWorkCreate[]; employeeWork?: EmployeeWorkCreate[];
employeeCheckup?: EmployeeCheckupCreate[]; employeeCheckup?: EmployeeCheckupCreate[];
@ -58,6 +58,7 @@ export type Employee = {
}; };
export type EmployeeCreate = { export type EmployeeCreate = {
selectedImage?: string;
id?: string; id?: string;
code: string; code: string;
image: File | null; image: File | null;