seekPage.vue 9.5 KB

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