@schukai/monster 3.100.5 → 3.100.7
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 +16 -0
- package/package.json +1 -1
- package/source/components/datatable/dataset.mjs +10 -5
- package/source/components/datatable/datasource.mjs +0 -1
- package/source/components/datatable/datatable.mjs +2 -0
- package/source/components/datatable/filter.mjs +4 -5
- package/source/components/datatable/style/datatable.pcss +1 -1
- package/source/components/datatable/util.mjs +2 -2
- package/source/components/form/api-bar.mjs +1 -1
- package/source/components/form/api-button.mjs +1 -1
- package/source/components/form/button.mjs +21 -1
- package/source/components/form/confirm-button.mjs +0 -45
- package/source/components/form/context-help.mjs +1 -1
- package/source/components/form/form.mjs +165 -164
- package/source/components/form/message-state-button.mjs +21 -7
- package/source/components/form/popper-button.mjs +25 -57
- package/source/components/form/select.mjs +2142 -2164
- package/source/components/form/state-button.mjs +24 -14
- package/source/components/form/style/button.pcss +2 -0
- package/source/components/form/style/message-state-button.pcss +1 -2
- package/source/components/form/style/state-button.pcss +1 -0
- package/source/components/form/stylesheet/button.mjs +1 -1
- package/source/components/form/stylesheet/field-set.mjs +14 -7
- package/source/components/form/stylesheet/message-state-button.mjs +7 -14
- package/source/components/form/stylesheet/state-button.mjs +7 -14
- package/source/components/layout/collapse.mjs +1 -1
- package/source/components/layout/details.mjs +1 -1
- package/source/components/style/accessibility.css +27 -0
- package/source/components/style/accessibility.pcss +31 -0
- package/source/components/stylesheet/accessibility.mjs +38 -0
package/CHANGELOG.md
CHANGED
@@ -2,6 +2,22 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
+
## [3.100.7] - 2025-01-19
|
6
|
+
|
7
|
+
### Bug Fixes
|
8
|
+
|
9
|
+
- **datatable:** pagination layout
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
## [3.100.6] - 2025-01-18
|
14
|
+
|
15
|
+
### Bug Fixes
|
16
|
+
|
17
|
+
- accessibility for buttons [#282](https://gitlab.schukai.com/oss/libraries/javascript/monster/issues/282)
|
18
|
+
|
19
|
+
|
20
|
+
|
5
21
|
## [3.100.5] - 2025-01-16
|
6
22
|
|
7
23
|
### Bug Fixes
|
package/package.json
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"author":"schukai GmbH","dependencies":{"@floating-ui/dom":"^1.6.13","@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.100.
|
1
|
+
{"author":"schukai GmbH","dependencies":{"@floating-ui/dom":"^1.6.13","@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.100.7"}
|
@@ -38,7 +38,7 @@ import {
|
|
38
38
|
datasourceLinkedElementSymbol,
|
39
39
|
} from "./util.mjs";
|
40
40
|
import { FormStyleSheet } from "../stylesheet/form.mjs";
|
41
|
-
import {addErrorAttribute} from "../../dom/error.mjs";
|
41
|
+
import { addErrorAttribute } from "../../dom/error.mjs";
|
42
42
|
|
43
43
|
export { DataSet };
|
44
44
|
|
@@ -237,14 +237,16 @@ class DataSet extends CustomElement {
|
|
237
237
|
super[assembleMethodSymbol]();
|
238
238
|
|
239
239
|
requestAnimationFrame(() => {
|
240
|
-
|
241
240
|
if (!this[datasourceLinkedElementSymbol]) {
|
242
241
|
const selector = this.getOption("datasource.selector");
|
243
242
|
|
244
243
|
if (isString(selector)) {
|
245
244
|
const element = findElementWithSelectorUpwards(this, selector);
|
246
245
|
if (element === null) {
|
247
|
-
addErrorAttribute(
|
246
|
+
addErrorAttribute(
|
247
|
+
this,
|
248
|
+
"the selector must match exactly one element",
|
249
|
+
);
|
248
250
|
return;
|
249
251
|
}
|
250
252
|
|
@@ -260,8 +262,11 @@ class DataSet extends CustomElement {
|
|
260
262
|
|
261
263
|
handleDataSourceChanges.call(this);
|
262
264
|
} else {
|
263
|
-
addErrorAttribute(
|
264
|
-
|
265
|
+
addErrorAttribute(
|
266
|
+
this,
|
267
|
+
"the datasource selector is missing or invalid",
|
268
|
+
);
|
269
|
+
return;
|
265
270
|
}
|
266
271
|
}
|
267
272
|
|
@@ -139,6 +139,8 @@ const resizeObserverSymbol = Symbol("resizeObserver");
|
|
139
139
|
* @example /examples/components/datatable/order-by Sort data
|
140
140
|
* @example /examples/components/datatable/select-rows Select rows
|
141
141
|
*
|
142
|
+
* @issue https://localhost.alvine.dev:8443/development/issues/closed/277.html
|
143
|
+
*
|
142
144
|
* @copyright schukai GmbH
|
143
145
|
* @summary A beautiful and highly customizable data table. It can be used to display data from a data source.
|
144
146
|
* @fires monster-datatable-row-copied
|
@@ -348,14 +348,13 @@ class Filter extends CustomElement {
|
|
348
348
|
initFilter.call(self);
|
349
349
|
updateFilterTabs.call(self);
|
350
350
|
|
351
|
-
if (self.getOption("features.autoFilter")===true) {
|
351
|
+
if (self.getOption("features.autoFilter") === true) {
|
352
352
|
doSearch
|
353
|
-
.call(self, {showEffect: false})
|
353
|
+
.call(self, { showEffect: false })
|
354
354
|
.then(() => {
|
355
355
|
fireCustomEvent(self, "monster-filter-initialized");
|
356
356
|
})
|
357
|
-
.catch(() => {
|
358
|
-
});
|
357
|
+
.catch(() => {});
|
359
358
|
}
|
360
359
|
});
|
361
360
|
}
|
@@ -384,7 +383,7 @@ class Filter extends CustomElement {
|
|
384
383
|
}
|
385
384
|
|
386
385
|
/**
|
387
|
-
* @return {
|
386
|
+
* @return {CSSStyleSheet[]}
|
388
387
|
*/
|
389
388
|
static getCSSStyleSheet() {
|
390
389
|
return [FilterStyleSheet, FormStyleSheet, ThemeStyleSheet, SpaceStyleSheet];
|
@@ -14,7 +14,7 @@
|
|
14
14
|
|
15
15
|
import { diff } from "../../data/diff.mjs";
|
16
16
|
import { Pathfinder } from "../../data/pathfinder.mjs";
|
17
|
-
import {isObject, isPrimitive} from "../../types/is.mjs";
|
17
|
+
import { isObject, isPrimitive } from "../../types/is.mjs";
|
18
18
|
import { Observer } from "../../types/observer.mjs";
|
19
19
|
|
20
20
|
export { handleDataSourceChanges, datasourceLinkedElementSymbol };
|
@@ -35,7 +35,7 @@ function handleDataSourceChanges() {
|
|
35
35
|
|
36
36
|
let data = this[datasourceLinkedElementSymbol]?.data;
|
37
37
|
|
38
|
-
if(isPrimitive(data)) {
|
38
|
+
if (isPrimitive(data)) {
|
39
39
|
throw new Error("Data must be an object or an array");
|
40
40
|
}
|
41
41
|
|
@@ -48,6 +48,8 @@ export const buttonElementSymbol = Symbol("buttonElement");
|
|
48
48
|
* @example /examples/components/form/button-simple Simple Button
|
49
49
|
* @example /examples/components/form/button-with-click-event Button with event
|
50
50
|
*
|
51
|
+
* @issue https://localhost.alvine.dev:8443/development/issues/closed/282.html
|
52
|
+
*
|
51
53
|
* @copyright schukai GmbH
|
52
54
|
* @summary A beautiful button that can make your life easier and also looks good.
|
53
55
|
* @fires monster-button-clicked this event is triggered when the button is clicked. It contains the field {button} with the button instance.
|
@@ -196,6 +198,9 @@ class Button extends CustomControl {
|
|
196
198
|
* @property {Object} effects Effects
|
197
199
|
* @property {boolean} effects.ripple=true Ripple effect
|
198
200
|
* @property {string} type="button" The default behavior of the button. Possible values are: submit, reset, button
|
201
|
+
* @property {Object} aria Aria attributes
|
202
|
+
* @property {string} aria.role The role of the button, should only be set if the button is not a button
|
203
|
+
* @property {string} aria.label="click me!" The label of the button
|
199
204
|
*/
|
200
205
|
get defaults() {
|
201
206
|
return Object.assign({}, super.defaults, {
|
@@ -217,6 +222,11 @@ class Button extends CustomControl {
|
|
217
222
|
},
|
218
223
|
value: null,
|
219
224
|
type: "button",
|
225
|
+
|
226
|
+
aria: {
|
227
|
+
role: null,
|
228
|
+
label: null,
|
229
|
+
},
|
220
230
|
});
|
221
231
|
}
|
222
232
|
|
@@ -300,14 +310,24 @@ function getTemplate() {
|
|
300
310
|
// language=HTML
|
301
311
|
return `
|
302
312
|
<div data-monster-role="control" part="control">
|
303
|
-
<button data-monster-attributes="disabled path:disabled | if:true,
|
313
|
+
<button data-monster-attributes="disabled path:disabled | if:true,
|
314
|
+
class path:classes.button,
|
315
|
+
aria-role path:aria.role,
|
316
|
+
path:aria.label | if:true,
|
304
317
|
type path:type"
|
305
318
|
data-monster-role="button"
|
306
319
|
part="button"
|
320
|
+
aria-labelledby="monster-button-aria-label"
|
307
321
|
data-monster-replace="path:labels.button"></button>
|
322
|
+
<div id="monster-button-aria-label"
|
323
|
+
class="visually-hidden" data-monster-replace="path:aria.label">click me</div>
|
308
324
|
</div>`;
|
309
325
|
}
|
310
326
|
|
327
|
+
/**
|
328
|
+
* @private
|
329
|
+
* @param event
|
330
|
+
*/
|
311
331
|
function createRipple(event) {
|
312
332
|
const button = this[buttonElementSymbol];
|
313
333
|
|
@@ -43,51 +43,6 @@ const confirmButtonElementSymbol = Symbol("confirmButtonElement");
|
|
43
43
|
*/
|
44
44
|
const cancelButtonElementSymbol = Symbol("cancelButtonElement");
|
45
45
|
|
46
|
-
/**
|
47
|
-
* This action callback executes the actions when a button is clicked.
|
48
|
-
*
|
49
|
-
* @callback Monster.Components.Form~exampleActionCallback
|
50
|
-
* @param {Event} e Event
|
51
|
-
* @this {CustomControl}
|
52
|
-
*/
|
53
|
-
|
54
|
-
/**
|
55
|
-
* This CustomControl creates a confirm button element with a variety of options.
|
56
|
-
*
|
57
|
-
* <img src="./images/confirm-button.png">
|
58
|
-
*
|
59
|
-
* Dependencies: the system uses functions of the [monsterjs](https://monsterjs.org/) library
|
60
|
-
* as well as [pooperjs](https://popper.js.org/docs/v2/).
|
61
|
-
*
|
62
|
-
* You can create this control either by specifying the HTML tag <monster-confirm-button />` directly in the HTML or using
|
63
|
-
* Javascript via the `document.createElement('monster-confirm-button');` method.
|
64
|
-
*
|
65
|
-
* ```html
|
66
|
-
* <monster-confirm-button></monster-confirm-button>
|
67
|
-
* ```
|
68
|
-
*
|
69
|
-
* Or you can create this CustomControl directly in Javascript:
|
70
|
-
*
|
71
|
-
* ```js
|
72
|
-
* import {ConfirmButton} from '@schukai/component-form/source/confirm-button.js';
|
73
|
-
* document.createElement('monster-confirm-button');
|
74
|
-
* ```
|
75
|
-
* The `data-monster-button-class` attribute can be used to change the CSS class of the button.
|
76
|
-
*
|
77
|
-
* @startuml confirm-button.png
|
78
|
-
* skinparam monochrome true
|
79
|
-
* skinparam shadowing false
|
80
|
-
* HTMLElement <|-- CustomElement
|
81
|
-
* CustomElement <|-- CustomControl
|
82
|
-
* CustomControl <|-- Button
|
83
|
-
* Button <|-- PopperButton
|
84
|
-
* PopperButton <|-- ConfirmButton
|
85
|
-
* @enduml
|
86
|
-
*
|
87
|
-
* @copyright schukai GmbH
|
88
|
-
* @summary A confirm button
|
89
|
-
*/
|
90
|
-
|
91
46
|
/**
|
92
47
|
* A confirm button control.
|
93
48
|
*
|
@@ -14,19 +14,19 @@
|
|
14
14
|
|
15
15
|
import "../datatable/datasource/dom.mjs";
|
16
16
|
import "../form/field-set.mjs";
|
17
|
-
import {DeadMansSwitch} from "../../util/deadmansswitch.mjs";
|
18
|
-
import {DataSet} from "../datatable/dataset.mjs";
|
17
|
+
import { DeadMansSwitch } from "../../util/deadmansswitch.mjs";
|
18
|
+
import { DataSet } from "../datatable/dataset.mjs";
|
19
19
|
import {
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
assembleMethodSymbol,
|
21
|
+
registerCustomElement,
|
22
|
+
getSlottedElements,
|
23
23
|
} from "../../dom/customelement.mjs";
|
24
|
-
import {datasourceLinkedElementSymbol} from "../datatable/util.mjs";
|
25
|
-
import {FormStyleSheet} from "./stylesheet/form.mjs";
|
26
|
-
import {addAttributeToken} from "../../dom/attributes.mjs";
|
27
|
-
import {getDocument} from "../../dom/util.mjs";
|
24
|
+
import { datasourceLinkedElementSymbol } from "../datatable/util.mjs";
|
25
|
+
import { FormStyleSheet } from "./stylesheet/form.mjs";
|
26
|
+
import { addAttributeToken } from "../../dom/attributes.mjs";
|
27
|
+
import { getDocument } from "../../dom/util.mjs";
|
28
28
|
|
29
|
-
export {Form};
|
29
|
+
export { Form };
|
30
30
|
|
31
31
|
/**
|
32
32
|
* @private
|
@@ -58,162 +58,163 @@ const debounceBindSymbol = Symbol("debounceBind");
|
|
58
58
|
* @fires monster-changed
|
59
59
|
*/
|
60
60
|
class Form extends DataSet {
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
61
|
+
/**
|
62
|
+
* @property {Object} templates Template definitions
|
63
|
+
* @property {string} templates.main Main template
|
64
|
+
* @property {Object} classes Class definitions
|
65
|
+
* @property {string} classes.form Form class
|
66
|
+
* @property {Object} writeBack Write back definitions
|
67
|
+
* @property {string[]} writeBack.events Write back events
|
68
|
+
* @property {Object} bind Bind definitions
|
69
|
+
* @property {Object} reportValidity Report validity definitions
|
70
|
+
* @property {string} reportValidity.selector Report validity selector
|
71
|
+
* @property {boolean} features.mutationObserver Mutation observer feature
|
72
|
+
* @property {boolean} features.writeBack Write back feature
|
73
|
+
* @property {boolean} features.bind Bind feature
|
74
|
+
*/
|
75
|
+
get defaults() {
|
76
|
+
const obj = Object.assign({}, super.defaults, {
|
77
|
+
templates: {
|
78
|
+
main: getTemplate(),
|
79
|
+
},
|
80
|
+
|
81
|
+
classes: {
|
82
|
+
form: "",
|
83
|
+
},
|
84
|
+
|
85
|
+
writeBack: {
|
86
|
+
events: ["keyup", "click", "change", "drop", "touchend", "input"],
|
87
|
+
},
|
88
|
+
|
89
|
+
reportValidity: {
|
90
|
+
selector: "input,select,textarea,monster-select,monster-toggle-switch",
|
91
|
+
},
|
92
|
+
|
93
|
+
eventProcessing: true,
|
94
|
+
});
|
95
|
+
|
96
|
+
obj["features"]["mutationObserver"] = false;
|
97
|
+
obj["features"]["writeBack"] = true;
|
98
|
+
|
99
|
+
return obj;
|
100
|
+
}
|
101
|
+
|
102
|
+
/**
|
103
|
+
*
|
104
|
+
* @return {string}
|
105
|
+
*/
|
106
|
+
static getTag() {
|
107
|
+
return "monster-form";
|
108
|
+
}
|
109
|
+
|
110
|
+
/**
|
111
|
+
* @return {CSSStyleSheet[]}
|
112
|
+
*/
|
113
|
+
static getCSSStyleSheet() {
|
114
|
+
return [FormStyleSheet];
|
115
|
+
}
|
116
|
+
|
117
|
+
/**
|
118
|
+
*
|
119
|
+
*/
|
120
|
+
[assembleMethodSymbol]() {
|
121
|
+
const selector = this.getOption("datasource.selector");
|
122
|
+
|
123
|
+
if (!selector) {
|
124
|
+
this[datasourceLinkedElementSymbol] = getDocument().createElement(
|
125
|
+
"monster-datasource-dom",
|
126
|
+
);
|
127
|
+
}
|
128
|
+
|
129
|
+
super[assembleMethodSymbol]();
|
130
|
+
|
131
|
+
initControlReferences.call(this);
|
132
|
+
initEventHandler.call(this);
|
133
|
+
initDataSourceHandler.call(this);
|
134
|
+
}
|
135
|
+
|
136
|
+
/**
|
137
|
+
* This method is called when the component is created.
|
138
|
+
* @since 3.70.0
|
139
|
+
* @return {Promise}
|
140
|
+
*/
|
141
|
+
refresh() {
|
142
|
+
return this.write().then(() => {
|
143
|
+
super.refresh();
|
144
|
+
return this;
|
145
|
+
});
|
146
|
+
}
|
147
|
+
|
148
|
+
/**
|
149
|
+
* Run reportValidation on all child html form controls.
|
150
|
+
*
|
151
|
+
* @since 2.10.0
|
152
|
+
* @return {boolean}
|
153
|
+
*/
|
154
|
+
reportValidity() {
|
155
|
+
let valid = true;
|
156
|
+
|
157
|
+
const selector = this.getOption("reportValidity.selector");
|
158
|
+
const nodes = getSlottedElements.call(this, selector);
|
159
|
+
|
160
|
+
nodes.forEach((node) => {
|
161
|
+
if (typeof node.reportValidity === "function") {
|
162
|
+
if (node.reportValidity() === false) {
|
163
|
+
valid = false;
|
164
|
+
}
|
165
|
+
}
|
166
|
+
});
|
167
|
+
|
168
|
+
return valid;
|
169
|
+
}
|
168
170
|
}
|
169
171
|
|
170
|
-
function initDataSourceHandler() {
|
171
|
-
}
|
172
|
+
function initDataSourceHandler() {}
|
172
173
|
|
173
174
|
/**
|
174
175
|
* @private
|
175
176
|
* @return {initEventHandler}
|
176
177
|
*/
|
177
178
|
function initEventHandler() {
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
179
|
+
this[debounceBindSymbol] = {};
|
180
|
+
|
181
|
+
if (this.getOption("features.writeBack") === true) {
|
182
|
+
const events = this.getOption("writeBack.events");
|
183
|
+
for (const event of events) {
|
184
|
+
this.addEventListener(event, (e) => {
|
185
|
+
if (!this.reportValidity()) {
|
186
|
+
this.classList.add("invalid");
|
187
|
+
setTimeout(() => {
|
188
|
+
this.classList.remove("invalid");
|
189
|
+
}, 1000);
|
190
|
+
|
191
|
+
return;
|
192
|
+
}
|
193
|
+
|
194
|
+
if (this[debounceWriteBackSymbol] instanceof DeadMansSwitch) {
|
195
|
+
try {
|
196
|
+
this[debounceWriteBackSymbol].touch();
|
197
|
+
return;
|
198
|
+
} catch (e) {
|
199
|
+
if (e.message !== "has already run") {
|
200
|
+
throw e;
|
201
|
+
}
|
202
|
+
delete this[debounceWriteBackSymbol];
|
203
|
+
}
|
204
|
+
}
|
205
|
+
|
206
|
+
this[debounceWriteBackSymbol] = new DeadMansSwitch(200, () => {
|
207
|
+
setTimeout(() => {
|
208
|
+
this.write().catch((e) => {
|
209
|
+
addAttributeToken(this, "error", e.message || `${e}`);
|
210
|
+
});
|
211
|
+
}, 0);
|
212
|
+
});
|
213
|
+
});
|
214
|
+
}
|
215
|
+
}
|
216
|
+
|
217
|
+
return this;
|
217
218
|
}
|
218
219
|
|
219
220
|
/**
|
@@ -221,10 +222,10 @@ function initEventHandler() {
|
|
221
222
|
* @return {FilterButton}
|
222
223
|
*/
|
223
224
|
function initControlReferences() {
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
225
|
+
if (!this.shadowRoot) {
|
226
|
+
throw new Error("no shadow-root is defined");
|
227
|
+
}
|
228
|
+
return this;
|
228
229
|
}
|
229
230
|
|
230
231
|
/**
|
@@ -232,8 +233,8 @@ function initControlReferences() {
|
|
232
233
|
* @return {string}
|
233
234
|
*/
|
234
235
|
function getTemplate() {
|
235
|
-
|
236
|
-
|
236
|
+
// language=HTML
|
237
|
+
return `
|
237
238
|
<div data-monster-role="control" part="control">
|
238
239
|
<form data-monster-attributes="disabled path:disabled | if:true, class path:classes.form"
|
239
240
|
data-monster-role="form"
|