@cocreate/events 1.5.0 → 1.6.1

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/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## [1.6.1](https://github.com/CoCreate-app/CoCreate-events/compare/v1.6.0...v1.6.1) (2023-03-16)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * events undefined ([113384c](https://github.com/CoCreate-app/CoCreate-events/commit/113384c5a7b300daf4ab7cc74d25ab9cdb2fbf8c))
7
+
8
+ # [1.6.0](https://github.com/CoCreate-app/CoCreate-events/compare/v1.5.0...v1.6.0) (2023-03-16)
9
+
10
+
11
+ ### Features
12
+
13
+ * replaced get-value and set-value with a super charged version of CoCreate-events ([5407615](https://github.com/CoCreate-app/CoCreate-events/commit/54076157dc1e3ae764bc1e8d8ce4a84786501449))
14
+
1
15
  # [1.5.0](https://github.com/CoCreate-app/CoCreate-events/compare/v1.4.1...v1.5.0) (2023-03-15)
2
16
 
3
17
 
package/demo/index.html CHANGED
@@ -68,8 +68,10 @@
68
68
 
69
69
  <!-- defining key example -->
70
70
  <div >
71
- <input input-target="#testing" input-value="" input-key="ty">
72
- <span id="testing" class="{{ty}}">other content</span>
71
+ <div observe-target=".testing" observe-attribute="value">testing this new value</div>
72
+ <input input-target=".testing" input-attribute="value" input-events="input, onload" value="great test">
73
+ <input class="testing {{ty}}">
74
+ <div class="testing {{ty}}">other content</div>
73
75
  </div>
74
76
 
75
77
  <span id="keyname" clone-data='{"attributes": {"key": "{{keyname}}", "value": ""}}' {{keyname}}="test" style="margin-right:10px; padding:5px">
package/docs/index.html CHANGED
@@ -134,7 +134,7 @@
134
134
  </div>
135
135
 
136
136
  <div id="demo-preview" class="position:relative overflow:auto background-color:white">
137
- <div get-value="#demo" class="padding:20px"></div>
137
+ <div class="demopreview" class="padding:20px"></div>
138
138
  </div>
139
139
 
140
140
  <div class="font-size:20px position:absolute top:10px right:10px opacity:0.6">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cocreate/events",
3
- "version": "1.5.0",
3
+ "version": "1.6.1",
4
4
  "description": "A simple events component in vanilla javascript. Easily configured using HTML5 attributes and/or JavaScript API.",
5
5
  "keywords": [
6
6
  "events",
package/src/index.js CHANGED
@@ -4,34 +4,48 @@ import observer from '@cocreate/observer';
4
4
 
5
5
 
6
6
  const CoCreateEvents = {
7
- // ToDo update to support config, ability to add custom prefix, for loop each defualt and custom prefix to support action
7
+
8
8
  init: function(prefix, events) {
9
9
  if (prefix && events)
10
- this.initElement(document, prefix, events);
10
+ this.initPrefix(prefix, events);
11
11
  else {
12
- this.initElement(document, 'toggle', ['click']);
13
- this.initElement(document, 'click', ['click']);
14
- this.initElement(document, 'hover', ['mouseover', 'mouseout']);
15
- this.initElement(document, 'mouseover', ['mouseover']);
16
- this.initElement(document, 'mouseout', ['mouseout']);
17
- this.initElement(document, 'input', ['input']);
18
- this.initElement(document, 'change', ['change']);
19
- this.initElement(document, 'selected', ['click']);
12
+ this.initPrefix('toggle', ['click']);
13
+ this.initPrefix('click', ['click']);
14
+ this.initPrefix('hover', ['mouseover', 'mouseout']);
15
+ this.initPrefix('mouseover', ['mouseover']);
16
+ this.initPrefix('mouseout', ['mouseout']);
17
+ this.initPrefix('input', ['input']);
18
+ this.initPrefix('change', ['change']);
19
+ this.initPrefix('selected', ['click']);
20
+ this.initPrefix('onload', ['onload']);
21
+ this.initPrefix('observe', ['observer']);
20
22
  }
23
+
24
+ let customEventEls = document.querySelectorAll('[event-name]')
25
+ let names = {}
26
+ for (let customEventEl of customEventEls) {
27
+ let name = customEventEl.getAttribute('event-name')
28
+ if(!names[name]) {
29
+ names[name] = name
30
+ this.initPrefix(name);
31
+ }
32
+ }
33
+
34
+ const self = this
35
+ observer.init({
36
+ name: 'CoCreateEventName',
37
+ observe: ['addedNodes'],
38
+ target: `[event-name]`,
39
+ callback: function(mutation) {
40
+ let name = mutation.target.getAttribute('event-name')
41
+ self.initPrefix(name);
42
+ }
43
+ });
44
+
21
45
  },
22
-
23
- initElement: function(element, prefix, events) {
24
- this.__initElementEvent(element || document, prefix, events);
25
- },
26
-
27
- __initElementEvent: function(element, prefix, events) {
46
+
47
+ initPrefix: function(prefix, events) {
28
48
  const self = this;
29
-
30
- let selector = `[${prefix}], [${prefix}-value]`
31
- let elements = document.querySelectorAll(selector)
32
- for (const el of elements) {
33
- this.addEvent(el, prefix, events)
34
- }
35
49
 
36
50
  action.init({
37
51
  name: prefix,
@@ -41,63 +55,128 @@ const CoCreateEvents = {
41
55
  }
42
56
  });
43
57
 
58
+ let selector = `[${prefix}], [${prefix}-value], [${prefix}-target], [${prefix}-closest], [${prefix}-parent], [${prefix}-next], [${prefix}-previous]`
59
+
44
60
  observer.init({
45
- name: 'CoCreateEventInit',
46
- observe: ['addedNodes'],
47
- target: `[${prefix}], [${prefix}-value]`,
61
+ name: 'CoCreateEventattributes',
62
+ observe: ['attributes', 'addedNodes'],
63
+ attributeName: [`${prefix}-events`],
64
+ target: selector,
48
65
  callback: function(mutation) {
49
- self.addEvent(mutation.target, prefix, events);
66
+ self.initElements([mutation.target], prefix, events)
50
67
  }
51
68
  });
52
-
53
69
 
70
+ if (events.includes('observer')) {
71
+ observer.init({
72
+ name: 'observerAttributes',
73
+ observe: ['attributes'],
74
+ attributeName: [`${prefix}-target`, `${prefix}-closest`, `${prefix}-parent`, `${prefix}-next`, `${prefix}-previous`],
75
+ callback: function(mutation) {
76
+ // remove previous observer
77
+ self.initElements([mutation.target], prefix, events)
78
+ }
79
+ });
80
+ }
81
+
82
+ let elements = document.querySelectorAll(selector)
83
+ this.initElements(elements, prefix, events);
54
84
  },
55
-
56
- addEvent: function(element, prefix, events) {
57
- const self = this;
58
- events.forEach((eventName) => {
59
- let debounce;
60
- element.addEventListener(eventName, function(event) {
85
+
86
+ elements: new Map(),
87
+ initElements: function(elements, prefix, events = []) {
88
+ const self = this
89
+ for (const el of elements) {
90
+ let prefixes = this.elements.get(el)
91
+ if (!prefixes) {
92
+ prefixes = {[prefix]: events}
93
+ this.elements.set(el, prefixes)
94
+ } else {
95
+ events = prefixes[prefix]
96
+ }
97
+
98
+ let customEvents = el.getAttribute(`${prefix}-events`)
99
+ if (customEvents) {
100
+ customEvents = customEvents.split(',')
101
+ for (let i = 0; i < customEvents.length; i++)
102
+ customEvents[i] = customEvents[i].trim()
103
+
104
+ for (let i = 0; i < events.length; i++)
105
+ el.removeEventListener(events[i], eventFunction)
106
+
107
+ events = customEvents
108
+ prefixes[prefix] = events
109
+ }
110
+ if (!events)
111
+ events = []
112
+ if (events.includes('onload'))
113
+ this.__updateElements(el, prefix);
114
+
115
+ if (events.includes('observer')) {
116
+ let target;
117
+ for (let attribute of el.attributes) {
118
+ if ([`${prefix}-target`, `${prefix}-closest`, `${prefix}-parent`, `${prefix}-next`, `${prefix}-previous`].includes(attribute.name)) {
119
+ target = attribute.value
120
+ break;
121
+ }
122
+ }
123
+
124
+ observer.init({
125
+ observe: ['addedNodes'],
126
+ target,
127
+ callback: function(mutation) {
128
+ self.__updateElements(el, prefix, mutation.target);
129
+ }
130
+ });
131
+ }
132
+
133
+ for (let i = 0; i < events.length; i++) {
134
+ if (events[i] !== 'onload' && events[i] !== 'observer')
135
+ el.addEventListener(events[i], eventFunction);
136
+ }
137
+
138
+ function eventFunction(event) {
61
139
  // ToDo: apply debounce
140
+ // let debounce;
62
141
  // clearTimeout(debounce);
63
142
  // debounce = setTimeout(function() {
64
- const target = event.currentTarget
65
- if (target) {
66
- if (target.id == "testtemplate1" || target.id == "testtemplate2")
67
- console.log(target.id)
68
- let attribute = target.getAttribute('actions') || ""
69
- if (attribute.includes(prefix))
70
- return;
71
- // if (target.closest(`[actions*="${prefix}"]`))
72
- // return;
73
- self.__updateElements(target, prefix);
74
-
75
- let parentElement = target.parentElement;
76
- if (parentElement) {
77
- do {
78
- parentElement = parentElement.closest(`[${prefix}], [${prefix}-value]`)
79
- if (parentElement) {
80
- self.__updateElements(parentElement, prefix);
81
- parentElement = parentElement.parentElement
82
- }
143
+ const target = event.currentTarget
144
+ if (target) {
145
+ let attribute = target.getAttribute('actions') || ""
146
+ if (attribute.includes(prefix))
147
+ return;
148
+ // if (target.closest(`[actions*="${prefix}"]`))
149
+ // return;
150
+ self.__updateElements(target, prefix);
151
+
152
+ let selector = `[${prefix}], [${prefix}-value], [${prefix}-target], [${prefix}-closest], [${prefix}-parent], [${prefix}-next], [${prefix}-previous]`
153
+
154
+ let parentElement = target.parentElement;
155
+ if (parentElement) {
156
+ do {
157
+ parentElement = parentElement.closest(selector)
158
+ if (parentElement) {
159
+ self.__updateElements(parentElement, prefix);
160
+ parentElement = parentElement.parentElement
83
161
  }
84
- while (parentElement)
85
-
86
162
  }
87
-
163
+ while (parentElement)
164
+
88
165
  }
89
- // }, 500);
90
-
91
- });
92
-
93
- });
166
+
167
+ }
168
+ // }, 500);
169
+ }
170
+
171
+
172
+ }
94
173
  },
95
174
 
96
- __updateElements: function(element, prefix) {
175
+ __updateElements: function(element, prefix, target) {
97
176
  const self = this;
98
177
  // ToDo: support empty value when prefix-attribute defined, add and remove the attribute
99
178
  let targetValue = element.getAttribute(`${prefix}-value`) || element.getAttribute(prefix);
100
- if (!targetValue && element.value)
179
+ if (!targetValue)
101
180
  targetValue = element.getValue()
102
181
  if (!targetValue) return
103
182
 
@@ -107,6 +186,8 @@ const CoCreateEvents = {
107
186
  }
108
187
 
109
188
  let targetAttribute = element.getAttribute(`${prefix}-attribute`) || 'class';
189
+ let targetText = element.getAttribute(`${prefix}-text`);
190
+ let targetHtml = element.getAttribute(`${prefix}-html`);
110
191
  let targetSelector = element.getAttribute(`${prefix}-target`);
111
192
  let targetClosest = element.getAttribute(`${prefix}-closest`);
112
193
  let targetParent = element.getAttribute(`${prefix}-parent`);
@@ -161,30 +242,30 @@ const CoCreateEvents = {
161
242
  });
162
243
  }
163
244
 
164
- let targetElements = [element];
165
- if (targetClosest) {
166
- element = element.closest(targetClosest);
167
- }
168
245
  values = values.map(x => x.trim());
169
- if (targetSelector) {
246
+ let targetElements = [element];
247
+ if (target) {
248
+ self.setValue(prefix, target, targetAttribute, values, targetKey);
249
+ } else if (targetSelector) {
170
250
  if (/{{\s*([\w\W]+)\s*}}/g.test(targetSelector)) return;
171
251
  targetElements = queryDocumentSelectorAll(targetSelector);
172
252
  targetElements.forEach((el) => self.setValue(prefix, el, targetAttribute, values, targetKey));
173
- }
174
- else if (targetParent)
253
+ } else if (targetClosest) {
254
+ element = element.closest(targetClosest);
255
+ self.setValue(prefix, element, targetAttribute, values, targetKey);
256
+ } else if (targetParent) {
175
257
  element.parentElement.querySelectorAll(targetParent).forEach((el) =>
176
258
  self.setValue(prefix, el, targetAttribute, values, targetKey)
177
259
  );
178
- else if (targetNext)
260
+ } else if (targetNext) {
179
261
  el.nextElementSibling.querySelectorAll(targetNext).forEach((el) =>
180
262
  self.setValue(prefix, el, targetAttribute, values, targetKey)
181
263
  );
182
- else if (targetPrevious)
264
+ } else if (targetPrevious) {
183
265
  el.previousElementSibling.querySelectorAll(targetPrevious).forEach((el) =>
184
266
  self.setValue(prefix, el, targetAttribute, values, targetKey)
185
267
  );
186
- else
187
- self.setValue(prefix, element, targetAttribute, values, targetKey);
268
+ }
188
269
 
189
270
  document.dispatchEvent(new CustomEvent(`${prefix}End`, {
190
271
  detail: {}
@@ -224,6 +305,12 @@ const CoCreateEvents = {
224
305
  } else {
225
306
  if (attrName === 'value') {
226
307
  oldValue = element.getValue()
308
+ } else if (attrName === 'text') {
309
+ attrValues = element.getAttribute(attrName).split(' ').map(x => x.trim());
310
+ oldValue = values.filter(x => attrValues.includes(x))[0] || '';
311
+ } else if (attrName === 'html') {
312
+ attrValues = element.getAttribute(attrName).split(' ').map(x => x.trim());
313
+ oldValue = values.filter(x => attrValues.includes(x))[0] || '';
227
314
  } else if (element.getAttribute(attrName)) {
228
315
  attrValues = element.getAttribute(attrName).split(' ').map(x => x.trim());
229
316
  oldValue = values.filter(x => attrValues.includes(x))[0] || '';