| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250 |
- <template>
- <div class="index_box">
- <el-form label-width="90px" :inline="true">
- <!-- ✅ 主搜索项 -->
- <el-form-item
- v-for="(item, i) in seekListRow"
- :key="i"
- :label="item.label"
- :label-width="(item.labelWidth || 90) + 'px'"
- >
- <component
- :is="getFieldComponent(item)"
- v-model="defaultWhere[item.value]"
- v-bind="getFieldProps(item)"
- @keydown.enter.native.stop="search"
- >
- <el-option
- v-for="(op, j) in item.planList || []"
- :key="j"
- :label="op.label"
- :value="op.value"
- />
- </component>
- </el-form-item>
- <!-- ✅ 更多选项(竖向排列) -->
- <el-form-item v-if="deboListRow.length" class="more_option">
- <el-dropdown
- ref="dropdownRef"
- trigger="click"
- :hide-on-click="false"
- v-model="dropdownVisible"
- >
- <div class="el-dropdown-link">
- 更多选项 <i class="el-icon-arrow-down el-icon--right"></i>
- </div>
- <el-dropdown-menu slot="dropdown">
- <div class="padding">
- <el-form label-position="left">
- <!-- 去掉 :inline="true" 即可竖排 -->
- <el-form-item
- v-for="(item, i) in deboListRow"
- :key="i"
- :label="item.label"
- :label-width="(item.labelWidth || 90) + 'px'"
- >
- <component
- :is="getFieldComponent(item)"
- v-model="defaultWhere[item.value]"
- v-bind="getFieldProps(item)"
- @change="handleChange"
- @keydown.enter.native.stop="search"
- >
- <el-option
- v-for="(op, j) in item.planList || []"
- :key="j"
- :label="op.label"
- :value="op.value"
- />
- </component>
- </el-form-item>
- </el-form>
- </div>
- </el-dropdown-menu>
- </el-dropdown>
- </el-form-item>
- <!-- ✅ 操作按钮 -->
- <el-form-item>
- <el-button type="primary" icon="el-icon-search" @click="search">
- 查询
- </el-button>
- <el-button icon="el-icon-refresh-left" type="primary" @click="reset">
- 重置
- </el-button>
- </el-form-item>
- </el-form>
- </div>
- </template>
- <script>
- export default {
- props: {
- maxLength: { type: Number, default: 3 },
- seekList: { type: Array, default: () => [] },
- keyValue: { type: String, default: '' }
- },
- data() {
- const today = new Date();
- return {
- defaultWhere: {
- startTime: today
- },
- dropdownVisible: false,
- seekListRow: [],
- deboListRow: []
- };
- },
- watch: {
- seekList: {
- immediate: true,
- deep: true,
- handler(val) {
- if (!Array.isArray(val)) return;
- this.seekListRow = val.slice(0, this.maxLength);
- this.deboListRow = val.slice(this.maxLength);
- }
- },
- defaultWhere: {
- deep: true,
- handler(val) {
- if (!this.keyValue) return;
- if (Object.keys(val).length) {
- sessionStorage.setItem(this.keyValue, JSON.stringify(val));
- } else {
- sessionStorage.removeItem(this.keyValue);
- }
- }
- }
- },
- mounted() {
- const cache = this.keyValue && sessionStorage.getItem(this.keyValue);
- if (cache) {
- this.defaultWhere = JSON.parse(cache);
- this.search();
- }
- },
- methods: {
- /** 根据字段类型返回对应组件 */
- getFieldComponent(item) {
- switch (item.type) {
- case 'input':
- return 'el-input';
- case 'select':
- return 'el-select';
- case 'selectTree':
- return 'ele-tree-select';
- case 'date':
- return 'el-date-picker';
- default:
- return 'el-input';
- }
- },
- /** 生成字段属性 */
- getFieldProps(item) {
- const base = {
- clearable: item.clearable !== undefined ? item.clearable : true,
- placeholder:
- item.placeholder ||
- (item.type === 'input' ? '请输入内容' : '请选择'),
- style: {
- width: (item.width || (item.type === 'date' ? 350 : 200)) + 'px'
- }
- };
- switch (item.type) {
- case 'select':
- return {
- ...base,
- multiple: !!item.multiple,
- filterable: item.filterable !== false
- };
- case 'selectTree':
- return {
- ...base,
- data: item.planList || [],
- childrenKey: item.childrenKey || 'children',
- valueKey: 'id',
- labelKey: 'name',
- 'default-expand-all': true
- };
- case 'date':
- return {
- ...base,
- type: item.dateType || 'daterange',
- defaultValue: this.today,
- 'value-format': 'yyyy-MM-dd HH:mm:ss',
- 'range-separator': '至',
- 'start-placeholder': '开始日期',
- 'end-placeholder': '结束日期'
- };
- default:
- return base;
- }
- },
- /** 下拉框保持展开 */
- handleChange() {
- if (this.$refs.dropdownRef?.show) this.$refs.dropdownRef.show();
- },
- /** 查询 */
- search() {
- const temp = { ...this.defaultWhere };
- this.seekList
- .filter((it) => it.valueAr)
- .forEach((it) => {
- const data = temp[it.value];
- if (data) {
- temp[it.valueAr[0]] = data[0];
- temp[it.valueAr[1]] = data[1];
- } else {
- delete temp[it.valueAr[0]];
- delete temp[it.valueAr[1]];
- }
- delete temp[it.value];
- });
- this.$emit('search', temp);
- },
- /** 重置 */
- reset() {
- const today = new Date();
- this.defaultWhere = {
- startTime: today
- };
- this.search();
- }
- }
- };
- </script>
- <style scoped lang="scss">
- .index_box {
- display: flex;
- }
- .padding {
- padding: 20px;
- max-height: 400px;
- overflow-y: auto;
- }
- ::v-deep(.more_option.el-form--inline.el-form-item) {
- margin-right: 0 !important;
- }
- /* ✅ 更多选项表单竖排间距优化 */
- ::v-deep(.el-dropdown-menu .el-form-item) {
- display: flex;
- align-items: center;
- margin-bottom: 10px;
- }
- </style>
|