diff --git a/packages/datalib/src/ChangeSet.ts b/packages/datalib/src/ChangeSet.ts
index 2e38d62b7..707db5db1 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 02e6439ad..4f505ebca 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 bc9696316..9a34f490d 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 5d442f982..5ba218b56 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 690e0619f..6ae1a2a31 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 b367e4408..d3b8a6913 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 dae86dd96..2c25cff32 100644
--- a/packages/web/src/tabs/ArchiveFileTab.svelte
+++ b/packages/web/src/tabs/ArchiveFileTab.svelte
@@ -3,22 +3,58 @@
-
+