aboutsummaryrefslogtreecommitdiff
path: root/src/fields/ListField.ts
diff options
context:
space:
mode:
authorTyler Schicke <tyler_schicke@brown.edu>2019-02-25 01:22:40 -0500
committerTyler Schicke <tyler_schicke@brown.edu>2019-02-25 01:22:40 -0500
commit80a2f5540af2aae49685de09a2b94f216f10f0d7 (patch)
treeb9ed70d2d176e31e9d69312dd2587ed13165832f /src/fields/ListField.ts
parent62e06a2c9ce5054777a7a790e5b03b96d3cd6425 (diff)
parent41ff4813ddd9e6094d7d609c5960e1a614e00d7f (diff)
Merge branch 'master' of github-tsch-brown:browngraphicslab/Dash-Web into authentication
Diffstat (limited to 'src/fields/ListField.ts')
-rw-r--r--src/fields/ListField.ts40
1 files changed, 32 insertions, 8 deletions
diff --git a/src/fields/ListField.ts b/src/fields/ListField.ts
index 1357dc445..700600804 100644
--- a/src/fields/ListField.ts
+++ b/src/fields/ListField.ts
@@ -1,22 +1,46 @@
-import { Field, FIELD_ID, FieldValue, Opt } from "./Field";
-import { BasicField } from "./BasicField";
-import { Types } from "../server/Message";
-import { observe, action } from "mobx";
+import { action, IArrayChange, IArraySplice, IObservableArray, observe, observable, Lambda } from "mobx";
import { Server } from "../client/Server";
-import { ServerUtils } from "../server/ServerUtil";
+import { UndoManager } from "../client/util/UndoManager";
+import { Types } from "../server/Message";
+import { BasicField } from "./BasicField";
+import { Field, FieldId } from "./Field";
export class ListField<T extends Field> extends BasicField<T[]> {
private _proxies: string[] = []
- constructor(data: T[] = [], id: FIELD_ID = undefined, save: boolean = true) {
+ constructor(data: T[] = [], id?: FieldId, save: boolean = true) {
super(data, save, id);
this.updateProxies();
if (save) {
Server.UpdateField(this);
}
- observe(this.Data, () => {
+ this.observeList();
+ }
+
+ private observeDisposer: Lambda | undefined;
+ private observeList(): void {
+ this.observeDisposer = observe(this.Data as IObservableArray<T>, (change: IArrayChange<T> | IArraySplice<T>) => {
this.updateProxies()
+ if (change.type == "splice") {
+ UndoManager.AddEvent({
+ undo: () => this.Data.splice(change.index, change.addedCount, ...change.removed),
+ redo: () => this.Data.splice(change.index, change.removedCount, ...change.added)
+ })
+ } else {
+ UndoManager.AddEvent({
+ undo: () => this.Data[change.index] = change.oldValue,
+ redo: () => this.Data[change.index] = change.newValue
+ })
+ }
Server.UpdateField(this);
- })
+ });
+ }
+
+ protected setData(value: T[]) {
+ if (this.observeDisposer) {
+ this.observeDisposer()
+ }
+ this.data = observable(value);
+ this.observeList();
}
private updateProxies() {