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

@@ -12,7 +12,12 @@ const getMacroFunction = {
} }
`, `,
transformRows: (code) => ` transformRows: (code) => `
(rows, args, modules, selectedCells, cols) => { (rows, args, modules, selectedCells, cols, columns) => {
${code}
}
`,
transformData: (code) => `
(rows, args, modules, selectedCells, cols, columns) => {
${code} ${code}
} }
`, `,
@@ -80,7 +85,8 @@ function runTramsformValue(
function removePreviewRowFlags(rows) { function removePreviewRowFlags(rows) {
rows = rows.filter((row) => row.__rowStatus != 'deleted'); rows = rows.filter((row) => row.__rowStatus != 'deleted');
rows = rows.map((row) => { rows = rows.map((row) => {
if (row.__rowStatus || row.__modifiedFields) return _.omit(row, ['__rowStatus', '__modifiedFields']); if (row.__rowStatus || row.__modifiedFields || row.__insertedFields || row.__deletedFields)
return _.omit(row, ['__rowStatus', '__modifiedFields', '__insertedFields', '__deletedFields']);
return row; return row;
}); });
return rows; return rows;
@@ -101,7 +107,8 @@ function runTramsformRows(
macroArgs, macroArgs,
modules, modules,
selectedCells, selectedCells,
data.structure.columns.map((x) => x.columnName) data.structure.columns.map((x) => x.columnName),
data.structure.columns
); );
if (!preview) { if (!preview) {
rows = removePreviewRowFlags(rows); rows = removePreviewRowFlags(rows);
@@ -115,6 +122,39 @@ function runTramsformRows(
}; };
} }
function runTramsformData(
func,
macroArgs: {},
data: FreeTableModel,
preview: boolean,
selectedCells: MacroSelectedCell[],
errors: string[] = []
) {
try {
let { rows, columns, cols } = func(
data.rows,
macroArgs,
modules,
selectedCells,
data.structure.columns.map((x) => x.columnName),
data.structure.columns
);
if (cols && !columns) {
columns = cols.map((columnName) => ({ columnName }));
}
if (!preview) {
rows = removePreviewRowFlags(rows);
}
return {
structure: { columns },
rows,
};
} catch (err) {
errors.push(`Error processing data: ${err.message}`);
}
return data;
}
export function runMacro( export function runMacro(
macro: MacroDefinition, macro: MacroDefinition,
macroArgs: {}, macroArgs: {},
@@ -136,5 +176,9 @@ export function runMacro(
if (macro.type == 'transformRows') { if (macro.type == 'transformRows') {
return runTramsformRows(func, macroArgs, data, preview, selectedCells, errors); return runTramsformRows(func, macroArgs, data, preview, selectedCells, errors);
} }
if (macro.type == 'transformData') {
// @ts-ignore
return runTramsformData(func, macroArgs, data, preview, selectedCells, errors);
}
return data; return data;
} }

View File

@@ -30,10 +30,11 @@ export default function FreeTableGridCore(props) {
macroPreview ? selectedCells : null, 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, modelState.value,
config, config,
cache, cache,
grider,
]); ]);
const handleSelectionChanged = React.useCallback( const handleSelectionChanged = React.useCallback(

View File

@@ -1,5 +1,13 @@
import { FreeTableModel, MacroDefinition, MacroSelectedCell, runMacro } from '@dbgate/datalib'; import { FreeTableModel, MacroDefinition, MacroSelectedCell, runMacro } from '@dbgate/datalib';
import Grider, { GriderRowStatus } from '../datagrid/Grider'; 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 { export default class MacroPreviewGrider extends Grider {
model: FreeTableModel; model: FreeTableModel;
@@ -17,7 +25,9 @@ export default class MacroPreviewGrider extends Grider {
const row = this.model.rows[index]; const row = this.model.rows[index];
return { return {
status: (row && row.__rowStatus) || 'regular', 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: ` code: `
const selectedRowIndexes = modules.lodash.uniq(selectedCells.map(x => x.row)); const selectedRowIndexes = modules.lodash.uniq(selectedCells.map(x => x.row));
const selectedRows = modules.lodash.groupBy(selectedCells, 'row'); const selectedRows = modules.lodash.groupBy(selectedCells, 'row');
const maxIndex = _.max(selectedRowIndexes); const maxIndex = modules.lodash.max(selectedRowIndexes);
return [ return [
...rows.slice(0, maxIndex + 1), ...rows.slice(0, maxIndex + 1),
...selectedRowIndexes.map(index => ({ ...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', __rowStatus: 'inserted',
})), })),
...rows.slice(maxIndex + 1), ...rows.slice(maxIndex + 1),
@@ -136,7 +136,63 @@ return rows.map(row => {
__rowStatus: 'deleted', __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; export default macros;