index.vue 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. <script>
  2. export default {
  3. name: "SuperSearch",
  4. props: {
  5. value: {
  6. type: [Object],
  7. require: true,
  8. },
  9. dict: {
  10. type: [Object],
  11. require: true,
  12. },
  13. columns: {
  14. type: [Array],
  15. require: true,
  16. },
  17. },
  18. components: {
  19. ElDraggable: () => import("@/components/draggable/index.vue"),
  20. ElFileUpload: () => import("@/components/FileUpload/index.vue"),
  21. ElPopoverSelectV2: () => import("@/components/popover-select-v2/index.vue"),
  22. ElPopoverMultipleSelectV2: () =>
  23. import("@/components/popover-select-v2/multiple.vue"),
  24. ElPopoverTreeSelect: () =>
  25. import("@/components/popover-tree-select/index.vue"),
  26. ElPopoverMultipleTreeSelect: () =>
  27. import("@/components/popover-tree-select/multiple.vue"),
  28. ElDateWrapper: () => import("@/components/date-wrapper/index.vue"),
  29. },
  30. data() {
  31. const { columns } = this.$props;
  32. const innerColumns = columns.map(({ item, attr }) => ({
  33. attr,
  34. item: { ...item, hidden: true, span: item.span || 6 },
  35. }));
  36. return {
  37. drawer: false,
  38. visible: false,
  39. innerColumns: innerColumns,
  40. };
  41. },
  42. computed: {
  43. innerValue: {
  44. get() {
  45. return this.value;
  46. },
  47. set(value) {
  48. this.$emit("input", value);
  49. },
  50. },
  51. showColumns: {
  52. get() {
  53. return this.innerColumns.filter(({ item }) => item.hidden);
  54. },
  55. set() {},
  56. },
  57. height: {
  58. get() {
  59. const maxMultiples = Math.ceil(
  60. this.innerColumns
  61. .map(({ item }) => item.span)
  62. .reduce((prev, curr) => {
  63. return prev + curr;
  64. }) / 24
  65. );
  66. const multiples = this.visible ? maxMultiples : 1;
  67. return multiples * 41 + "px";
  68. },
  69. set() {},
  70. },
  71. },
  72. watch: {},
  73. methods: {
  74. onVisible() {
  75. this.visible = !this.visible;
  76. },
  77. },
  78. created() {},
  79. mounted() {},
  80. destroyed() {},
  81. };
  82. </script>
  83. <template>
  84. <el-form
  85. class="superForm"
  86. ref="superForm"
  87. v-bind="$attrs"
  88. v-on="$listeners"
  89. :model="innerValue"
  90. label-width="auto"
  91. label-position="right"
  92. @submit.native.prevent
  93. >
  94. <el-row
  95. :gutter="24"
  96. :style="{ height }"
  97. style="overflow: hidden; transition: 250ms; display: flex"
  98. class="px-3"
  99. >
  100. <el-row :gutter="20" style="flex: 1; display: flex; flex-wrap: wrap">
  101. <el-col
  102. v-for="({ item, attr }, index) in showColumns"
  103. :key="index"
  104. :span="item.span"
  105. >
  106. <el-form-item :prop="item.key" :label="item.title">
  107. <component
  108. v-if="attr.is === 'el-input'"
  109. v-bind="attr"
  110. v-model="innerValue[item.key]"
  111. @keyup.enter.native="$emit('submit')"
  112. style="width: 100%"
  113. >
  114. </component>
  115. <component
  116. v-if="attr.is === 'el-select'"
  117. v-bind="attr"
  118. v-model="innerValue[item.key]"
  119. @change="attr.multiple ? '': $emit('submit')"
  120. style="width: 100%"
  121. >
  122. <template>
  123. <el-option
  124. v-for="item in dict.type[attr.dictName]"
  125. :key="item.value"
  126. :label="item.label"
  127. :value="item.value"
  128. >
  129. </el-option>
  130. </template>
  131. </component>
  132. <component
  133. v-if="attr.is === 'el-date-picker'"
  134. v-bind="attr"
  135. v-model="innerValue[item.key]"
  136. @change="$emit('submit')"
  137. style="width: 100%"
  138. >
  139. </component>
  140. <component
  141. v-if="attr.is === 'el-popover-select-v2'"
  142. v-bind="attr"
  143. v-model="innerValue[item.key]"
  144. :title="item.title"
  145. :source.sync="innerValue"
  146. @change="$emit('submit')"
  147. style="width: 100%"
  148. >
  149. </component>
  150. <component
  151. v-if="attr.is === 'el-popover-multiple-select-v2'"
  152. v-bind="attr"
  153. :title="item.title"
  154. v-model="innerValue[item.key]"
  155. :source.sync="innerValue"
  156. @change="$emit('submit')"
  157. style="width: 100%"
  158. >
  159. </component>
  160. <component
  161. v-if="attr.is === 'el-popover-tree-select'"
  162. v-bind="attr"
  163. v-model="innerValue[item.key]"
  164. :source.sync="innerValue"
  165. @change="$emit('submit')"
  166. style="width: 100%"
  167. >
  168. </component>
  169. <component
  170. v-if="attr.is === 'el-popover-multiple-tree-select'"
  171. v-bind="attr"
  172. v-model="innerValue[item.key]"
  173. :source.sync="innerValue"
  174. @change="$emit('submit')"
  175. style="width: 100%"
  176. >
  177. </component>
  178. <component
  179. v-if="attr.is === 'el-date-wrapper'"
  180. v-bind="attr"
  181. v-model="innerValue[item.key]"
  182. :source.sync="innerValue"
  183. @change="$emit('submit')"
  184. style="width: 100%"
  185. >
  186. </component>
  187. </el-form-item>
  188. </el-col>
  189. </el-row>
  190. <el-row style="width: fit-content; text-align: right" class="ml-5">
  191. <el-button :size="$attrs.size" type="primary" @click="$emit('submit')">
  192. 搜索
  193. </el-button>
  194. <el-button :size="$attrs.size" @click="$emit('reset')">
  195. 重置
  196. </el-button>
  197. <!-- <el-button :size="$attrs.size" @click="visible = !visible">
  198. {{ visible ? "展开" : "收起" }}
  199. </el-button> -->
  200. </el-row>
  201. </el-row>
  202. <el-divider class="m-0" style="cursor: pointer" @click="visible = !visible">
  203. <i
  204. class="el-icon-d-arrow-left"
  205. style="transition: 250ms"
  206. :style="{ transform: `rotate(${visible ? 90 : -90}deg)` }"
  207. ></i>
  208. </el-divider>
  209. </el-form>
  210. </template>
  211. <style scoped>
  212. .superForm>>>.el-form-item{
  213. margin-bottom: 12px;
  214. }
  215. </style>