popup.vue 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <template>
  2. <BasicModal v-bind="$attrs" @register="register" @ok="confirm" :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 [
  41. registerForm,
  42. { getFieldsValue, updateSchema, setFieldsValue, resetFields /* validate*/ },
  43. ] = useForm({
  44. labelWidth: 100,
  45. schemas,
  46. showActionButtonGroup: false,
  47. actionColOptions: { span: 24 },
  48. });
  49. const [register, { closeModal }] = useModalInner((data) => {
  50. resetFields();
  51. // if (unref(isUpdate)) {
  52. // setFieldsValue(data);
  53. // }
  54. if (data.id) {
  55. state.rule_id = data.id;
  56. state.ismenu = data.ismenu;
  57. }
  58. setFieldsValue(data);
  59. updateSchema({
  60. field: 'pid',
  61. componentProps: { treeData: popupData.treeData },
  62. });
  63. });
  64. function confirm() {
  65. console.log('确定');
  66. const data = getFieldsValue();
  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. }
  77. return {
  78. register,
  79. schemas,
  80. registerForm,
  81. replaceFields,
  82. model: modelRef,
  83. confirm,
  84. ...toRefs(popupData),
  85. };
  86. },
  87. });
  88. </script>
  89. <style lang="less">
  90. .ant-form-item-label {
  91. text-align: center !important;
  92. }
  93. .tree-wrap {
  94. display: flex;
  95. }
  96. .tree-label {
  97. width: 20.6%;
  98. margin-top: 8px;
  99. margin-bottom: 1em;
  100. text-align: center;
  101. }
  102. @media (max-width: 639px) {
  103. .ant-form-item-label {
  104. line-height: 2.5715 !important;
  105. text-align: center !important;
  106. }
  107. .tree-label {
  108. width: 33%;
  109. margin-top: 8px;
  110. margin-bottom: 1em;
  111. text-align: center;
  112. }
  113. }
  114. </style>