vsn 0.1.23 → 0.1.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/demo/demo.html +16 -7
- package/demo/vsn.js +1 -0
- package/dist/AST.d.ts +2 -1
- package/dist/AST.js +94 -4
- package/dist/AST.js.map +1 -1
- package/dist/Attribute.d.ts +1 -1
- package/dist/Attribute.js +3 -3
- package/dist/Attribute.js.map +1 -1
- package/dist/Configuration.d.ts +1 -1
- package/dist/Configuration.js +4 -4
- package/dist/Configuration.js.map +1 -1
- package/dist/Controller.d.ts +10 -5
- package/dist/Controller.js +21 -6
- package/dist/Controller.js.map +1 -1
- package/dist/DOM/DOMObject.d.ts +1 -1
- package/dist/DOM/DOMObject.js +2 -2
- package/dist/DOM/DOMObject.js.map +1 -1
- package/dist/DOM.d.ts +1 -1
- package/dist/DOM.js +4 -4
- package/dist/DOM.js.map +1 -1
- package/dist/EventDispatcher.d.ts +26 -0
- package/dist/EventDispatcher.js +117 -0
- package/dist/EventDispatcher.js.map +1 -0
- package/dist/Formats.js +2 -2
- package/dist/Formats.js.map +1 -1
- package/dist/MessageList.d.ts +14 -0
- package/dist/MessageList.js +88 -0
- package/dist/MessageList.js.map +1 -0
- package/dist/Model/Collection.d.ts +5 -0
- package/dist/Model/Collection.js +37 -0
- package/dist/Model/Collection.js.map +1 -0
- package/dist/Model/DataModel.d.ts +6 -0
- package/dist/Model/DataModel.js +54 -0
- package/dist/Model/DataModel.js.map +1 -0
- package/dist/Model/ModelAbstract.d.ts +20 -0
- package/dist/Model/ModelAbstract.js +122 -0
- package/dist/Model/ModelAbstract.js.map +1 -0
- package/dist/Model/fields/BooleanField.d.ts +5 -0
- package/dist/Model/fields/BooleanField.js +43 -0
- package/dist/Model/fields/BooleanField.js.map +1 -0
- package/dist/Model/fields/EmailField.d.ts +5 -0
- package/dist/Model/fields/EmailField.js +36 -0
- package/dist/Model/fields/EmailField.js.map +1 -0
- package/dist/Model/fields/Field.d.ts +13 -0
- package/dist/Model/fields/Field.js +79 -0
- package/dist/Model/fields/Field.js.map +1 -0
- package/dist/Model/fields/FloatField.d.ts +5 -0
- package/dist/Model/fields/FloatField.js +47 -0
- package/dist/Model/fields/FloatField.js.map +1 -0
- package/dist/Model/fields/PositiveNumberField.d.ts +5 -0
- package/dist/Model/fields/PositiveNumberField.js +51 -0
- package/dist/Model/fields/PositiveNumberField.js.map +1 -0
- package/dist/Model/fields/StringField.d.ts +5 -0
- package/dist/Model/fields/StringField.js +43 -0
- package/dist/Model/fields/StringField.js.map +1 -0
- package/dist/Model.d.ts +11 -0
- package/dist/Model.js +72 -0
- package/dist/Model.js.map +1 -0
- package/dist/Registry.d.ts +2 -2
- package/dist/Registry.js +6 -16
- package/dist/Registry.js.map +1 -1
- package/dist/Scope.d.ts +7 -10
- package/dist/Scope.js +40 -90
- package/dist/Scope.js.map +1 -1
- package/dist/SimplePromise.d.ts +42 -0
- package/dist/SimplePromise.js +217 -0
- package/dist/SimplePromise.js.map +1 -0
- package/dist/Tag.js +12 -6
- package/dist/Tag.js.map +1 -1
- package/dist/attributes/Bind.js +1 -1
- package/dist/attributes/Bind.js.map +1 -1
- package/dist/attributes/ClickRemoveClass.js +17 -5
- package/dist/attributes/ClickRemoveClass.js.map +1 -1
- package/dist/attributes/ClickToggleClass.js +17 -5
- package/dist/attributes/ClickToggleClass.js.map +1 -1
- package/dist/attributes/Exec.js +6 -0
- package/dist/attributes/Exec.js.map +1 -1
- package/dist/attributes/Format.js +3 -0
- package/dist/attributes/Format.js.map +1 -1
- package/dist/attributes/If.js +12 -0
- package/dist/attributes/If.js.map +1 -1
- package/dist/attributes/JSONAttribute.js +3 -0
- package/dist/attributes/JSONAttribute.js.map +1 -1
- package/dist/attributes/KeyAbstract.js +11 -4
- package/dist/attributes/KeyAbstract.js.map +1 -1
- package/dist/attributes/KeyDown.js +8 -2
- package/dist/attributes/KeyDown.js.map +1 -1
- package/dist/attributes/KeyUp.js +8 -2
- package/dist/attributes/KeyUp.js.map +1 -1
- package/dist/attributes/List.js +14 -5
- package/dist/attributes/List.js.map +1 -1
- package/dist/attributes/ListItem.js +3 -0
- package/dist/attributes/ListItem.js.map +1 -1
- package/dist/attributes/On.js +15 -3
- package/dist/attributes/On.js.map +1 -1
- package/dist/attributes/Radio.d.ts +2 -0
- package/dist/attributes/Radio.js +52 -5
- package/dist/attributes/Radio.js.map +1 -1
- package/dist/attributes/RootAttribute.js +8 -2
- package/dist/attributes/RootAttribute.js.map +1 -1
- package/dist/attributes/ScopeChange.js +7 -1
- package/dist/attributes/ScopeChange.js.map +1 -1
- package/dist/attributes/SetAttribute.js +3 -0
- package/dist/attributes/SetAttribute.js.map +1 -1
- package/dist/attributes/StandardAttribute.js +25 -7
- package/dist/attributes/StandardAttribute.js.map +1 -1
- package/dist/attributes/StyleAttribute.js +1 -1
- package/dist/attributes/StyleAttribute.js.map +1 -1
- package/dist/attributes/TypeAttribute.js +3 -0
- package/dist/attributes/TypeAttribute.js.map +1 -1
- package/dist/{Vision.d.ts → vsn.d.ts} +3 -1
- package/dist/{Vision.js → vsn.js} +10 -6
- package/dist/vsn.js.map +1 -0
- package/package.json +9 -13
- package/src/AST.ts +96 -5
- package/src/Attribute.ts +2 -2
- package/src/Configuration.ts +3 -3
- package/src/Controller.ts +16 -7
- package/src/DOM/DOMObject.ts +1 -1
- package/src/DOM.ts +4 -4
- package/src/EventDispatcher.ts +117 -0
- package/src/Formats.ts +2 -2
- package/src/MessageList.ts +81 -0
- package/src/Model/Collection.ts +13 -0
- package/src/Model/DataModel.ts +29 -0
- package/src/Model/ModelAbstract.ts +114 -0
- package/src/Model/fields/BooleanField.ts +16 -0
- package/src/Model/fields/EmailField.ts +12 -0
- package/src/Model/fields/Field.ts +65 -0
- package/src/Model/fields/FloatField.ts +22 -0
- package/src/Model/fields/PositiveNumberField.ts +24 -0
- package/src/Model/fields/StringField.ts +16 -0
- package/src/Model.ts +57 -0
- package/src/Registry.ts +3 -5
- package/src/Scope.ts +39 -90
- package/src/SimplePromise.ts +219 -0
- package/src/Tag.ts +12 -9
- package/src/attributes/Bind.ts +1 -1
- package/src/attributes/ClickRemoveClass.ts +2 -0
- package/src/attributes/ClickToggleClass.ts +2 -0
- package/src/attributes/Exec.ts +2 -0
- package/src/attributes/Format.ts +1 -0
- package/src/attributes/If.ts +4 -0
- package/src/attributes/JSONAttribute.ts +1 -0
- package/src/attributes/KeyAbstract.ts +2 -1
- package/src/attributes/KeyDown.ts +1 -0
- package/src/attributes/KeyUp.ts +1 -0
- package/src/attributes/List.ts +6 -3
- package/src/attributes/ListItem.ts +1 -0
- package/src/attributes/On.ts +4 -0
- package/src/attributes/Radio.ts +18 -3
- package/src/attributes/RootAttribute.ts +1 -0
- package/src/attributes/ScopeChange.ts +3 -1
- package/src/attributes/SetAttribute.ts +1 -0
- package/src/attributes/StandardAttribute.ts +4 -1
- package/src/attributes/StyleAttribute.ts +1 -1
- package/src/attributes/TypeAttribute.ts +1 -0
- package/src/{Vision.ts → vsn.ts} +4 -2
- package/test/AST.spec.ts +2 -1
- package/test/DOM.spec.ts +1 -1
- package/test/MessageList.spec.ts +101 -0
- package/test/Model/DataModel.spec.ts +141 -0
- package/test/Model.spec.ts +306 -0
- package/test/Scope.spec.ts +2 -2
- package/test/SimplePromise.spec.ts +271 -0
- package/test/attributes/Bind.spec.ts +5 -5
- package/test/attributes/JSONAttribute.spec.ts +1 -1
- package/test/attributes/ListItem.spec.ts +1 -1
- package/webpack.config.js +2 -2
- package/demo/vision.js +0 -1
- package/dist/Vision.js.map +0 -1
- package/main.py +0 -16
package/src/attributes/Radio.ts
CHANGED
|
@@ -9,7 +9,7 @@ export class Radio extends Attribute {
|
|
|
9
9
|
protected key?: string;
|
|
10
10
|
protected boundScope?: Scope;
|
|
11
11
|
|
|
12
|
-
public async
|
|
12
|
+
public async setup() {
|
|
13
13
|
let scopeKey: string = this.getAttributeValue() || this.tag.getRawAttributeValue('name');
|
|
14
14
|
let ref: ScopeReference;
|
|
15
15
|
try {
|
|
@@ -21,11 +21,25 @@ export class Radio extends Attribute {
|
|
|
21
21
|
|
|
22
22
|
this.key = await ref.getKey();
|
|
23
23
|
this.boundScope = await ref.getScope();
|
|
24
|
+
await super.setup();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public async extract() {
|
|
28
|
+
if (this.tag.checked)
|
|
29
|
+
await this.handleEvent(null);
|
|
30
|
+
await super.extract();
|
|
24
31
|
}
|
|
25
32
|
|
|
26
33
|
public async connect() {
|
|
27
|
-
this.boundScope.
|
|
34
|
+
this.boundScope.on(`change:${this.key}`, this.checkSelected, this);
|
|
28
35
|
this.tag.addEventHandler('change', this.getAttributeModifiers(), this.handleEvent.bind(this));
|
|
36
|
+
await this.checkSelected();
|
|
37
|
+
await super.connect();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public async evaluate() {
|
|
41
|
+
await this.checkSelected();
|
|
42
|
+
await super.evaluate();
|
|
29
43
|
}
|
|
30
44
|
|
|
31
45
|
async handleEvent(e) {
|
|
@@ -33,6 +47,7 @@ export class Radio extends Attribute {
|
|
|
33
47
|
}
|
|
34
48
|
|
|
35
49
|
async checkSelected() {
|
|
36
|
-
|
|
50
|
+
const scopeValue = this.boundScope.get(this.key);
|
|
51
|
+
this.tag.checked = `${scopeValue}` === this.tag.value;
|
|
37
52
|
}
|
|
38
53
|
}
|
|
@@ -12,12 +12,14 @@ export abstract class ScopeChange extends Attribute {
|
|
|
12
12
|
const code: string = this.getAttributeValue();
|
|
13
13
|
this.handler = new Tree(code);
|
|
14
14
|
await this.handler.prepare(this.tag.scope, this.tag.dom, this.tag);
|
|
15
|
+
await super.compile();
|
|
15
16
|
}
|
|
16
17
|
|
|
17
18
|
public async connect() {
|
|
18
19
|
const binding = this.getAttributeBinding();
|
|
19
20
|
const ref: ScopeReference = this.tag.scope.getReference(binding, false);
|
|
20
|
-
(await ref.getScope()).
|
|
21
|
+
(await ref.getScope()).on(`change:${await ref.getKey()}`, this.handleEvent.bind(this));
|
|
22
|
+
await super.connect();
|
|
21
23
|
}
|
|
22
24
|
|
|
23
25
|
async handleEvent(e) {
|
|
@@ -13,14 +13,17 @@ export class StandardAttribute extends Attribute {
|
|
|
13
13
|
if (StandardAttribute.magicAttributes.indexOf(this.key) === -1 && !this.tag.element.hasAttribute(this.attributeName)) {
|
|
14
14
|
this.tag.element.setAttribute(this.attributeName, '');
|
|
15
15
|
}
|
|
16
|
+
await super.setup();
|
|
16
17
|
}
|
|
17
18
|
|
|
18
19
|
public async extract() {
|
|
19
20
|
this.updateFrom();
|
|
21
|
+
await super.extract();
|
|
20
22
|
}
|
|
21
23
|
|
|
22
24
|
public async connect() {
|
|
23
|
-
this.tag.scope.
|
|
25
|
+
this.tag.scope.on(`change:${this.key}`, this.updateTo.bind(this));
|
|
26
|
+
await super.connect();
|
|
24
27
|
}
|
|
25
28
|
|
|
26
29
|
public mutate(mutation: MutationRecord) {
|
package/src/{Vision.ts → vsn.ts}
RENAMED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import {DOM} from "./DOM";
|
|
2
|
-
import {EventDispatcher} from "simple-ts-event-dispatcher";
|
|
3
2
|
import {WrappedArray} from "./Scope";
|
|
4
|
-
import {DataModel} from "simple-ts-models";
|
|
5
3
|
import {Registry} from "./Registry";
|
|
6
4
|
import "./Types";
|
|
7
5
|
import "./Formats";
|
|
@@ -9,6 +7,8 @@ import {Configuration} from "./Configuration";
|
|
|
9
7
|
import {VisionHelper} from "./helpers/VisionHelper";
|
|
10
8
|
import {Tree} from "./AST";
|
|
11
9
|
import {Query} from "./Query";
|
|
10
|
+
import {EventDispatcher} from "./EventDispatcher";
|
|
11
|
+
import {DataModel} from "./Model/DataModel";
|
|
12
12
|
|
|
13
13
|
export class Vision extends EventDispatcher {
|
|
14
14
|
protected static _instance: Vision;
|
|
@@ -73,4 +73,6 @@ export * from './Attribute';
|
|
|
73
73
|
export * from './AST';
|
|
74
74
|
export {DOM} from './DOM';
|
|
75
75
|
export {WrappedArray, Scope, ScopeReference} from './Scope';
|
|
76
|
+
export {Controller} from './Controller';
|
|
77
|
+
export {Tag} from './Tag';
|
|
76
78
|
export const vision: Vision = Vision.instance;
|
package/test/AST.spec.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
|
|
2
2
|
import {Scope, WrappedArray} from "../src/Scope";
|
|
3
3
|
import {Tree} from "../src/AST";
|
|
4
4
|
import {DOM} from "../src/DOM";
|
|
5
|
+
import {IDeferred, SimplePromise} from "../src/SimplePromise";
|
|
5
6
|
|
|
6
7
|
describe('Tree', () => {
|
|
7
8
|
let scope: Scope = null,
|
package/test/DOM.spec.ts
CHANGED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import MessageList from "../src/MessageList";
|
|
2
|
+
|
|
3
|
+
describe('MessageList', () => {
|
|
4
|
+
it("should reset properly", () => {
|
|
5
|
+
const list = new MessageList();
|
|
6
|
+
list.merge({
|
|
7
|
+
'foo': ['bar', 'baz']
|
|
8
|
+
});
|
|
9
|
+
console.info(list.keys);
|
|
10
|
+
expect(list.length).toBe(1);
|
|
11
|
+
expect(list['foo']).toEqual(['bar', 'baz']);
|
|
12
|
+
|
|
13
|
+
list.reset();
|
|
14
|
+
|
|
15
|
+
expect(list.length).toBe(0);
|
|
16
|
+
expect(list['foo']).toEqual(undefined);
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it("should add messages", () => {
|
|
20
|
+
const list = new MessageList({
|
|
21
|
+
'foo': ['bar', 'baz']
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
// Add list
|
|
25
|
+
list.add('foo', ['biz', 'blarg']);
|
|
26
|
+
expect(list['foo']).toEqual(['bar', 'baz', 'biz', 'blarg']);
|
|
27
|
+
|
|
28
|
+
// Add single error and replace
|
|
29
|
+
list.add('foo', 'replaced', true);
|
|
30
|
+
expect(list['foo']).toEqual(['replaced']);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it("should merge messages", () => {
|
|
34
|
+
const list = new MessageList();
|
|
35
|
+
list.merge({
|
|
36
|
+
'foo': ['bar', 'baz'],
|
|
37
|
+
'test': ['test 1', 'test 2']
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
list.merge({
|
|
41
|
+
'foo': ['merged 1', 'merged 2'],
|
|
42
|
+
'test': ['test 3', 'test 4'],
|
|
43
|
+
'new': ['new 1', 'new 2']
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
expect(list['foo']).toEqual(['bar', 'baz', 'merged 1', 'merged 2']);
|
|
47
|
+
expect(list['test']).toEqual(['test 1', 'test 2', 'test 3', 'test 4']);
|
|
48
|
+
expect(list['new']).toEqual(['new 1', 'new 2']);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("should replace messages", () => {
|
|
52
|
+
const list = new MessageList();
|
|
53
|
+
list.merge({
|
|
54
|
+
'foo': ['bar', 'baz'],
|
|
55
|
+
'test': ['test 1', 'test 2']
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
list.merge({
|
|
59
|
+
'foo': ['merged 1', 'merged 2'],
|
|
60
|
+
'test': ['test 3', 'test 4'],
|
|
61
|
+
'new': ['new 1', 'new 2']
|
|
62
|
+
}, true);
|
|
63
|
+
|
|
64
|
+
expect(list['foo']).toEqual(['merged 1', 'merged 2']);
|
|
65
|
+
expect(list['test']).toEqual(['test 3', 'test 4']);
|
|
66
|
+
expect(list['new']).toEqual(['new 1', 'new 2']);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it("should return a list", () => {
|
|
70
|
+
const list = new MessageList(),
|
|
71
|
+
items = {
|
|
72
|
+
'foo': ['bar', 'baz'],
|
|
73
|
+
'test': ['test 1', 'test 2']
|
|
74
|
+
};
|
|
75
|
+
list.merge(items);
|
|
76
|
+
expect(list.list).toEqual(items);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it("should ignore empty additions", () => {
|
|
80
|
+
const list = new MessageList();
|
|
81
|
+
list.merge({});
|
|
82
|
+
list.merge(null);
|
|
83
|
+
expect(list.length).toEqual(0);
|
|
84
|
+
|
|
85
|
+
list.merge({
|
|
86
|
+
'empty': [],
|
|
87
|
+
'null': null
|
|
88
|
+
});
|
|
89
|
+
expect(list.length).toEqual(0);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it("should cache list getter result", () => {
|
|
93
|
+
const messageList = new MessageList({
|
|
94
|
+
'foo': ['bar', 'baz']
|
|
95
|
+
}),
|
|
96
|
+
list = messageList.list;
|
|
97
|
+
expect(list).toBe(messageList.list);
|
|
98
|
+
messageList.add('bar', 'baz');
|
|
99
|
+
expect(list).not.toBe(messageList.list);
|
|
100
|
+
});
|
|
101
|
+
});
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import {DataModel} from "../../src/Model/DataModel";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
describe('Model', () => {
|
|
5
|
+
it("Should trigger a change event when any field is changed", () => {
|
|
6
|
+
const m = new DataModel(['foo']);
|
|
7
|
+
let value = null,
|
|
8
|
+
field = null;
|
|
9
|
+
|
|
10
|
+
m.on('change', (_field, values) => {
|
|
11
|
+
field = _field;
|
|
12
|
+
value = values.value;
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
m.foo = 'testing';
|
|
16
|
+
|
|
17
|
+
expect<string | null>(field).toBe('foo');
|
|
18
|
+
expect(value).toBe(m.foo);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it("Should create the given fields from an object", () => {
|
|
22
|
+
const m = new DataModel({
|
|
23
|
+
field_1: 1,
|
|
24
|
+
field_2: 'yes',
|
|
25
|
+
field_3: true
|
|
26
|
+
});
|
|
27
|
+
expect(m.getFields().length).toBe(3);
|
|
28
|
+
|
|
29
|
+
m.setData({field_4: 4, field_5: 5});
|
|
30
|
+
expect(m.getFields().length).toBe(5);
|
|
31
|
+
const data = m.getData();
|
|
32
|
+
expect(data['field_1']).toBe(1);
|
|
33
|
+
expect(data['field_2']).toBe('yes');
|
|
34
|
+
expect(data['field_3']).toBe(true);
|
|
35
|
+
expect(data['field_4']).toBe(4);
|
|
36
|
+
expect(data['field_5']).toBe(5);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it("Should create the given fields from an array", () => {
|
|
40
|
+
const m = new DataModel([
|
|
41
|
+
'field_1',
|
|
42
|
+
'field_2',
|
|
43
|
+
'field_3'
|
|
44
|
+
]);
|
|
45
|
+
expect(m.getFields().length).toBe(3);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it("Should trigger a change event when a field is changed", () => {
|
|
49
|
+
const m = new DataModel({
|
|
50
|
+
field_1: 1,
|
|
51
|
+
field_2: 'yes',
|
|
52
|
+
field_3: true
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
let oldValue = null,
|
|
56
|
+
oldValueCheck = null,
|
|
57
|
+
value = null;
|
|
58
|
+
|
|
59
|
+
m.bindToFields('change', [
|
|
60
|
+
'field_2',
|
|
61
|
+
'field_1'
|
|
62
|
+
], (values) => {
|
|
63
|
+
oldValue = values.oldValue;
|
|
64
|
+
value = values.value;
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// Test to make sure field_1 change event is being called
|
|
68
|
+
oldValueCheck = m.field_1;
|
|
69
|
+
m.field_1 = 2;
|
|
70
|
+
expect(value).toBe(m.field_1);
|
|
71
|
+
expect(oldValue).toBe(oldValueCheck);
|
|
72
|
+
|
|
73
|
+
// Test to make sure field_2 change event is being called
|
|
74
|
+
oldValueCheck = m.field_2;
|
|
75
|
+
m.field_2 = 'no';
|
|
76
|
+
expect(value).toBe(m.field_2);
|
|
77
|
+
expect(oldValue).toBe(oldValueCheck);
|
|
78
|
+
|
|
79
|
+
// Test to make sure fields that aren't being listened to aren't
|
|
80
|
+
// triggering the event
|
|
81
|
+
oldValueCheck = m.foo;
|
|
82
|
+
m.foo = false;
|
|
83
|
+
expect(value).not.toBe(m.foo);
|
|
84
|
+
expect(oldValue).not.toBe(oldValueCheck);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it("Should trigger a change:field event when any field is changed", () => {
|
|
88
|
+
const m = new DataModel(['field_1']);
|
|
89
|
+
let value = null;
|
|
90
|
+
|
|
91
|
+
m.on('change:field_1', (values) => {
|
|
92
|
+
value = values.value;
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
m.field_1 = 'testing';
|
|
96
|
+
|
|
97
|
+
expect(value).toBe(m.field_1);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it("should save last data and return true with is modfied if something is modified", () => {
|
|
101
|
+
const m = new DataModel({
|
|
102
|
+
field_1: 1,
|
|
103
|
+
field_2: 'foo'
|
|
104
|
+
});
|
|
105
|
+
m.setLastData();
|
|
106
|
+
expect(m.isModified()).toBe(false);
|
|
107
|
+
m.field_1 = 2;
|
|
108
|
+
m.field_2 = null;
|
|
109
|
+
expect(m.isModified()).toBe(true);
|
|
110
|
+
m.setLastData();
|
|
111
|
+
expect(m.isModified()).toBe(false);
|
|
112
|
+
m.field_2 = 'bar';
|
|
113
|
+
expect(m.isModified()).toBe(true);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it("should revert to last data correctly", () => {
|
|
117
|
+
const m = new DataModel({
|
|
118
|
+
field_1: 1,
|
|
119
|
+
field_2: 'bar'
|
|
120
|
+
});
|
|
121
|
+
m.setLastData();
|
|
122
|
+
expect(m.isModified()).toBe(false);
|
|
123
|
+
m.field_1 = 2;
|
|
124
|
+
m.field_2 = null;
|
|
125
|
+
expect(m.isModified()).toBe(true);
|
|
126
|
+
m.revert();
|
|
127
|
+
expect(m.isModified()).toBe(false);
|
|
128
|
+
expect(m.field_1).toBe(1);
|
|
129
|
+
expect(m.field_2).toBe('bar');
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it("should return the field object", () => {
|
|
133
|
+
const m = new DataModel({
|
|
134
|
+
field_1: 1,
|
|
135
|
+
field_2: 'string field!'
|
|
136
|
+
}),
|
|
137
|
+
field = m.getField('field_2');
|
|
138
|
+
expect(field.value).toBe('string field!');
|
|
139
|
+
|
|
140
|
+
});
|
|
141
|
+
});
|