Commit f7a1b022369d535cd0e53fd2a94ffca33664c8a7

Authored by Carson
Committed by GitHub
1 parent 0dc2f149

fix(useColumns): 多级表头下的列支持行内编辑 (#2521)

src/components/Table/src/hooks/useColumns.ts
... ... @@ -146,31 +146,38 @@ export function useColumns(
146 146 const getViewColumns = computed(() => {
147 147 const viewColumns = sortFixedColumn(unref(getColumnsRef));
148 148  
  149 + const mapFn = (column) => {
  150 + const { slots, customRender, format, edit, editRow, flag } = column;
  151 +
  152 + if (!slots || !slots?.title) {
  153 + // column.slots = { title: `header-${dataIndex}`, ...(slots || {}) };
  154 + column.customTitle = column.title;
  155 + Reflect.deleteProperty(column, 'title');
  156 + }
  157 + const isDefaultAction = [INDEX_COLUMN_FLAG, ACTION_COLUMN_FLAG].includes(flag!);
  158 + if (!customRender && format && !edit && !isDefaultAction) {
  159 + column.customRender = ({ text, record, index }) => {
  160 + return formatCell(text, format, record, index);
  161 + };
  162 + }
  163 +
  164 + // edit table
  165 + if ((edit || editRow) && !isDefaultAction) {
  166 + column.customRender = renderEditCell(column);
  167 + }
  168 + return reactive(column);
  169 + };
  170 +
149 171 const columns = cloneDeep(viewColumns);
150 172 return columns
151   - .filter((column) => {
152   - return hasPermission(column.auth) && isIfShow(column);
153   - })
  173 + .filter((column) => hasPermission(column.auth) && isIfShow(column))
154 174 .map((column) => {
155   - const { slots, customRender, format, edit, editRow, flag } = column;
156   -
157   - if (!slots || !slots?.title) {
158   - // column.slots = { title: `header-${dataIndex}`, ...(slots || {}) };
159   - column.customTitle = column.title;
160   - Reflect.deleteProperty(column, 'title');
161   - }
162   - const isDefaultAction = [INDEX_COLUMN_FLAG, ACTION_COLUMN_FLAG].includes(flag!);
163   - if (!customRender && format && !edit && !isDefaultAction) {
164   - column.customRender = ({ text, record, index }) => {
165   - return formatCell(text, format, record, index);
166   - };
  175 + // Support table multiple header editable
  176 + if (column.children?.length) {
  177 + column.children = column.children.map(mapFn);
167 178 }
168 179  
169   - // edit table
170   - if ((edit || editRow) && !isDefaultAction) {
171   - column.customRender = renderEditCell(column);
172   - }
173   - return reactive(column);
  180 + return mapFn(column);
174 181 });
175 182 });
176 183  
... ...
src/views/demo/table/EditRowTable.vue
... ... @@ -29,47 +29,54 @@
29 29 const columns: BasicColumn[] = [
30 30 {
31 31 title: '输入框',
32   - dataIndex: 'name',
  32 + dataIndex: 'name-group',
33 33 editRow: true,
34   - editComponentProps: {
35   - prefix: '$',
36   - },
37   - width: 150,
38   - },
39   - {
40   - title: '默认输入状态',
41   - dataIndex: 'name7',
42   - editRow: true,
43   - width: 150,
44   - },
45   - {
46   - title: '输入框校验',
47   - dataIndex: 'name1',
48   - editRow: true,
49   - align: 'left',
50   - // 默认必填校验
51   - editRule: true,
52   - width: 150,
53   - },
54   - {
55   - title: '输入框函数校验',
56   - dataIndex: 'name2',
57   - editRow: true,
58   - align: 'right',
59   - editRule: async (text) => {
60   - if (text === '2') {
61   - return '不能输入该值';
62   - }
63   - return '';
64   - },
65   - },
66   - {
67   - title: '数字输入框',
68   - dataIndex: 'id',
69   - editRow: true,
70   - editRule: true,
71   - editComponent: 'InputNumber',
72   - width: 150,
  34 + children: [
  35 + {
  36 + title: '输入框',
  37 + dataIndex: 'name',
  38 + editRow: true,
  39 + editComponentProps: {
  40 + prefix: '$',
  41 + },
  42 + width: 150,
  43 + },
  44 + {
  45 + title: '默认输入状态',
  46 + dataIndex: 'name7',
  47 + editRow: true,
  48 + width: 150,
  49 + },
  50 + {
  51 + title: '输入框校验',
  52 + dataIndex: 'name1',
  53 + editRow: true,
  54 + align: 'left',
  55 + // 默认必填校验
  56 + editRule: true,
  57 + width: 150,
  58 + },
  59 + {
  60 + title: '输入框函数校验',
  61 + dataIndex: 'name2',
  62 + editRow: true,
  63 + align: 'right',
  64 + editRule: async (text) => {
  65 + if (text === '2') {
  66 + return '不能输入该值';
  67 + }
  68 + return '';
  69 + },
  70 + },
  71 + {
  72 + title: '数字输入框',
  73 + dataIndex: 'id',
  74 + editRow: true,
  75 + editRule: true,
  76 + editComponent: 'InputNumber',
  77 + width: 150,
  78 + },
  79 + ],
73 80 },
74 81 {
75 82 title: '下拉框',
... ...