@cocreate/elements 1.4.11 → 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,38 @@
1
+ ## [1.6.1](https://github.com/CoCreate-app/CoCreate-elements/compare/v1.6.0...v1.6.1) (2022-01-02)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * add input event listener to valueEl ([ea77493](https://github.com/CoCreate-app/CoCreate-elements/commit/ea77493fed7401b2ccd3d825b73198daf03f836c))
7
+ * check if document_id is a valid id if not return ([220151f](https://github.com/CoCreate-app/CoCreate-elements/commit/220151f9ee0b2c9ff8e4afc06cc24ad5b891b161))
8
+
9
+ # [1.6.0](https://github.com/CoCreate-app/CoCreate-elements/compare/v1.5.0...v1.6.0) (2022-01-01)
10
+
11
+
12
+ ### Bug Fixes
13
+
14
+ * ability to use key as innerHTML ([ca76c3c](https://github.com/CoCreate-app/CoCreate-elements/commit/ca76c3ce1f4f28fc86ec47f808a1f21546159bb3))
15
+ * get-value attribute value now supports a selector added # to all values currently in get-value attributes ([dd4c9e3](https://github.com/CoCreate-app/CoCreate-elements/commit/dd4c9e327029d5bd7774695541c8c46cb05e88fe))
16
+
17
+
18
+ ### Features
19
+
20
+ * getValue now has support for get-value-key ([951e027](https://github.com/CoCreate-app/CoCreate-elements/commit/951e02725b5a50852e9e3838a2f16e4cf230ebec))
21
+
22
+ # [1.5.0](https://github.com/CoCreate-app/CoCreate-elements/compare/v1.4.12...v1.5.0) (2021-12-27)
23
+
24
+
25
+ ### Features
26
+
27
+ * set-value and set-value-key attribute to add placeholders that can be replaced by value onChange ([266cf5f](https://github.com/CoCreate-app/CoCreate-elements/commit/266cf5f7f72869a9a390889d24ddab2fed038c26))
28
+
29
+ ## [1.4.12](https://github.com/CoCreate-app/CoCreate-elements/compare/v1.4.11...v1.4.12) (2021-12-24)
30
+
31
+
32
+ ### Bug Fixes
33
+
34
+ * get-value observer typo ([1ab5e84](https://github.com/CoCreate-app/CoCreate-elements/commit/1ab5e84428a680bd0e4a1c62091fd55edf22f69d))
35
+
1
36
  ## [1.4.11](https://github.com/CoCreate-app/CoCreate-elements/compare/v1.4.10...v1.4.11) (2021-12-23)
2
37
 
3
38
 
@@ -0,0 +1,32 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Value | CoCreateJS</title>
5
+
6
+ <!-- CoCreate Favicon -->
7
+ <link rel="icon" href="https://cdn.cocreate.app/favicon.ico" type="image/ico" sizes="16x16">
8
+ <!-- CoCreate CSS CDN -->
9
+ <link rel="stylesheet" href="https://cdn.cocreate.app/logic/latest/CoCreate-logic.min.css" type="text/css"/>
10
+ </head>
11
+ <body>
12
+ <!-- windows -->
13
+ <!--<ul get-value="##a123"> </ul>-->
14
+ <!--<ul id="a123"> hello </ul>-->
15
+
16
+ <input id="testing" value="new">
17
+ <h1 get-value="#testing" get-value-key="ty" class="{{ty}}" test="{{ty}}">{{ty}}</h1>
18
+
19
+
20
+
21
+ <hr/>
22
+
23
+ <input id="testing1" value="new1" />
24
+ <input get-value="#testing1" />
25
+ <input get-value="#testing1" />
26
+
27
+ <script src="https://cdn.cocreate.app/latest/CoCreate.min.js"></script>
28
+ <!--<script src="../dist/CoCreate-form.js"></script>-->
29
+ <!--<script src="../../../CoCreateJS/dist/CoCreate.js" ></script>-->
30
+
31
+ </body>
32
+ </html>
package/docs/index.html CHANGED
@@ -114,7 +114,7 @@
114
114
  <div class="svSplitter svHorizontal"> </div>
115
115
 
116
116
  <div class="svPanel">
117
- <iframe get-value="demo" frameBorder="0" height="100%" width="100%" class="min-width:300px"></iframe>
117
+ <iframe get-value="#demo" frameBorder="0" height="100%" width="100%" class="min-width:300px"></iframe>
118
118
  </div>
119
119
 
120
120
  </div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cocreate/elements",
3
- "version": "1.4.11",
3
+ "version": "1.6.1",
4
4
  "description": "Fetch content into any html element by using html5 attributes to query data stored in CoCreate headless CMS. If data is changed it will instantly reflect in html tags as changes are broadcasted in realtime",
5
5
  "keywords": [
6
6
  "elements",
package/src/getValue.js CHANGED
@@ -1,34 +1,29 @@
1
1
  import observer from '@cocreate/observer';
2
- import {setValue} from './setValue';
2
+ import { setValue } from './setValue';
3
+
4
+ const valueEls = new Map();
3
5
 
4
6
  function initGetValues() {
5
7
  var elements = document.querySelectorAll('[get-value]');
6
- initElements(elements)
8
+ initElements(elements);
7
9
  }
8
10
 
9
11
  function initElements(elements) {
10
12
  for (let element of elements)
11
- initElement(element)
13
+ initElement(element);
14
+ for(let valueEl of valueEls.keys())
15
+ setValueByFind(valueEl);
12
16
  }
13
17
 
14
18
  function initElement(element) {
15
- let id = element.getAttribute('get-value')
16
- let valueEl = document.getElementById(id);
17
- if(!valueEl) return;
18
- let value = getValue(valueEl)
19
- setValue(element, value)
20
-
21
- // if (['INPUT', 'TEXTAREA', 'SELECT'].includes(valueEl.tagName) || valueEl.contentEditable)
19
+ let selector = element.getAttribute('get-value');
20
+ if(!selector) return;
21
+ if(/{{\s*([\w\W]+)\s*}}/g.test(selector)) return;
22
22
 
23
- // valueEl.addEventListener('input', (e) => {
24
- // setValueByFind(e.target)
25
- // })
26
-
27
- // valueEl.addEventListener('updated_by_fetch', (e) => {
28
- // setValueByFind(e.target)
29
- // })
30
-
31
- initEvents(valueEl);
23
+ let valueEl = document.querySelector(selector);
24
+ if(!valueEl) return;
25
+
26
+ initEvents(valueEl, element);
32
27
 
33
28
  element.dispatchEvent(new Event("input", {
34
29
  "bubbles": true
@@ -36,28 +31,57 @@ function initElement(element) {
36
31
 
37
32
  }
38
33
 
39
- const valueEls = new Map();
40
- function initEvents(valueEl){
34
+ function initEvents(valueEl, element){
41
35
  if (!valueEls.has(valueEl)) {
42
- valueEls.set(valueEl);
36
+ valueEls.set(valueEl, [element]);
43
37
  if (['INPUT', 'TEXTAREA', 'SELECT'].includes(valueEl.tagName) || valueEl.contentEditable)
44
38
  valueEl.addEventListener('input', (e) => {
45
- setValueByFind(e.target)
46
- })
39
+ setValueByFind(e.target);
40
+ });
47
41
 
48
42
  valueEl.addEventListener('updated_by_fetch', (e) => {
49
- setValueByFind(e.target)
50
- })
43
+ setValueByFind(e.target);
44
+ });
51
45
  }
46
+ else
47
+ valueEls.get(valueEl).push(element);
52
48
  }
53
49
 
54
- function setValueByFind(valueEl){
55
- let value = getValue(valueEl)
56
- let id = valueEl.getAttribute('id')
57
- if(!id) return;
58
- var elements = document.querySelectorAll('[get-value="' + id + '"]');
59
- for(let element of elements)
60
- setValue(element, value)
50
+ function setValueByFind(valueEl) {
51
+ let value = getValue(valueEl);
52
+ if (!value) return;
53
+ let elements = valueEls.get(valueEl);
54
+
55
+ for(let element of elements){
56
+ let key = element.getAttribute('get-value-key');
57
+ if (key){
58
+ key = `{{${key}}}`;
59
+ const regex = new RegExp(key, "g");
60
+ for (let attribute of element.attributes){
61
+ let attrName = attribute.name;
62
+ let attrValue = attribute.value;
63
+ let setAttr = false;
64
+ if (attrValue.includes(key)){
65
+ attrValue = attrValue.replace(regex, value);
66
+ setAttr = true;
67
+ }
68
+ if (attrName.includes(key)){
69
+ element.removeAttribute(key);
70
+ attrName = attrName.replace(regex, value);
71
+ setAttr = true;
72
+ }
73
+ if(setAttr)
74
+ element.setAttribute(attrName, attrValue);
75
+ }
76
+ let html = element.innerHTML;
77
+ if (html.indexOf(key) !== -1){
78
+ html = html.replace(regex, value);
79
+ element.innerHTML = html;
80
+ }
81
+ }
82
+ else
83
+ setValue(element, value);
84
+ }
61
85
  }
62
86
 
63
87
  var getValue = (element) => {
@@ -112,13 +136,12 @@ function __encryptPassword(str) {
112
136
  }
113
137
 
114
138
  observer.init({
115
- name: 'CoCreateLogic',
139
+ name: 'get-value',
116
140
  observe: ['addedNodes'],
117
141
  target: '[get-value]',
118
142
  callback: function(mutation) {
119
- CoCreateLogic.getValues.initElement(mutation.target);
143
+ initElement(mutation.target);
120
144
  }
121
145
  });
122
146
 
123
- initGetValues();
124
- export {getValue};
147
+ export { initGetValues, getValue };
package/src/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import observer from '@cocreate/observer';
2
2
  import action from '@cocreate/actions';
3
3
  import crud from '@cocreate/crud-client';
4
- import {setValue} from './setValue';
5
- import {getValue} from './getValue';
4
+ import { initSetValues, setValue } from './setValue';
5
+ import { initGetValues, getValue } from './getValue';
6
6
 
7
7
  const selector = "[collection][document_id][name]:not(cocreate-select, link), input, textarea, select, [contenteditable]";
8
8
 
@@ -40,6 +40,7 @@ function initElement(el) {
40
40
 
41
41
  const { collection, document_id, name, isRead } = crud.getAttr(el);
42
42
  if (!collection || !name) return;
43
+ if (!document_id.match(/^[0-9a-fA-F]{24}$/)) return;
43
44
  if (!crud.checkAttrValue(collection) || !crud.checkAttrValue(name)) return;
44
45
 
45
46
  __initEvents(el);
@@ -164,5 +165,8 @@ action.init({
164
165
  });
165
166
 
166
167
  init();
168
+ initGetValues();
169
+ initSetValues();
170
+
167
171
 
168
172
  export default {initElements, initElement, save, getValue, setValue};
package/src/setValue.js CHANGED
@@ -1,4 +1,72 @@
1
+ import observer from '@cocreate/observer';
1
2
  import crud from '@cocreate/crud-client';
3
+ import { getValue } from './getValue';
4
+
5
+ function initSetValues() {
6
+ var elements = document.querySelectorAll('[set-value]');
7
+ initElements(elements);
8
+ }
9
+
10
+ function initElements(elements) {
11
+ for (let element of elements)
12
+ initElement(element);
13
+ }
14
+
15
+ function initElement(element) {
16
+ initEvents(element);
17
+ }
18
+
19
+ function initEvents(element){
20
+ if (['INPUT', 'TEXTAREA', 'SELECT'].includes(element.tagName) || element.contentEditable)
21
+ element.addEventListener('input', (e) => {
22
+ setValueByFind(e.target);
23
+ });
24
+
25
+ element.addEventListener('updated_by_fetch', (e) => {
26
+ setValueByFind(e.target);
27
+ });
28
+ }
29
+
30
+ function setValueByFind(element){
31
+ let key = element.getAttribute('set-value-key');
32
+ if (key)
33
+ key = `{{${key}}}`;
34
+ let value = getValue(element);
35
+ if (!value) return;
36
+ let selector = element.getAttribute('set-value');
37
+ if(!selector) return;
38
+ let elements = document.querySelectorAll(selector);
39
+
40
+ for(let element of elements){
41
+ if (key){
42
+ const regex = new RegExp(key, "g");
43
+ for (let attribute of element.attributes){
44
+ let attrName = attribute.name;
45
+ let attrValue = attribute.value;
46
+ let setAttr = false;
47
+ if (attrValue.includes(key)){
48
+ attrValue = attrValue.replace(regex, value);
49
+ setAttr = true;
50
+ }
51
+ if (attrName.includes(key)){
52
+ element.removeAttribute(key);
53
+ attrName = attrName.replace(regex, value);
54
+ setAttr = true;
55
+ }
56
+ if(setAttr)
57
+ element.setAttribute(attrName, attrValue);
58
+ }
59
+ let html = element.innerHTML;
60
+ if (html.indexOf(key) !== -1){
61
+ html = html.replace(regex, value);
62
+ element.innerHTML = html;
63
+ }
64
+ }
65
+ else
66
+ setValue(element, value);
67
+ }
68
+
69
+ }
2
70
 
3
71
  var setValue = (el, value) => {
4
72
  if (value === null || value === undefined) return;
@@ -144,4 +212,13 @@ function dispatchEvents(el) {
144
212
  el.dispatchEvent(changeEvent);
145
213
  }
146
214
 
147
- export {setValue};
215
+ observer.init({
216
+ name: 'set-value',
217
+ observe: ['addedNodes'],
218
+ target: '[set-value]',
219
+ callback: function(mutation) {
220
+ initElement(mutation.target);
221
+ }
222
+ });
223
+
224
+ export { initSetValues, setValue };