aboutsummaryrefslogtreecommitdiff
path: root/src/fields/ListField.ts
diff options
context:
space:
mode:
authorBob Zeleznik <zzzman@gmail.com>2019-05-17 21:52:49 -0400
committerBob Zeleznik <zzzman@gmail.com>2019-05-17 21:52:49 -0400
commit618b4a42795b59cde47510b86b6e25dc03e15935 (patch)
treef10a9f093df478db15e94fbf8992a32fe8ba99d0 /src/fields/ListField.ts
parent19fca408a19c5f7a759ff6c3bfefe27b96ec3563 (diff)
parent4e244951b7b18d7973360f423e8de80c42466228 (diff)
merged
Diffstat (limited to 'src/fields/ListField.ts')
-rw-r--r--src/fields/ListField.ts122
1 files changed, 0 insertions, 122 deletions
diff --git a/src/fields/ListField.ts b/src/fields/ListField.ts
deleted file mode 100644
index ce32da0a6..000000000
--- a/src/fields/ListField.ts
+++ /dev/null
@@ -1,122 +0,0 @@
-import { action, IArrayChange, IArraySplice, IObservableArray, observe, observable, Lambda } from "mobx";
-import { Server } from "../client/Server";
-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?: FieldId, save: boolean = true) {
- super(data, save, id);
- this.updateProxies();
- if (save) {
- Server.UpdateField(this);
- }
- 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.updateProxies();
- this.observeList();
- }
-
- private updateProxies() {
- this._proxies = this.Data.map(field => field.Id);
- }
-
- UpdateFromServer(fields: string[]) {
- this._proxies = fields;
- }
- private arraysEqual(a: any[], b: any[]) {
- if (a === b) return true;
- if (a == null || b == null) return false;
- if (a.length != b.length) return false;
-
- // If you don't care about the order of the elements inside
- // the array, you should sort both arrays here.
- // Please note that calling sort on an array will modify that array.
- // you might want to clone your array first.
-
- for (var i = 0; i < a.length; ++i) {
- if (a[i] !== b[i]) return false;
- }
- return true;
- }
-
- init(callback: (field: Field) => any) {
- Server.GetFields(this._proxies, action((fields: { [index: string]: Field }) => {
- if (!this.arraysEqual(this._proxies, this.Data.map(field => field.Id))) {
- var dataids = this.data.map(d => d.Id);
- var added = this.data.length == this._proxies.length - 1;
- var deleted = this.data.length > this._proxies.length;
- for (let i = 0; i < dataids.length && added; i++)
- added = this._proxies.indexOf(dataids[i]) != -1;
- for (let i = 0; i < this._proxies.length && deleted; i++)
- deleted = dataids.indexOf(this._proxies[i]) != -1;
- if (added) { // if only 1 items was added
- for (let i = 0; i < this._proxies.length; i++)
- if (dataids.indexOf(this._proxies[i]) === -1)
- this.Data.splice(i, 0, fields[this._proxies[i]] as T);
- } else if (deleted) { // if only items were deleted
- for (let i = this.data.length - 1; i >= 0; i--) {
- if (this._proxies.indexOf(this.data[i].Id) === -1) {
- this.Data.splice(i, 1);
- }
- }
- } else // otherwise, just rebuild the whole list
- this.data = this._proxies.map(id => fields[id] as T)
- observe(this.Data, () => {
- this.updateProxies()
- Server.UpdateField(this);
- })
- }
- callback(this);
- }))
- }
-
- ToScriptString(): string {
- return "new ListField([" + this.Data.map(field => field.ToScriptString()).join(", ") + "])";
- }
-
- Copy(): Field {
- return new ListField<T>(this.Data);
- }
-
- ToJson(): { type: Types, data: string[], _id: string } {
- return {
- type: Types.List,
- data: this._proxies,
- _id: this.Id
- }
- }
-
- static FromJson(id: string, ids: string[]): ListField<Field> {
- let list = new ListField([], id, false);
- list._proxies = ids;
- return list
- }
-} \ No newline at end of file