feat: import worker with multiple criteria (#72)

* feat: add i18n import from file

* fix: background color

* feat: add import worker component

* feat: support newer passport

* refactor: update validator

* fix: wrong endpoint

* refactor: change to display passport

* feat: add component and state

* fix: wrong validator

* refactor: add i18n

* refactor: add slont top-append

* refactor: use v-model

* refactor: impurt workder

* fix: criteria

* refactor: add customer branch id

---------

Co-authored-by: Thanaphon Frappet <thanaphon@frappet.com>
This commit is contained in:
Methapon Metanipat 2024-11-13 11:53:25 +07:00 committed by GitHub
parent 481d9d4e9e
commit 202e8c2e6f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 359 additions and 25 deletions

View file

@ -56,6 +56,7 @@ import ToggleButton from 'components/button/ToggleButton.vue';
import FormAbout from 'components/05_quotation/FormAbout.vue';
import SelectZone from 'components/shared/SelectZone.vue';
import PersonCard from 'components/shared/PersonCard.vue';
import ImportWorker from './ImportWorker.vue';
import {
AddButton,
SaveButton,
@ -233,6 +234,7 @@ const pageState = reactive({
fieldSelected: [],
gridView: false,
isLoaded: false,
importWorker: false,
currentTab: 'all',
addModal: false,
@ -1043,9 +1045,50 @@ async function getInvoiceCodeFullPay() {
const ret = await invoiceStore.getInvoiceList();
if (ret) code.value = ret.result.at(0)?.code || '';
}
const importWorkerCriteria = ref<{
passport: string[] | null;
visa: string[] | null;
}>({
passport: [],
visa: [],
});
async function getWorkerFromCriteria(
payload: typeof importWorkerCriteria.value,
) {
const ret = await employeeStore.fetchList({
payload: {
passport: payload.passport || undefined,
},
pageSize: 99999, // must include all possible worker
page: 1,
passport: true,
customerBranchId: quotationFormData.value.customerBranchId,
});
if (!ret) return false; // error, do not close dialog
// TODO: Merge employee into worker list
const deduplicate = ret.result.filter(
(a) => !selectedWorker.value.find((b) => a.id === b.id),
);
preSelectedWorker.value = [...deduplicate, ...selectedWorker.value];
convertEmployeeToTable();
return true;
}
</script>
<template>
<ImportWorker
v-model:open="pageState.importWorker"
v-model:data="importWorkerCriteria"
:import-worker="getWorkerFromCriteria"
/>
<div class="column surface-0 fullscreen">
<div class="color-bar">
<div class="orange-segment"></div>
@ -1839,6 +1882,63 @@ async function getInvoiceCodeFullPay() {
}
"
>
<template #top-append>
<q-btn
flat
dense
round
size="sm"
icon="mdi-dots-horizontal"
:id="`btn-kebab-action`"
@click.stop
:title="$t('general.additional')"
>
<q-menu class="bordered" ref="refMenu">
<q-list>
<q-item
v-close-popup
dense
clickable
class="row items-center"
style="white-space: nowrap"
@click.stop="
() => {
triggerCreateEmployee();
}
"
>
<q-icon
size="xs"
class="q-mr-sm"
name="mdi-plus"
style="color: hsl(var(--info-bg))"
/>
<span>
{{ $t('quotation.addWorker') }}
</span>
</q-item>
<q-item
v-close-popup
dense
clickable
style="white-space: nowrap"
class="row items-center"
@click.stop="() => (pageState.importWorker = true)"
>
<q-icon
size="xs"
class="q-mr-sm"
name="mdi-import"
style="color: hsl(195 90% 50%)"
/>
<span>{{ $t('quotation.importWorker') }}</span>
</q-item>
</q-list>
</q-menu>
</q-btn>
</template>
<section class="col row scroll">
<SelectZone
ref="refSelectZoneEmployee"
@ -1851,16 +1951,6 @@ async function getInvoiceCodeFullPay() {
:items="workerList"
:new-items="newWorkerList"
>
<template #top>
<AddButton
icon-only
@click="
() => {
triggerCreateEmployee();
}
"
/>
</template>
<template #data="{ item }">
<PersonCard
noAction
@ -1871,7 +1961,7 @@ async function getInvoiceCodeFullPay() {
$i18n.locale === 'eng'
? `${item.firstNameEN} ${item.lastNameEN}`
: `${item.firstName} ${item.lastName}`,
code: item.code,
code: item.employeePassport.at(0)?.number,
female: item.gender === 'female',
male: item.gender === 'male',
img: `${baseUrl}/customer/${item.id}/image/${item.selectedImage}`,