seekPage.vue 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  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. />
  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 HH:mm:ss"
  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. />
  98. </div>
  99. <div v-if="item.type == 'select'">
  100. <el-select
  101. clearable
  102. v-model="defaultWhere[item.value]"
  103. :multiple="item.multiple ? item.multiple : false"
  104. :filterable="item.filterable ? item.filterable : true"
  105. :placeholder="item.placeholder || '请输入内容'"
  106. :style="{
  107. width: item.width ? item.width + 'px' : '220px'
  108. }"
  109. @visible-change="change"
  110. @change="handerChange"
  111. >
  112. <el-option
  113. v-for="(op, i) in item.planList"
  114. :label="op.label"
  115. :value="op.value"
  116. :key="i"
  117. ></el-option>
  118. </el-select>
  119. </div>
  120. <div v-if="item.type == 'date'">
  121. <el-date-picker
  122. v-model="defaultWhere[item.value]"
  123. @blur="change"
  124. :type="item.dateType || 'daterange'"
  125. range-separator="至"
  126. start-placeholder="开始日期"
  127. end-placeholder="结束日期"
  128. value-format="yyyy-MM-dd HH:mm:ss"
  129. :style="{
  130. width: item.width ? item.width + 'px' : '220px'
  131. }"
  132. >
  133. </el-date-picker>
  134. </div>
  135. <div v-if="item.type == 'DictSelection'">
  136. <DictSelection
  137. v-model="defaultWhere[item.value]"
  138. :placeholder="item.placeholder || '请选择内容'"
  139. :multiple="item.multiple ? item.multiple : false"
  140. :style="{
  141. width: item.width ? item.width + 'px' : '220px'
  142. }"
  143. :dictName="item.dictName"
  144. />
  145. </div>
  146. <div v-if="item.type == 'picker'">
  147. <el-date-picker
  148. v-model="defaultWhere[item.value]"
  149. @blur="change"
  150. value-format="yyyy-MM-dd"
  151. :style="{
  152. width: item.width ? item.width + 'px' : '220px'
  153. }"
  154. >
  155. </el-date-picker>
  156. </div>
  157. </el-form-item>
  158. </el-form-item>
  159. </el-form>
  160. </div>
  161. </el-dropdown-menu>
  162. </div>
  163. </el-dropdown>
  164. </el-form-item>
  165. <el-form-item>
  166. <el-button
  167. type="primary"
  168. icon="el-icon-search"
  169. class="ele-btn-icon"
  170. @click="search"
  171. >
  172. 查询
  173. </el-button>
  174. <el-button @click="reset" icon="el-icon-refresh-left" type="primary"
  175. >重置</el-button
  176. >
  177. </el-form-item>
  178. </el-form>
  179. </div>
  180. </template>
  181. <script>
  182. export default {
  183. props: {
  184. seekList: {
  185. type: Array,
  186. default: () => []
  187. },
  188. formLength: {
  189. type: [Number],
  190. default: 3
  191. },
  192. keyValue:''
  193. },
  194. mounted() {
  195. let whereObj = sessionStorage[this.keyValue];
  196. if (whereObj) {
  197. this.defaultWhere = JSON.parse(whereObj);
  198. this.search();
  199. }
  200. },
  201. components: {},
  202. watch: {
  203. seekList: {
  204. handler(val) {
  205. this.$nextTick(() => {
  206. if (Array.isArray(val) && val.length <= this.formLength) {
  207. this.seekListRow = val;
  208. } else if (Array.isArray(val) && val.length >= this.formLength) {
  209. this.seekListRow = val.slice(0, this.formLength);
  210. this.deboListRow = val.slice(this.formLength);
  211. }
  212. });
  213. },
  214. deep: true,
  215. immediate: true
  216. },
  217. defaultWhere: {
  218. handler(val) {
  219. if (this.keyValue) {
  220. sessionStorage[this.keyValue] = JSON.stringify(val);
  221. if (Object.keys(val).length === 0) {
  222. sessionStorage.removeItem(this.keyValue);
  223. }
  224. }
  225. },
  226. deep: true
  227. // immediate: true
  228. }
  229. },
  230. data() {
  231. return {
  232. defaultWhere: {},
  233. dropdownVisible: true,
  234. deboListRow: [],
  235. seekListRow: []
  236. };
  237. },
  238. computed: {
  239. info() {
  240. return this.$store.state.user.info;
  241. }
  242. },
  243. created() {},
  244. methods: {
  245. change(visible) {
  246. this.dropdownVisible = visible;
  247. this.$refs.dropdownref.show();
  248. },
  249. handerChange() {
  250. this.$refs.dropdownref.show();
  251. },
  252. search() {
  253. let valueAr = this.seekList.filter((item) => item.valueAr);
  254. valueAr.forEach((item) => {
  255. let data = this.defaultWhere[item.value];
  256. if (data) {
  257. this.defaultWhere[item.valueAr[0]] = data[0];
  258. this.defaultWhere[item.valueAr[1]] = data[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 lang="scss">
  274. .index_box {
  275. display: flex;
  276. }
  277. .padding {
  278. padding: 20px;
  279. }
  280. :deep(.el-form-item) {
  281. margin-bottom: 5px !important;
  282. }
  283. </style>