seekPage.vue 9.8 KB

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