aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorbobzel <zzzman@gmail.com>2020-10-05 11:59:48 -0400
committerbobzel <zzzman@gmail.com>2020-10-05 11:59:48 -0400
commit2a5cceb16d102a2139ca876983577eb8d882e9e0 (patch)
tree93abb019c104c69b69e5f664b43fdf5fa1417535 /src
parentb725cbb244136ddfffad24d4ac68b9beb31845a3 (diff)
handled concurrent list additions as a special case (need to handle all concurrent edits still).
Diffstat (limited to 'src')
-rw-r--r--src/client/views/GlobalKeyHandler.ts2
-rw-r--r--src/fields/List.ts4
-rw-r--r--src/fields/util.ts22
-rw-r--r--src/server/websocket.ts14
4 files changed, 28 insertions, 14 deletions
diff --git a/src/client/views/GlobalKeyHandler.ts b/src/client/views/GlobalKeyHandler.ts
index b9b771027..89292a445 100644
--- a/src/client/views/GlobalKeyHandler.ts
+++ b/src/client/views/GlobalKeyHandler.ts
@@ -226,7 +226,7 @@ export class KeyManager {
if (e.target !== document.body) {
stopPropagation = false;
preventDefault = false;
- };
+ }
break;
case "v":
stopPropagation = false;
diff --git a/src/fields/List.ts b/src/fields/List.ts
index c9e4bd3c1..dca8d111c 100644
--- a/src/fields/List.ts
+++ b/src/fields/List.ts
@@ -43,7 +43,7 @@ const listHandlers: any = {
}
}
const res = list.__fields.push(...items);
- this[Update]();
+ this[Update]("$addToSet");
return res;
}),
reverse() {
@@ -314,7 +314,7 @@ class ListImpl<T extends Field> extends ObjectField {
// console.log(diff);
const update = this[OnUpdate];
// update && update(diff);
- update?.();
+ update?.(diff);
}
private [Self] = this;
diff --git a/src/fields/util.ts b/src/fields/util.ts
index 4da9fce74..90446f531 100644
--- a/src/fields/util.ts
+++ b/src/fields/util.ts
@@ -371,17 +371,19 @@ export function deleteProperty(target: any, prop: string | number | symbol) {
export function updateFunction(target: any, prop: any, value: any, receiver: any) {
let current = ObjectField.MakeCopy(value);
return (diff?: any) => {
- if (true || !diff) {
+ if (diff === "$addToSet") {
+ diff = { '$addToSet': { ["fields." + prop]: SerializationHelper.Serialize(value) } };
+ } else {
diff = { '$set': { ["fields." + prop]: SerializationHelper.Serialize(value) } };
- const oldValue = current;
- const newValue = ObjectField.MakeCopy(value);
- current = newValue;
- if (!(value instanceof CursorField) && !(value?.some?.((v: any) => v instanceof CursorField))) {
- UndoManager.AddEvent({
- redo() { receiver[prop] = newValue; },
- undo() { receiver[prop] = oldValue; }
- });
- }
+ }
+ const oldValue = current;
+ const newValue = ObjectField.MakeCopy(value);
+ current = newValue;
+ if (!(value instanceof CursorField) && !(value?.some?.((v: any) => v instanceof CursorField))) {
+ UndoManager.AddEvent({
+ redo() { receiver[prop] = newValue; },
+ undo() { receiver[prop] = oldValue; }
+ });
}
target[Update](diff);
};
diff --git a/src/server/websocket.ts b/src/server/websocket.ts
index b33e76c0b..7d13480f5 100644
--- a/src/server/websocket.ts
+++ b/src/server/websocket.ts
@@ -201,7 +201,7 @@ export namespace WebSocket {
function setField(socket: Socket, newValue: Transferable) {
Database.Instance.update(newValue.id, newValue, () =>
- socket.broadcast.emit(MessageStore.SetField.Message, newValue));
+ socket.broadcast.emit(MessageStore.SetField.Message, newValue)); // broadcast set value to all other clients
if (newValue.type === Types.Text) { // if the newValue has sring type, then it's suitable for searching -- pass it to SOLR
Search.updateDocument({ id: newValue.id, data: { set: (newValue as any).data } });
}
@@ -271,7 +271,19 @@ export namespace WebSocket {
return typeof value === "string" ? value : value[0];
}
+ function updateListField(socket: Socket, diff: Diff, results?: Transferable): void {
+ diff.diff.$set = diff.diff.$addToSet; // convert add to set to a query of the current fields, and then a set of the composition of the new fields with the old ones
+ delete diff.diff.$addToSet;
+ const updatefield = Array.from(Object.keys(diff.diff.$set))[0];
+ const list = (results as any).fields?.[updatefield.replace("fields.", "")].fields;
+ list.forEach((item: any) => !diff.diff.$set[updatefield].fields.some((x: any) => x.fieldId === item.fieldId) && diff.diff.$set[updatefield].fields.push(item));
+ Database.Instance.update(diff.id, diff.diff,
+ () => socket.broadcast.emit(MessageStore.UpdateField.Message, diff), false);
+ console.log(results, diff.diff.$set);
+ }
+
function UpdateField(socket: Socket, diff: Diff) {
+ if (diff.diff.$addToSet) return GetRefField([diff.id, (result?: Transferable) => updateListField(socket, diff, result)]); // would prefer to have Mongo handle list additions direclty, but for now handle it on our own
Database.Instance.update(diff.id, diff.diff,
() => socket.broadcast.emit(MessageStore.UpdateField.Message, diff), false);
const docfield = diff.diff.$set || diff.diff.$unset;