@schukai/monster 3.73.4 → 3.73.6

Sign up to get free protection for your applications and to get access to all the features.
package/CHANGELOG.md CHANGED
@@ -2,13 +2,25 @@
2
2
 
3
3
 
4
4
 
5
- ## [3.73.4] - 2024-07-02
5
+ ## [3.73.6] - 2024-07-31
6
6
 
7
7
  ### Bug Fixes
8
8
 
9
- - eventprocessing is now only active in selected controls: form, filter. [#224](https://gitlab.schukai.com/oss/libraries/javascript/monster/issues/224)
9
+ - repair url in tests [#230](https://gitlab.schukai.com/oss/libraries/javascript/monster/issues/230)
10
+ - improvement of the tree menu to avoid recursion. [#230](https://gitlab.schukai.com/oss/libraries/javascript/monster/issues/230)
11
+
12
+
13
+ ## [3.73.5] - 2024-07-02
14
+
15
+ ### Bug Fixes
10
16
 
17
+ - originValues in the save button is now reset.
18
+
19
+ ## [3.73.4] - 2024-07-02
20
+
21
+ ### Bug Fixes
11
22
 
23
+ - event processing is now only active in selected controls: form, filter. [#224](https://gitlab.schukai.com/oss/libraries/javascript/monster/issues/224)
12
24
 
13
25
  ## [3.73.3] - 2024-07-01
14
26
 
package/package.json CHANGED
@@ -1 +1 @@
1
- {"author":"schukai GmbH","dependencies":{"@floating-ui/dom":"^1.6.7","@popperjs/core":"^2.11.8"},"description":"Monster is a simple library for creating fast, robust and lightweight websites.","homepage":"https://monsterjs.org/","keywords":["framework","web","dom","css","sass","mobile-first","app","front-end","templates","schukai","core","shopcloud","alvine","monster","buildmap","stack","observer","observable","uuid","node","nodelist","css-in-js","logger","log","theme"],"license":"AGPL 3.0","main":"source/monster.mjs","module":"source/monster.mjs","name":"@schukai/monster","repository":{"type":"git","url":"https://gitlab.schukai.com/oss/libraries/javascript/monster.git"},"type":"module","version":"3.73.4"}
1
+ {"author":"schukai GmbH","dependencies":{"@floating-ui/dom":"^1.6.7","@popperjs/core":"^2.11.8"},"description":"Monster is a simple library for creating fast, robust and lightweight websites.","homepage":"https://monsterjs.org/","keywords":["framework","web","dom","css","sass","mobile-first","app","front-end","templates","schukai","core","shopcloud","alvine","monster","buildmap","stack","observer","observable","uuid","node","nodelist","css-in-js","logger","log","theme"],"license":"AGPL 3.0","main":"source/monster.mjs","module":"source/monster.mjs","name":"@schukai/monster","repository":{"type":"git","url":"https://gitlab.schukai.com/oss/libraries/javascript/monster.git"},"type":"module","version":"3.73.6"}
@@ -46,6 +46,12 @@ export { SaveButton };
46
46
  */
47
47
  const stateButtonElementSymbol = Symbol("stateButtonElement");
48
48
 
49
+ /**
50
+ * @private
51
+ * @type {symbol}
52
+ */
53
+ const originValuesSymbol = Symbol("originValues");
54
+
49
55
  /**
50
56
  * @private
51
57
  * @type {symbol}
@@ -161,18 +167,20 @@ class SaveButton extends CustomElement {
161
167
  new Observer(handleDataSourceChanges.bind(this)),
162
168
  );
163
169
 
164
- let originValues;
170
+ self[originValuesSymbol] = null;
165
171
 
166
172
  element.datasource.attachObserver(
167
173
  new Observer(function () {
168
- if (!originValues) {
169
- originValues = clone(self[datasourceLinkedElementSymbol].data);
174
+ if (!self[originValuesSymbol]) {
175
+ self[originValuesSymbol] = clone(
176
+ self[datasourceLinkedElementSymbol].data,
177
+ );
170
178
  }
171
179
 
172
180
  const currentValues = this.getRealSubject();
173
181
  const ignoreChanges = self.getOption("ignoreChanges");
174
182
 
175
- const result = diff(originValues, currentValues);
183
+ const result = diff(self[originValuesSymbol], currentValues);
176
184
  if (isArray(ignoreChanges) && ignoreChanges.length > 0) {
177
185
  const itemsToRemove = [];
178
186
  for (const item of result) {
@@ -285,6 +293,7 @@ function initEventHandler() {
285
293
  this[datasourceLinkedElementSymbol]
286
294
  .write()
287
295
  .then(() => {
296
+ this[originValuesSymbol] = null;
288
297
  this[stateButtonElementSymbol].removeState();
289
298
  this[stateButtonElementSymbol].setOption("disabled", true);
290
299
  this.setOption("changes", 0);
@@ -51,7 +51,6 @@ export const buttonElementSymbol = Symbol("buttonElement");
51
51
  * @copyright schukai GmbH
52
52
  * @summary A beautiful button that can make your life easier and also looks good.
53
53
  * @fires monster-button-clicked this event is triggered when the button is clicked. It contains the field {button} with the button instance.
54
- *
55
54
  */
56
55
  class Button extends CustomControl {
57
56
  /**
@@ -32,7 +32,6 @@ import {
32
32
  assembleMethodSymbol,
33
33
  getSlottedElements,
34
34
  registerCustomElement,
35
- updaterTransformerMethodsSymbol,
36
35
  } from "../../dom/customelement.mjs";
37
36
  import {
38
37
  findTargetElementFromEvent,
@@ -84,120 +83,120 @@ const clickToLoadOptionsMessage = "Click to load options.";
84
83
 
85
84
  /**
86
85
  * @private
87
- * @type {symbol}
86
+ * @type {Symbol}
88
87
  */
89
88
  const timerCallbackSymbol = Symbol("timerCallback");
90
89
 
91
90
  /**
92
91
  * @private
93
- * @type {symbol}
92
+ * @type {Symbol}
94
93
  */
95
94
  const keyFilterEventSymbol = Symbol("keyFilterEvent");
96
95
 
97
96
  /**
98
97
  * @private
99
- * @type {symbol}
98
+ * @type {Symbol}
100
99
  */
101
100
  const lazyLoadDoneSymbol = Symbol("lazyLoadDone");
102
101
 
103
102
  /**
104
103
  * @private
105
- * @type {symbol}
104
+ * @type {Symbol}
106
105
  */
107
106
  const isLoadingSymbol = Symbol("isLoading");
108
107
 
109
108
  /**
110
109
  * local symbol
111
110
  * @private
112
- * @type {symbol}
111
+ * @type {Symbol}
113
112
  */
114
113
  const closeEventHandler = Symbol("closeEventHandler");
115
114
 
116
115
  /**
117
116
  * local symbol
118
117
  * @private
119
- * @type {symbol}
118
+ * @type {Symbol}
120
119
  */
121
120
  const clearOptionEventHandler = Symbol("clearOptionEventHandler");
122
121
 
123
122
  /**
124
123
  * local symbol
125
124
  * @private
126
- * @type {symbol}
125
+ * @type {Symbol}
127
126
  */
128
127
  const resizeObserverSymbol = Symbol("resizeObserver");
129
128
 
130
129
  /**
131
130
  * local symbol
132
131
  * @private
133
- * @type {symbol}
132
+ * @type {Symbol}
134
133
  */
135
134
  const keyEventHandler = Symbol("keyEventHandler");
136
135
 
137
136
  /**
138
137
  * local symbol
139
138
  * @private
140
- * @type {symbol}
139
+ * @type {Symbol}
141
140
  */
142
141
  const lastFetchedDataSymbol = Symbol("lastFetchedData");
143
142
  /**
144
143
  * local symbol
145
144
  * @private
146
- * @type {symbol}
145
+ * @type {Symbol}
147
146
  */
148
147
  const inputEventHandler = Symbol("inputEventHandler");
149
148
 
150
149
  /**
151
150
  * local symbol
152
151
  * @private
153
- * @type {symbol}
152
+ * @type {Symbol}
154
153
  */
155
154
  const changeEventHandler = Symbol("changeEventHandler");
156
155
 
157
156
  /**
158
157
  * local symbol
159
158
  * @private
160
- * @type {symbol}
159
+ * @type {Symbol}
161
160
  */
162
161
  const controlElementSymbol = Symbol("controlElement");
163
162
 
164
163
  /**
165
164
  * local symbol
166
165
  * @private
167
- * @type {symbol}
166
+ * @type {Symbol}
168
167
  */
169
168
  const selectionElementSymbol = Symbol("selectionElement");
170
169
 
171
170
  /**
172
171
  * local symbol
173
172
  * @private
174
- * @type {symbol}
173
+ * @type {Symbol}
175
174
  */
176
175
  const containerElementSymbol = Symbol("containerElement");
177
176
 
178
177
  /**
179
178
  * local symbol
180
179
  * @private
181
- * @type {symbol}
180
+ * @type {Symbol}
182
181
  */
183
182
  const popperElementSymbol = Symbol("popperElement");
184
183
 
185
184
  /**
186
185
  * local symbol
187
186
  * @private
188
- * @type {symbol}
187
+ * @type {Symbol}
189
188
  */
190
189
  const inlineFilterElementSymbol = Symbol("inlineFilterElement");
191
190
  /**
192
191
  * local symbol
193
192
  * @private
194
- * @type {symbol}
193
+ * @type {Symbol}
195
194
  */
196
195
  const popperFilterElementSymbol = Symbol("popperFilterElement");
197
196
  /**
198
197
  * local symbol
199
198
  * @private
200
- * @type {symbol}
199
+ * @type {Symbol}
201
200
  */
202
201
  const popperFilterContainerElementSymbol = Symbol(
203
202
  "popperFilterContainerElement",
@@ -206,27 +205,27 @@ const popperFilterContainerElementSymbol = Symbol(
206
205
  /**
207
206
  * local symbol
208
207
  * @private
209
- * @type {symbol}
208
+ * @type {Symbol}
210
209
  */
211
210
  const optionsElementSymbol = Symbol("optionsElement");
212
211
 
213
212
  /**
214
213
  * local symbol
215
214
  * @private
216
- * @type {symbol}
215
+ * @type {Symbol}
217
216
  */
218
217
  const noOptionsAvailableElementSymbol = Symbol("noOptionsAvailableElement");
219
218
 
220
219
  /**
221
220
  * local symbol
222
221
  * @private
223
- * @type {symbol}
222
+ * @type {Symbol}
224
223
  */
225
224
  const statusOrRemoveBadgesElementSymbol = Symbol("statusOrRemoveBadgesElement");
226
225
 
227
226
  /**
228
227
  * @private
229
- * @type {symbol}
228
+ * @type {Symbol}
230
229
  */
231
230
  const areOptionsAvailableAndInitSymbol = Symbol("@@areOptionsAvailableAndInit");
232
231
 
@@ -271,69 +270,20 @@ const FILTER_POSITION_POPPER = "popper";
271
270
  const FILTER_POSITION_INLINE = "inline";
272
271
 
273
272
  /**
274
- * @typedef {Object} Selection
275
- * @property {*} value
276
- * @property {String} label
277
- * @memberOf Monster.Components.Form
278
- * @since 1.2.0
279
- */
280
-
281
- /**
282
- * This CustomControl creates a select element with a variety of options.
283
- * It supports filtering, local and remote, multiple selection and has a
284
- * template system for displaying the options.
285
- *
286
- * <img src="./images/select.png">
273
+ * A select control that can be used to select one or more options from a list.
287
274
  *
288
- * Dependencies: the system uses functions of the [monsterjs](https://monsterjs.org/) library
289
- * as well as [pooperjs](https://popper.js.org/docs/v2/).
275
+ * @fragments /fragments/components/form/select/
290
276
  *
291
- * You can create this control either by specifying the HTML tag `<monster-select />` directly in the HTML or using
292
- * Javascript via the `document.createElement('monster-select');` method.
293
- *
294
- * ```html
295
- * <monster-select></monster-select>
296
- * ```
297
- *
298
- * Or you can create this CustomControl directly in Javascript:
299
- *
300
- * ```js
301
- * import {Select} from '@schukai/component-form/source/select.js';
302
- * document.createElement('monster-select');
303
- * ```
304
- *
305
- * ## Events
306
- *
307
- * The event `monster-change` is sent as soon as someone has clicked on a input control.
308
- * `monster-changed` is sent as soon as the control has processed this input.
309
- * The `monster-changed` event is sent when setting a selection. If the options have been set, the `monster-options-set` event is sent.
310
- *
311
- * The CustomEvent has the property [`detail`](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/detail).
312
- *
313
- * ```
314
- * node.addEventListener('monster-change',(e)=>console.log(e.detail))
315
- * node.addEventListener('monster-changed',(e)=>console.log(e.detail))
316
- * node.addEventListener('monster-selected',(e)=>console.log(e.detail))
317
- * node.addEventListener('monster-options-set',(e)=>console.log(e.detail))
318
- * ```
319
- *
320
- * @externalExample ../../../example/components/form/select.mjs
321
- * @startuml select.png
322
- * skinparam monochrome true
323
- * skinparam shadowing false
324
- * HTMLElement <|-- CustomElement
325
- * CustomElement <|-- CustomControl
326
- * CustomControl <|-- Select
327
- * @enduml
277
+ * @example /examples/components/form/select-simple
278
+ * @example /examples/components/form/select-with-options
328
279
  *
329
280
  * @since 1.0.0
330
281
  * @copyright schukai GmbH
331
- * @memberOf Monster.Components.Form
332
- * @summary A highly configurable select control
333
- * @fires Monster.Components.Form.event:monster-options-set
334
- * @fires Monster.Components.Form.event:monster-selected
335
- * @fires Monster.Components.Form.event:monster-change
336
- * @fires Monster.Components.Form.event:monster-changed
282
+ * @summary A beautiful select control that can make your life easier and also looks good.
283
+ * @fires monster-options-set
284
+ * @fires monster-selected
285
+ * @fires monster-change
286
+ * @fires monster-changed
337
287
  */
338
288
  class Select extends CustomControl {
339
289
  /**
@@ -346,7 +296,7 @@ class Select extends CustomControl {
346
296
 
347
297
  /**
348
298
  * This method is called by the `instanceof` operator.
349
- * @returns {symbol}
299
+ * @returns {Symbol}
350
300
  * @since 2.1.0
351
301
  */
352
302
  static get [instanceSymbol]() {
@@ -540,7 +490,7 @@ class Select extends CustomControl {
540
490
  }
541
491
 
542
492
  /**
543
- * @return {Monster.Components.Form.Select}
493
+ * @return {Select}
544
494
  */
545
495
  [assembleMethodSymbol]() {
546
496
  const self = this;
@@ -431,7 +431,7 @@ function initEventHandler() {
431
431
  }
432
432
 
433
433
  return this;
434
- }
434
+ }
435
435
 
436
436
  /**
437
437
  * @private
@@ -469,6 +469,7 @@ function importEntries() {
469
469
  });
470
470
  } catch (error) {
471
471
  addAttributeToken(this, ATTRIBUTE_ERRORMESSAGE, String(error));
472
+ return this;
472
473
  }
473
474
 
474
475
  const options = [];
@@ -500,7 +501,6 @@ function importEntries() {
500
501
  }
501
502
 
502
503
  this.setOption("entries", options);
503
-
504
504
  return this;
505
505
  }
506
506
 
@@ -12,13 +12,14 @@
12
12
  * SPDX-License-Identifier: AGPL-3.0
13
13
  */
14
14
 
15
- import { isArray, isObject } from "../types/is.mjs";
16
- import { Node } from "../types/node.mjs";
17
- import { NodeList } from "../types/nodelist.mjs";
18
- import { assembleParts } from "./buildmap.mjs";
19
- import { extend } from "./extend.mjs";
15
+ import {isArray, isObject} from "../types/is.mjs";
16
+ import {Node} from "../types/node.mjs";
17
+ import {NodeList} from "../types/nodelist.mjs";
18
+ import {clone} from "../util/clone.mjs";
19
+ import {assembleParts} from "./buildmap.mjs";
20
+ import {extend} from "./extend.mjs";
20
21
 
21
- export { buildTree };
22
+ export {buildTree};
22
23
 
23
24
  /**
24
25
  * @private
@@ -139,63 +140,69 @@ const rootSymbol = Symbol("root");
139
140
  * @since 1.26.0
140
141
  */
141
142
  function buildTree(subject, selector, idKey, parentIDKey, options) {
142
- const nodes = new Map();
143
-
144
- if (!isObject(options)) {
145
- options = {};
146
- }
147
-
148
- options = extend(
149
- {},
150
- {
151
- rootReferences: [null, undefined],
152
- filter: undefined,
153
- },
154
- options,
155
- );
156
-
157
- const filter = options?.filter;
158
- let rootReferences = options.rootReferences;
159
- if (!isArray(rootReferences)) {
160
- rootReferences = [rootReferences];
161
- }
162
-
163
- const childMap = assembleParts(subject, selector, filter, function (o, k, m) {
164
- const key = o?.[idKey];
165
- let ref = o?.[parentIDKey];
166
- if (rootReferences.indexOf(ref) !== -1) ref = rootSymbol;
167
-
168
- if (key === undefined) {
169
- throw new Error("the object has no value for the specified id");
170
- }
171
-
172
- o[parentSymbol] = ref;
173
-
174
- const node = new Node(o);
175
- this.has(ref)
176
- ? this.get(ref).add(node)
177
- : this.set(ref, new NodeList().add(node));
178
- nodes.set(key, node);
179
- });
180
-
181
- nodes.forEach((node) => {
143
+ const nodes = new Map();
144
+
145
+ const maxDepth = 100;
146
+
147
+ if (!isObject(options)) {
148
+ options = {};
149
+ }
150
+
151
+ options = extend(
152
+ {},
153
+ {
154
+ rootReferences: [null, undefined],
155
+ filter: undefined,
156
+ },
157
+ options,
158
+ );
159
+
160
+ const filter = options?.filter;
161
+ let rootReferences = options.rootReferences;
162
+ if (!isArray(rootReferences)) {
163
+ rootReferences = [rootReferences];
164
+ }
165
+
166
+ const childMap = assembleParts(subject, selector, filter, function (o, k, m) {
167
+ const key = o?.[idKey];
168
+ let ref = o?.[parentIDKey];
169
+ if (rootReferences.indexOf(ref) !== -1) ref = rootSymbol;
170
+
171
+ if (key === undefined) {
172
+ throw new Error("the object has no value for the specified id");
173
+ }
174
+
175
+ o[parentSymbol] = ref;
176
+
177
+ const node = new Node(o);
178
+ this.has(ref)
179
+ ? this.get(ref).add(node)
180
+ : this.set(ref, new NodeList().add(node));
181
+ nodes.set(key, node);
182
+ });
183
+
184
+ nodes.forEach((node) => {
182
185
  const id = node?.["value"]?.[idKey];
183
186
 
187
+ if (id === undefined) {
188
+ throw new Error("the object has no value for the specified id");
189
+ }
190
+
184
191
  if (childMap.has(id)) {
185
- node.childNodes = childMap.get(id);
186
- childMap.delete(id);
192
+ node.childNodes = childMap.get(id);
193
+ childMap.delete(id);
187
194
  }
188
195
  });
189
196
 
190
- const list = new NodeList();
197
+ const list = new NodeList();
191
198
 
192
- childMap.forEach((s) => {
193
- if (s instanceof Set) {
194
- s.forEach((n) => {
195
- list.add(n);
196
- });
197
- }
198
- });
199
+ childMap.forEach((s) => {
200
+ if (s instanceof Set) {
201
+ s.forEach((n) => {
202
+ list.add(n);
203
+ });
204
+ }
205
+ });
199
206
 
200
- return list;
207
+ return list;
201
208
  }