feat: add service dialog
This commit is contained in:
parent
c19f6fefe3
commit
2b44855585
3 changed files with 227 additions and 58 deletions
|
|
@ -4,72 +4,108 @@ const detail = defineModel<string>('detail');
|
||||||
const name = defineModel<string>('name');
|
const name = defineModel<string>('name');
|
||||||
const code = defineModel<string>('code');
|
const code = defineModel<string>('code');
|
||||||
|
|
||||||
|
const serviceCode = defineModel<string>('serviceCode');
|
||||||
|
const serviceName = defineModel<string>('serviceName');
|
||||||
|
const serviceDescription = defineModel<string>('serviceDescription');
|
||||||
|
|
||||||
defineProps<{
|
defineProps<{
|
||||||
dense?: boolean;
|
dense?: boolean;
|
||||||
outlined?: boolean;
|
outlined?: boolean;
|
||||||
readonly?: boolean;
|
readonly?: boolean;
|
||||||
separator?: boolean;
|
separator?: boolean;
|
||||||
isType?: boolean;
|
isType?: boolean;
|
||||||
|
service?: boolean;
|
||||||
}>();
|
}>();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="row">
|
<div class="col-3 app-text-muted">
|
||||||
<div class="col-4 app-text-muted">
|
• {{ $t(`formDialogTitleInformation`) }}
|
||||||
• {{ $t(`formDialogTitleInformation`) }}
|
</div>
|
||||||
</div>
|
<div v-if="!service" class="col-9 row q-col-gutter-md">
|
||||||
<div class="col-8 row q-col-gutter-md">
|
<q-input
|
||||||
<q-input
|
:dense="dense"
|
||||||
:dense="dense"
|
:outlined="!readonly"
|
||||||
:outlined="!readonly"
|
:readonly="readonly"
|
||||||
:readonly="readonly"
|
:borderless="readonly"
|
||||||
:borderless="readonly"
|
hide-bottom-space
|
||||||
hide-bottom-space
|
class="col-6"
|
||||||
class="col-6"
|
:label="
|
||||||
:label="
|
$t(isType ? 'productAndServiceTypeCode' : 'productAndServiceGroupCode')
|
||||||
$t(
|
"
|
||||||
isType ? 'productAndServiceTypeCode' : 'productAndServiceGroupCode',
|
v-model="code"
|
||||||
)
|
/>
|
||||||
"
|
<q-input
|
||||||
v-model="code"
|
:dense="dense"
|
||||||
/>
|
:outlined="!readonly"
|
||||||
<q-input
|
:readonly="readonly"
|
||||||
:dense="dense"
|
:borderless="readonly"
|
||||||
:outlined="!readonly"
|
hide-bottom-space
|
||||||
:readonly="readonly"
|
class="col-6"
|
||||||
:borderless="readonly"
|
:label="
|
||||||
hide-bottom-space
|
$t(isType ? 'productAndServiceTypeName' : 'productAndServiceGroupName')
|
||||||
class="col-6"
|
"
|
||||||
:label="
|
v-model="name"
|
||||||
$t(
|
/>
|
||||||
isType ? 'productAndServiceTypeName' : 'productAndServiceGroupName',
|
<q-input
|
||||||
)
|
:dense="dense"
|
||||||
"
|
:outlined="!readonly"
|
||||||
v-model="name"
|
:readonly="readonly"
|
||||||
/>
|
:borderless="readonly"
|
||||||
<q-input
|
hide-bottom-space
|
||||||
:dense="dense"
|
type="textarea"
|
||||||
:outlined="!readonly"
|
class="col-12"
|
||||||
:readonly="readonly"
|
:label="$t('detail')"
|
||||||
:borderless="readonly"
|
v-model="detail"
|
||||||
hide-bottom-space
|
/>
|
||||||
type="textarea"
|
<q-input
|
||||||
class="col-12"
|
:dense="dense"
|
||||||
:label="$t('detail')"
|
:outlined="!readonly"
|
||||||
v-model="detail"
|
:readonly="readonly"
|
||||||
/>
|
:borderless="readonly"
|
||||||
<q-input
|
hide-bottom-space
|
||||||
:dense="dense"
|
type="textarea"
|
||||||
:outlined="!readonly"
|
class="col-12"
|
||||||
:readonly="readonly"
|
:label="$t('formDialogInputRemark')"
|
||||||
:borderless="readonly"
|
v-model="remark"
|
||||||
hide-bottom-space
|
/>
|
||||||
type="textarea"
|
</div>
|
||||||
class="col-12"
|
|
||||||
:label="$t('formDialogInputRemark')"
|
<div v-if="service" class="col-9 row q-col-gutter-md">
|
||||||
v-model="remark"
|
<q-input
|
||||||
/>
|
for="input-service-code"
|
||||||
</div>
|
:dense="dense"
|
||||||
|
:outlined="!readonly"
|
||||||
|
:readonly="readonly"
|
||||||
|
:borderless="readonly"
|
||||||
|
hide-bottom-space
|
||||||
|
class="col-3"
|
||||||
|
:label="$t('serviceCode')"
|
||||||
|
v-model="serviceCode"
|
||||||
|
/>
|
||||||
|
<q-input
|
||||||
|
for="input-service-name"
|
||||||
|
:dense="dense"
|
||||||
|
:outlined="!readonly"
|
||||||
|
:readonly="readonly"
|
||||||
|
:borderless="readonly"
|
||||||
|
hide-bottom-space
|
||||||
|
class="col-9"
|
||||||
|
:label="$t('serviceName')"
|
||||||
|
v-model="serviceName"
|
||||||
|
/>
|
||||||
|
<q-input
|
||||||
|
for="input-service-description"
|
||||||
|
:dense="dense"
|
||||||
|
:outlined="!readonly"
|
||||||
|
:readonly="readonly"
|
||||||
|
:borderless="readonly"
|
||||||
|
hide-bottom-space
|
||||||
|
type="textarea"
|
||||||
|
class="col-12"
|
||||||
|
:label="$t('serviceDetail')"
|
||||||
|
v-model="serviceDescription"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
|
||||||
88
src/components/04_product-service/FormServiceWork.vue
Normal file
88
src/components/04_product-service/FormServiceWork.vue
Normal file
|
|
@ -0,0 +1,88 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import NoData from 'src/components/NoData.vue';
|
||||||
|
import WorkManagementComponent from './WorkManagementComponent.vue';
|
||||||
|
import { ref } from 'vue';
|
||||||
|
|
||||||
|
const serviceName = defineModel<string>('serviceName');
|
||||||
|
|
||||||
|
const workItems = ref([
|
||||||
|
{
|
||||||
|
id: '1',
|
||||||
|
product: [
|
||||||
|
{
|
||||||
|
id: '1',
|
||||||
|
label: 'ค่าธรรมเนียมใบอนุญาตทำงาน 2 ปี',
|
||||||
|
code: 'AC101',
|
||||||
|
price: '1,200.00',
|
||||||
|
time: '14',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '2',
|
||||||
|
product: [
|
||||||
|
{
|
||||||
|
id: '1',
|
||||||
|
label: 'ค่าธรรมเนียมใบอนุญาตทำงาน 2 ปี',
|
||||||
|
code: 'AC101',
|
||||||
|
price: '1,200.00',
|
||||||
|
time: '14',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '1',
|
||||||
|
label:
|
||||||
|
'ค่าบริการและค่าดำเนินงานยื่นคำร้องขอใบอนุญาตทำงานแทน คนงานต่างด้าว MOU',
|
||||||
|
code: 'AC102',
|
||||||
|
price: '1,200.00',
|
||||||
|
time: '14',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
defineProps<{
|
||||||
|
dense?: boolean;
|
||||||
|
outlined?: boolean;
|
||||||
|
readonly?: boolean;
|
||||||
|
separator?: boolean;
|
||||||
|
}>();
|
||||||
|
|
||||||
|
defineEmits<{
|
||||||
|
(e: 'addProduct'): void;
|
||||||
|
(e: 'deleteWork'): void;
|
||||||
|
(e: 'deleteProduct'): void;
|
||||||
|
}>();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="column col-12 full-height">
|
||||||
|
<div class="col-1 app-text-muted row items-start">
|
||||||
|
• {{ $t(`workInformation`) }}
|
||||||
|
<q-btn
|
||||||
|
icon="mdi-plus"
|
||||||
|
dense
|
||||||
|
flat
|
||||||
|
round
|
||||||
|
padding="0"
|
||||||
|
color="primary"
|
||||||
|
class="q-ml-sm"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- <div class="col row rounded bordered surface-2 justify-center items-center">
|
||||||
|
<NoData />
|
||||||
|
</div> -->
|
||||||
|
|
||||||
|
<div class="col q-gutter-y-md">
|
||||||
|
<WorkManagementComponent
|
||||||
|
v-for="(work, index) in workItems"
|
||||||
|
:key="work.id"
|
||||||
|
v-model:product-items="work.product"
|
||||||
|
:workIndex="index"
|
||||||
|
@addProduct="$emit('addProduct')"
|
||||||
|
></WorkManagementComponent>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped lang="scss"></style>
|
||||||
|
|
@ -14,6 +14,7 @@ import BasicInfoProduct from 'src/components/04_product-service/ฺBasicInfoProd
|
||||||
import PriceDataComponent from 'src/components/04_product-service/PriceDataComponent.vue';
|
import PriceDataComponent from 'src/components/04_product-service/PriceDataComponent.vue';
|
||||||
import ProfileUpload from 'src/components/ProfileUpload.vue';
|
import ProfileUpload from 'src/components/ProfileUpload.vue';
|
||||||
import TotalProductCardComponent from 'components/04_product-service/TotalProductCardComponent.vue';
|
import TotalProductCardComponent from 'components/04_product-service/TotalProductCardComponent.vue';
|
||||||
|
import FormServiceWork from 'src/components/04_product-service/FormServiceWork.vue';
|
||||||
|
|
||||||
import { Status } from 'src/stores/types';
|
import { Status } from 'src/stores/types';
|
||||||
import NoData from 'components/NoData.vue';
|
import NoData from 'components/NoData.vue';
|
||||||
|
|
@ -73,6 +74,7 @@ const drawerInfo = ref<boolean>(false);
|
||||||
const isEdit = ref<boolean>(false);
|
const isEdit = ref<boolean>(false);
|
||||||
const dialogInputForm = ref<boolean>(false);
|
const dialogInputForm = ref<boolean>(false);
|
||||||
const dialogProduct = ref<boolean>(false);
|
const dialogProduct = ref<boolean>(false);
|
||||||
|
const dialogService = ref<boolean>(false);
|
||||||
const statusToggle = ref<boolean>(false);
|
const statusToggle = ref<boolean>(false);
|
||||||
const profileSubmit = ref<boolean>(false);
|
const profileSubmit = ref<boolean>(false);
|
||||||
const profileFile = ref<File | undefined>(undefined);
|
const profileFile = ref<File | undefined>(undefined);
|
||||||
|
|
@ -109,6 +111,18 @@ const formDataProduct = ref<ProductCreate>({
|
||||||
code: '',
|
code: '',
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const serviceTab = [
|
||||||
|
{
|
||||||
|
name: 'serviceInformation',
|
||||||
|
label: 'serviceInformation',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'workInformation',
|
||||||
|
label: 'workInformation',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const currentServiceTab = ref('serviceInformation');
|
||||||
|
|
||||||
const currentId = ref<string>('');
|
const currentId = ref<string>('');
|
||||||
const currentIdType = ref<string>('');
|
const currentIdType = ref<string>('');
|
||||||
const resultSearchGroup = ref<ProductGroup[]>();
|
const resultSearchGroup = ref<ProductGroup[]>();
|
||||||
|
|
@ -417,7 +431,7 @@ watch(currentStatus, async () => {
|
||||||
></q-fab-action>
|
></q-fab-action>
|
||||||
<q-fab-action
|
<q-fab-action
|
||||||
v-if="productMode === 'service'"
|
v-if="productMode === 'service'"
|
||||||
label="เพิ่มบริการ"
|
:label="$t('addService')"
|
||||||
external-label
|
external-label
|
||||||
label-position="left"
|
label-position="left"
|
||||||
style="color: white; background-color: hsla(var(--blue-11-hsl))"
|
style="color: white; background-color: hsla(var(--blue-11-hsl))"
|
||||||
|
|
@ -426,7 +440,8 @@ watch(currentStatus, async () => {
|
||||||
@click="
|
@click="
|
||||||
() => {
|
() => {
|
||||||
clearFormGroup();
|
clearFormGroup();
|
||||||
dialogInputForm = true;
|
currentServiceTab = 'serviceInformation';
|
||||||
|
dialogService = true;
|
||||||
}
|
}
|
||||||
"
|
"
|
||||||
></q-fab-action>
|
></q-fab-action>
|
||||||
|
|
@ -1047,6 +1062,36 @@ watch(currentStatus, async () => {
|
||||||
/>
|
/>
|
||||||
</AppBox>
|
</AppBox>
|
||||||
</FormDialog>
|
</FormDialog>
|
||||||
|
|
||||||
|
<FormDialog
|
||||||
|
no-address
|
||||||
|
:title="$t('addService')"
|
||||||
|
v-model:modal="dialogService"
|
||||||
|
v-model:tabs-list="serviceTab"
|
||||||
|
v-model:current-tab="currentServiceTab"
|
||||||
|
>
|
||||||
|
<template #prepend>
|
||||||
|
<ProfileUpload
|
||||||
|
v-model:url-profile="profileUrl"
|
||||||
|
v-model:status-toggle="statusToggle"
|
||||||
|
v-model:profile-submit="profileSubmit"
|
||||||
|
@input-file="inputFile.click()"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template #information>
|
||||||
|
<BasicInformation
|
||||||
|
v-if="currentServiceTab === 'serviceInformation'"
|
||||||
|
dense
|
||||||
|
service
|
||||||
|
/>
|
||||||
|
<FormServiceWork
|
||||||
|
v-if="currentServiceTab === 'workInformation'"
|
||||||
|
dense
|
||||||
|
@addProduct="dialogTotalProduct = true"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
</FormDialog>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue