diff --git a/frontend-html/src/model/entities/FormScreenLifecycle/FormScreenLifecycle.tsx b/frontend-html/src/model/entities/FormScreenLifecycle/FormScreenLifecycle.tsx
index ec83933275..234e50249e 100644
--- a/frontend-html/src/model/entities/FormScreenLifecycle/FormScreenLifecycle.tsx
+++ b/frontend-html/src/model/entities/FormScreenLifecycle/FormScreenLifecycle.tsx
@@ -786,7 +786,9 @@ export class FormScreenLifecycle02 implements IFormScreenLifecycle02 {
Entity: dataView.entity,
UpdateData: updateData,
});
-
+ if (updateObjectResult === null){
+ return false;
+ }
dataView.formFocusManager.stopAutoFocus();
// This might run more times in parallel, but we want to apply the result just once.
@@ -817,7 +819,9 @@ export class FormScreenLifecycle02 implements IFormScreenLifecycle02 {
},
],
});
-
+ if (updateObjectResult === null){
+ return;
+ }
yield*processCRUDResult(dataView, updateObjectResult, false, dataView);
if (formScreen.requestSaveAfterUpdate) {
diff --git a/frontend-html/src/model/entities/FormScreenLifecycle/UpdateRequestAggregator.tsx b/frontend-html/src/model/entities/FormScreenLifecycle/UpdateRequestAggregator.tsx
index 754e540549..19b38c4e59 100644
--- a/frontend-html/src/model/entities/FormScreenLifecycle/UpdateRequestAggregator.tsx
+++ b/frontend-html/src/model/entities/FormScreenLifecycle/UpdateRequestAggregator.tsx
@@ -19,6 +19,7 @@ along with ORIGAM. If not, see .
import { createMachine, interpret } from "xstate";
import { IUpdateData } from "../types/IApi";
+import _ from "lodash";
interface IUpdateObjectData {
@@ -61,6 +62,7 @@ export class UpdateRequestAggregator {
interpreter = interpret(
createMachine(
{
+ /** @xstate-layout N4IgpgJg5mDOIC5QFcAOECGAXMB5ARgFZgDGWAdAJIAiAMgKIDEAqgArUCCAKvQPoBK9AIrN6AZR7UA2gAYAuolCoA9rACWWNcoB2ikAA9EATgAsJ8gFYA7CaMyZARgBMRi06sA2ADQgAnogAOCwBmcgCPIyMPAKjgmSsAhwBfJJ80TBwCYjJyNk4eXmp6ACFcZgA5AGFKcoBxFnZuPkERcUlZBSQQFXVNHT1DBABaB2CHcmDojxMHDysrVytggJ9-BFMjSydHCwcLDwsggICUtPRsPCJSCjymwpKyqpr6-VgsC-IMADMcACcACgcVhkAEpGOkLllrrlGgUiqUKtU6h09D0NFpdF1Bk5gqF9nNgsCPNEnKNvH5jNFyEZgqYHCYnKSrM5TiAIZkrjkiq1RIwUV00X1MaBBkNjuQFpEAvMjC5olYLKtEAcrNTIlFTAEnAyHEZWezLtkbrDnowIDowOQ3h8DVCcrcuM9+UpVOj+ljEDMLBN7LNiUyPITyWs5h5yMT1TiLDIDlF9ecOUaYflTebtJbrThyLbOcaU8iHJ0Xb0MQNEFZSRL7PYFnFgtZFRSEKHw8CZCZwh54o4PPGMoboQ7TQ7msJRBJ6NJ5KjXUKywg4psTGMxhYLEYbLjtUrhvSwgFfV2Zg524yrH3Ibnk9xnuQOKxKAIKuVUxbyGptAA3ZQAa0tOaTIc6jvB8n3KF86gQD9vxIbAMQ6Z1ulnUsPQXdtyHpQlowjGR1yMHdtVVDxthkKIZkcIwDycC9E0HE1gPvR9+GfU0wF+X5lF+chUAAG2wL5OIAW2zBMB3tejahApiWMg6DlFgoUEOnAVkPdEVEHcTZSScddiPXZYTHbHcTEDcNdUo5kTDXYFtRSVIQG0ZQIDgPQAOuGcSzUgxEBGBYJimGY5gWaxlh3EYZCcCYDx7dsHBPBlghosSKBoBgPLdYVvIQE9SImGwaXsZc10DHc5m9IFq2CbUsJxJK7TzO54UeJFanSudULXMJqw7LVEh0nd4u9Dcdko6MHACXE6qvblRFENqUPUhdpXIGZCNcRI4tcHcglCFxbFpaZmXPey3PE-NWpUzzMuxfCmzi0JnBrbVnH2TwpsAiSpLAiCLuLDL53mHdV2pNtcIOaUDl7E7RPq69HQY0DBDEXBaAANUneavMGaNVTXX1GWWCIFSB+wVrbOIYx00Z3ro86vsEAApehKkkTHrsQHHLGjRwCfCDdGzWQyAhWiJKPG3FYpMuykiAA */
predictableActionArguments: true,
id: "updateObject",
initial: "IDLE",
@@ -155,7 +157,12 @@ export class UpdateRequestAggregator {
{devTools: true}
);
- enqueue(data: IUpdateObjectData): Promise {
+ enqueue(data: IUpdateObjectData): Promise {
+ this.removeCurrentlyProcessedValues(data);
+ if (data.UpdateData.length === 0) {
+ return Promise.resolve(null);
+ }
+
this.interpreter.send({
type: "UPDATE_REQUESTED",
payload: data,
@@ -165,6 +172,38 @@ export class UpdateRequestAggregator {
return itemJustEnqueued!.promise;
}
+ private removeCurrentlyProcessedValues(newData: IUpdateObjectData) {
+ if (
+ !this.currentRequest ||
+ this.currentRequest.Entity !== newData.Entity
+ ) {
+ return;
+ }
+ for (const newUpdateData of Array.from(newData.UpdateData)) {
+ for (const updateDataInProgress of this.currentRequest.UpdateData) {
+ if (updateDataInProgress.RowId === newUpdateData.RowId) {
+ this.removeDuplicateProperties({
+ removeFrom: newUpdateData,
+ source: updateDataInProgress});
+ if (Object.keys(newUpdateData.Values).length === 0) {
+ newData.UpdateData.remove(newUpdateData);
+ }
+ }
+ }
+ }
+ }
+
+ private removeDuplicateProperties(args: {removeFrom: IUpdateData, source: IUpdateData}) {
+ for (const processedColumn of Object.keys(args.source.Values)) {
+ for (const newColumn of Object.keys(args.removeFrom.Values)) {
+ if (processedColumn === newColumn &&
+ _.isEqual(args.source.Values[processedColumn], args.removeFrom.Values[newColumn])) {
+ delete args.removeFrom.Values[newColumn];
+ }
+ }
+ }
+ }
+
mergeToQueue(data: IUpdateObjectData) {
let updateObjectItem = this.registeredRequests.find(
(item) => item.Entity === data.Entity && !item.isRunning
diff --git a/frontend-html/src/model/entities/OrigamAPI.ts b/frontend-html/src/model/entities/OrigamAPI.ts
index d563e8970a..fb141c4857 100644
--- a/frontend-html/src/model/entities/OrigamAPI.ts
+++ b/frontend-html/src/model/entities/OrigamAPI.ts
@@ -381,7 +381,6 @@ export class OrigamAPI implements IApi {
async restoreData(data: { SessionFormIdentifier: string; ObjectId: string }) {
return (await this.axiosInstance.post("/UIService/RestoreData", data)).data;
}
-
async updateObject(data: {
SessionFormIdentifier: string;
Entity: string;