refactor: employee new img dialog
This commit is contained in:
parent
893b0a8c2a
commit
685ad0cc54
7 changed files with 254 additions and 57 deletions
|
|
@ -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">
|
||||||
|
|
|
||||||
|
|
@ -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: [
|
||||||
|
|
|
||||||
|
|
@ -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 || ''}`
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue