rows macros

This commit is contained in:
Jan Prochazka
2020-11-01 11:26:46 +01:00
parent cb0aee6476
commit d5b8433c17
3 changed files with 138 additions and 46 deletions

View File

@@ -10,6 +10,11 @@ const getMacroFunction = {
(value, args, modules, rowIndex, row, columnName) => { (value, args, modules, rowIndex, row, columnName) => {
${code} ${code}
} }
`,
transformRows: (code) => `
(rows, args, modules, selectedCells, cols) => {
${code}
}
`, `,
}; };
@@ -20,22 +25,14 @@ const modules = {
moment, moment,
}; };
export function runMacro( function runTramsformValue(
macro: MacroDefinition, func,
macroArgs: {}, macroArgs: {},
data: FreeTableModel, data: FreeTableModel,
preview: boolean, preview: boolean,
selectedCells: MacroSelectedCell[], selectedCells: MacroSelectedCell[],
errors: string[] = [] errors: string[] = []
): FreeTableModel { ) {
let func;
try {
func = eval(getMacroFunction[macro.type](macro.code));
} catch (err) {
errors.push(`Error compiling macro ${macro.name}: ${err.message}`);
return data;
}
if (macro.type == 'transformValue') {
const selectedRows = _.groupBy(selectedCells, 'row'); const selectedRows = _.groupBy(selectedCells, 'row');
const rows = data.rows.map((row, rowIndex) => { const rows = data.rows.map((row, rowIndex) => {
const selectedRow = selectedRows[rowIndex]; const selectedRow = selectedRows[rowIndex];
@@ -79,5 +76,65 @@ export function runMacro(
rows, rows,
}; };
} }
function removePreviewRowFlags(rows) {
rows = rows.filter((row) => row.__rowStatus != 'deleted');
rows = rows.map((row) => {
if (row.__rowStatus || row.__modifiedFields) return _.omit(row, ['__rowStatus', '__modifiedFields']);
return row;
});
return rows;
}
function runTramsformRows(
func,
macroArgs: {},
data: FreeTableModel,
preview: boolean,
selectedCells: MacroSelectedCell[],
errors: string[] = []
) {
let rows = data.rows;
try {
rows = func(
data.rows,
macroArgs,
modules,
selectedCells,
data.structure.columns.map((x) => x.columnName)
);
if (!preview) {
rows = removePreviewRowFlags(rows);
}
} catch (err) {
errors.push(`Error processing rows: ${err.message}`);
}
return {
structure: data.structure,
rows,
};
}
export function runMacro(
macro: MacroDefinition,
macroArgs: {},
data: FreeTableModel,
preview: boolean,
selectedCells: MacroSelectedCell[],
errors: string[] = []
): FreeTableModel {
let func;
try {
func = eval(getMacroFunction[macro.type](macro.code));
} catch (err) {
errors.push(`Error compiling macro ${macro.name}: ${err.message}`);
return data;
}
if (macro.type == 'transformValue') {
return runTramsformValue(func, macroArgs, data, preview, selectedCells, errors);
}
if (macro.type == 'transformRows') {
return runTramsformRows(func, macroArgs, data, preview, selectedCells, errors);
}
return data; return data;
} }

View File

@@ -16,7 +16,7 @@ export default class MacroPreviewGrider extends Grider {
getRowStatus(index): GriderRowStatus { getRowStatus(index): GriderRowStatus {
const row = this.model.rows[index]; const row = this.model.rows[index];
return { return {
status: 'regular', status: (row && row.__rowStatus) || 'regular',
modifiedFields: row ? row.__modifiedFields : null, modifiedFields: row ? row.__modifiedFields : null,
}; };
} }

View File

@@ -102,6 +102,41 @@ const macros = [
], ],
code: `return modules.moment().format(args.format)`, code: `return modules.moment().format(args.format)`,
}, },
{
title: 'Duplicate rows',
name: 'duplicateRows',
group: 'Tools',
description: 'Duplicate selected rows',
type: 'transformRows',
code: `
const selectedRowIndexes = modules.lodash.uniq(selectedCells.map(x => x.row));
const selectedRows = modules.lodash.groupBy(selectedCells, 'row');
const maxIndex = _.max(selectedRowIndexes);
return [
...rows.slice(0, maxIndex + 1),
...selectedRowIndexes.map(index => ({
..._.pick(rows[index], selectedRows[index].map(x=>x.column)),
__rowStatus: 'inserted',
})),
...rows.slice(maxIndex + 1),
]
`,
},
{
title: 'Delete empty rows',
name: 'deleteEmptyRows',
group: 'Tools',
description: 'Delete empty rows - rows with all values null or empty string',
type: 'transformRows',
code: `
return rows.map(row => {
if (cols.find(col => row[col])) return row;
return {
...row,
__rowStatus: 'deleted',
};
})
`}
]; ];
export default macros; export default macros;