@schukai/monster 3.56.1 → 3.57.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -49,6 +49,7 @@ function setOptionFromAttribute(
49
49
  mapping = {},
50
50
  prefix = "data-monster-option-",
51
51
  ) {
52
+
52
53
  if (!(element instanceof HTMLElement)) return options;
53
54
  if (!element.hasAttributes()) return options;
54
55
 
@@ -84,4 +85,4 @@ function setOptionFromAttribute(
84
85
  finder.setVia(optionName, value);
85
86
 
86
87
  return options;
87
- }
88
+ }
@@ -1,3 +1,4 @@
1
+
1
2
  /**
2
3
  * Copyright schukai GmbH and contributors 2023. All Rights Reserved.
3
4
  * Node module: @schukai/monster
@@ -93,9 +94,11 @@ export * from "./components/datatable/datatable/header.mjs";
93
94
  export * from "./components/datatable/pagination.mjs";
94
95
  export * from "./components/datatable/util.mjs";
95
96
  export * from "./components/datatable/filter.mjs";
97
+ export * from "./components/datatable/save-button.mjs";
96
98
  export * from "./components/datatable/dataset.mjs";
97
99
  export * from "./components/datatable/embedded-pagination.mjs";
98
100
  export * from "./components/datatable/status.mjs";
101
+ export * from "./components/datatable/change-button.mjs";
99
102
  export * from "./components/datatable/constants.mjs";
100
103
  export * from "./components/datatable/stylesheet/select-filter.mjs";
101
104
  export * from "./components/datatable/stylesheet/datasource.mjs";
@@ -105,10 +108,12 @@ export * from "./components/datatable/stylesheet/filter-date-range.mjs";
105
108
  export * from "./components/datatable/stylesheet/datatable.mjs";
106
109
  export * from "./components/datatable/stylesheet/pagination.mjs";
107
110
  export * from "./components/datatable/stylesheet/filter.mjs";
111
+ export * from "./components/datatable/stylesheet/save-button.mjs";
108
112
  export * from "./components/datatable/stylesheet/dataset.mjs";
109
113
  export * from "./components/datatable/stylesheet/embedded-pagination.mjs";
110
114
  export * from "./components/datatable/stylesheet/filter-controls-defaults.mjs";
111
115
  export * from "./components/datatable/stylesheet/status.mjs";
116
+ export * from "./components/datatable/stylesheet/change-button.mjs";
112
117
  export * from "./components/datatable/stylesheet/filter-range.mjs";
113
118
  export * from "./components/state/log/entry.mjs";
114
119
  export * from "./components/state/state.mjs";
@@ -152,7 +152,7 @@ function getMonsterVersion() {
152
152
  }
153
153
 
154
154
  /** don't touch, replaced by make with package.json version */
155
- monsterVersion = new Version("3.56.1");
155
+ monsterVersion = new Version("3.57.0");
156
156
 
157
157
  return monsterVersion;
158
158
  }
@@ -175,7 +175,7 @@ describe('Select', function () {
175
175
 
176
176
  done();
177
177
 
178
- }, 10)
178
+ }, 100)
179
179
  })
180
180
 
181
181
  mocks.appendChild(select);
@@ -0,0 +1,310 @@
1
+ import { getGlobal } from "../../../../source/types/global.mjs";
2
+ import chai from "chai"
3
+ import { chaiDom } from "../../../util/chai-dom.mjs";
4
+ import { initJSDOM } from "../../../util/jsdom.mjs";
5
+
6
+ let expect = chai.expect;
7
+ chai.use(chaiDom);
8
+
9
+ const global = getGlobal();
10
+
11
+ let html1 = `
12
+ <div id="test1">
13
+ </div>
14
+ `;
15
+
16
+ let html2 = `
17
+ <div id="test2">
18
+ <monster-toggle-switch></monster-toggle-switch>
19
+ </div>
20
+ `;
21
+
22
+ let ToggleSwitch;
23
+
24
+ describe('ToggleSwitch', function () {
25
+
26
+ before(function (done) {
27
+ initJSDOM().then(() => {
28
+
29
+ import("element-internals-polyfill").catch(e => done(e));
30
+
31
+ import("../../../../source/components/form/toggle-switch.mjs").then((m) => {
32
+ ToggleSwitch = m['ToggleSwitch'];
33
+ done()
34
+ }).catch(e => done(e))
35
+
36
+
37
+ });
38
+ })
39
+
40
+ describe('new ToggleSwitch', function () {
41
+
42
+ beforeEach(() => {
43
+ let mocks = document.getElementById('mocks');
44
+ mocks.innerHTML = html1;
45
+ })
46
+
47
+ afterEach(() => {
48
+ let mocks = document.getElementById('mocks');
49
+ mocks.innerHTML = "";
50
+ })
51
+
52
+ describe('create from template', function () {
53
+ beforeEach(() => {
54
+ let mocks = document.getElementById('mocks');
55
+ mocks.innerHTML = html2;
56
+ });
57
+
58
+ afterEach(() => {
59
+ let mocks = document.getElementById('mocks');
60
+ mocks.innerHTML = "";
61
+
62
+ })
63
+
64
+ describe('create from template', function () {
65
+ it('should contains monster-toggle-switch', function () {
66
+ expect(document.getElementById('test2')).contain.html('<monster-toggle-switch');
67
+ });
68
+ });
69
+
70
+ });
71
+
72
+ describe('document.createElement', function () {
73
+ it('should instance of monster-toggle-switch', function () {
74
+ expect(document.createElement('monster-toggle-switch')).is.instanceof(ToggleSwitch);
75
+ });
76
+ });
77
+
78
+ });
79
+
80
+ describe('toggle', function () {
81
+ beforeEach(() => {
82
+ let mocks = document.getElementById('mocks');
83
+ mocks.innerHTML = html1;
84
+ });
85
+
86
+ afterEach(() => {
87
+ let mocks = document.getElementById('mocks');
88
+ mocks.innerHTML = "";
89
+ })
90
+
91
+ it('toggle to on', function () {
92
+
93
+ const toggleSwitch = document.createElement('monster-toggle-switch');
94
+
95
+ expect(toggleSwitch.value).is.equal('off');
96
+ expect(toggleSwitch.state).is.equal('off');
97
+
98
+ toggleSwitch.toggle();
99
+
100
+ expect(toggleSwitch.value).is.equal('on');
101
+ expect(toggleSwitch.state).is.equal('on');
102
+
103
+ toggleSwitch.toggle();
104
+
105
+ expect(toggleSwitch.value).is.equal('off');
106
+ expect(toggleSwitch.state).is.equal('off');
107
+ });
108
+
109
+ it('toggle on to off', function () {
110
+
111
+ const toggleSwitch = document.createElement('monster-toggle-switch');
112
+
113
+ toggleSwitch.toggleOn();
114
+
115
+ expect(toggleSwitch.value).is.equal('on');
116
+ expect(toggleSwitch.state).is.equal('on');
117
+
118
+ toggleSwitch.toggleOff();
119
+
120
+ expect(toggleSwitch.value).is.equal('off');
121
+ expect(toggleSwitch.state).is.equal('off');
122
+
123
+ });
124
+
125
+
126
+ });
127
+
128
+ describe('describe css', function () {
129
+
130
+ beforeEach(() => {
131
+ let mocks = document.getElementById('mocks');
132
+ mocks.innerHTML = html1;
133
+ });
134
+
135
+ afterEach(() => {
136
+ let mocks = document.getElementById('mocks');
137
+ mocks.innerHTML = "";
138
+ })
139
+
140
+ it('css toggle', function (done) {
141
+
142
+ /**
143
+ * new Control
144
+ */
145
+ const toggleSwitch = document.createElement('monster-toggle-switch');
146
+
147
+ /**
148
+ * set init value to on
149
+ */
150
+ toggleSwitch.value = "on";
151
+
152
+ /**
153
+ * insert DOM
154
+ */
155
+ document.getElementById('mocks').appendChild(toggleSwitch);
156
+
157
+ /**
158
+ * expect that classes.on is set to Element Switch
159
+ */
160
+ let hasClassA = toggleSwitch.shadowRoot.querySelectorAll('[data-monster-role="switch"]')[0].classList.contains(toggleSwitch.getOption('classes.on'));
161
+ expect(hasClassA).is.true;
162
+
163
+ /**
164
+ * switch off
165
+ */
166
+ toggleSwitch.value = "off";
167
+
168
+ /**
169
+ * Updater prozess runs in setTimeout
170
+ * self[internalSymbol].attachObserver();
171
+ */
172
+ setTimeout(() => {
173
+
174
+ /**
175
+ * expect that classes.on is removed from Element Switch
176
+ */
177
+ let hasClassB = toggleSwitch.shadowRoot.querySelectorAll('[data-monster-role="switch"]')[0].classList.contains(toggleSwitch.getOption('classes.on'));
178
+ expect(hasClassB).is.false;
179
+
180
+ /**
181
+ * expect that classes.off is set to Element Switch
182
+ */
183
+ let hasClassC = toggleSwitch.shadowRoot.querySelectorAll('[data-monster-role="switch"]')[0].classList.contains(toggleSwitch.getOption('classes.off'));
184
+ expect(hasClassC).is.true;
185
+
186
+
187
+ done();
188
+ }, 0);
189
+
190
+ })
191
+
192
+ });
193
+
194
+ describe('describe value', function () {
195
+
196
+ beforeEach(() => {
197
+ let mocks = document.getElementById('mocks');
198
+ mocks.innerHTML = html1;
199
+ });
200
+
201
+ afterEach(() => {
202
+ let mocks = document.getElementById('mocks');
203
+ mocks.innerHTML = "";
204
+
205
+ })
206
+
207
+ it('the default value is off', function () {
208
+
209
+ /**
210
+ * new Control
211
+ */
212
+ let toggleSwitch = document.createElement('monster-toggle-switch');
213
+
214
+ /**
215
+ * the switch is off and provides the value for off
216
+ */
217
+ expect(toggleSwitch.value).is.equal('off');
218
+
219
+ /**
220
+ * the switch is off
221
+ */
222
+ expect(toggleSwitch.state).is.equal('off');
223
+
224
+ });
225
+
226
+ it('incorrect values are not accepted', function () {
227
+
228
+ let toggleSwitch = document.createElement('monster-toggle-switch');
229
+
230
+ /**
231
+ * define the values for on and off
232
+ */
233
+ toggleSwitch.setOption('values.on', 'true');
234
+ toggleSwitch.setOption('values.off', 'false');
235
+
236
+ /**
237
+ * This value is not "true" and not "false"
238
+ */
239
+ toggleSwitch.value = "test";
240
+
241
+ /**
242
+ * the switch is off and provides the value for off
243
+ */
244
+ expect(toggleSwitch.value).is.equal('false');
245
+
246
+ /**
247
+ * the switch is off
248
+ */
249
+ expect(toggleSwitch.state).is.equal('off');
250
+
251
+ /**
252
+ * disabled attribute is only set when the element has been mounted in the DOM
253
+ */
254
+ expect(toggleSwitch.hasAttribute('disabled')).is.false;
255
+
256
+ /**
257
+ * insert DOM
258
+ */
259
+ document.getElementById('mocks').appendChild(toggleSwitch);
260
+
261
+ /**
262
+ * now the element is disabled
263
+ */
264
+ expect(toggleSwitch.hasAttribute('disabled')).is.true;
265
+
266
+
267
+ });
268
+
269
+ it('correct values are accepted', function () {
270
+
271
+ const toggleSwitch = document.createElement('monster-toggle-switch');
272
+
273
+ /**
274
+ * define the values for on and off
275
+ */
276
+ toggleSwitch.setOption('values.on', 'true');
277
+ toggleSwitch.setOption('values.off', 'false');
278
+
279
+ /**
280
+ * This value is correct
281
+ */
282
+ toggleSwitch.value = "true";
283
+
284
+ /**
285
+ * the switch is on and provides the value for on
286
+ */
287
+ expect(toggleSwitch.value).is.equal('true');
288
+
289
+ /**
290
+ * the switch is on
291
+ */
292
+ expect(toggleSwitch.state).is.equal('on');
293
+
294
+ /**
295
+ * insert DOM
296
+ */
297
+ document.getElementById('mocks').appendChild(toggleSwitch);
298
+
299
+ /**
300
+ * disabled attribute is not set
301
+ */
302
+ expect(toggleSwitch.hasAttribute('disabled')).is.false;
303
+
304
+ });
305
+
306
+ });
307
+
308
+
309
+
310
+ });
@@ -96,18 +96,11 @@ describe('Treeselect', function () {
96
96
  } ]`);
97
97
 
98
98
  resolve2(JSON.stringify(json))
99
-
100
-
101
99
  })
102
-
103
-
104
100
  }
105
101
  });
106
102
  })
107
-
108
103
  };
109
-
110
-
111
104
  })
112
105
 
113
106
  afterEach(() => {
@@ -174,7 +167,7 @@ describe('Treeselect', function () {
174
167
 
175
168
  done();
176
169
 
177
- }, 10)
170
+ }, 100)
178
171
  })
179
172
 
180
173
 
@@ -175,6 +175,22 @@ describe('Transformer', function () {
175
175
  ['index:a', new Map().set('a', 5), 5],
176
176
  ['substring:2:4', 'abcdefghijklmnop', 'cdef'],
177
177
  ['nop', 'abcdefghijklmnop', 'abcdefghijklmnop'],
178
+ ['set-toggle:c', 'a b c', 'a b'],
179
+ ['set-toggle:c', 'a b', 'a b c'],
180
+ ['set-set:c', 'a b', 'a b c'],
181
+ ['set-set:c', 'a b c', 'a b c'],
182
+ ['set-remove:c', 'a b c', 'a b'],
183
+ ['set-toggle:c:,', 'a,b,c', 'a,b'],
184
+ ['set-toggle:c:,', 'a,b', 'a,b,c'],
185
+ ['set-set:c:,', 'a,b', 'a,b,c'],
186
+ ['set-set:c:,', 'a,b,c', 'a,b,c'],
187
+ ['set-remove:c:,', 'a,b,c', 'a,b'],
188
+ ['set-toggle:c,d:,', 'a,b,c', 'a,b,d'],
189
+ ['set-toggle:c,d:,', 'a,b,c,d', 'a,b'],
190
+ ['set-toggle:c,d:,', 'a,b', 'a,b,c,d'],
191
+ ['set-set:c,d:,', 'a,b', 'a,b,c,d'],
192
+ ['set-set:c,d:,', 'a,b,c', 'a,b,c,d'],
193
+ ['set-remove:c:,', 'a,b,c', 'a,b'],
178
194
 
179
195
  ].forEach(function (data) {
180
196
 
@@ -19,7 +19,7 @@ describe('DOM', function () {
19
19
  let CustomControl, registerCustomElement, TestComponent, document, jsdomFlag;
20
20
 
21
21
  before(function (done) {
22
- initJSDOM().then(() => {
22
+ initJSDOM({}).then(() => {
23
23
 
24
24
  import("element-internals-polyfill").then((m) => {
25
25
  m.polyfill();
@@ -29,7 +29,7 @@ describe('DOM', function () {
29
29
  jsdomFlag = navigator.userAgent.includes("jsdom");
30
30
 
31
31
  import("../../../source/dom/customelement.mjs").then((m) => {
32
-
32
+
33
33
  registerCustomElement = m['registerCustomElement'];
34
34
 
35
35
 
@@ -55,10 +55,52 @@ describe('DOM', function () {
55
55
  });
56
56
  }).catch((e) => {
57
57
  done(e);
58
- } );
58
+ });
59
59
  });
60
60
  })
61
61
 
62
+ describe('formDisabledCallback()', function () {
63
+
64
+ let element
65
+
66
+ beforeEach(() => {
67
+ try {
68
+ const TestComponent2 = class extends CustomControl {
69
+ /**
70
+ * A description of the entire function.
71
+ *
72
+ * @return {string} description of return value
73
+ */
74
+ static getTag() {
75
+ return "monster-customcontrol2"
76
+ }
77
+ }
78
+ registerCustomElement(TestComponent2)
79
+ } catch (e) {
80
+ expect(e).to.be.not.null;
81
+ }
82
+
83
+ element = document.createElement('monster-customcontrol2');
84
+
85
+ })
86
+
87
+ afterEach(() => {
88
+
89
+ })
90
+
91
+ it('should return undefined', function () {
92
+ expect(element.formDisabledCallback()).to.be.undefined;
93
+ expect(element.hasAttribute('disabled')).to.be.false;
94
+ expect(element.formDisabledCallback(true)).to.be.undefined;
95
+ expect(element.hasAttribute('disabled')).to.be.true;
96
+ const d = element.getAttribute('disabled');
97
+ expect(d).to.not.be.null;
98
+
99
+ });
100
+
101
+ })
102
+
103
+
62
104
  describe('CustomControl()', function () {
63
105
 
64
106
  beforeEach(() => {
@@ -76,13 +118,16 @@ describe('DOM', function () {
76
118
 
77
119
  describe('create', function () {
78
120
  it('should return custom-element object', function () {
121
+ let d
79
122
  try {
80
- let d = new TestComponent();
123
+ d = new TestComponent();
81
124
  } catch (e) {
82
- expect(e).to.be.not.null;
125
+ expect(e).to.be.null;
83
126
  }
84
127
 
85
- expect(typeof d).is.equal('undefined');
128
+ console.log(typeof d,"ssss");
129
+ expect(typeof d).is.equal('object');
130
+
86
131
  });
87
132
  });
88
133
 
@@ -91,7 +136,7 @@ describe('DOM', function () {
91
136
 
92
137
  let d = document.createElement('monster-customcontrol');
93
138
  document.getElementById('test1').appendChild(d);
94
-
139
+
95
140
  expect(document.getElementsByTagName('monster-customcontrol').length).is.equal(1);
96
141
  // no data-monster-objectlink="Symbol(monsterUpdater)" because it has nothing to update
97
142
  expect(document.getElementById('test1')).contain.html('<monster-customcontrol data-monster-error="Error: html is not set."></monster-customcontrol>')
@@ -172,7 +217,7 @@ describe('DOM', function () {
172
217
 
173
218
  let d = document.createElement('monster-customcontrol');
174
219
  form.appendChild(d);
175
-
220
+
176
221
  });
177
222
 
178
223
  it('name getter', function () {
@@ -1,11 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  import chai from "chai"
4
- // import {internalSymbol} from "../../../source/constants.mjs";
5
- // import {ATTRIBUTE_OPTIONS} from "../../../source/dom/constants.mjs";
6
4
  import {getDocument} from "../../../source/dom/util.mjs";
7
- // import {ProxyObserver} from "../../../source/types/proxyobserver.mjs";
8
- // import {addObjectWithUpdaterToElement} from "../../../source/dom/updater.mjs";
9
5
  import {chaiDom} from "../../util/chai-dom.mjs";
10
6
  import {initJSDOM} from "../../util/jsdom.mjs";
11
7
 
@@ -2,10 +2,8 @@
2
2
 
3
3
  import chai from "chai"
4
4
  import {internalSymbol} from "../../../source/constants.mjs";
5
- import {ATTRIBUTE_OPTIONS} from "../../../source/dom/constants.mjs";
6
5
  import {getDocument} from "../../../source/dom/util.mjs";
7
6
  import {ProxyObserver} from "../../../source/types/proxyobserver.mjs";
8
- import {addObjectWithUpdaterToElement} from "../../../source/dom/updater.mjs";
9
7
  import {chaiDom} from "../../util/chai-dom.mjs";
10
8
  import {initJSDOM} from "../../util/jsdom.mjs";
11
9
 
@@ -27,34 +25,41 @@ const updaterSymbolKey = "@schukai/monster/dom/custom-element@@options-updater-l
27
25
  const updaterSymbolSymbol = Symbol.for(updaterSymbolKey);
28
26
 
29
27
 
30
-
31
28
  describe('DOM', function () {
32
29
 
33
- let CustomElement, registerCustomElement, TestComponent, document, TestComponent2,assignUpdaterToElement;
34
-
30
+ let CustomElement, registerCustomElement, TestComponent, document, TestComponent2, assignUpdaterToElement,
31
+ addObjectWithUpdaterToElement;
35
32
 
36
33
  describe("assignUpdaterToElement", function () {
37
34
 
38
35
  before(function (done) {
39
- initJSDOM().then(() => {
40
- import("../../../source/dom/customelement.mjs").then((m) => {
41
- try {
42
- CustomElement = m['CustomElement'];
43
- assignUpdaterToElement= function (elements, object) {
44
- return addObjectWithUpdaterToElement.call(this, elements, updaterSymbolSymbol, object);
36
+ const options = {};
37
+ initJSDOM(options).then(() => {
38
+ import("../../../source/dom/updater.mjs").then((yy) => {
39
+ addObjectWithUpdaterToElement = yy['addObjectWithUpdaterToElement'];
40
+ import("../../../source/dom/customelement.mjs").then((m) => {
41
+ try {
42
+ CustomElement = m['CustomElement'];
43
+ assignUpdaterToElement = function (elements, object) {
44
+ return addObjectWithUpdaterToElement.call(this, elements, updaterSymbolSymbol, object);
45
+ }
46
+
47
+
48
+ document = getDocument();
49
+
50
+ done()
51
+ } catch (e) {
52
+ done(e);
45
53
  }
46
-
47
-
48
- document = getDocument();
49
54
 
50
- done()
51
- } catch (e) {
52
- done(e);
53
- }
54
55
 
56
+ }).catch((e) => {
57
+ done(e);
58
+ });
55
59
 
60
+ }).catch((e) => {
61
+ done(e);
56
62
  });
57
-
58
63
  });
59
64
  })
60
65
 
@@ -71,7 +76,7 @@ describe('DOM', function () {
71
76
  /**
72
77
  * this test try to simulate the bug that was found in the assignUpdaterToElement function.
73
78
  * The bug was that the updater was not assigned to the element when the element was created.
74
- *
79
+ *
75
80
  * unfortunately, this test does not reproduce the bug.
76
81
  */
77
82
  it("should assign an updater to an element", function (done) {
@@ -98,9 +103,9 @@ describe('DOM', function () {
98
103
  expect(JSON.stringify(y)).to.equal('{"b":2}');
99
104
 
100
105
  const sy = updaterSymbolSymbol;
101
-
106
+
102
107
  let v = element.getAttribute("data-monster-objectlink");
103
- expect(v).to.equal('Symbol('+updaterSymbolKey+')');
108
+ expect(v).to.equal('Symbol(' + updaterSymbolKey + ')');
104
109
 
105
110
  const updater = element[sy];
106
111
 
@@ -126,7 +131,7 @@ describe('DOM', function () {
126
131
  // <input data-monster-bind="path:a" id="test2" data-monster-attributes="value path:a" data-monster-objectlink="Symbol(@schukai/monster/dom/@@object-updater-link)" value="3">
127
132
 
128
133
  expect(mockHTML.querySelector("#test2")).to.have.value('3')
129
- expect(mockHTML.querySelector("#test2")).to.have.attribute('data-monster-objectlink', 'Symbol('+updaterSymbolKey+')')
134
+ expect(mockHTML.querySelector("#test2")).to.have.attribute('data-monster-objectlink', 'Symbol(' + updaterSymbolKey + ')')
130
135
  //expect(mockHTML).to.have.html(resultHTML);
131
136
 
132
137
  expect(element.value).to.equal("3");
@@ -140,11 +145,10 @@ describe('DOM', function () {
140
145
 
141
146
  })
142
147
 
143
-
144
148
  describe('CustomElement()', function () {
145
149
 
146
150
  before(function (done) {
147
- initJSDOM().then(() => {
151
+ initJSDOM({}).then(() => {
148
152
 
149
153
  import("../../../source/dom/customelement.mjs").then((m) => {
150
154
 
@@ -254,7 +258,7 @@ describe('DOM', function () {
254
258
  try {
255
259
  expect(document.getElementsByTagName('monster-testclass2').length).is.equal(1);
256
260
  expect(document.getElementsByTagName('monster-testclass2').item(0).shadowRoot.innerHTML).is.equal('<h1></h1><article><p>test</p><div id="container"></div></article>');
257
- expect(document.getElementById('test1')).contain.html('<monster-testclass2 data-monster-objectlink="Symbol('+updaterSymbolKey+')"></monster-testclass2>');
261
+ expect(document.getElementById('test1')).contain.html('<monster-testclass2 data-monster-objectlink="Symbol(' + updaterSymbolKey + ')"></monster-testclass2>');
258
262
  return done();
259
263
  } catch (e) {
260
264
  done(e);