CategoryModal.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import Modal from "@/components/Provider/Modal";
  2. import { css } from "@linaria/core";
  3. import { Button, Checkbox, Form, Input, Select } from "ant-design-vue";
  4. import { defineComponent, onMounted, reactive, ref } from "vue";
  5. import { any } from "vue-types";
  6. import UploadImage from "./UploadImage";
  7. import { uploader } from "../objects";
  8. const layout = {
  9. labelCol: { span: 6 },
  10. wrapperCol: { span: 18 },
  11. };
  12. export default defineComponent({
  13. props: {
  14. data: any(),
  15. },
  16. setup(props) {
  17. const modal = Modal.use();
  18. const formState: { [name: string]: any } = reactive({
  19. formData: {
  20. ...{
  21. name: "",
  22. cover: "",
  23. subName: "",
  24. sort: 0,
  25. type: "list",
  26. isHome: false,
  27. },
  28. ...props.data,
  29. },
  30. });
  31. const rules = reactive({
  32. name: [{ required: true, message: "名称不能为空", trigger: "change" }],
  33. cover: [{ required: false }],
  34. subName: [{ required: false }],
  35. isHome: [{ required: false }],
  36. type: [{ required: true, message: "类型不能为空", trigger: "change" }],
  37. });
  38. const { validate, validateInfos } = Form.useForm(formState.formData, rules);
  39. function submit() {
  40. validate().then(async () => {
  41. await uploader.uploadBlobImages(formState.formData);
  42. modal.submit(formState.formData);
  43. });
  44. }
  45. const changeBanner = (v: string) => {
  46. formState.formData.cover = v;
  47. };
  48. return () => {
  49. return (
  50. <div class={EditStyle}>
  51. <Form {...layout} onSubmit={submit}>
  52. <Form.Item {...validateInfos.cover} wrapperCol={{ span: 24 }}>
  53. <UploadImage
  54. data={formState.formData.cover}
  55. text={"上传菜单banner图"}
  56. onChange={changeBanner}
  57. ></UploadImage>
  58. </Form.Item>
  59. <Form.Item {...validateInfos.name} label={"菜单名称"}>
  60. <Input
  61. placeholder={"请输入菜单名称"}
  62. v-model={[formState.formData.name, "value"]}
  63. maxlength={30}
  64. />
  65. </Form.Item>
  66. <Form.Item {...validateInfos.subName} label={"副标题"}>
  67. <Input
  68. placeholder={"请输入副标题"}
  69. v-model={[formState.formData.subName, "value"]}
  70. maxlength={30}
  71. />
  72. </Form.Item>
  73. <Form.Item {...validateInfos.type} label={"菜单类型"}>
  74. <Select v-model={[formState.formData.type, "value"]}>
  75. <Select.Option value="list">列表</Select.Option>
  76. <Select.Option value="detail">详情</Select.Option>
  77. <Select.Option value="download">下载</Select.Option>
  78. </Select>
  79. </Form.Item>
  80. <Form.Item {...validateInfos.isHome} label={"是否首页展示"}>
  81. <Checkbox
  82. v-model={[formState.formData.isHome, "checked"]}
  83. ></Checkbox>
  84. </Form.Item>
  85. <Form.Item style={{ marginBottom: 0 }} wrapperCol={{ span: 24 }}>
  86. <Button type="primary" htmlType="submit" block>
  87. 保存
  88. </Button>
  89. </Form.Item>
  90. </Form>
  91. </div>
  92. );
  93. };
  94. },
  95. });
  96. const EditStyle = css`
  97. width: 500px;
  98. `;