aboutsummaryrefslogtreecommitdiff
path: root/src/server/websocket.ts
diff options
context:
space:
mode:
authorJames Hu <51237606+jameshu111@users.noreply.github.com>2023-05-04 10:38:40 -0400
committerJames Hu <51237606+jameshu111@users.noreply.github.com>2023-05-04 10:38:40 -0400
commit0c25989104bef9785bf112490c73541bd4bc1764 (patch)
treeb0ced46668e67faa3effb11190505bd4a1fa67e6 /src/server/websocket.ts
parent725bf38dc018cb218d8a88605234e95a2beee446 (diff)
First attempt at remfromlsit
Diffstat (limited to 'src/server/websocket.ts')
-rw-r--r--src/server/websocket.ts62
1 files changed, 59 insertions, 3 deletions
diff --git a/src/server/websocket.ts b/src/server/websocket.ts
index 2acdaa5a3..74b5dacaa 100644
--- a/src/server/websocket.ts
+++ b/src/server/websocket.ts
@@ -317,21 +317,77 @@ export namespace WebSocket {
);
}
+ function findClosestIndex(list: any, indexesToDelete: number[], value: any, hintIndex : number) {
+ let closestIndex = -1;
+ for(let i = 0; i < list.length; i++) {
+ if(list[i] == value && !indexesToDelete.includes(i)) {
+ if(Math.abs(i - hintIndex) < Math.abs(closestIndex - hintIndex)) {
+ closestIndex = i;
+ }
+ }
+ }
+ return closestIndex;
+ }
+
function remFromListField(socket: Socket, diff: Diff, curListItems?: Transferable): void {
+ // console.log("##### %O", diff);
diff.diff.$set = diff.diff.$remFromSet;
delete diff.diff.$remFromSet;
+ // console.log(JSON.stringify(diff));
const updatefield = Array.from(Object.keys(diff.diff.$set))[0];
+ // console.log("websocket/remfromlist: UPDATE FIELD: " + updatefield);
const remListItems = diff.diff.$set[updatefield].fields;
const curList = (curListItems as any)?.fields?.[updatefield.replace('fields.', '')]?.fields.filter((f: any) => f !== null) || [];
- diff.diff.$set[updatefield].fields = curList?.filter(
- (curItem: any) => !remListItems.some((remItem: any) => (remItem.fieldId ? remItem.fieldId === curItem.fieldId : remItem.heading ? remItem.heading === curItem.heading : remItem === curItem))
- );
+ const hint = diff.diff.$set.hint;
+ // console.log(remListItems);
+ // console.log(curList);
+
+
+ if(hint) {
+ // console.log("websocket/remfromlist: %O", hint);
+ // console.log(findClosestIndex([5, 5, 3], [], 5, 0));
+ // console.log(findClosestIndex([5, 5, 3], [0], 5, 1));
+ let indexesToRemove: number[] = [];
+ for(let i = 0; i < hint.deleteCount; i++) {
+ // console.log("VALUE: %d", remListItems[i]);
+ // console.log("HINT INDEX: %d", i + hint.start);
+ if(curList[i + hint.start] == remListItems[i]) {
+ indexesToRemove.push(i + hint.start);
+ continue;
+ }
+
+ let closestIndex = findClosestIndex(curList, indexesToRemove, remListItems[i], i + hint.start);
+ if(closestIndex != -1) {
+ indexesToRemove.push(closestIndex);
+ } else {
+ console.log("Item to delete was not found - index = -1");
+ }
+ }
+
+ // console.log("INDEXES TO REMOVE: ", indexesToRemove);
+ diff.diff.$set[updatefield].fields = curList?.filter(
+ (curItem: any, index : number) => !(indexesToRemove.includes(index))
+ );
+ // console.log("websocket/remfromlist: newdiff: %O", diff.diff.$set[updatefield].fields);
+ } else {
+ diff.diff.$set[updatefield].fields = curList?.filter(
+ (curItem: any) => !remListItems.some((remItem: any) => (remItem.fieldId ? remItem.fieldId === curItem.fieldId :
+ remItem.heading ? remItem.heading === curItem.heading : remItem === curItem))
+ );
+ // console.log("websocket/remfromlist: newdiff: %O", diff.diff.$set[updatefield].fields);
+ }
+
+
const sendBack = diff.diff.length !== diff.diff.$set[updatefield].fields.length;
+ // console.log("websocket/remfromlist: DIFFY " + JSON.stringify(diff.diff.$set));
+ // console.log("websocket/remfromlist: DIFF LENGTH " + diff.diff.length);
+ // console.log("websocket/remfromlist: DIFF $SET " + diff.diff.$set[updatefield].fields);
delete diff.diff.length;
Database.Instance.update(
diff.id,
diff.diff,
() => {
+ // console.log("websocket/remfromlist: lambda: %s", JSON.stringify(diff))
if (sendBack) {
console.log('SEND BACK');
const id = socket.id;