editCategoryModal.vue 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. <!-- bannerUrl: ""
  2. iconUrl: ""
  3. imgUrl: ""
  4. isShow: "0"
  5. level: "L1"
  6. name: "test"
  7. type: 0
  8. wapBannerUrl: "https://4dkk.4dage.com/shop/huafa/20220302/23135195983e96.png?x-oss-process=image/resize,m_fixed,w_100,h_100" -->
  9. <template>
  10. <BasicModal v-bind="$attrs" @register="register" title="编 辑" @ok="handleOk">
  11. <div class="pt-3px pr-3px">
  12. <BasicForm @register="registerForm" />
  13. </div>
  14. </BasicModal>
  15. </template>
  16. <script lang="ts">
  17. import { defineComponent } from 'vue';
  18. import { categoryApi, uploadBannerApi, updateCategoryApi } from '/@/api/product/category';
  19. import { TreeNode } from '/@/utils/treeUtils';
  20. import { BasicModal, useModalInner } from '/@/components/Modal';
  21. import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
  22. import { cloneDeep } from 'lodash-es';
  23. import { useMessage } from '/@/hooks/web/useMessage';
  24. import { useI18n } from '/@/hooks/web/useI18n';
  25. const { t } = useI18n();
  26. const isLevel2 = (type: string) => type === 'L2';
  27. const schemas: FormSchema[] = [
  28. {
  29. field: 'id',
  30. label: 'Id',
  31. component: 'Input',
  32. ifShow: false,
  33. },
  34. {
  35. field: 'name',
  36. component: 'Input',
  37. label: '分类名称',
  38. colProps: {
  39. span: 24,
  40. },
  41. componentProps: {
  42. maxLength: 15,
  43. },
  44. required: true,
  45. },
  46. {
  47. field: 'level',
  48. component: 'RadioGroup',
  49. label: '级别',
  50. defaultValue: 'L1',
  51. colProps: {
  52. span: 24,
  53. },
  54. componentProps: {
  55. options: [
  56. {
  57. label: '一级分类',
  58. value: 'L1',
  59. },
  60. {
  61. label: '二级分类',
  62. value: 'L2',
  63. },
  64. ],
  65. },
  66. },
  67. {
  68. field: 'parentId',
  69. component: 'ApiSelect',
  70. label: '上级分类',
  71. ifShow: ({ values }) => isLevel2(values.level),
  72. colProps: {
  73. span: 18,
  74. },
  75. componentProps: {
  76. api: async function (params) {
  77. const res = (await categoryApi(params)) as any as TreeNode[];
  78. // const treeData = makeTree(res);
  79. return res.filter((i) => i.level === 'L1');
  80. },
  81. labelField: 'name',
  82. valueField: 'id',
  83. },
  84. },
  85. {
  86. field: 'isShow',
  87. component: 'RadioGroup',
  88. label: '是否显示',
  89. defaultValue: '1',
  90. colProps: {
  91. span: 24,
  92. },
  93. componentProps: {
  94. options: [
  95. {
  96. label: '显示',
  97. value: '1',
  98. },
  99. {
  100. label: '不显示',
  101. value: '0',
  102. },
  103. ],
  104. },
  105. },
  106. {
  107. field: 'sortOrder',
  108. component: 'InputNumber',
  109. label: '排序',
  110. defaultValue: 1,
  111. colProps: {
  112. span: 24,
  113. },
  114. componentProps: {
  115. min: 0,
  116. },
  117. },
  118. {
  119. field: 'wapBannerUrl',
  120. component: 'Upload',
  121. show: false,
  122. label: '手机banner',
  123. rules: [{ required: true, message: '请选择上传文件' }],
  124. itemProps: {
  125. validateTrigger: 'blur',
  126. },
  127. componentProps: {
  128. api: uploadBannerApi,
  129. maxNumber: 1,
  130. maxSize: 5,
  131. afterFetch: function (data) {
  132. Reflect.set(data, 'url', data.message.url);
  133. return data;
  134. },
  135. },
  136. required: true,
  137. },
  138. ];
  139. export default defineComponent({
  140. components: { BasicModal, BasicForm },
  141. props: {
  142. userData: { type: Object },
  143. },
  144. emits: ['update', 'register'],
  145. setup(_, { emit }) {
  146. const { createMessage } = useMessage();
  147. const [
  148. registerForm,
  149. { validate, getFieldsValue, resetFields, setFieldsValue, updateSchema },
  150. ] = useForm({
  151. labelWidth: 120,
  152. schemas,
  153. showActionButtonGroup: false,
  154. actionColOptions: {
  155. span: 24,
  156. },
  157. });
  158. const [register, { closeModal }] = useModalInner((data) => {
  159. data && onDataReceive(data);
  160. });
  161. function onDataReceive(data) {
  162. console.log('Data Received', cloneDeep(data));
  163. setFieldsValue({
  164. ...data,
  165. isShow: String(data.isShow),
  166. wapBannerUrl: [data.wapBannerUrl],
  167. });
  168. updateSchema({
  169. field: 'parentId',
  170. componentProps: {
  171. api: async function (params) {
  172. const res = (await categoryApi(params)) as any as TreeNode[];
  173. return res.filter((i) => i.level === 'L1' && i.id !== data.id);
  174. },
  175. labelField: 'name',
  176. valueField: 'id',
  177. },
  178. });
  179. }
  180. async function handleOk() {
  181. try {
  182. const values = await validate();
  183. console.log('values', values);
  184. if (values) {
  185. let data = getFieldsValue();
  186. console.log('data', data);
  187. await updateCategoryApi({
  188. id: data.id,
  189. level: data.level,
  190. isShow: data.isShow,
  191. name: data.name,
  192. parentId: data.parentId,
  193. sortOrder: data.sortOrder,
  194. wapBannerUrl: data.wapBannerUrl[0] || '',
  195. });
  196. emit('update');
  197. createMessage.success(t('common.optSuccess'));
  198. resetFields();
  199. closeModal();
  200. }
  201. } catch (error) {}
  202. // let res = await saveItemApi(data);
  203. }
  204. return { register, schemas, registerForm, handleOk };
  205. },
  206. });
  207. </script>