aboutsummaryrefslogtreecommitdiff
path: root/src/fields/ListField.ts
diff options
context:
space:
mode:
authorHannah Chow <hannah_chow@brown.edu>2019-03-10 22:47:11 -0400
committerHannah Chow <hannah_chow@brown.edu>2019-03-10 22:47:11 -0400
commitce0d749c291609b7acca6db490bfcc131cf3996d (patch)
treeb7c6e6c1dbfb1424790d496d6f1e1520bfac7798 /src/fields/ListField.ts
parent018d92a8a49e7e1a3a41ae87e24a9a8ba60619d6 (diff)
parent845a7989a6ff66b1c922d1f7f69c7560b6783dd8 (diff)
mergging
Diffstat (limited to 'src/fields/ListField.ts')
-rw-r--r--src/fields/ListField.ts21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/fields/ListField.ts b/src/fields/ListField.ts
index 700600804..ce32da0a6 100644
--- a/src/fields/ListField.ts
+++ b/src/fields/ListField.ts
@@ -40,6 +40,7 @@ export class ListField<T extends Field> extends BasicField<T[]> {
this.observeDisposer()
}
this.data = observable(value);
+ this.updateProxies();
this.observeList();
}
@@ -69,7 +70,25 @@ export class ListField<T extends Field> extends BasicField<T[]> {
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))) {
- this.data = this._proxies.map(id => fields[id] as T)
+ 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);