data macros (able to change columns) + duplicate column macro

This commit is contained in:
Jan Prochazka
2020-11-01 12:09:40 +01:00
parent d5b8433c17
commit ab2fb3bf97
4 changed files with 119 additions and 8 deletions

View File

@@ -30,10 +30,11 @@ export default function FreeTableGridCore(props) {
macroPreview ? selectedCells : null,
]
);
const display = React.useMemo(() => new FreeTableGridDisplay(modelState.value, config, setConfig, cache, setCache), [
const display = React.useMemo(() => new FreeTableGridDisplay(grider.model || modelState.value, config, setConfig, cache, setCache), [
modelState.value,
config,
cache,
grider,
]);
const handleSelectionChanged = React.useCallback(

View File

@@ -1,5 +1,13 @@
import { FreeTableModel, MacroDefinition, MacroSelectedCell, runMacro } from '@dbgate/datalib';
import Grider, { GriderRowStatus } from '../datagrid/Grider';
import _ from 'lodash';
function convertToSet(row, field) {
if (!row) return null;
if (!row[field]) return null;
if (_.isSet(row[field])) return row[field];
return new Set(row[field]);
}
export default class MacroPreviewGrider extends Grider {
model: FreeTableModel;
@@ -17,7 +25,9 @@ export default class MacroPreviewGrider extends Grider {
const row = this.model.rows[index];
return {
status: (row && row.__rowStatus) || 'regular',
modifiedFields: row ? row.__modifiedFields : null,
modifiedFields: convertToSet(row, '__modifiedFields'),
insertedFields: convertToSet(row, '__insertedFields'),
deletedFields: convertToSet(row, '__deletedFields'),
};
}

View File

@@ -111,11 +111,11 @@ return value ? value.toString().replace(new RegExp(rtext, rflags), args.replace
code: `
const selectedRowIndexes = modules.lodash.uniq(selectedCells.map(x => x.row));
const selectedRows = modules.lodash.groupBy(selectedCells, 'row');
const maxIndex = _.max(selectedRowIndexes);
const maxIndex = modules.lodash.max(selectedRowIndexes);
return [
...rows.slice(0, maxIndex + 1),
...selectedRowIndexes.map(index => ({
..._.pick(rows[index], selectedRows[index].map(x=>x.column)),
...modules.lodash.pick(rows[index], selectedRows[index].map(x => x.column)),
__rowStatus: 'inserted',
})),
...rows.slice(maxIndex + 1),
@@ -136,7 +136,63 @@ return rows.map(row => {
__rowStatus: 'deleted',
};
})
`}
`,
},
{
title: 'Duplicate columns',
name: 'duplicateColumns',
group: 'Tools',
description: 'Duplicate selected columns',
type: 'transformData',
code: `
const selectedColumnNames = modules.lodash.uniq(selectedCells.map(x => x.column));
const selectedRowIndexes = modules.lodash.uniq(selectedCells.map(x => x.row));
const addedColumnNames = selectedColumnNames.map(col => (args.prefix || '') + col + (args.postfix || ''));
const resultRows = rows.map((row, rowIndex) => ({
...row,
...(selectedRowIndexes.includes(rowIndex) ? modules.lodash.fromPairs(selectedColumnNames.map(col => [(args.prefix || '') + col + (args.postfix || ''), row[col]])) : {}),
__insertedFields: addedColumnNames,
}));
const resultCols = [
...cols,
...addedColumnNames,
];
return {
rows: resultRows,
cols: resultCols,
}
`,
args: [
{
type: 'text',
label: 'Prefix',
name: 'prefix',
},
{
type: 'text',
label: 'Postfix',
name: 'postfix',
default: '_copy',
},
],
},
];
// function f() {
// const selectedColumnNames = modules.lodash.uniq(selectedCells.map((x) => x.column));
// const addedColumnNames = selectedColumnNames.map((col) => (args.prefix || '') + col + (args.postfix || ''));
// const resultRows = rows.map((row) => ({
// ...row,
// ...modules.lodash.fromPairs(
// selectedColumnNames.map((col) => [(args.prefix || '') + col + (args.postfix || ''), row[col]])
// ),
// __insertedFields: addedColumnNames,
// }));
// const resultCols = [...cols, ...addedColumnNames];
// return {
// rows: resultRows,
// cols: resultCols,
// };
// }
export default macros;