@cocreate/events 1.5.0 → 1.6.0

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,10 @@
1
+ # [1.6.0](https://github.com/CoCreate-app/CoCreate-events/compare/v1.5.0...v1.6.0) (2023-03-16)
2
+
3
+
4
+ ### Features
5
+
6
+ * replaced get-value and set-value with a super charged version of CoCreate-events ([5407615](https://github.com/CoCreate-app/CoCreate-events/commit/54076157dc1e3ae764bc1e8d8ce4a84786501449))
7
+
1
8
  # [1.5.0](https://github.com/CoCreate-app/CoCreate-events/compare/v1.4.1...v1.5.0) (2023-03-15)
2
9
 
3
10
 
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.0",
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,129 @@ 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
+
111
+ if (events.includes('onload'))
112
+ this.__updateElements(el, prefix);
113
+
114
+ if (events.includes('observer')) {
115
+ let target;
116
+ for (let attribute of el.attributes) {
117
+ if ([`${prefix}-target`, `${prefix}-closest`, `${prefix}-parent`, `${prefix}-next`, `${prefix}-previous`].includes(attribute.name)) {
118
+ target = attribute.value
119
+ break;
120
+ }
121
+ }
122
+
123
+ observer.init({
124
+ observe: ['addedNodes'],
125
+ target,
126
+ callback: function(mutation) {
127
+ self.__updateElements(el, prefix, mutation.target);
128
+ }
129
+ });
130
+ }
131
+
132
+ for (let i = 0; i < events.length; i++) {
133
+ if (events[i] !== 'onload' && events[i] !== 'observer')
134
+ el.addEventListener(events[i], eventFunction);
135
+ }
136
+
137
+ function eventFunction(event) {
61
138
  // ToDo: apply debounce
139
+ // let debounce;
62
140
  // clearTimeout(debounce);
63
141
  // 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
- }
142
+ const target = event.currentTarget
143
+ if (target) {
144
+ if (target.id == "testtemplate1" || target.id == "testtemplate2")
145
+ console.log(target.id)
146
+ let attribute = target.getAttribute('actions') || ""
147
+ if (attribute.includes(prefix))
148
+ return;
149
+ // if (target.closest(`[actions*="${prefix}"]`))
150
+ // return;
151
+ self.__updateElements(target, prefix);
152
+
153
+ let selector = `[${prefix}], [${prefix}-value], [${prefix}-target], [${prefix}-closest], [${prefix}-parent], [${prefix}-next], [${prefix}-previous]`
154
+
155
+ let parentElement = target.parentElement;
156
+ if (parentElement) {
157
+ do {
158
+ parentElement = parentElement.closest(selector)
159
+ if (parentElement) {
160
+ self.__updateElements(parentElement, prefix);
161
+ parentElement = parentElement.parentElement
83
162
  }
84
- while (parentElement)
85
-
86
163
  }
87
-
164
+ while (parentElement)
165
+
88
166
  }
89
- // }, 500);
90
-
91
- });
92
-
93
- });
167
+
168
+ }
169
+ // }, 500);
170
+ }
171
+
172
+
173
+ }
94
174
  },
95
175
 
96
- __updateElements: function(element, prefix) {
176
+ __updateElements: function(element, prefix, target) {
97
177
  const self = this;
98
178
  // ToDo: support empty value when prefix-attribute defined, add and remove the attribute
99
179
  let targetValue = element.getAttribute(`${prefix}-value`) || element.getAttribute(prefix);
100
- if (!targetValue && element.value)
180
+ if (!targetValue)
101
181
  targetValue = element.getValue()
102
182
  if (!targetValue) return
103
183
 
@@ -107,6 +187,8 @@ const CoCreateEvents = {
107
187
  }
108
188
 
109
189
  let targetAttribute = element.getAttribute(`${prefix}-attribute`) || 'class';
190
+ let targetText = element.getAttribute(`${prefix}-text`);
191
+ let targetHtml = element.getAttribute(`${prefix}-html`);
110
192
  let targetSelector = element.getAttribute(`${prefix}-target`);
111
193
  let targetClosest = element.getAttribute(`${prefix}-closest`);
112
194
  let targetParent = element.getAttribute(`${prefix}-parent`);
@@ -161,30 +243,30 @@ const CoCreateEvents = {
161
243
  });
162
244
  }
163
245
 
164
- let targetElements = [element];
165
- if (targetClosest) {
166
- element = element.closest(targetClosest);
167
- }
168
246
  values = values.map(x => x.trim());
169
- if (targetSelector) {
247
+ let targetElements = [element];
248
+ if (target) {
249
+ self.setValue(prefix, target, targetAttribute, values, targetKey);
250
+ } else if (targetSelector) {
170
251
  if (/{{\s*([\w\W]+)\s*}}/g.test(targetSelector)) return;
171
252
  targetElements = queryDocumentSelectorAll(targetSelector);
172
253
  targetElements.forEach((el) => self.setValue(prefix, el, targetAttribute, values, targetKey));
173
- }
174
- else if (targetParent)
254
+ } else if (targetClosest) {
255
+ element = element.closest(targetClosest);
256
+ self.setValue(prefix, element, targetAttribute, values, targetKey);
257
+ } else if (targetParent) {
175
258
  element.parentElement.querySelectorAll(targetParent).forEach((el) =>
176
259
  self.setValue(prefix, el, targetAttribute, values, targetKey)
177
260
  );
178
- else if (targetNext)
261
+ } else if (targetNext) {
179
262
  el.nextElementSibling.querySelectorAll(targetNext).forEach((el) =>
180
263
  self.setValue(prefix, el, targetAttribute, values, targetKey)
181
264
  );
182
- else if (targetPrevious)
265
+ } else if (targetPrevious) {
183
266
  el.previousElementSibling.querySelectorAll(targetPrevious).forEach((el) =>
184
267
  self.setValue(prefix, el, targetAttribute, values, targetKey)
185
268
  );
186
- else
187
- self.setValue(prefix, element, targetAttribute, values, targetKey);
269
+ }
188
270
 
189
271
  document.dispatchEvent(new CustomEvent(`${prefix}End`, {
190
272
  detail: {}
@@ -224,6 +306,12 @@ const CoCreateEvents = {
224
306
  } else {
225
307
  if (attrName === 'value') {
226
308
  oldValue = element.getValue()
309
+ } else if (attrName === 'text') {
310
+ attrValues = element.getAttribute(attrName).split(' ').map(x => x.trim());
311
+ oldValue = values.filter(x => attrValues.includes(x))[0] || '';
312
+ } else if (attrName === 'html') {
313
+ attrValues = element.getAttribute(attrName).split(' ').map(x => x.trim());
314
+ oldValue = values.filter(x => attrValues.includes(x))[0] || '';
227
315
  } else if (element.getAttribute(attrName)) {
228
316
  attrValues = element.getAttribute(attrName).split(' ').map(x => x.trim());
229
317
  oldValue = values.filter(x => attrValues.includes(x))[0] || '';