From be0f68fb7fd21be4c223dc0412be01d85519315e Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Fri, 10 Feb 2023 10:22:38 +0100 Subject: [PATCH] editing changeset on archive file --- packages/datalib/src/ChangeSet.ts | 17 +++++++-- packages/datalib/src/GridDisplay.ts | 29 +++++++++----- packages/datalib/src/JslGridDisplay.ts | 4 +- packages/web/src/datagrid/ChangeSetGrider.ts | 26 ++++++++++--- packages/web/src/datagrid/JslDataGrid.svelte | 10 ++++- .../web/src/datagrid/JslDataGridCore.svelte | 17 ++++++++- packages/web/src/tabs/ArchiveFileTab.svelte | 38 ++++++++++++++++++- 7 files changed, 118 insertions(+), 23 deletions(-) diff --git a/packages/datalib/src/ChangeSet.ts b/packages/datalib/src/ChangeSet.ts index 2e38d62b..707db5db 100644 --- a/packages/datalib/src/ChangeSet.ts +++ b/packages/datalib/src/ChangeSet.ts @@ -15,6 +15,7 @@ export interface ChangeSetItem { pureName: string; schemaName?: string; insertedRowIndex?: number; + existingRowIndex?: number; document?: any; condition?: { [column: string]: string }; fields?: { [column: string]: string }; @@ -38,6 +39,7 @@ export interface ChangeSetRowDefinition { pureName: string; schemaName: string; insertedRowIndex?: number; + existingRowIndex?: number; condition?: { [column: string]: string }; } @@ -66,7 +68,8 @@ export function findExistingChangeSetItem( x => x.pureName == definition.pureName && x.schemaName == definition.schemaName && - _.isEqual(x.condition, definition.condition) + ((definition.existingRowIndex != null && x.existingRowIndex == definition.existingRowIndex) || + (definition.existingRowIndex == null && _.isEqual(x.condition, definition.condition))) ); if (inUpdates) return ['updates', inUpdates]; @@ -74,7 +77,8 @@ export function findExistingChangeSetItem( x => x.pureName == definition.pureName && x.schemaName == definition.schemaName && - _.isEqual(x.condition, definition.condition) + ((definition.existingRowIndex != null && x.existingRowIndex == definition.existingRowIndex) || + (definition.existingRowIndex == null && _.isEqual(x.condition, definition.condition))) ); if (inDeletes) return ['deletes', inDeletes]; @@ -119,6 +123,7 @@ export function setChangeSetValue( schemaName: definition.schemaName, condition: definition.condition, insertedRowIndex: definition.insertedRowIndex, + existingRowIndex: definition.existingRowIndex, fields: { [definition.uniqueName]: value, }, @@ -162,6 +167,7 @@ export function setChangeSetRowData( schemaName: definition.schemaName, condition: definition.condition, insertedRowIndex: definition.insertedRowIndex, + existingRowIndex: definition.existingRowIndex, document, }, ], @@ -395,6 +401,7 @@ export function deleteChangeSetRows(changeSet: ChangeSet, definition: ChangeSetR pureName: definition.pureName, schemaName: definition.schemaName, condition: definition.condition, + existingRowIndex: definition.existingRowIndex, }, ], }; @@ -402,9 +409,11 @@ export function deleteChangeSetRows(changeSet: ChangeSet, definition: ChangeSetR } export function getChangeSetInsertedRows(changeSet: ChangeSet, name?: NamedObjectInfo) { - if (!name) return []; + // if (!name) return []; if (!changeSet) return []; - const rows = changeSet.inserts.filter(x => x.pureName == name.pureName && x.schemaName == name.schemaName); + const rows = changeSet.inserts.filter( + x => name == null || (x.pureName == name.pureName && x.schemaName == name.schemaName) + ); const maxIndex = _.maxBy(rows, x => x.insertedRowIndex)?.insertedRowIndex; if (maxIndex == null) return []; const res = Array(maxIndex + 1).fill({}); diff --git a/packages/datalib/src/GridDisplay.ts b/packages/datalib/src/GridDisplay.ts index 02e6439a..4f505ebc 100644 --- a/packages/datalib/src/GridDisplay.ts +++ b/packages/datalib/src/GridDisplay.ts @@ -460,30 +460,39 @@ export abstract class GridDisplay { return _.pick(row, this.changeSetKeyFields); } - getChangeSetField(row, uniqueName, insertedRowIndex): ChangeSetFieldDefinition { + getChangeSetField( + row, + uniqueName, + insertedRowIndex, + existingRowIndex = null, + baseNameOmitable = false + ): ChangeSetFieldDefinition { const col = this.columns.find(x => x.uniqueName == uniqueName); if (!col) return null; const baseObj = this.baseTableOrSimilar; - if (!baseObj) return null; - if (baseObj.pureName != col.pureName || baseObj.schemaName != col.schemaName) { - return null; + if (!baseNameOmitable) { + if (!baseObj) return null; + if (baseObj.pureName != col.pureName || baseObj.schemaName != col.schemaName) { + return null; + } } return { - ...this.getChangeSetRow(row, insertedRowIndex), + ...this.getChangeSetRow(row, insertedRowIndex, existingRowIndex, baseNameOmitable), uniqueName: uniqueName, columnName: col.columnName, }; } - getChangeSetRow(row, insertedRowIndex): ChangeSetRowDefinition { + getChangeSetRow(row, insertedRowIndex, existingRowIndex, baseNameOmitable = false): ChangeSetRowDefinition { const baseObj = this.baseTableOrSimilar; - if (!baseObj) return null; + if (!baseNameOmitable && !baseObj) return null; return { - pureName: baseObj.pureName, - schemaName: baseObj.schemaName, + pureName: baseObj?.pureName, + schemaName: baseObj?.schemaName, insertedRowIndex, - condition: insertedRowIndex == null ? this.getChangeSetCondition(row) : null, + existingRowIndex, + condition: insertedRowIndex == null && existingRowIndex == null ? this.getChangeSetCondition(row) : null, }; } diff --git a/packages/datalib/src/JslGridDisplay.ts b/packages/datalib/src/JslGridDisplay.ts index bc969631..9a34f490 100644 --- a/packages/datalib/src/JslGridDisplay.ts +++ b/packages/datalib/src/JslGridDisplay.ts @@ -13,7 +13,8 @@ export class JslGridDisplay extends GridDisplay { setCache: ChangeCacheFunc, rows: any, isDynamicStructure: boolean, - supportsReload: boolean + supportsReload: boolean, + editable: boolean = false ) { super(config, setConfig, cache, setCache, null); @@ -22,6 +23,7 @@ export class JslGridDisplay extends GridDisplay { this.supportsReload = supportsReload; this.isDynamicStructure = isDynamicStructure; this.filterTypeOverride = 'eval'; + this.editable = editable; if (structure?.columns) { this.columns = _.uniqBy( diff --git a/packages/web/src/datagrid/ChangeSetGrider.ts b/packages/web/src/datagrid/ChangeSetGrider.ts index 5d442f98..5ba218b5 100644 --- a/packages/web/src/datagrid/ChangeSetGrider.ts +++ b/packages/web/src/datagrid/ChangeSetGrider.ts @@ -48,7 +48,8 @@ export default class ChangeSetGrider extends Grider { public display: GridDisplay, public macro: MacroDefinition = null, public macroArgs: {} = {}, - public selectedCells: MacroSelectedCell[] = [] + public selectedCells: MacroSelectedCell[] = [], + public useRowIndexInsteaOfCondition: boolean = false ) { super(); this.changeSet = changeSetState && changeSetState.value; @@ -81,7 +82,12 @@ export default class ChangeSetGrider extends Grider { if (this.rowCacheIndexes.has(index)) return; const row = this.getRowSource(index); const insertedRowIndex = this.getInsertedRowIndex(index); - const rowDefinition = this.display?.getChangeSetRow(row, insertedRowIndex); + const rowDefinition = this.display?.getChangeSetRow( + row, + insertedRowIndex, + this.useRowIndexInsteaOfCondition && index < this.sourceRows.length ? index : null, + this.useRowIndexInsteaOfCondition + ); const [matchedField, matchedChangeSetItem] = findExistingChangeSetItem(this.changeSet, rowDefinition); const rowUpdated = matchedChangeSetItem ? getRowFromItem(row, matchedChangeSetItem) @@ -125,7 +131,7 @@ export default class ChangeSetGrider extends Grider { } get canInsert() { - return !!this.display.baseTableOrCollection; + return this.useRowIndexInsteaOfCondition || !!this.display.baseTableOrCollection; } getRowData(index: number) { @@ -152,13 +158,23 @@ export default class ChangeSetGrider extends Grider { setCellValue(index: number, uniqueName: string, value: any) { const row = this.getRowSource(index); - const definition = this.display.getChangeSetField(row, uniqueName, this.getInsertedRowIndex(index)); + const definition = this.display.getChangeSetField( + row, + uniqueName, + this.getInsertedRowIndex(index), + this.useRowIndexInsteaOfCondition && index < this.sourceRows.length ? index : null, + this.useRowIndexInsteaOfCondition + ); this.applyModification(chs => setChangeSetValue(chs, definition, value)); } setRowData(index: number, document: any) { const row = this.getRowSource(index); - const definition = this.display.getChangeSetRow(row, this.getInsertedRowIndex(index)); + const definition = this.display.getChangeSetRow( + row, + this.getInsertedRowIndex(index), + this.useRowIndexInsteaOfCondition && index < this.sourceRows.length ? index : null + ); this.applyModification(chs => setChangeSetRowData(chs, definition, document)); } diff --git a/packages/web/src/datagrid/JslDataGrid.svelte b/packages/web/src/datagrid/JslDataGrid.svelte index 690e0619..6ae1a2a3 100644 --- a/packages/web/src/datagrid/JslDataGrid.svelte +++ b/packages/web/src/datagrid/JslDataGrid.svelte @@ -12,6 +12,10 @@ export let supportsReload = false; export let listenInitializeFile = false; + export let changeSetState = null; + export let changeSetStore = null; + export let dispatchChangeSet = null; + let loadedRows; let infoCounter = 0; @@ -47,7 +51,8 @@ cache.update, loadedRows, $info?.__isDynamicStructure, - supportsReload + supportsReload, + !!changeSetState ); @@ -63,5 +68,8 @@ bind:loadedRows isDynamicStructure={$info?.__isDynamicStructure} useEvalFilters + {changeSetState} + {changeSetStore} + {dispatchChangeSet} /> {/key} diff --git a/packages/web/src/datagrid/JslDataGridCore.svelte b/packages/web/src/datagrid/JslDataGridCore.svelte index b367e440..d3b8a691 100644 --- a/packages/web/src/datagrid/JslDataGridCore.svelte +++ b/packages/web/src/datagrid/JslDataGridCore.svelte @@ -55,6 +55,7 @@ import createQuickExportMenu from '../utility/createQuickExportMenu'; import { exportQuickExportFile } from '../utility/exportFileTools'; import useEffect from '../utility/useEffect'; + import ChangeSetGrider from './ChangeSetGrider'; import LoadingDataGridCore from './LoadingDataGridCore.svelte'; import RowsArrayGrider from './RowsArrayGrider'; @@ -63,6 +64,9 @@ export let display; export let formatterFunction; + export let changeSetState; + export let dispatchChangeSet; + export const activator = createActivator('JslDataGridCore', false); export let loadedRows = []; @@ -93,7 +97,18 @@ } $: $effect; - $: grider = new RowsArrayGrider(loadedRows); + $: grider = new ChangeSetGrider( + loadedRows, + changeSetState, + dispatchChangeSet, + display, + undefined, + undefined, + undefined, + true + ); + + // $: grider = new RowsArrayGrider(loadedRows); export function exportGrid() { const initialValues = {} as any; diff --git a/packages/web/src/tabs/ArchiveFileTab.svelte b/packages/web/src/tabs/ArchiveFileTab.svelte index dae86dd9..2c25cff3 100644 --- a/packages/web/src/tabs/ArchiveFileTab.svelte +++ b/packages/web/src/tabs/ArchiveFileTab.svelte @@ -3,22 +3,58 @@ - +