refactor: edit div of DrawerInfo

This commit is contained in:
Net 2024-08-16 16:47:13 +07:00
parent d03c04f0d0
commit b0885e10a3

View file

@ -14,6 +14,12 @@ import useFlowStore from 'stores/flow';
import { Status } from 'stores/types'; import { Status } from 'stores/types';
import { CustomerStats, Customer, CustomerBranch } from 'stores/customer/types'; import { CustomerStats, Customer, CustomerBranch } from 'stores/customer/types';
import { Employee, EmployeeHistory } from 'stores/employee/types'; import { Employee, EmployeeHistory } from 'stores/employee/types';
import {
EditButton,
DeleteButton,
SaveButton,
UndoButton,
} from 'components/button';
import { AddressForm } from 'components/form'; import { AddressForm } from 'components/form';
import ItemCard from 'src/components/ItemCard.vue'; import ItemCard from 'src/components/ItemCard.vue';
@ -2265,70 +2271,74 @@ const emptyCreateDialog = ref(false);
} }
" "
> >
<div class="full-height full-width column"> <div class="q-px-lg q-pt-lg surface-2">
<div class="q-mx-lg q-mt-lg"> <ProfileBanner
<ProfileBanner @view="employeeFormState.imageDialog = true"
@view="employeeFormState.imageDialog = true" @edit="dialogEmployeeImageUpload && dialogEmployeeImageUpload.browse()"
@edit=" @update:toggle-status="
dialogEmployeeImageUpload && dialogEmployeeImageUpload.browse() (v) => {
" if (currentFromDataEmployee.id !== undefined)
@update:toggle-status=" triggerChangeStatus(currentFromDataEmployee.id, v);
(v) => { }
if (currentFromDataEmployee.id !== undefined) "
triggerChangeStatus(currentFromDataEmployee.id, v); active
} use-toggle
" color="white"
active icon="mdi-account-plus-outline"
use-toggle bg-color="linear-gradient(135deg, rgba(43,137,223,1) 0%, rgba(230,51,81,1) 100%)"
color="white" v-model:current-tab="employeeFormState.currentTab"
icon="mdi-account-plus-outline" v-model:toggle-status="currentFromDataEmployee.status"
bg-color="linear-gradient(135deg, rgba(43,137,223,1) 0%, rgba(230,51,81,1) 100%)" v-model:cover-url="employeeFormState.profileUrl"
v-model:current-tab="employeeFormState.currentTab" fallback-cover="/images/employee-banner.png"
v-model:toggle-status="currentFromDataEmployee.status" :img="employeeFormState.profileUrl"
v-model:cover-url="employeeFormState.profileUrl" :tabs-list="[
fallback-cover="/images/employee-banner.png" { name: 'personalInfo', label: 'personalInfo' },
:img="employeeFormState.profileUrl" { name: 'healthCheck', label: 'healthCheck' },
:tabs-list="[ { name: 'workHistory', label: 'workHistory' },
{ name: 'personalInfo', label: 'personalInfo' }, { name: 'other', label: 'other' },
{ name: 'healthCheck', label: 'healthCheck' }, ]"
{ name: 'workHistory', label: 'workHistory' }, :menu="formMenuIconEmployee"
{ name: 'other', label: 'other' }, :toggle-title="$t('formDialogTitleUserStatus')"
]" :hide-fade="
:menu="formMenuIconEmployee" employeeFormState.profileUrl === '' ||
:toggle-title="$t('formDialogTitleUserStatus')" employeeFormState.profileUrl === undefined
:hide-fade=" "
employeeFormState.profileUrl === '' || />
employeeFormState.profileUrl === undefined </div>
"
/> <div
</div> style="flex: 1; width: 100%; overflow-y: auto"
<div class="surface-2 q-pa-lg"
class="col surface-1 q-ma-lg rounded bordered scroll row" id="drawer-employee-form"
id="employee-form" >
> <div class="col surface-1 full-height rounded bordered scroll row">
<div class="col"> <div
<div style="position: sticky; top: 0" class="q-pa-sm"> class="col"
style="height: 100%; max-height: 100; overflow-y: auto"
v-if="$q.screen.gt.sm"
>
<div class="q-py-md q-pl-md q-pr-sm">
<SideMenu <SideMenu
:menu="[ :menu="[
{ {
name: $t('formDialogTitleInformation'), name: $t('formDialogTitleInformation'),
anchor: 'form-information', anchor: 'drawer-form-information',
}, },
{ {
name: $t('formDialogTitlePersonal'), name: $t('formDialogTitlePersonal'),
anchor: 'form-personal', anchor: 'drawer-form-personal',
}, },
{ {
name: $t('formDialogTitlePersonnelAddress'), name: $t('formDialogTitlePersonnelAddress'),
anchor: 'form-personal-address', anchor: 'drawer-form-personal-address',
}, },
{ {
name: $t('formDialogTitlePassport'), name: $t('formDialogTitlePassport'),
anchor: 'form-passport', anchor: 'drawer-form-passport',
}, },
{ {
name: $t('formDialogTitleVisa'), name: $t('formDialogTitleVisa'),
anchor: 'form-visa', anchor: 'drawer-form-visa',
}, },
]" ]"
background="transparent" background="transparent"
@ -2336,247 +2346,308 @@ const emptyCreateDialog = ref(false);
background: 'hsla(var(--blue-6-hsl) / .2)', background: 'hsla(var(--blue-6-hsl) / .2)',
foreground: 'var(--blue-6)', foreground: 'var(--blue-6)',
}" }"
scroll-element="#employee-form" scroll-element="#drawer-employee-form-content"
/> />
</div> </div>
</div> </div>
<div <div
v-if="employeeFormState.currentTab === 'personalInfo'" class="col-12 col-md-10 q-py-md q-pr-md q-pl-sm"
class="col-10 q-pa-md q-gutter-y-xl" id="drawer-employee-form-content"
style="height: 290px; overflow-y: auto"
> >
<BasicInformation <template v-if="employeeFormState.currentTab === 'personalInfo'">
:no-action="$route.name === 'CustomerBranchManagement'" <div
id="form-information" class="q-pt-sm row"
prefix-id="drawer-info-employee" style="position: absolute; z-index: 999; right: 4%"
dense >
outlined <UndoButton
:title="'formDialogTitleInformation'" v-if="employeeFormState.isEmployeeEdit"
:readonly="!employeeFormState.isEmployeeEdit" id="btn-info-basic-undo"
:employee-owner-option="employeeStore.ownerOption" icon-only
v-model:customer-branch="employeeFormState.formDataEmployeeOwner" @click="
v-model:employee-id="employeeFormState.currentEmployeeCode" () => {
v-model:nrc-no="currentFromDataEmployee.nrcNo" employeeFormStore.resetFormDataEmployee();
v-model:code="currentFromDataEmployee.code" employeeFormState.isEmployeeEdit = false;
@filter-owner-branch="employeeFormStore.employeeFilterOwnerBranch" employeeFormState.dialogType = 'info';
@undo=" }
() => { "
employeeFormStore.resetFormDataEmployee(); type="button"
employeeFormState.isEmployeeEdit = false; />
employeeFormState.dialogType = 'info'; <SaveButton
} v-if="employeeFormState.isEmployeeEdit"
" id="btn-info-basic-save"
@edit=" icon-only
() => { type="submit"
employeeFormState.isEmployeeEdit = true; />
employeeFormState.dialogType = 'edit'; <EditButton
} v-if="!employeeFormState.isEmployeeEdit"
" id="btn-info-basic-edit"
@save="async () => {}" icon-only
@delete=" @click="
() => deleteEmployeeById({ id: currentFromDataEmployee.id }) () => {
" employeeFormState.isEmployeeEdit = true;
/> employeeFormState.dialogType = 'edit';
<FormPerson }
id="form-personal" "
prefix-id="drawer-info-employee" type="button"
dense />
outlined <DeleteButton
employee v-if="!employeeFormState.isEmployeeEdit"
separator id="btn-info-basic-delete"
:title="'personalInfo'" icon-only
:readonly="!employeeFormState.isEmployeeEdit" @click="
v-model:firstName="currentFromDataEmployee.firstName" () => deleteEmployeeById({ id: currentFromDataEmployee.id })
v-model:lastName="currentFromDataEmployee.lastName" "
v-model:firstNameEN="currentFromDataEmployee.firstNameEN" type="button"
v-model:lastNameEN="currentFromDataEmployee.lastNameEN" />
v-model:gender="currentFromDataEmployee.gender" </div>
v-model:birthDate="currentFromDataEmployee.dateOfBirth"
v-model:nationality="currentFromDataEmployee.nationality" <BasicInformation
/> no-action
<AddressForm id="drawer-form-information"
id="form-personal-address" prefix-id="drawer-info-employee"
employee dense
v-model:address="currentFromDataEmployee.address" outlined
v-model:addressEN="currentFromDataEmployee.addressEN" :title="'formDialogTitleInformation'"
v-model:provinceId="currentFromDataEmployee.provinceId" :readonly="!employeeFormState.isEmployeeEdit"
v-model:districtId="currentFromDataEmployee.districtId" :employee-owner-option="employeeStore.ownerOption"
v-model:subDistrictId="currentFromDataEmployee.subDistrictId" v-model:customer-branch="employeeFormState.formDataEmployeeOwner"
v-model:zipCode="currentFromDataEmployee.zipCode" v-model:employee-id="employeeFormState.currentEmployeeCode"
:readonly="!employeeFormState.isEmployeeEdit" v-model:nrc-no="currentFromDataEmployee.nrcNo"
prefix-id="drawer-info-personnel" v-model:code="currentFromDataEmployee.code"
dense @filter-owner-branch="employeeFormStore.employeeFilterOwnerBranch"
/> @undo="
<FormEmployeePassport () => {
prefix-id="drawer-info-employee"
id="form-passport"
dense
outlined
separator
:title="'formDialogTitlePassport'"
:readonly="!employeeFormState.isEmployeeEdit"
v-model:passport-type="currentFromDataEmployee.passportType"
v-model:passport-number="currentFromDataEmployee.passportNumber"
v-model:passport-issue-date="
currentFromDataEmployee.passportIssueDate
"
v-model:passport-expiry-date="
currentFromDataEmployee.passportExpiryDate
"
v-model:passport-issuing-place="
currentFromDataEmployee.passportIssuingPlace
"
v-model:passport-issuing-country="
currentFromDataEmployee.passportIssuingCountry
"
v-model:previous-passport-reference="
currentFromDataEmployee.previousPassportReference
"
/>
<FormEmployeeVisa
prefix-id="drawer-info-employee"
id="form-visa"
dense
outlined
:title="`formDialogTitleVisa`"
:readonly="!employeeFormState.isEmployeeEdit"
v-model:visa-type="currentFromDataEmployee.visaType"
v-model:visa-number="currentFromDataEmployee.visaNumber"
v-model:visa-issue-date="currentFromDataEmployee.visaIssueDate"
v-model:visa-expiry-date="currentFromDataEmployee.visaExpiryDate"
v-model:visa-issuing-place="
currentFromDataEmployee.visaIssuingPlace
"
v-model:visa-stay-until-date="
currentFromDataEmployee.visaStayUntilDate
"
v-model:tm6-number="currentFromDataEmployee.tm6Number"
v-model:entry-date="currentFromDataEmployee.entryDate"
/>
</div>
<div class="col-10 q-pa-md q-gutter-y-xl" v-else>
<FormEmployeeHealthCheck
v-if="employeeFormState.currentTab === 'healthCheck'"
id="form-checkup"
prefix-id="form-employee"
dense
outlined
v-model:current-index="employeeFormState.currentIndex"
v-model:employee-checkup="currentFromDataEmployee.employeeCheckup"
v-model:checkup-type-option="
optionStore.globalOption.insurancePlace
"
v-model:medical-benefit-option="
optionStore.globalOption.typeInsurance
"
v-model:insuranceCompanyOption="
optionStore.globalOption.insurancePlace
"
@save="
(index) => {
employeeFormState.currentIndex = index;
notify('create', $t('success'));
}
"
@edit="
(index) => {
if (
currentFromDataEmployee.employeeCheckup?.[index].statusSave
) {
employeeFormState.currentIndex = index;
currentFromDataEmployee.employeeCheckup[index].statusSave =
false;
}
}
"
@undo="
(index) => {
if (
currentFromDataEmployee.employeeCheckup?.[index]
.statusSave === false
) {
employeeFormState.currentIndex = -1;
currentFromDataEmployee.employeeCheckup[index].statusSave =
true;
employeeFormStore.resetFormDataEmployee(); employeeFormStore.resetFormDataEmployee();
employeeFormState.isEmployeeEdit = false;
employeeFormState.dialogType = 'info';
} }
} "
" @edit="
@delete=" () => {
(index) => { employeeFormState.isEmployeeEdit = true;
employeeFormState.currentIndex = index; employeeFormState.dialogType = 'edit';
deleteEmployeeById({ type: 'healthCheck' });
}
"
/>
<FormEmployeeWorkHistory
v-if="employeeFormState.currentTab === 'workHistory'"
id="form-work-history"
prefix-id="form-employee"
dense
outlined
v-model:current-index="employeeFormState.currentIndex"
v-model:employee-work="currentFromDataEmployee.employeeWork"
v-model:position-name-option="optionStore.globalOption.position"
v-model:job-type-option="optionStore.globalOption.businessType"
v-model:workplace-option="optionStore.globalOption.area"
@delete="
(index) => {
employeeFormState.currentIndex = index;
deleteEmployeeById({ type: 'work' });
}
"
@save="
(index) => {
employeeFormState.currentIndex = index;
}
"
@undo="
(index) => {
if (
currentFromDataEmployee.employeeWork?.[index].statusSave ===
false
) {
employeeFormState.currentIndex = -1;
currentFromDataEmployee.employeeWork[index].statusSave = true;
} }
} "
" @save="async () => {}"
@edit=" @delete="
(index) => { () => deleteEmployeeById({ id: currentFromDataEmployee.id })
if (currentFromDataEmployee.employeeWork?.[index].statusSave) { "
/>
<FormPerson
id="drawer-form-personal"
prefix-id="drawer-info-employee"
dense
outlined
employee
separator
:title="'personalInfo'"
:readonly="!employeeFormState.isEmployeeEdit"
v-model:firstName="currentFromDataEmployee.firstName"
v-model:lastName="currentFromDataEmployee.lastName"
v-model:firstNameEN="currentFromDataEmployee.firstNameEN"
v-model:lastNameEN="currentFromDataEmployee.lastNameEN"
v-model:gender="currentFromDataEmployee.gender"
v-model:birthDate="currentFromDataEmployee.dateOfBirth"
v-model:nationality="currentFromDataEmployee.nationality"
/>
<AddressForm
id="drawer-form-personal-address"
employee
v-model:address="currentFromDataEmployee.address"
v-model:addressEN="currentFromDataEmployee.addressEN"
v-model:provinceId="currentFromDataEmployee.provinceId"
v-model:districtId="currentFromDataEmployee.districtId"
v-model:subDistrictId="currentFromDataEmployee.subDistrictId"
v-model:zipCode="currentFromDataEmployee.zipCode"
:readonly="!employeeFormState.isEmployeeEdit"
prefix-id="drawer-info-personnel"
dense
/>
<FormEmployeePassport
prefix-id="drawer-info-employee"
id="drawer-form-passport"
dense
outlined
separator
:title="'formDialogTitlePassport'"
:readonly="!employeeFormState.isEmployeeEdit"
v-model:passport-type="currentFromDataEmployee.passportType"
v-model:passport-number="currentFromDataEmployee.passportNumber"
v-model:passport-issue-date="
currentFromDataEmployee.passportIssueDate
"
v-model:passport-expiry-date="
currentFromDataEmployee.passportExpiryDate
"
v-model:passport-issuing-place="
currentFromDataEmployee.passportIssuingPlace
"
v-model:passport-issuing-country="
currentFromDataEmployee.passportIssuingCountry
"
v-model:previous-passport-reference="
currentFromDataEmployee.previousPassportReference
"
/>
<FormEmployeeVisa
prefix-id="drawer-info-employee"
id="drawer-form-visa"
dense
outlined
:title="`formDialogTitleVisa`"
:readonly="!employeeFormState.isEmployeeEdit"
v-model:visa-type="currentFromDataEmployee.visaType"
v-model:visa-number="currentFromDataEmployee.visaNumber"
v-model:visa-issue-date="currentFromDataEmployee.visaIssueDate"
v-model:visa-expiry-date="currentFromDataEmployee.visaExpiryDate"
v-model:visa-issuing-place="
currentFromDataEmployee.visaIssuingPlace
"
v-model:visa-stay-until-date="
currentFromDataEmployee.visaStayUntilDate
"
v-model:tm6-number="currentFromDataEmployee.tm6Number"
v-model:entry-date="currentFromDataEmployee.entryDate"
/>
</template>
<template v-if="employeeFormState.currentTab === 'healthCheck'">
>
<FormEmployeeHealthCheck
v-if="employeeFormState.currentTab === 'healthCheck'"
id="drawer-form-checkup"
prefix-id="form-employee"
dense
outlined
v-model:current-index="employeeFormState.currentIndex"
v-model:employee-checkup="currentFromDataEmployee.employeeCheckup"
v-model:checkup-type-option="
optionStore.globalOption.insurancePlace
"
v-model:medical-benefit-option="
optionStore.globalOption.typeInsurance
"
v-model:insuranceCompanyOption="
optionStore.globalOption.insurancePlace
"
@save="
(index) => {
employeeFormState.currentIndex = index; employeeFormState.currentIndex = index;
currentFromDataEmployee.employeeWork[index].statusSave = notify('create', $t('success'));
false;
} }
} "
" @edit="
/> (index) => {
<FormEmployeeOther if (
v-if="employeeFormState.currentTab === 'other'" currentFromDataEmployee.employeeCheckup?.[index].statusSave
id="form-other" ) {
prefix-id="form-employee" employeeFormState.currentIndex = index;
dense currentFromDataEmployee.employeeCheckup[index].statusSave =
outlined false;
v-model:employee-other="currentFromDataEmployee.employeeOtherInfo" }
@undo="
() => {
if (
currentFromDataEmployee.employeeOtherInfo?.statusSave ===
false
) {
currentFromDataEmployee.employeeOtherInfo.statusSave = true;
} }
} "
" @undo="
@edit=" (index) => {
() => { if (
if (currentFromDataEmployee.employeeOtherInfo?.statusSave) { currentFromDataEmployee.employeeCheckup?.[index]
currentFromDataEmployee.employeeOtherInfo.statusSave = false; .statusSave === false
) {
employeeFormState.currentIndex = -1;
currentFromDataEmployee.employeeCheckup[index].statusSave =
true;
employeeFormStore.resetFormDataEmployee();
}
} }
} "
" @delete="
/> (index) => {
employeeFormState.currentIndex = index;
deleteEmployeeById({ type: 'healthCheck' });
}
"
/>
</template>
<template v-if="employeeFormState.currentTab === 'workHistory'">
<FormEmployeeWorkHistory
v-if="employeeFormState.currentTab === 'workHistory'"
id="drawer-work-history"
prefix-id="drawer-employee"
dense
outlined
v-model:current-index="employeeFormState.currentIndex"
v-model:employee-work="currentFromDataEmployee.employeeWork"
v-model:position-name-option="optionStore.globalOption.position"
v-model:job-type-option="optionStore.globalOption.businessType"
v-model:workplace-option="optionStore.globalOption.area"
@delete="
(index) => {
employeeFormState.currentIndex = index;
deleteEmployeeById({ type: 'work' });
}
"
@save="
(index) => {
employeeFormState.currentIndex = index;
}
"
@undo="
(index) => {
if (
currentFromDataEmployee.employeeWork?.[index].statusSave ===
false
) {
employeeFormState.currentIndex = -1;
currentFromDataEmployee.employeeWork[index].statusSave =
true;
}
}
"
@edit="
(index) => {
if (
currentFromDataEmployee.employeeWork?.[index].statusSave
) {
employeeFormState.currentIndex = index;
currentFromDataEmployee.employeeWork[index].statusSave =
false;
}
}
"
/>
</template>
<template v-if="employeeFormState.currentTab === 'other'">
<FormEmployeeOther
v-if="employeeFormState.currentTab === 'other'"
id="drawer-other"
prefix-id="drawer-employee"
dense
outlined
v-model:employee-other="currentFromDataEmployee.employeeOtherInfo"
@undo="
() => {
if (
currentFromDataEmployee.employeeOtherInfo?.statusSave ===
false
) {
currentFromDataEmployee.employeeOtherInfo.statusSave = true;
}
}
"
@edit="
() => {
if (currentFromDataEmployee.employeeOtherInfo?.statusSave) {
currentFromDataEmployee.employeeOtherInfo.statusSave = false;
}
}
"
/>
</template>
</div> </div>
</div> </div>
</div> </div>