mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-19 17:46:00 +00:00
data macros (able to change columns) + duplicate column macro
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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'),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user