seekPage.vue 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  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 <= formLength - 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' : '220px' }"
  18. @keyup.enter.native="search" />
  19. </div>
  20. <div v-if="item.type == 'select'">
  21. <el-select
  22. clearable
  23. v-model="defaultWhere[item.value]"
  24. :placeholder="item.placeholder || '请输入内容'"
  25. :multiple="item.multiple ? item.multiple : false"
  26. :filterable="item.filterable ? item.filterable : true"
  27. :style="{ width: item.width ? item.width + 'px' : '220px' }"
  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 == 'date'">
  38. <el-date-picker
  39. v-model="defaultWhere[item.value]"
  40. @visible-change="change"
  41. :type="item.dateType || 'daterange'"
  42. range-separator="至"
  43. start-placeholder="开始日期"
  44. end-placeholder="结束日期"
  45. value-format="yyyy-MM-dd"
  46. :style="{ width: item.width ? item.width + 'px' : '220px' }"
  47. >
  48. </el-date-picker>
  49. </div>
  50. <div v-if="item.type == 'DictSelection'">
  51. <DictSelection
  52. v-model="defaultWhere[item.value]"
  53. :placeholder="item.placeholder || '请选择内容'"
  54. :multiple="item.multiple ? item.multiple : false"
  55. :style="{ width: item.width ? item.width + 'px' : '220px' }"
  56. :dictName="item.dictName"
  57. />
  58. </div>
  59. </div>
  60. </el-form-item>
  61. </el-form-item>
  62. <el-form-item>
  63. <el-dropdown
  64. ref="dropdownref"
  65. trigger="click"
  66. :hide-on-click="false"
  67. v-model="dropdownVisible"
  68. >
  69. <div v-if="seekList.length > formLength">
  70. <span class="el-dropdown-link">
  71. 更多选项<i class="el-icon-arrow-down el-icon--right"></i>
  72. </span>
  73. <el-dropdown-menu slot="dropdown">
  74. <div class="padding">
  75. <el-form label-position="left">
  76. <el-form-item
  77. v-for="(item, i) in deboListRow"
  78. :key="i"
  79. :inline="true"
  80. label-position="left"
  81. >
  82. <el-form-item
  83. :label-width="
  84. item.labelWidth ? item.labelWidth : '90' + 'px'
  85. "
  86. :inline="true"
  87. :label="item.label"
  88. >
  89. <div v-if="item.type == 'input'">
  90. <el-input
  91. clearable
  92. v-model="defaultWhere[item.value]"
  93. :placeholder="item.placeholder || '请输入内容'"
  94. :style="{
  95. width: item.width ? item.width + 'px' : '220px'
  96. }"
  97. @keydown.enter.native="() => search()"
  98. @keyup.enter.native="() => search()" />
  99. </div>
  100. <div v-if="item.type == 'select'">
  101. <el-select
  102. clearable
  103. v-model="defaultWhere[item.value]"
  104. :multiple="item.multiple ? item.multiple : false"
  105. :filterable="item.filterable ? item.filterable : true"
  106. :placeholder="item.placeholder || '请输入内容'"
  107. :style="{
  108. width: item.width ? item.width + 'px' : '220px'
  109. }"
  110. @visible-change="change"
  111. @change="handerChange"
  112. >
  113. <el-option
  114. v-for="(op, i) in item.planList"
  115. :label="op.label"
  116. :value="op.value"
  117. :key="i"
  118. ></el-option>
  119. </el-select>
  120. </div>
  121. <div v-if="item.type == 'date'">
  122. <el-date-picker
  123. v-model="defaultWhere[item.value]"
  124. @blur="change"
  125. :type="item.dateType || 'daterange'"
  126. range-separator="至"
  127. start-placeholder="开始日期"
  128. end-placeholder="结束日期"
  129. value-format="yyyy-MM-dd HH:mm:ss"
  130. :style="{
  131. width: item.width ? item.width + 'px' : '220px'
  132. }"
  133. >
  134. </el-date-picker>
  135. </div>
  136. <div v-if="item.type == 'DictSelection'">
  137. <DictSelection
  138. v-model="defaultWhere[item.value]"
  139. :placeholder="item.placeholder || '请选择内容'"
  140. :multiple="item.multiple ? item.multiple : false"
  141. :style="{
  142. width: item.width ? item.width + 'px' : '220px'
  143. }"
  144. :dictName="item.dictName"
  145. />
  146. </div>
  147. <div v-if="item.type == 'picker'">
  148. <el-date-picker
  149. v-model="defaultWhere[item.value]"
  150. @blur="change"
  151. value-format="yyyy-MM-dd"
  152. :style="{
  153. width: item.width ? item.width + 'px' : '220px'
  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. export default {
  184. props: {
  185. seekList: {
  186. type: Array,
  187. default: () => []
  188. },
  189. formLength: {
  190. type: [Number],
  191. default: 3
  192. },
  193. keyValue: ''
  194. },
  195. mounted() {
  196. let whereObj = sessionStorage[this.keyValue];
  197. if (whereObj) {
  198. this.defaultWhere = JSON.parse(whereObj);
  199. this.search();
  200. }
  201. },
  202. components: {},
  203. watch: {
  204. seekList: {
  205. handler(val) {
  206. this.$nextTick(() => {
  207. if (Array.isArray(val) && val.length <= this.formLength) {
  208. this.seekListRow = val;
  209. } else if (Array.isArray(val) && val.length >= this.formLength) {
  210. this.seekListRow = val.slice(0, this.formLength);
  211. this.deboListRow = val.slice(this.formLength);
  212. }
  213. });
  214. },
  215. deep: true,
  216. immediate: true
  217. },
  218. defaultWhere: {
  219. handler(val) {
  220. if (this.keyValue) {
  221. sessionStorage[this.keyValue] = JSON.stringify(val);
  222. if (Object.keys(val).length === 0) {
  223. sessionStorage.removeItem(this.keyValue);
  224. }
  225. }
  226. },
  227. deep: true
  228. // immediate: true
  229. }
  230. },
  231. data() {
  232. return {
  233. defaultWhere: {},
  234. dropdownVisible: true,
  235. deboListRow: [],
  236. seekListRow: []
  237. };
  238. },
  239. computed: {
  240. info() {
  241. return this.$store.state.user.info;
  242. }
  243. },
  244. created() {},
  245. methods: {
  246. change(visible) {
  247. this.dropdownVisible = visible;
  248. this.$refs.dropdownref.show();
  249. },
  250. handerChange() {
  251. this.$refs.dropdownref.show();
  252. },
  253. // changeDate(val, prop) {
  254. // console.log(val);
  255. // console.log(prop);
  256. // if (!val) {
  257. // this.defaultWhere[prop] = ['', ''];
  258. // console.log(this.defaultWhere);
  259. // }
  260. // },
  261. search() {
  262. let valueAr = this.seekList.filter((item) => item.valueAr);
  263. let where = JSON.parse(JSON.stringify(this.defaultWhere));
  264. valueAr.forEach((item) => {
  265. let data = where[item.value];
  266. if (data) {
  267. where[item.valueAr[0]] = data[0];
  268. where[item.valueAr[1]] = data[1];
  269. } else {
  270. where[item.valueAr[0]] = '';
  271. where[item.valueAr[1]] = '';
  272. }
  273. delete where[item.value];
  274. });
  275. this.$emit('search', where);
  276. },
  277. // 重置
  278. reset() {
  279. this.defaultWhere = {};
  280. this.search();
  281. }
  282. // 折叠悬浮中样式调整
  283. }
  284. };
  285. </script>
  286. <style scoped lang="scss">
  287. .index_box {
  288. display: flex;
  289. }
  290. .padding {
  291. padding: 20px;
  292. }
  293. :deep(.el-form-item) {
  294. margin-bottom: 5px !important;
  295. }
  296. </style>