addModal.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. <template>
  2. <BasicModal
  3. v-bind="$attrs"
  4. @cancel="resetFields"
  5. @register="register"
  6. :title="title"
  7. width="60%"
  8. min-width="600px"
  9. @ok="handleOk"
  10. >
  11. <div class="pt-3px pr-3px">
  12. <BasicForm @register="registerForm" :model="modelRef" />
  13. </div>
  14. </BasicModal>
  15. </template>
  16. <script lang="ts">
  17. // computed
  18. import { defineComponent, ref } from 'vue';
  19. import { addNoticeApi, editNoticeApi } from '/@/api/notification/list';
  20. import { BasicModal, useModalInner } from '/@/components/Modal';
  21. import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
  22. // import { ListAllCompanyApi } from '/@/api/corporation/list';
  23. import { useI18n } from '/@/hooks/web/useI18n';
  24. import { useMessage } from '/@/hooks/web/useMessage';
  25. // import { useUserStore } from '/@/store/modules/user';
  26. // import { Tinymce } from '/@/components/Tinymce';
  27. import { uploadApi } from '/@/api/advertisement/list';
  28. import { formatToDateTime } from '/@/utils/dateUtil';
  29. const { t } = useI18n();
  30. export default defineComponent({
  31. components: { BasicModal, BasicForm },
  32. props: {
  33. userData: { type: Object },
  34. },
  35. emits: ['register', 'ok', 'cancel'],
  36. setup(_, { emit }) {
  37. const modelRef = ref({});
  38. const isView = ref(false);
  39. // const userStore = useUserStore();
  40. // const { getCheckRole } = userStore;
  41. // const userinfo = computed(() => userStore.getUserInfo);
  42. // const { companyId } = userinfo.value;
  43. const schemas: FormSchema[] = [
  44. {
  45. field: 'id',
  46. component: 'Input',
  47. label: 'id',
  48. show: false,
  49. },
  50. {
  51. field: 'title',
  52. component: 'Input',
  53. label: '标题',
  54. required: true,
  55. componentProps: {},
  56. colProps: {
  57. span: 22,
  58. },
  59. },
  60. {
  61. field: 'effectiveTime',
  62. component: 'RangePicker',
  63. componentProps: {
  64. format: 'YYYY-MM-DD HH:mm:ss',
  65. showTime: true,
  66. },
  67. label: '时间段',
  68. required: true,
  69. colProps: {
  70. span: 22,
  71. },
  72. },
  73. {
  74. field: 'type',
  75. component: 'RadioButtonGroup',
  76. label: '类型',
  77. required: true,
  78. colProps: {
  79. span: 22,
  80. },
  81. defaultValue: 0,
  82. componentProps: {
  83. options: [
  84. { label: '文字', value: 0 },
  85. { label: '图片', value: 1 },
  86. ],
  87. },
  88. },
  89. {
  90. field: 'content1',
  91. label: '内容',
  92. component: 'InputTextArea',
  93. ifShow: ({ model }) => {
  94. return model['type'] === 0;
  95. },
  96. colProps: {
  97. span: 22,
  98. },
  99. componentProps: {
  100. showCount: true,
  101. maxlength: 200,
  102. autoSize: {
  103. minRows: 6,
  104. },
  105. },
  106. },
  107. {
  108. field: 'content2',
  109. label: '内容',
  110. component: 'Upload',
  111. required: true,
  112. itemProps: {
  113. validateTrigger: 'blur',
  114. },
  115. ifShow: ({ model }) => {
  116. return model['type'] === 1;
  117. },
  118. componentProps: {
  119. api: uploadApi,
  120. maxSize: 5,
  121. emptyHidePreview: true,
  122. maxNumber: 1,
  123. accept: ['jpg', 'jpeg', 'gif', 'png'],
  124. afterFetch: function (data) {
  125. Reflect.set(data, 'url', data.message.url);
  126. return data;
  127. },
  128. },
  129. colProps: {
  130. span: 22,
  131. },
  132. },
  133. ];
  134. const title = ref('新 增');
  135. const { createMessage } = useMessage();
  136. const [registerForm, { validate, resetFields, setFieldsValue, updateSchema }] = useForm({
  137. labelWidth: 120,
  138. schemas,
  139. showActionButtonGroup: false,
  140. actionColOptions: {
  141. span: 24,
  142. },
  143. });
  144. // closeModal
  145. const [register, { closeModal }] = useModalInner((data) => {
  146. data && onDataReceive(data);
  147. });
  148. async function onDataReceive(data) {
  149. console.log('onDataReceive', data);
  150. // 方式1;
  151. resetFields();
  152. isView.value = false;
  153. let updateSchemas = schemas.map((item: FormSchema) => {
  154. item.componentProps = {
  155. ...item.componentProps,
  156. disabled: false,
  157. };
  158. return item;
  159. });
  160. if (data.isView) {
  161. isView.value = true;
  162. title.value = '查看';
  163. setFieldsValue({
  164. ...data,
  165. effectiveTime: [data.startTime, data.endTime],
  166. });
  167. if (data.type === 0) {
  168. setFieldsValue({
  169. content1: data.content,
  170. });
  171. }
  172. if (data.type === 1) {
  173. setFieldsValue({
  174. content2: [data.content],
  175. });
  176. }
  177. updateSchemas = schemas.map((item: FormSchema) => {
  178. item.componentProps = {
  179. ...item.componentProps,
  180. disabled: true,
  181. };
  182. return item;
  183. });
  184. }
  185. await updateSchema(updateSchemas);
  186. }
  187. async function handleOk() {
  188. let data = await validate();
  189. console.log('data', data);
  190. const requestApi = data.id ? editNoticeApi : addNoticeApi;
  191. let res = await requestApi({
  192. title: data.title,
  193. content: data.type === 0 ? data.content1 : data.content2[0],
  194. type: String(data.type),
  195. effectiveTime: data.effectiveTime.map((i) => formatToDateTime(i)),
  196. id: data.id,
  197. });
  198. console.log('res', res);
  199. emit('ok', res);
  200. createMessage.success(t('common.optSuccess'));
  201. closeModal();
  202. resetFields();
  203. }
  204. return {
  205. register,
  206. title,
  207. schemas,
  208. registerForm,
  209. modelRef,
  210. handleOk,
  211. resetFields,
  212. isView,
  213. };
  214. },
  215. });
  216. </script>