popup.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. <template>
  2. <BasicModal v-bind="$attrs" @register="register" @ok="handleSubmit" :title="title">
  3. <BasicForm @register="registerForm" :model="model" />
  4. </BasicModal>
  5. </template>
  6. <script lang="ts">
  7. import { Tree } from 'ant-design-vue';
  8. import { defineComponent, PropType, reactive, ref, toRefs } from 'vue';
  9. import { BasicModal, useModalInner } from '/@/components/Modal';
  10. import { BasicForm, useForm } from '/@/components/Form/index';
  11. import { schemas } from './data';
  12. interface PopupData {
  13. title: string;
  14. treeData: object[];
  15. }
  16. interface State {
  17. rule_id: string | number;
  18. ismenu: boolean;
  19. }
  20. export default defineComponent({
  21. components: { BasicModal, BasicForm, [Tree.name]: Tree },
  22. props: {
  23. popupData: {
  24. type: Object as PropType<PopupData>,
  25. default: () => {},
  26. },
  27. },
  28. emits: ['saveData'],
  29. setup(props, { emit }) {
  30. const state = reactive<State>({
  31. rule_id: 0,
  32. ismenu: false,
  33. });
  34. const popupData = props.popupData as PopupData;
  35. console.log(popupData);
  36. const modelRef = ref({});
  37. const replaceFields = {
  38. key: 'id',
  39. };
  40. const [registerForm, { updateSchema, setFieldsValue, resetFields, validate }] = useForm({
  41. labelWidth: 100,
  42. schemas,
  43. showActionButtonGroup: false,
  44. actionColOptions: { span: 24 },
  45. });
  46. const [register, { closeModal }] = useModalInner((data) => {
  47. resetFields();
  48. // if (unref(isUpdate)) {
  49. // setFieldsValue(data);
  50. // }
  51. if (data.id) {
  52. state.rule_id = data.id;
  53. state.ismenu = data.ismenu;
  54. }
  55. setFieldsValue(data);
  56. updateSchema({
  57. field: 'pid',
  58. componentProps: {
  59. treeData: popupData.treeData,
  60. },
  61. });
  62. });
  63. async function handleSubmit() {
  64. console.log('确定');
  65. try {
  66. const data = await validate();
  67. let menuChange = false;
  68. if (state.rule_id) {
  69. data.id = state.rule_id;
  70. if (data.ismenu !== state.ismenu) {
  71. menuChange = true;
  72. }
  73. }
  74. const popupData = { closeModal, data, menuChange };
  75. emit('saveData', popupData);
  76. } finally {
  77. }
  78. }
  79. return {
  80. register,
  81. schemas,
  82. registerForm,
  83. replaceFields,
  84. model: modelRef,
  85. handleSubmit,
  86. ...toRefs(popupData),
  87. };
  88. },
  89. });
  90. </script>
  91. <style lang="less">
  92. .ant-form-item-label {
  93. text-align: center !important;
  94. }
  95. .tree-wrap {
  96. display: flex;
  97. }
  98. .tree-label {
  99. width: 20.6%;
  100. margin-top: 8px;
  101. margin-bottom: 1em;
  102. text-align: center;
  103. }
  104. @media (max-width: 639px) {
  105. .ant-form-item-label {
  106. line-height: 2.5715 !important;
  107. text-align: center !important;
  108. }
  109. .tree-label {
  110. width: 33%;
  111. margin-top: 8px;
  112. margin-bottom: 1em;
  113. text-align: center;
  114. }
  115. }
  116. </style>