refactor: 表格列选择器重构
This commit is contained in:
parent
238a5a929b
commit
5f235c9fee
|
@ -240,7 +240,7 @@
|
|||
const initColumn = () => {
|
||||
let tmpArr: MsTableColumn = [];
|
||||
if (props.showSetting) {
|
||||
tmpArr = tableStore.getShowInTableColumns(attrs.tableKey as string);
|
||||
tmpArr = tableStore.getShowInTableColumns(attrs.tableKey as string) || [];
|
||||
} else {
|
||||
tmpArr = props.columns;
|
||||
}
|
||||
|
|
|
@ -33,9 +33,9 @@
|
|||
<MsButton :disabled="!hasChange" @click="handleReset">{{ t('msTable.columnSetting.resetDefault') }}</MsButton>
|
||||
</div>
|
||||
<div class="flex-col">
|
||||
<div v-for="(item, idx) in nonSortColumn" :key="item.dataIndex" class="column-item">
|
||||
<div v-for="item in nonSortColumn" :key="item.dataIndex" class="column-item">
|
||||
<div>{{ t(item.title as string) }}</div>
|
||||
<a-switch size="small" :model-value="item.showInTable" @change="handleFirstColumnChange(idx)" />
|
||||
<a-switch v-model="item.showInTable" size="small" />
|
||||
</div>
|
||||
</div>
|
||||
<a-divider orientation="center" class="non-sort"
|
||||
|
@ -44,13 +44,13 @@
|
|||
}}</span></a-divider
|
||||
>
|
||||
<Draggable tag="div" :list="couldSortColumn" ghost-class="ghost" item-key="dateIndex">
|
||||
<template #item="{ element, index }">
|
||||
<template #item="{ element }">
|
||||
<div class="column-drag-item">
|
||||
<div class="flex w-[90%] items-center">
|
||||
<MsIcon type="icon-icon_drag" class="text-[16px] text-[var(--color-text-4)]" />
|
||||
<span class="ml-[8px]">{{ t(element.title as string) }}</span>
|
||||
</div>
|
||||
<a-switch size="small" :model-value="element.showInTable" @change="handleSecondColumnChange(index)" />
|
||||
<a-switch v-model="element.showInTable" size="small" />
|
||||
</div>
|
||||
</template>
|
||||
</Draggable>
|
||||
|
@ -113,20 +113,6 @@
|
|||
loadColumn(props.tableKey);
|
||||
};
|
||||
|
||||
const handleFirstColumnChange = (idx: number) => {
|
||||
const item = nonSortColumn.value[idx];
|
||||
item.showInTable = !item.showInTable;
|
||||
nonSortColumn.value[idx] = item;
|
||||
hasChange.value = true;
|
||||
};
|
||||
|
||||
const handleSecondColumnChange = (idx: number) => {
|
||||
const item = couldSortColumn.value[idx];
|
||||
item.showInTable = !item.showInTable;
|
||||
couldSortColumn.value[idx] = item;
|
||||
hasChange.value = true;
|
||||
};
|
||||
|
||||
const handleModeChange = (value: string | number | boolean) => {
|
||||
currentMode.value = value as string;
|
||||
tableStore.setMode(props.tableKey, value as TableOpenDetailMode);
|
||||
|
|
|
@ -1,25 +1,26 @@
|
|||
import { defineStore } from 'pinia';
|
||||
import { MsTableSelectorItem, MsTableState, TableOpenDetailMode } from './types';
|
||||
import { MsTableColumn } from '@/components/pure/ms-table/type';
|
||||
import { parse, stringify } from '@/utils/serializeMap';
|
||||
import { MsTableState, TableOpenDetailMode } from './types';
|
||||
import { MsTableColumn, MsTableColumnData } from '@/components/pure/ms-table/type';
|
||||
import { SpecialColumnEnum } from '@/enums/tableEnum';
|
||||
import { orderBy, filter, cloneDeep } from 'lodash';
|
||||
|
||||
const msTableStore = defineStore('msTable', {
|
||||
// 开启数据持久化
|
||||
persist: {
|
||||
serializer: {
|
||||
deserialize: parse,
|
||||
serialize: stringify,
|
||||
},
|
||||
paths: ['selectorColumnMap'],
|
||||
},
|
||||
state: (): MsTableState => ({
|
||||
selectorColumnMap: new Map<string, MsTableSelectorItem>(),
|
||||
selectorColumnMap: {},
|
||||
baseSortIndex: 10,
|
||||
operationBaseIndex: 100,
|
||||
}),
|
||||
actions: {
|
||||
initColumn(tableKey: string, column: MsTableColumn, mode: TableOpenDetailMode) {
|
||||
if (!this.selectorColumnMap.has(tableKey)) {
|
||||
const tmpMap = this.selectorColumnMap;
|
||||
column.forEach((item) => {
|
||||
if (!this.selectorColumnMap[tableKey]) {
|
||||
column.forEach((item, idx) => {
|
||||
if (item.sortIndex === undefined) {
|
||||
item.sortIndex = this.baseSortIndex + idx;
|
||||
}
|
||||
if (item.showDrag === undefined) {
|
||||
item.showDrag = false;
|
||||
}
|
||||
|
@ -36,45 +37,62 @@ const msTableStore = defineStore('msTable', {
|
|||
}
|
||||
if (item.dataIndex === SpecialColumnEnum.OPERATION || item.dataIndex === SpecialColumnEnum.ACTION) {
|
||||
item.showDrag = false;
|
||||
item.sortIndex = 1000;
|
||||
item.sortIndex = this.operationBaseIndex;
|
||||
}
|
||||
});
|
||||
tmpMap.set(tableKey, { mode, column });
|
||||
this.selectorColumnMap = tmpMap;
|
||||
this.selectorColumnMap[tableKey] = { mode, column };
|
||||
}
|
||||
},
|
||||
getMode(key: string): string {
|
||||
if (this.selectorColumnMap.has(key)) {
|
||||
return this.selectorColumnMap.get(key)?.mode || '';
|
||||
}
|
||||
return '';
|
||||
},
|
||||
|
||||
setMode(key: string, mode: TableOpenDetailMode) {
|
||||
if (this.selectorColumnMap.has(key)) {
|
||||
const item = this.selectorColumnMap.get(key);
|
||||
if (this.selectorColumnMap[key]) {
|
||||
const item = this.selectorColumnMap[key];
|
||||
if (item) {
|
||||
item.mode = mode;
|
||||
}
|
||||
}
|
||||
},
|
||||
getColumns(key: string): { nonSort: MsTableColumn; couldSort: MsTableColumn } {
|
||||
if (this.selectorColumnMap.has(key)) {
|
||||
const tmpArr = this.selectorColumnMap.get(key)?.column || [];
|
||||
const nonSortableColumns = tmpArr.filter((item) => !item.showDrag);
|
||||
const couldSortableColumns = tmpArr.filter((item) => !!item.showDrag);
|
||||
return { nonSort: nonSortableColumns, couldSort: couldSortableColumns };
|
||||
}
|
||||
return { nonSort: [], couldSort: [] };
|
||||
},
|
||||
setColumns(key: string, columns: MsTableColumn, mode: TableOpenDetailMode) {
|
||||
this.selectorColumnMap.set(key, { mode, column: columns });
|
||||
columns.forEach((item, idx) => {
|
||||
if (item.showDrag) {
|
||||
item.sortIndex = this.baseSortIndex + idx;
|
||||
}
|
||||
});
|
||||
this.selectorColumnMap[key] = { mode, column: columns };
|
||||
},
|
||||
getShowInTableColumns(key: string): MsTableColumn {
|
||||
if (this.selectorColumnMap.has(key)) {
|
||||
const tmpArr = this.selectorColumnMap.get(key)?.column;
|
||||
return tmpArr?.filter((item) => item.showInTable) || [];
|
||||
}
|
||||
return [];
|
||||
},
|
||||
getters: {
|
||||
getMode: (state) => {
|
||||
return (key: string) => {
|
||||
if (state.selectorColumnMap[key]) {
|
||||
return state.selectorColumnMap[key].mode;
|
||||
}
|
||||
return 'drawer';
|
||||
};
|
||||
},
|
||||
getColumns: (state) => {
|
||||
return (key: string) => {
|
||||
if (state.selectorColumnMap[key]) {
|
||||
const tmpArr = cloneDeep(state.selectorColumnMap[key].column);
|
||||
const nonSortableColumns = tmpArr.filter((item: MsTableColumnData) => !item.showDrag);
|
||||
const couldSortableColumns = tmpArr.filter((item: MsTableColumnData) => !!item.showDrag);
|
||||
return { nonSort: nonSortableColumns, couldSort: couldSortableColumns };
|
||||
}
|
||||
return { nonSort: [], couldSort: [] };
|
||||
};
|
||||
},
|
||||
getShowInTableColumns: (state) => {
|
||||
return (key: string) => {
|
||||
if (state.selectorColumnMap[key]) {
|
||||
const tmpArr: MsTableColumn = cloneDeep(state.selectorColumnMap[key].column);
|
||||
return orderBy(
|
||||
filter(tmpArr, (i) => i.showInTable),
|
||||
['sortIndex'],
|
||||
['asc']
|
||||
) as MsTableColumn;
|
||||
}
|
||||
return [];
|
||||
};
|
||||
},
|
||||
},
|
||||
});
|
||||
|
|
|
@ -8,6 +8,15 @@ export interface MsTableSelectorItem {
|
|||
// 列配置
|
||||
column: MsTableColumn;
|
||||
}
|
||||
export interface MsTableState {
|
||||
selectorColumnMap: Map<string, MsTableSelectorItem>;
|
||||
|
||||
export interface SelectorColumnMap {
|
||||
[key: string]: MsTableSelectorItem;
|
||||
}
|
||||
export interface MsTableState {
|
||||
// 列配置, 持久化
|
||||
selectorColumnMap: SelectorColumnMap;
|
||||
// 列排序基数
|
||||
baseSortIndex: number;
|
||||
// 操作列基数
|
||||
operationBaseIndex: number;
|
||||
}
|
||||
|
|
|
@ -145,6 +145,7 @@
|
|||
{
|
||||
title: 'system.organization.operation',
|
||||
slotName: 'operation',
|
||||
dataIndex: 'operation',
|
||||
fixed: 'right',
|
||||
width: 230,
|
||||
},
|
||||
|
|
Loading…
Reference in New Issue