booklist-edit.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <template>
  2. <simple-form-modal ref="modalRef" :items="formItems" :baseUrl="baseUrl" @success="handleSuccess" :title="title"
  3. width="600px" labelWidth="100px">
  4. <template #relatedItems="{ model }">
  5. <div class="flex items-center space-x-4">
  6. <el-checkbox v-model="isSpecified" label="指定商品" />
  7. <div v-if="isSpecified" class="flex items-center text-gray-600">
  8. <span>已选择 <span class="text-red-500 font-bold">{{ (model.relatedItems || []).length }}</span>
  9. 款商品,</span>
  10. <el-button link type="primary" @click="openGoodsDialog(model)">选择商品 ></el-button>
  11. </div>
  12. </div>
  13. </template>
  14. <template #status="{ model }">
  15. <el-switch v-model="model.status" active-value="online" inactive-value="offline" />
  16. </template>
  17. <template #banner="{ model }">
  18. <div class="flex flex-col">
  19. <image-upload v-model="model.banner" :limit="1" :fileSize="2" fileType="jpg" />
  20. <span class="text-gray-400 text-xs mt-1">选择背景图</span>
  21. </div>
  22. </template>
  23. </simple-form-modal>
  24. <goods-select-dialog v-model="goodsDialogVisible" :default-selected="selectedGoods" @confirm="handleGoodsConfirm" />
  25. </template>
  26. <script setup>
  27. import { ref, computed } from 'vue';
  28. import SimpleFormModal from '@/components/CommonPage/SimpleFormModal.vue';
  29. import GoodsSelectDialog from '../../components/GoodsSelectDialog.vue';
  30. import ImageUpload from '@/components/ImageUpload/index.vue';
  31. const emit = defineEmits(['success']);
  32. const modalRef = ref(null);
  33. const title = ref('添加书单');
  34. const goodsDialogVisible = ref(false);
  35. const selectedGoods = ref([]);
  36. const isSpecified = ref(true); // Default checked as per image
  37. const currentFormModel = ref(null);
  38. const baseUrl = {
  39. add: '/salesOps/booklist/add',
  40. update: '/salesOps/booklist/update'
  41. };
  42. const formItems = computed(() => [
  43. {
  44. label: '书单名称',
  45. prop: 'name',
  46. type: 'input',
  47. required: true,
  48. props: { placeholder: '请输入书单名称' }
  49. },
  50. {
  51. label: '关联商品',
  52. prop: 'relatedItems',
  53. type: 'relatedItems',
  54. slot: 'relatedItems',
  55. required: true,
  56. },
  57. {
  58. label: '是否上线',
  59. prop: 'status',
  60. type: 'status',
  61. slot: 'status',
  62. required: true,
  63. },
  64. {
  65. label: '书单banner',
  66. prop: 'banner',
  67. type: 'banner',
  68. slot: 'banner',
  69. required: true,
  70. },
  71. {
  72. label: '书单描述',
  73. prop: 'description',
  74. type: 'textarea',
  75. required: true,
  76. props: { placeholder: '请输入书单描述' }
  77. },
  78. ]);
  79. const handleOpen = (data) => {
  80. title.value = data && data.id ? '编辑书单' : '添加书单';
  81. selectedGoods.value = data && data.relatedGoods ? data.relatedGoods : [];
  82. modalRef.value.handleOpen(data);
  83. };
  84. const handleSuccess = (data) => {
  85. emit('success', data);
  86. };
  87. const openGoodsDialog = (model) => {
  88. currentFormModel.value = model;
  89. if (!model.relatedItems) {
  90. model.relatedItems = [];
  91. }
  92. selectedGoods.value = model.relatedItems;
  93. goodsDialogVisible.value = true;
  94. };
  95. const handleGoodsConfirm = (rows) => {
  96. selectedGoods.value = rows;
  97. if (currentFormModel.value) {
  98. currentFormModel.value.relatedItems = rows;
  99. }
  100. goodsDialogVisible.value = false;
  101. };
  102. defineExpose({
  103. handleOpen
  104. });
  105. </script>