123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- <template>
- <LjDialogNew v-bind="$attrs" width="600px" :closed="closed">
- <template #header>
- <div class="flx-1">
- <span class="text-h5-b">配置项值选择</span>
- </div>
- </template>
- <div class="checkbox-area">
- <el-checkbox v-model="showHeadboardModel" label="床头" border></el-checkbox>
- <el-checkbox v-model="showNightstandModel" label="床头柜" border></el-checkbox>
- <el-checkbox v-model="showBedframeModel" label="床架" border></el-checkbox>
- </div>
- <div class="config-sections config-scroll-container">
- <ConfigSection
- v-if="showHeadboardModel"
- part-name="床头"
- v-model:selectedConfigItems="partsConfig.headboard"
- :configItemOptions="headboardConfigOptions"
- :configValueOptionsMap="configValueOptionsMap"
- />
- <ConfigSection
- v-if="showNightstandModel"
- part-name="床头柜"
- v-model:selectedConfigItems="partsConfig.nightstand"
- :configItemOptions="nightstandConfigOptions"
- :configValueOptionsMap="configValueOptionsMap"
- />
- <ConfigSection
- v-if="showBedframeModel"
- part-name="床架"
- v-model:selectedConfigItems="partsConfig.bedframe"
- :configItemOptions="bedframeConfigOptions"
- :configValueOptionsMap="configValueOptionsMap"
- />
- </div>
- <template #footer>
- <el-button @click="onCancel">取消</el-button>
- <el-button type="primary" @click="onConfirm">确认配置</el-button>
- </template>
- </LjDialogNew>
- </template>
- <script setup lang="ts">
- import { PropType, computed } from "vue";
- import ConfigSection from "./ConfigSection.vue";
- import LjDialogNew from "@/components/LjDialog/index-new.vue";
- interface ConfigValue {
- printid: number;
- namemx: string;
- }
- interface ConfigItemOption {
- pzid: number;
- pzname: string;
- }
- interface SelectedConfigItem {
- pzid: number;
- selectedId: number;
- selectedValue?: string;
- }
- const props = defineProps({
- showHeadboard: { type: Boolean, default: true },
- showNightstand: { type: Boolean, default: true },
- showBedframe: { type: Boolean, default: false },
- headboardConfigOptions: { type: Array as PropType<ConfigItemOption[]>, required: true },
- nightstandConfigOptions: { type: Array as PropType<ConfigItemOption[]>, required: true },
- bedframeConfigOptions: { type: Array as PropType<ConfigItemOption[]>, required: true },
- configValueOptionsMap: { type: Object as PropType<Record<number, ConfigValue[]>>, required: true },
- partsConfig: {
- type: Object as PropType<{
- headboard: SelectedConfigItem[];
- nightstand: SelectedConfigItem[];
- bedframe: SelectedConfigItem[];
- }>,
- required: true
- }
- });
- const emit = defineEmits([
- "update:showHeadboard",
- "update:showNightstand",
- "update:showBedframe",
- "update:partsConfig",
- "cancel",
- "submit",
- "closed",
- "update:modelValue"
- ]);
- const showHeadboardModel = computed({
- get: () => props.showHeadboard,
- set: (val: boolean) => emit("update:showHeadboard", val)
- });
- const showNightstandModel = computed({
- get: () => props.showNightstand,
- set: (val: boolean) => emit("update:showNightstand", val)
- });
- const showBedframeModel = computed({
- get: () => props.showBedframe,
- set: (val: boolean) => emit("update:showBedframe", val)
- });
- const onCancel = () => emit("cancel");
- const onConfirm = () => {
- const newParts = { ...props.partsConfig };
- if (!showHeadboardModel.value) {
- newParts.headboard = [];
- }
- if (!showNightstandModel.value) {
- newParts.nightstand = [];
- }
- if (!showBedframeModel.value) {
- newParts.bedframe = [];
- }
- emit("submit", newParts);
- };
- const closed = () => emit("cancel");
- </script>
- <style lang="scss">
- .el-dialog {
- max-height: 80vh;
- display: flex;
- flex-direction: column;
- }
- </style>
- <style scoped lang="scss">
- .config-scroll-container {
- flex: 1;
- overflow-y: auto;
- padding-right: 4px;
- max-height: 50vh;
- }
- .checkbox-area {
- padding: 0 0 8px 0;
- border-bottom: 1px solid #ebeef5;
- display: flex;
- }
- .config-sections {
- padding: 8px 0px;
- }
- </style>
|