seekPage.vue 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. <template>
  2. <div class="index_box">
  3. <el-form label-width="90px" :inline="true">
  4. <el-form-item v-for="(item, i) in seekList" :key="i">
  5. <el-form-item
  6. :label="item.label"
  7. :label-width="item.labelWidth + 'px'"
  8. v-if="i <= 2"
  9. >
  10. <!-- input 输入 -->
  11. <div>
  12. <div v-if="item.type == 'input'">
  13. <el-input
  14. clearable
  15. v-model="defaultWhere[item.value]"
  16. :placeholder="item.placeholder || '请输入内容'"
  17. :style="{ width: item.width ? item.width + 'px' : '230px' }"
  18. />
  19. </div>
  20. <div v-if="item.type == 'select'">
  21. <el-select
  22. clearable
  23. v-model="defaultWhere[item.value]"
  24. :multiple="item.multiple ? item.multiple : false"
  25. :filterable="item.filterable ? item.filterable : true"
  26. :placeholder="item.placeholder || '请选择'"
  27. :style="{ width: item.width ? item.width + 'px' : '230px' }"
  28. >
  29. <el-option
  30. v-for="(op, i) in item.planList"
  31. :label="op.label"
  32. :value="op.value"
  33. :key="i"
  34. ></el-option>
  35. </el-select>
  36. </div>
  37. <div v-if="item.type == 'selectTree'">
  38. <ele-tree-select
  39. clearable
  40. ref="processTypeRef"
  41. filterable
  42. :data="item.planList"
  43. v-model="defaultWhere[item.value]"
  44. :childrenKey="item.childrenKey || 'children'"
  45. valueKey="id"
  46. labelKey="name"
  47. :placeholder="item.placeholder || '请选择'"
  48. default-expand-all
  49. :style="{ width: item.width ? item.width + 'px' : '230px' }"
  50. />
  51. </div>
  52. <div v-if="item.type == 'date'">
  53. <el-date-picker
  54. v-model="defaultWhere[item.value]"
  55. @visible-change="change"
  56. :type="item.dateType || 'daterange'"
  57. range-separator="至"
  58. start-placeholder="开始日期"
  59. end-placeholder="结束日期"
  60. value-format="yyyy-MM-dd HH:mm:ss"
  61. :style="{ width: item.width ? item.width + 'px' : '380px' }"
  62. >
  63. </el-date-picker>
  64. </div>
  65. </div>
  66. </el-form-item>
  67. </el-form-item>
  68. <el-form-item>
  69. <el-dropdown
  70. ref="dropdownref"
  71. trigger="click"
  72. :hide-on-click="false"
  73. v-model="dropdownVisible"
  74. >
  75. <div v-if="seekList.length > 3">
  76. <span class="el-dropdown-link">
  77. 更多选项<i class="el-icon-arrow-down el-icon--right"></i>
  78. </span>
  79. <el-dropdown-menu slot="dropdown">
  80. <div class="padding">
  81. <el-form label-position="left">
  82. <el-form-item
  83. v-for="(item, i) in deboListRow"
  84. :key="i"
  85. :inline="true"
  86. label-position="left"
  87. >
  88. <el-form-item
  89. :label-width="
  90. item.labelWidth ? item.labelWidth : '90' + 'px'
  91. "
  92. :inline="true"
  93. :label="item.label"
  94. >
  95. <div v-if="item.type == 'input'">
  96. <el-input
  97. clearable
  98. v-model="defaultWhere[item.value]"
  99. :placeholder="item.placeholder || '请输入内容'"
  100. :style="{
  101. width: item.width ? item.width + 'px' : '230px'
  102. }"
  103. />
  104. </div>
  105. <div v-if="item.type == 'select'">
  106. <el-select
  107. clearable
  108. v-model="defaultWhere[item.value]"
  109. :multiple="item.multiple ? item.multiple : false"
  110. :filterable="item.filterable ? item.filterable : true"
  111. :placeholder="item.placeholder || '请选择'"
  112. :style="{
  113. width: item.width ? item.width + 'px' : '230px'
  114. }"
  115. @visible-change="change"
  116. @change="handerChange"
  117. >
  118. <el-option
  119. v-for="(op, i) in item.planList"
  120. :label="op.label"
  121. :value="op.value"
  122. :key="i"
  123. ></el-option>
  124. </el-select>
  125. </div>
  126. <div v-if="item.type == 'selectTree'">
  127. <ele-tree-select
  128. clearable
  129. ref="processTypeRef"
  130. filterable
  131. :data="item.planList"
  132. v-model="defaultWhere[item.value]"
  133. :childrenKey="item.childrenKey || 'children'"
  134. valueKey="id"
  135. labelKey="name"
  136. :placeholder="item.placeholder || '请选择'"
  137. default-expand-all
  138. :style="{
  139. width: item.width ? item.width + 'px' : '230px'
  140. }"
  141. />
  142. </div>
  143. <div v-if="item.type == 'date'">
  144. <el-date-picker
  145. v-model="defaultWhere[item.value]"
  146. @blur="change"
  147. :type="item.dateType || 'daterange'"
  148. range-separator="至"
  149. start-placeholder="开始日期"
  150. end-placeholder="结束日期"
  151. value-format="yyyy-MM-dd HH:mm:ss"
  152. :style="{
  153. width: item.width ? item.width + 'px' : '230px'
  154. }"
  155. >
  156. </el-date-picker>
  157. </div>
  158. </el-form-item>
  159. </el-form-item>
  160. </el-form>
  161. </div>
  162. </el-dropdown-menu>
  163. </div>
  164. </el-dropdown>
  165. </el-form-item>
  166. <el-form-item>
  167. <el-button
  168. type="primary"
  169. icon="el-icon-search"
  170. class="ele-btn-icon"
  171. @click="search"
  172. >
  173. 查询
  174. </el-button>
  175. <el-button @click="reset" icon="el-icon-refresh-left" type="primary"
  176. >重置</el-button
  177. >
  178. </el-form-item>
  179. </el-form>
  180. </div>
  181. </template>
  182. <script>
  183. import { copyObj } from '@/utils/util';
  184. export default {
  185. props: {
  186. seekList: {
  187. type: Array,
  188. default: () => []
  189. },
  190. keyValue: ''
  191. },
  192. components: {},
  193. watch: {
  194. seekList: {
  195. handler(val) {
  196. this.$nextTick(() => {
  197. if (Array.isArray(val) && val.length <= 3) {
  198. this.seekListRow = val;
  199. } else if (Array.isArray(val) && val.length >= 3) {
  200. this.seekListRow = val.slice(0, 3);
  201. this.deboListRow = val.slice(3);
  202. }
  203. });
  204. },
  205. deep: true,
  206. immediate: true
  207. },
  208. defaultWhere: {
  209. handler(val) {
  210. if (this.keyValue) {
  211. sessionStorage[this.keyValue] = JSON.stringify(val);
  212. if (Object.keys(val).length === 0) {
  213. sessionStorage.removeItem(this.keyValue);
  214. }
  215. }
  216. },
  217. deep: true
  218. // immediate: true
  219. }
  220. },
  221. data() {
  222. return {
  223. defaultWhere: {},
  224. dropdownVisible: true,
  225. deboListRow: [],
  226. seekListRow: []
  227. };
  228. },
  229. computed: {
  230. info() {
  231. return this.$store.state.user.info;
  232. }
  233. },
  234. mounted() {
  235. let whereObj = sessionStorage[this.keyValue];
  236. if (whereObj) {
  237. this.defaultWhere = JSON.parse(whereObj);
  238. this.search();
  239. }
  240. },
  241. methods: {
  242. change(visible) {
  243. this.dropdownVisible = visible;
  244. this.$refs.dropdownref.show();
  245. },
  246. handerChange() {
  247. this.$refs.dropdownref.show();
  248. },
  249. search() {
  250. let valueAr = this.seekList.filter((item) => item.valueAr);
  251. valueAr.forEach((item) => {
  252. let data = this.defaultWhere[item.value];
  253. if (data) {
  254. this.defaultWhere[item.valueAr[0]] = data[0];
  255. this.defaultWhere[item.valueAr[1]] = data[1];
  256. } else {
  257. delete this.defaultWhere[item.valueAr[0]];
  258. delete this.defaultWhere[item.valueAr[1]];
  259. }
  260. delete this.defaultWhere[item.value];
  261. });
  262. this.$emit('search', this.defaultWhere);
  263. },
  264. // 重置
  265. reset() {
  266. this.defaultWhere = {};
  267. this.search();
  268. }
  269. // 折叠悬浮中样式调整
  270. }
  271. };
  272. </script>
  273. <style scoped>
  274. .index_box {
  275. display: flex;
  276. }
  277. .padding {
  278. padding: 20px;
  279. }
  280. </style>