vsn 0.1.93 → 0.1.94

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/src/DOM.ts CHANGED
@@ -189,16 +189,8 @@ export class DOM extends EventDispatcher {
189
189
  }
190
190
  }
191
191
 
192
- async buildFrom(ele: any, isRoot: boolean = false, forComponent: boolean = false) {
193
- if (isRoot) {
194
- document.body.setAttribute('vsn-root', '');
195
- document.ondragover = (e) => e.cancelable && e.preventDefault(); // Allow dragging over document
196
- }
197
-
198
- // Create tags for each html element with a v-attribute
199
- const newTags: Tag[] = [];
200
- const toBuild: HTMLElement[] = [];
201
-
192
+ async discover(ele: HTMLElement, forComponent: boolean = false): Promise<HTMLElement[]> {
193
+ const discovered: HTMLElement[] = [];
202
194
  const checkElement = (e: HTMLElement): boolean => {
203
195
  if (ElementHelper.hasVisionAttribute(e)) {
204
196
  if (
@@ -206,7 +198,7 @@ export class DOM extends EventDispatcher {
206
198
  ) return false;
207
199
  if (this.queued.indexOf(e) > -1) return false;
208
200
  this.queued.push(e);
209
- toBuild.push(e);
201
+ discovered.push(e);
210
202
  }
211
203
 
212
204
  return true;
@@ -221,11 +213,30 @@ export class DOM extends EventDispatcher {
221
213
  checkElement(ele);
222
214
  scanChildren(ele);
223
215
 
216
+ return discovered;
217
+ }
218
+
219
+ async buildTag(element: HTMLElement, returnExisting: boolean = false): Promise<Tag> {
220
+ if (element[Tag.TaggedVariable]) return returnExisting ? element[Tag.TaggedVariable] : null;
221
+ const tag: Tag = new Tag(element, this);
222
+ this.tags.push(tag);
223
+ return tag;
224
+ }
225
+
226
+ async buildFrom(ele: any, isRoot: boolean = false, forComponent: boolean = false) {
227
+ if (isRoot) {
228
+ document.body.setAttribute('vsn-root', '');
229
+ document.ondragover = (e) => e.cancelable && e.preventDefault(); // Allow dragging over document
230
+ }
231
+
232
+ // Create tags for each html element with a vsn-attribute
233
+ const newTags: Tag[] = [];
234
+ const toBuild: HTMLElement[] = await this.discover(ele, forComponent);
235
+
224
236
  for (const element of toBuild) {
225
- if (element[Tag.TaggedVariable]) continue;
226
- const tag: Tag = new Tag(element, this);
227
- this.tags.push(tag);
228
- newTags.push(tag);
237
+ const tag = await this.buildTag(element);
238
+ if (tag)
239
+ newTags.push(tag);
229
240
  }
230
241
 
231
242
  if (isRoot)
@@ -113,11 +113,11 @@ export class List extends Attribute {
113
113
  }
114
114
 
115
115
  public get listItemName(): string {
116
- return this.tag.getRawAttributeValue('vsn-list-item-name', 'item');
116
+ return this.tag.getRawAttributeValue('list-item-name', 'item');
117
117
  }
118
118
 
119
119
  public get listItemModel(): string {
120
- return this.tag.getRawAttributeValue('vsn-list-item-model');
120
+ return this.tag.getRawAttributeValue('list-item-model');
121
121
  }
122
122
 
123
123
  public remove(item: any) {
@@ -135,6 +135,7 @@ export class List extends Attribute {
135
135
  }
136
136
 
137
137
  protected async add(obj) {
138
+ // Setup new HTML element
138
139
  const clone = this.template.cloneNode(true);
139
140
  let element: HTMLElement;
140
141
  if (clone instanceof DocumentFragment) {
@@ -144,20 +145,29 @@ export class List extends Attribute {
144
145
  }
145
146
  delete element[Tag.TaggedVariable];
146
147
 
147
- this.tag.element.appendChild(element);
148
+ // Setup new tag
149
+ const tag = await this.tag.dom.buildTag(element, true);
150
+ tag.createScope(true);
148
151
 
149
- await this.tag.dom.buildFrom(this.tag.element);
150
- const tag: Tag = await this.tag.dom.getTagForElement(element);
151
- this.tags.push(tag);
152
+ // Setup new scope & class, if defined
153
+ const modelName: string = this.listItemModel;
154
+ let cls;
155
+ if (modelName)
156
+ cls = await Registry.instance.models.get(modelName);
152
157
 
153
- if (obj) {
154
- if (tag.scope.wrapped) {
155
- tag.scope.data.setData(obj);
156
- } else {
157
- tag.wrap(obj);
158
+ if (cls) {
159
+ if (!obj || !(obj instanceof cls)) {
160
+ obj = new cls(obj);
158
161
  }
159
162
  }
160
163
 
164
+ tag.scope.set(this.listItemName, tag.scope);
165
+ tag.wrap(obj);
166
+
167
+ // Add to DOM & build
168
+ this.tag.element.appendChild(element);
169
+ await this.tag.dom.buildFrom(this.tag.element);
170
+ this.tags.push(tag);
161
171
  this.tag.dispatch('add', obj);
162
172
  }
163
173
  }
@@ -18,30 +18,13 @@ export class ListItem extends Attribute {
18
18
  this._list = this.tag.findAncestorByAttribute('vsn-list');
19
19
  if (!this._list)
20
20
  throw Error(ListItem.ERROR_NO_PARENT);
21
- const modelName: string = (await this.getList()).listItemModel;
22
- if (modelName) {
23
- const cls = await Registry.instance.models.get(modelName);
24
- if (
25
- !(this.tag.scope.data instanceof cls) &&
26
- !(this.tag.scope.wrapped instanceof cls)
27
- ) {
28
- this.instantiateModel(cls);
29
- }
30
21
 
31
- }
32
- this.tag.scope.set(this.listItemName, this.tag.scope);
33
- await super.setup();
34
- }
22
+ this.tag.scope.set((await this.getListAttribute()).listItemName, this.tag.scope);
35
23
 
36
- public get listItemName(): string {
37
- return this.getAttributeBinding('item');
24
+ await super.setup();
38
25
  }
39
26
 
40
- public async getList(): Promise<List> {
27
+ public async getListAttribute(): Promise<List> {
41
28
  return await this._list.getAttribute<List>('vsn-list');
42
29
  }
43
-
44
- private instantiateModel(model: any) {
45
- this.tag.wrap(model, false, true);
46
- }
47
30
  }
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
- export const VERSION = '0.1.93';
1
+ export const VERSION = '0.1.94';
2
2
 
@@ -41,7 +41,7 @@ describe('ListItem', () => {
41
41
 
42
42
  it("vsn-list-item should find it's parent list", (done) => {
43
43
  document.body.innerHTML = `
44
- <ul vsn-list:list vsn-list-item-model="ListItemSpecTestItem" id="test"><li vsn-list-item:item id="test-item"></li></ul>
44
+ <ul vsn-list:list list-item-model="ListItemSpecTestItem" id="test"><li vsn-list-item id="test-item"></li></ul>
45
45
  `;
46
46
 
47
47
  const dom = new DOM(document);
@@ -58,7 +58,7 @@ describe('ListItem', () => {
58
58
  it("should properly wrap list item class", (done) => {
59
59
  document.body.innerHTML = `
60
60
  <div vsn-controller:controller="ListItemController">
61
- <ul vsn-list:controller.items vsn-list-item-model="ListItemSpecTestItem" id="test">
61
+ <ul vsn-list:controller.items list-item-model="ListItemSpecTestItem" id="test">
62
62
  <li vsn-template vsn-list-item:item></li>
63
63
  </ul>
64
64
  </div>
@@ -89,7 +89,7 @@ describe('ListItem', () => {
89
89
 
90
90
  it("vsn-list-item should work with vsn-set", (done) => {
91
91
  document.body.innerHTML = `
92
- <ul vsn-list:list vsn-list-item-model="ListItemSpecTestItem" id="test"><li vsn-list-item:item id="test-item" vsn-set:item.testing|integer="1"></li></ul>
92
+ <ul vsn-list:list list-item-model="ListItemSpecTestItem" id="test"><li vsn-list-item:item id="test-item" vsn-set:item.testing|integer="1"></li></ul>
93
93
  `;
94
94
 
95
95
  const dom = new DOM(document);
@@ -105,14 +105,15 @@ describe('ListItem', () => {
105
105
 
106
106
  it("vsn-list-item should work with vsn-exec", (done) => {
107
107
  document.body.innerHTML = `
108
- <ul vsn-list:list vsn-list-item-model="ListItemSpecTestItem" id="test"><li vsn-list-item:item id="test-item" vsn-exec="item.test = 1"></li></ul>
108
+ <ul vsn-list:list list-item-model="ListItemSpecTestItem" id="test">
109
+ <li vsn-list-item id="test-item" vsn-exec="item.test = 1"></li>
110
+ </ul>
109
111
  `;
110
112
 
113
+ console.log('################# building dom');
111
114
  const dom = new DOM(document);
112
115
  dom.once('built', async () => {
113
- const list = await dom.getTagForElement(document.getElementById('test'));
114
116
  const listItem = await dom.getTagForElement(document.getElementById('test-item'));
115
- const listItemAttr: ListItem = await listItem.getAttribute('vsn-list-item') as ListItem;
116
117
  console.log('test keys', listItem.scope.keys);
117
118
  expect(listItem.scope.get('test')).toBe(1);
118
119
  done();