feat: show option propertie (service)

This commit is contained in:
puriphatt 2024-06-24 11:10:28 +00:00
parent 9ce656ae45
commit c240963512
5 changed files with 158 additions and 107 deletions

View file

@ -1,5 +1,9 @@
<script setup lang="ts"> <script setup lang="ts">
import { Icon } from '@iconify/vue'; import { Icon } from '@iconify/vue';
import { Attributes } from 'src/stores/product-service/types';
import useOptionStore from 'src/stores/options';
const optionStore = useOptionStore();
const remark = defineModel<string>('remark'); const remark = defineModel<string>('remark');
const detail = defineModel<string>('detail'); const detail = defineModel<string>('detail');
@ -9,6 +13,7 @@ const code = defineModel<string>('code');
const serviceCode = defineModel<string>('serviceCode'); const serviceCode = defineModel<string>('serviceCode');
const serviceName = defineModel<string>('serviceNameTh'); const serviceName = defineModel<string>('serviceNameTh');
const serviceDescription = defineModel<string>('serviceDescription'); const serviceDescription = defineModel<string>('serviceDescription');
const serviceAttributes = defineModel<Attributes>('serviceAttributes');
defineProps<{ defineProps<{
dense?: boolean; dense?: boolean;
@ -120,6 +125,16 @@ defineEmits<{
</q-btn> </q-btn>
</template> </template>
</q-input> </q-input>
<div v-if="readonly && serviceAttributes" class="col-12 q-gutter-x-md">
<span
v-for="(p, index) in serviceAttributes.additional"
:key="index"
class="bordered q-px-sm surface-tab"
style="border-radius: 6px"
>
{{ optionStore.mapOption(p.fieldName ?? '') }}
</span>
</div>
<q-input <q-input
id="input-service-description" id="input-service-description"
for="input-service-description" for="input-service-description"

View file

@ -5,10 +5,10 @@ import { moveItemUp, moveItemDown, deleteItem, dialog } from 'src/stores/utils';
import NoData from 'src/components/NoData.vue'; import NoData from 'src/components/NoData.vue';
import WorkManagementComponent from './WorkManagementComponent.vue'; import WorkManagementComponent from './WorkManagementComponent.vue';
const { t } = useI18n();
import { WorkItems } from 'src/stores/product-service/types'; import { WorkItems } from 'src/stores/product-service/types';
const { t } = useI18n();
const workItems = defineModel<WorkItems[]>('workItems', { default: [] }); const workItems = defineModel<WorkItems[]>('workItems', { default: [] });
defineProps<{ defineProps<{
@ -75,6 +75,7 @@ function confirmDelete(items: unknown[], index: number) {
:readonly="readonly" :readonly="readonly"
v-model:work-name="workItems[index].name" v-model:work-name="workItems[index].name"
v-model:product-items="work.product" v-model:product-items="work.product"
v-model:attributes="work.attributes"
@add-product="$emit('addProduct', index)" @add-product="$emit('addProduct', index)"
@move-work-up="moveItemUp(workItems, index)" @move-work-up="moveItemUp(workItems, index)"
@move-work-down="moveItemDown(workItems, index)" @move-work-down="moveItemDown(workItems, index)"

View file

@ -3,10 +3,12 @@ import { Icon } from '@iconify/vue';
import { formatNumberDecimal } from 'src/stores/utils'; import { formatNumberDecimal } from 'src/stores/utils';
import useProductServiceStore from 'src/stores/product-service'; import useProductServiceStore from 'src/stores/product-service';
import { ProductList } from 'src/stores/product-service/types'; import useOptionStore from 'src/stores/options';
import { Attributes, ProductList } from 'src/stores/product-service/types';
import { storeToRefs } from 'pinia'; import { storeToRefs } from 'pinia';
const productServiceStore = useProductServiceStore(); const productServiceStore = useProductServiceStore();
const optionStore = useOptionStore();
const { fetchListOfWork } = productServiceStore; const { fetchListOfWork } = productServiceStore;
const { workNameItems } = storeToRefs(productServiceStore); const { workNameItems } = storeToRefs(productServiceStore);
@ -19,6 +21,7 @@ defineProps<{
}>(); }>();
const workName = defineModel<string>('workName'); const workName = defineModel<string>('workName');
const attributes = defineModel<Attributes>('attributes');
const productItems = defineModel<(ProductList & { nameEn: string })[]>( const productItems = defineModel<(ProductList & { nameEn: string })[]>(
'productItems', 'productItems',
{ {
@ -50,6 +53,7 @@ defineEmits<{
header-style="border-top-left-radius: var(--radius-2); border-top-right-radius: var(--radius-2)" header-style="border-top-left-radius: var(--radius-2); border-top-right-radius: var(--radius-2)"
> >
<template v-slot:header> <template v-slot:header>
<div class="column full-width">
<div class="row items-center q-py-sm full-width" @click.stop> <div class="row items-center q-py-sm full-width" @click.stop>
<q-btn <q-btn
v-if="!readonly" v-if="!readonly"
@ -164,6 +168,21 @@ defineEmits<{
<q-tooltip>{{ $t('delete') }}</q-tooltip> <q-tooltip>{{ $t('delete') }}</q-tooltip>
</q-btn> </q-btn>
</div> </div>
<div
v-if="readonly && attributes"
class="row q-pb-md q-px-md q-gutter-x-md"
>
<span
v-for="(p, index) in attributes.additional"
:key="index"
class="bordered q-px-sm surface-tab"
style="border-radius: 6px"
>
{{ optionStore.mapOption(p.fieldName ?? '') }}
</span>
</div>
</div>
</template> </template>
<div class="surface-2"> <div class="surface-2">
<div <div
@ -318,7 +337,9 @@ defineEmits<{
:deep( :deep(
.q-item__section.column.q-item__section--side.justify-center.q-item__section--avatar.q-focusable.relative-position.cursor-pointer .q-item__section.column.q-item__section--side.justify-center.q-item__section--avatar.q-focusable.relative-position.cursor-pointer
) { ) {
justify-content: start !important;
padding-right: 8px !important; padding-right: 8px !important;
padding-top: 16px;
min-width: 0px; min-width: 0px;
} }
</style> </style>

View file

@ -1881,6 +1881,7 @@ watch(currentStatus, async () => {
openPropertiesDialog('service'); openPropertiesDialog('service');
} }
" "
v-model:service-attributes="formDataProductService.attributes"
v-model:service-code="formDataProductService.code" v-model:service-code="formDataProductService.code"
v-model:service-description="formDataProductService.detail" v-model:service-description="formDataProductService.detail"
v-model:service-name-th="formDataProductService.name" v-model:service-name-th="formDataProductService.name"

View file

@ -4,8 +4,21 @@ import { defineStore } from 'pinia';
const useOptionStore = defineStore('optionStore', () => { const useOptionStore = defineStore('optionStore', () => {
const globalOption = ref(); const globalOption = ref();
function mapOption(value: string) {
for (const category in globalOption.value) {
if (globalOption.value.hasOwnProperty(category)) {
const option = globalOption.value[category].find(
(opt: { value: string }) => opt.value === value,
);
if (option) return option.label;
}
}
}
return { return {
globalOption, globalOption,
mapOption,
}; };
}); });