@schukai/monster 3.51.5 → 3.52.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 +17 -0
- package/README.md +15 -12
- package/example/components/form/button.mjs +10 -0
- package/example/components/form/select.mjs +25 -0
- package/example/components/form/tree-select.mjs +27 -0
- package/example/components/host/host.mjs +0 -0
- package/example/components/notify/message.mjs +4 -0
- package/example/components/notify/notify.mjs +4 -0
- package/example/components/state/log.mjs +0 -0
- package/example/components/state/state.mjs +0 -0
- package/package.json +6 -2
- package/source/components/constants.mjs +132 -0
- package/source/components/datatable/columnbar.mjs +310 -0
- package/source/components/datatable/constants.mjs +121 -0
- package/source/components/datatable/dataset.mjs +219 -0
- package/source/components/datatable/datasource/dom.mjs +186 -0
- package/source/components/datatable/datasource/namespace.mjs +13 -0
- package/source/components/datatable/datasource/rest.mjs +400 -0
- package/source/components/datatable/datasource.mjs +102 -0
- package/source/components/datatable/datatable/header.mjs +268 -0
- package/source/components/datatable/datatable/namespace.mjs +13 -0
- package/source/components/datatable/datatable.mjs +789 -0
- package/source/components/datatable/embedded-pagination.mjs +113 -0
- package/source/components/datatable/filter/abstract-base.mjs +31 -0
- package/source/components/datatable/filter/date-range.mjs +1041 -0
- package/source/components/datatable/filter/input.mjs +175 -0
- package/source/components/datatable/filter/namespace.mjs +13 -0
- package/source/components/datatable/filter/range.mjs +671 -0
- package/source/components/datatable/filter/select.mjs +65 -0
- package/source/components/datatable/filter/settings.mjs +116 -0
- package/source/components/datatable/filter-button.mjs +98 -0
- package/source/components/datatable/filter.mjs +929 -0
- package/source/components/datatable/namespace.mjs +11 -0
- package/source/components/datatable/pagination.mjs +456 -0
- package/source/components/datatable/style/column-bar.pcss +123 -0
- package/source/components/datatable/style/dataset.pcss +13 -0
- package/source/components/datatable/style/datasource.pcss +16 -0
- package/source/components/datatable/style/datatable.pcss +239 -0
- package/source/components/datatable/style/embedded-pagination.pcss +101 -0
- package/source/components/datatable/style/filter-button.pcss +22 -0
- package/source/components/datatable/style/filter-controls-defaults.pcss +46 -0
- package/source/components/datatable/style/filter-date-range.pcss +9 -0
- package/source/components/datatable/style/filter-range.pcss +5 -0
- package/source/components/datatable/style/filter.pcss +156 -0
- package/source/components/datatable/style/pagination.pcss +59 -0
- package/source/components/datatable/style/select-filter.pcss +27 -0
- package/source/components/datatable/stylesheet/column-bar.mjs +33 -0
- package/source/components/datatable/stylesheet/dataset.mjs +33 -0
- package/source/components/datatable/stylesheet/datasource.mjs +33 -0
- package/source/components/datatable/stylesheet/datatable.mjs +33 -0
- package/source/components/datatable/stylesheet/embedded-pagination.mjs +33 -0
- package/source/components/datatable/stylesheet/filter-button.mjs +33 -0
- package/source/components/datatable/stylesheet/filter-controls-defaults.mjs +33 -0
- package/source/components/datatable/stylesheet/filter-date-range.mjs +33 -0
- package/source/components/datatable/stylesheet/filter-range.mjs +33 -0
- package/source/components/datatable/stylesheet/filter.mjs +33 -0
- package/source/components/datatable/stylesheet/namespace.mjs +13 -0
- package/source/components/datatable/stylesheet/pagination.mjs +33 -0
- package/source/components/datatable/stylesheet/select-filter.mjs +33 -0
- package/source/components/datatable/util.mjs +60 -0
- package/source/components/form/action-button.mjs +262 -0
- package/source/components/form/api-button.mjs +515 -0
- package/source/components/form/button-bar.mjs +739 -0
- package/source/components/form/button.mjs +350 -0
- package/source/components/form/confirm-button.mjs +330 -0
- package/source/components/form/constants.mjs +111 -0
- package/source/components/form/context-help.mjs +123 -0
- package/source/components/form/events.mjs +84 -0
- package/source/components/form/form.mjs +601 -0
- package/source/components/form/message-state-button.mjs +396 -0
- package/source/components/form/namespace.mjs +13 -0
- package/source/components/form/popper-button.mjs +435 -0
- package/source/components/form/popper.mjs +487 -0
- package/source/components/form/reload.mjs +360 -0
- package/source/components/form/select.mjs +2314 -0
- package/source/components/form/shadow-reload.mjs +137 -0
- package/source/components/form/state-button.mjs +182 -0
- package/source/components/form/style/action-button.pcss +41 -0
- package/source/components/form/style/api-button.pcss +0 -0
- package/source/components/form/style/button-bar.pcss +51 -0
- package/source/components/form/style/button.pcss +8 -0
- package/source/components/form/style/confirm-button.pcss +17 -0
- package/source/components/form/style/context-help.pcss +16 -0
- package/source/components/form/style/form.pcss +10 -0
- package/source/components/form/style/message-state-button.pcss +10 -0
- package/source/components/form/style/popper-button.pcss +16 -0
- package/source/components/form/style/popper.pcss +8 -0
- package/source/components/form/style/select.pcss +265 -0
- package/source/components/form/style/state-button.pcss +116 -0
- package/source/components/form/style/tabs.pcss +170 -0
- package/source/components/form/style/tree-select.pcss +81 -0
- package/source/components/form/stylesheet/action-button.mjs +33 -0
- package/source/components/form/stylesheet/api-button.mjs +33 -0
- package/source/components/form/stylesheet/button-bar.mjs +33 -0
- package/source/components/form/stylesheet/button.mjs +33 -0
- package/source/components/form/stylesheet/confirm-button.mjs +33 -0
- package/source/components/form/stylesheet/context-help.mjs +33 -0
- package/source/components/form/stylesheet/form.mjs +33 -0
- package/source/components/form/stylesheet/message-state-button.mjs +33 -0
- package/source/components/form/stylesheet/namespace.mjs +13 -0
- package/source/components/form/stylesheet/popper-button.mjs +33 -0
- package/source/components/form/stylesheet/popper.mjs +33 -0
- package/source/components/form/stylesheet/select.mjs +33 -0
- package/source/components/form/stylesheet/state-button.mjs +33 -0
- package/source/components/form/stylesheet/tabs.mjs +33 -0
- package/source/components/form/stylesheet/tree-select.mjs +33 -0
- package/source/components/form/tabs.mjs +1011 -0
- package/source/components/form/template.mjs +373 -0
- package/source/components/form/tree-select.mjs +527 -0
- package/source/components/form/types/namespace.mjs +13 -0
- package/source/components/form/types/state.mjs +93 -0
- package/source/components/form/util/fetch.mjs +133 -0
- package/source/components/form/util/floating-ui.mjs +245 -0
- package/source/components/form/util/namespace.mjs +13 -0
- package/source/components/form/util/popper.mjs +49 -0
- package/source/components/host/call-button.mjs +236 -0
- package/source/components/host/collapse.mjs +526 -0
- package/source/components/host/config-manager.mjs +304 -0
- package/source/components/host/constants.mjs +18 -0
- package/source/components/host/details.mjs +268 -0
- package/source/components/host/events.mjs +131 -0
- package/source/components/host/host.mjs +420 -0
- package/source/components/host/namespace.mjs +13 -0
- package/source/components/host/overlay.mjs +339 -0
- package/source/components/host/style/call-button.pcss +36 -0
- package/source/components/host/style/collapse.pcss +67 -0
- package/source/components/host/style/config-manager.pcss +5 -0
- package/source/components/host/style/details.pcss +68 -0
- package/source/components/host/style/host.pcss +43 -0
- package/source/components/host/style/overlay.pcss +73 -0
- package/source/components/host/style/toggle-button.pcss +36 -0
- package/source/components/host/style/viewer.pcss +13 -0
- package/source/components/host/stylesheet/call-button.mjs +33 -0
- package/source/components/host/stylesheet/collapse.mjs +33 -0
- package/source/components/host/stylesheet/config-manager.mjs +33 -0
- package/source/components/host/stylesheet/details.mjs +33 -0
- package/source/components/host/stylesheet/host.mjs +33 -0
- package/source/components/host/stylesheet/namespace.mjs +13 -0
- package/source/components/host/stylesheet/overlay.mjs +33 -0
- package/source/components/host/stylesheet/toggle-button.mjs +33 -0
- package/source/components/host/stylesheet/viewer.mjs +33 -0
- package/source/components/host/toggle-button.mjs +88 -0
- package/source/components/host/util.mjs +23 -0
- package/source/components/host/viewer.mjs +309 -0
- package/source/components/namespace.mjs +14 -0
- package/source/components/notify/constants.mjs +15 -0
- package/source/components/notify/events.mjs +15 -0
- package/source/components/notify/message.mjs +374 -0
- package/source/components/notify/namespace.mjs +15 -0
- package/source/components/notify/notify.mjs +236 -0
- package/source/components/notify/style/message.pcss +57 -0
- package/source/components/notify/style/notify.pcss +118 -0
- package/source/components/notify/stylesheet/message.mjs +33 -0
- package/source/components/notify/stylesheet/namespace.mjs +15 -0
- package/source/components/notify/stylesheet/notify.mjs +33 -0
- package/source/components/state/log/entry.mjs +126 -0
- package/source/components/state/log/namespace.mjs +13 -0
- package/source/components/state/log.mjs +275 -0
- package/source/components/state/namespace.mjs +13 -0
- package/source/components/state/state.mjs +131 -0
- package/source/components/state/style/log.pcss +111 -0
- package/source/components/state/style/state.pcss +113 -0
- package/source/components/state/stylesheet/log.mjs +33 -0
- package/source/components/state/stylesheet/state.mjs +33 -0
- package/source/components/style/badge.pcss +92 -0
- package/source/components/style/border.pcss +77 -0
- package/source/components/style/button.pcss +105 -0
- package/source/components/style/card.pcss +108 -0
- package/source/components/style/color.pcss +257 -0
- package/source/components/style/common.pcss +103 -0
- package/source/components/style/control.pcss +11 -0
- package/source/components/style/data-grid.pcss +43 -0
- package/source/components/style/display.pcss +42 -0
- package/source/components/style/floating-ui.pcss +33 -0
- package/source/components/style/form.pcss +5 -0
- package/source/components/style/host.pcss +15 -0
- package/source/components/style/link.pcss +63 -0
- package/source/components/style/mixin/badge.pcss +18 -0
- package/source/components/style/mixin/button.pcss +54 -0
- package/source/components/style/mixin/form.pcss +247 -0
- package/source/components/style/mixin/hover.pcss +8 -0
- package/source/components/style/mixin/media.pcss +107 -0
- package/source/components/style/mixin/property.pcss +288 -0
- package/source/components/style/mixin/skeleton.pcss +26 -0
- package/source/components/style/mixin/spinner.pcss +24 -0
- package/source/components/style/mixin/typography.pcss +52 -0
- package/source/components/style/normalize.pcss +14 -0
- package/source/components/style/popper.pcss +78 -0
- package/source/components/style/property.pcss +17 -0
- package/source/components/style/ripple.pcss +14 -0
- package/source/components/style/skeleton.pcss +28 -0
- package/source/components/style/space.pcss +47 -0
- package/source/components/style/spinner.pcss +6 -0
- package/source/components/style/table.pcss +46 -0
- package/source/components/style/theme.pcss +119 -0
- package/source/components/style/typography.pcss +131 -0
- package/source/components/stylesheet/badge.mjs +33 -0
- package/source/components/stylesheet/border.mjs +33 -0
- package/source/components/stylesheet/button.mjs +33 -0
- package/source/components/stylesheet/card.mjs +33 -0
- package/source/components/stylesheet/color.mjs +33 -0
- package/source/components/stylesheet/common.mjs +33 -0
- package/source/components/stylesheet/control.mjs +33 -0
- package/source/components/stylesheet/data-grid.mjs +33 -0
- package/source/components/stylesheet/display.mjs +33 -0
- package/source/components/stylesheet/floating-ui.mjs +33 -0
- package/source/components/stylesheet/form.mjs +33 -0
- package/source/components/stylesheet/host.mjs +33 -0
- package/source/components/stylesheet/link.mjs +33 -0
- package/source/components/stylesheet/namespace.mjs +13 -0
- package/source/components/stylesheet/normalize.mjs +33 -0
- package/source/components/stylesheet/popper.mjs +33 -0
- package/source/components/stylesheet/property.mjs +33 -0
- package/source/components/stylesheet/ripple.mjs +33 -0
- package/source/components/stylesheet/skeleton.mjs +33 -0
- package/source/components/stylesheet/space.mjs +33 -0
- package/source/components/stylesheet/spinner.mjs +33 -0
- package/source/components/stylesheet/table.mjs +33 -0
- package/source/components/stylesheet/theme.mjs +33 -0
- package/source/components/stylesheet/tree-menu.mjs +33 -0
- package/source/components/stylesheet/typography.mjs +33 -0
- package/source/components/tree-menu/namespace.mjs +13 -0
- package/source/components/tree-menu/style/tree-menu.pcss +107 -0
- package/source/components/tree-menu/stylesheet/namespace.mjs +13 -0
- package/source/components/tree-menu/stylesheet/tree-menu.mjs +33 -0
- package/source/components/tree-menu/tree-menu.mjs +660 -0
- package/source/constraints/abstract.mjs +17 -24
- package/source/constraints/abstractoperator.mjs +27 -22
- package/source/constraints/andoperator.mjs +20 -17
- package/source/constraints/invalid.mjs +17 -17
- package/source/constraints/isarray.mjs +20 -20
- package/source/constraints/isobject.mjs +20 -20
- package/source/constraints/oroperator.mjs +45 -45
- package/source/constraints/valid.mjs +17 -17
- package/source/data/buildmap.mjs +108 -103
- package/source/data/buildtree.mjs +59 -57
- package/source/data/datasource/dom.mjs +80 -84
- package/source/data/datasource/namespace.mjs +1 -1
- package/source/data/datasource/server/restapi/data-fetch-error.mjs +27 -25
- package/source/data/datasource/server/restapi/writeerror.mjs +34 -32
- package/source/data/datasource/server/restapi.mjs +176 -177
- package/source/data/datasource/server/webconnect.mjs +150 -156
- package/source/data/datasource/server.mjs +58 -59
- package/source/data/datasource/storage/localstorage.mjs +25 -24
- package/source/data/datasource/storage/sessionstorage.mjs +28 -25
- package/source/data/datasource/storage.mjs +74 -73
- package/source/data/datasource.mjs +176 -167
- package/source/data/diff.mjs +98 -97
- package/source/data/extend.mjs +42 -42
- package/source/data/pathfinder.mjs +301 -288
- package/source/data/pipe.mjs +36 -36
- package/source/data/transformer.mjs +742 -726
- package/source/dom/assembler.mjs +44 -44
- package/source/dom/attributes.mjs +142 -122
- package/source/dom/constants.mjs +62 -58
- package/source/dom/customcontrol.mjs +299 -299
- package/source/dom/customelement.mjs +843 -806
- package/source/dom/dimension.mjs +56 -46
- package/source/dom/events.mjs +74 -69
- package/source/dom/focusmanager.mjs +175 -175
- package/source/dom/locale.mjs +28 -28
- package/source/dom/ready.mjs +13 -13
- package/source/dom/resource/data.mjs +117 -111
- package/source/dom/resource/link/stylesheet.mjs +16 -16
- package/source/dom/resource/link.mjs +94 -96
- package/source/dom/resource/script.mjs +72 -74
- package/source/dom/resource.mjs +174 -172
- package/source/dom/resourcemanager.mjs +152 -156
- package/source/dom/slotted.mjs +78 -80
- package/source/dom/template.mjs +126 -112
- package/source/dom/theme.mjs +35 -35
- package/source/dom/updater.mjs +673 -651
- package/source/dom/util/extract-keys.mjs +34 -22
- package/source/dom/util/init-options-from-attributes.mjs +46 -38
- package/source/dom/util/namespace.mjs +13 -0
- package/source/dom/util/set-option-from-attribute.mjs +35 -29
- package/source/dom/util.mjs +112 -81
- package/source/dom/worker/factory.mjs +83 -83
- package/source/i18n/formatter.mjs +75 -73
- package/source/i18n/locale.mjs +146 -144
- package/source/i18n/provider.mjs +70 -64
- package/source/i18n/providers/embed.mjs +136 -127
- package/source/i18n/providers/fetch.mjs +84 -76
- package/source/i18n/translations.mjs +205 -195
- package/source/logging/handler/console.mjs +36 -36
- package/source/logging/handler.mjs +140 -140
- package/source/logging/logentry.mjs +25 -25
- package/source/logging/logger.mjs +177 -175
- package/source/math/random.mjs +63 -59
- package/source/monster.mjs +223 -103
- package/source/net/webconnect/message.mjs +31 -31
- package/source/net/webconnect.mjs +278 -271
- package/source/text/bracketed-key-value-hash.mjs +182 -179
- package/source/text/formatter.mjs +235 -210
- package/source/text/generate-range-comparison-expression.mjs +56 -34
- package/source/text/namespace.mjs +1 -1
- package/source/types/base.mjs +69 -61
- package/source/types/basewithoptions.mjs +46 -46
- package/source/types/binary.mjs +20 -20
- package/source/types/dataurl.mjs +96 -90
- package/source/types/global.mjs +45 -39
- package/source/types/id.mjs +25 -25
- package/source/types/internal.mjs +115 -114
- package/source/types/is.mjs +56 -40
- package/source/types/mediatype.mjs +119 -119
- package/source/types/namespace.mjs +1 -1
- package/source/types/node.mjs +160 -150
- package/source/types/nodelist.mjs +94 -96
- package/source/types/noderecursiveiterator.mjs +50 -50
- package/source/types/observablequeue.mjs +73 -73
- package/source/types/observer.mjs +104 -104
- package/source/types/observerlist.mjs +66 -66
- package/source/types/proxyobserver.mjs +210 -210
- package/source/types/queue.mjs +63 -63
- package/source/types/randomid.mjs +13 -13
- package/source/types/regex.mjs +3 -1
- package/source/types/stack.mjs +64 -64
- package/source/types/tokenlist.mjs +206 -205
- package/source/types/typeof.mjs +12 -10
- package/source/types/uniquequeue.mjs +48 -48
- package/source/types/uuid.mjs +32 -32
- package/source/types/validate.mjs +67 -67
- package/source/types/version.mjs +115 -105
- package/source/util/clone.mjs +103 -91
- package/source/util/comparator.mjs +97 -97
- package/source/util/deadmansswitch.mjs +40 -44
- package/source/util/freeze.mjs +10 -9
- package/source/util/namespace.mjs +1 -1
- package/source/util/processing.mjs +104 -105
- package/source/util/runtime.mjs +56 -44
- package/source/util/trimspaces.mjs +24 -24
- package/test/cases/components/form/button.mjs +122 -0
- package/test/cases/components/form/confirm-button.mjs +127 -0
- package/test/cases/components/form/form.mjs +317 -0
- package/test/cases/components/form/reload.mjs +188 -0
- package/test/cases/components/form/select.mjs +229 -0
- package/test/cases/components/form/state-button.mjs +130 -0
- package/test/cases/components/form/tabs.mjs +98 -0
- package/test/cases/components/form/template.mjs +189 -0
- package/test/cases/components/form/tree-select.mjs +216 -0
- package/test/cases/components/host/details.mjs +68 -0
- package/test/cases/components/host/host.mjs +70 -0
- package/test/cases/components/host/overlay.mjs +60 -0
- package/test/cases/components/host/util.mjs +79 -0
- package/test/cases/components/notify/message.mjs +39 -0
- package/test/cases/components/notify/notify.mjs +89 -0
- package/test/cases/dom/customcontrol.mjs +5 -4
- package/test/cases/math/random.mjs +0 -1
- package/test/cases/monster.mjs +1 -1
- package/test/cases/net/webconnect/message.mjs +0 -1
- package/test/cases/types/node.mjs +1 -1
- package/test/util/chai-dom.mjs +2 -2
- package/test/util/intersection-mock.mjs +69 -0
- package/test/util/jsdom.mjs +41 -25
- package/test/util/localstorage.mjs +1 -0
- package/test/util/resize-observer.mjs +29 -0
- package/test/util/websocket.mjs +4 -1
- package/test/web/import.js +16 -1
- package/test/web/test.html +28 -5
- package/test/web/tests.js +30398 -17879
package/source/dom/updater.mjs
CHANGED
|
@@ -10,14 +10,14 @@ import { diff } from "../data/diff.mjs";
|
|
|
10
10
|
import { Pathfinder } from "../data/pathfinder.mjs";
|
|
11
11
|
import { Pipe } from "../data/pipe.mjs";
|
|
12
12
|
import {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
13
|
+
ATTRIBUTE_ERRORMESSAGE,
|
|
14
|
+
ATTRIBUTE_UPDATER_ATTRIBUTES,
|
|
15
|
+
ATTRIBUTE_UPDATER_BIND,
|
|
16
|
+
ATTRIBUTE_UPDATER_INSERT,
|
|
17
|
+
ATTRIBUTE_UPDATER_INSERT_REFERENCE,
|
|
18
|
+
ATTRIBUTE_UPDATER_REMOVE,
|
|
19
|
+
ATTRIBUTE_UPDATER_REPLACE,
|
|
20
|
+
ATTRIBUTE_UPDATER_SELECT_THIS,
|
|
21
21
|
} from "./constants.mjs";
|
|
22
22
|
|
|
23
23
|
import { Base } from "../types/base.mjs";
|
|
@@ -56,164 +56,174 @@ export { Updater, addObjectWithUpdaterToElement };
|
|
|
56
56
|
* @summary The updater class connects an object with the dom
|
|
57
57
|
*/
|
|
58
58
|
class Updater extends Base {
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
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
|
-
|
|
59
|
+
/**
|
|
60
|
+
* @since 1.8.0
|
|
61
|
+
* @param {HTMLElement} element
|
|
62
|
+
* @param {object|ProxyObserver|undefined} subject
|
|
63
|
+
* @throws {TypeError} value is not a object
|
|
64
|
+
* @throws {TypeError} value is not an instance of HTMLElement
|
|
65
|
+
* @see {@link Monster.DOM.findDocumentTemplate}
|
|
66
|
+
*/
|
|
67
|
+
constructor(element, subject) {
|
|
68
|
+
super();
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* @type {HTMLElement}
|
|
72
|
+
*/
|
|
73
|
+
if (subject === undefined) subject = {};
|
|
74
|
+
if (!isInstance(subject, ProxyObserver)) {
|
|
75
|
+
subject = new ProxyObserver(subject);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
this[internalSymbol] = {
|
|
79
|
+
element: validateInstance(element, HTMLElement),
|
|
80
|
+
last: {},
|
|
81
|
+
callbacks: new Map(),
|
|
82
|
+
eventTypes: ["keyup", "click", "change", "drop", "touchend", "input"],
|
|
83
|
+
subject: subject,
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
this[internalSymbol].callbacks.set(
|
|
87
|
+
"checkstate",
|
|
88
|
+
getCheckStateCallback.call(this),
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
this[internalSymbol].subject.attachObserver(
|
|
92
|
+
new Observer(() => {
|
|
93
|
+
const s = this[internalSymbol].subject.getRealSubject();
|
|
94
|
+
|
|
95
|
+
const diffResult = diff(this[internalSymbol].last, s);
|
|
96
|
+
this[internalSymbol].last = clone(s);
|
|
97
|
+
|
|
98
|
+
for (const [, change] of Object.entries(diffResult)) {
|
|
99
|
+
removeElement.call(this, change);
|
|
100
|
+
insertElement.call(this, change);
|
|
101
|
+
updateContent.call(this, change);
|
|
102
|
+
updateAttributes.call(this, change);
|
|
103
|
+
}
|
|
104
|
+
}),
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Defaults: 'keyup', 'click', 'change', 'drop', 'touchend'
|
|
110
|
+
*
|
|
111
|
+
* @see {@link https://developer.mozilla.org/de/docs/Web/Events}
|
|
112
|
+
* @since 1.9.0
|
|
113
|
+
* @param {Array} types
|
|
114
|
+
* @return {Updater}
|
|
115
|
+
*/
|
|
116
|
+
setEventTypes(types) {
|
|
117
|
+
this[internalSymbol].eventTypes = validateArray(types);
|
|
118
|
+
return this;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* With this method, the eventlisteners are hooked in and the magic begins.
|
|
123
|
+
*
|
|
124
|
+
* ```
|
|
125
|
+
* updater.run().then(() => {
|
|
126
|
+
* updater.enableEventProcessing();
|
|
127
|
+
* });
|
|
128
|
+
* ```
|
|
129
|
+
*
|
|
130
|
+
* @since 1.9.0
|
|
131
|
+
* @return {Updater}
|
|
132
|
+
* @throws {Error} the bind argument must start as a value with a path
|
|
133
|
+
*/
|
|
134
|
+
enableEventProcessing() {
|
|
135
|
+
this.disableEventProcessing();
|
|
136
|
+
|
|
137
|
+
for (const type of this[internalSymbol].eventTypes) {
|
|
138
|
+
// @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener
|
|
139
|
+
this[internalSymbol].element.addEventListener(
|
|
140
|
+
type,
|
|
141
|
+
getControlEventHandler.call(this),
|
|
142
|
+
{
|
|
143
|
+
capture: true,
|
|
144
|
+
passive: true,
|
|
145
|
+
},
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return this;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* This method turns off the magic or who loves it more profane it removes the eventListener.
|
|
154
|
+
*
|
|
155
|
+
* @since 1.9.0
|
|
156
|
+
* @return {Updater}
|
|
157
|
+
*/
|
|
158
|
+
disableEventProcessing() {
|
|
159
|
+
for (const type of this[internalSymbol].eventTypes) {
|
|
160
|
+
this[internalSymbol].element.removeEventListener(
|
|
161
|
+
type,
|
|
162
|
+
getControlEventHandler.call(this),
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return this;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* The run method must be called for the update to start working.
|
|
171
|
+
* The method ensures that changes are detected.
|
|
172
|
+
*
|
|
173
|
+
* ```
|
|
174
|
+
* updater.run().then(() => {
|
|
175
|
+
* updater.enableEventProcessing();
|
|
176
|
+
* });
|
|
177
|
+
* ```
|
|
178
|
+
*
|
|
179
|
+
* @summary Let the magic begin
|
|
180
|
+
* @return {Promise}
|
|
181
|
+
*/
|
|
182
|
+
run() {
|
|
183
|
+
// the key __init__has no further meaning and is only
|
|
184
|
+
// used to create the diff for empty objects.
|
|
185
|
+
this[internalSymbol].last = { __init__: true };
|
|
186
|
+
return this[internalSymbol].subject.notifyObservers();
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Gets the values of bound elements and changes them in subject
|
|
191
|
+
*
|
|
192
|
+
* @since 1.27.0
|
|
193
|
+
* @return {Monster.DOM.Updater}
|
|
194
|
+
*/
|
|
195
|
+
retrieve() {
|
|
196
|
+
retrieveFromBindings.call(this);
|
|
197
|
+
return this;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* If you have passed a ProxyObserver in the constructor, you will get the object that the ProxyObserver manages here.
|
|
202
|
+
* However, if you passed a simple object, here you will get a proxy for that object.
|
|
203
|
+
*
|
|
204
|
+
* For changes the ProxyObserver must be used.
|
|
205
|
+
*
|
|
206
|
+
* @since 1.8.0
|
|
207
|
+
* @return {Proxy}
|
|
208
|
+
*/
|
|
209
|
+
getSubject() {
|
|
210
|
+
return this[internalSymbol].subject.getSubject();
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* This method can be used to register commands that can be called via call: instruction.
|
|
215
|
+
* This can be used to provide a pipe with its own functionality.
|
|
216
|
+
*
|
|
217
|
+
* @param {string} name
|
|
218
|
+
* @param {function} callback
|
|
219
|
+
* @returns {Transformer}
|
|
220
|
+
* @throws {TypeError} value is not a string
|
|
221
|
+
* @throws {TypeError} value is not a function
|
|
222
|
+
*/
|
|
223
|
+
setCallback(name, callback) {
|
|
224
|
+
this[internalSymbol].callbacks.set(name, callback);
|
|
225
|
+
return this;
|
|
226
|
+
}
|
|
217
227
|
}
|
|
218
228
|
|
|
219
229
|
/**
|
|
@@ -224,22 +234,20 @@ class Updater extends Base {
|
|
|
224
234
|
* @this Updater
|
|
225
235
|
*/
|
|
226
236
|
function getCheckStateCallback() {
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
}
|
|
242
|
-
};
|
|
237
|
+
return function (current) {
|
|
238
|
+
// this is a reference to the current object (therefore no array function here)
|
|
239
|
+
if (this instanceof HTMLInputElement) {
|
|
240
|
+
if (["radio", "checkbox"].indexOf(this.type) !== -1) {
|
|
241
|
+
return `${this.value}` === `${current}` ? "true" : undefined;
|
|
242
|
+
}
|
|
243
|
+
} else if (this instanceof HTMLOptionElement) {
|
|
244
|
+
if (isArray(current) && current.indexOf(this.value) !== -1) {
|
|
245
|
+
return "true";
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
return undefined;
|
|
249
|
+
}
|
|
250
|
+
};
|
|
243
251
|
}
|
|
244
252
|
|
|
245
253
|
/**
|
|
@@ -254,28 +262,26 @@ const symbol = Symbol("@schukai/monster/updater@@EventHandler");
|
|
|
254
262
|
* @throws {Error} the bind argument must start as a value with a path
|
|
255
263
|
*/
|
|
256
264
|
function getControlEventHandler() {
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
return self[symbol];
|
|
265
|
+
if (this[symbol]) {
|
|
266
|
+
return this[symbol];
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* @throws {Error} the bind argument must start as a value with a path.
|
|
271
|
+
* @throws {Error} unsupported object
|
|
272
|
+
* @param {Event} event
|
|
273
|
+
*/
|
|
274
|
+
this[symbol] = (event) => {
|
|
275
|
+
const element = findTargetElementFromEvent(event, ATTRIBUTE_UPDATER_BIND);
|
|
276
|
+
|
|
277
|
+
if (element === undefined) {
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
retrieveAndSetValue.call(this, element);
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
return this[symbol];
|
|
279
285
|
}
|
|
280
286
|
|
|
281
287
|
/**
|
|
@@ -286,67 +292,70 @@ function getControlEventHandler() {
|
|
|
286
292
|
* @private
|
|
287
293
|
*/
|
|
288
294
|
function retrieveAndSetValue(element) {
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
295
|
+
const pathfinder = new Pathfinder(this[internalSymbol].subject.getSubject());
|
|
296
|
+
|
|
297
|
+
let path = element.getAttribute(ATTRIBUTE_UPDATER_BIND);
|
|
298
|
+
if (path === null)
|
|
299
|
+
throw new Error("the bind argument must start as a value with a path");
|
|
300
|
+
|
|
301
|
+
if (path.indexOf("path:") !== 0) {
|
|
302
|
+
throw new Error("the bind argument must start as a value with a path");
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
path = path.substring(5);
|
|
306
|
+
|
|
307
|
+
let value;
|
|
308
|
+
|
|
309
|
+
if (element instanceof HTMLInputElement) {
|
|
310
|
+
switch (element.type) {
|
|
311
|
+
case "checkbox":
|
|
312
|
+
value = element.checked ? element.value : undefined;
|
|
313
|
+
break;
|
|
314
|
+
default:
|
|
315
|
+
value = element.value;
|
|
316
|
+
break;
|
|
317
|
+
}
|
|
318
|
+
} else if (element instanceof HTMLTextAreaElement) {
|
|
319
|
+
value = element.value;
|
|
320
|
+
} else if (element instanceof HTMLSelectElement) {
|
|
321
|
+
switch (element.type) {
|
|
322
|
+
case "select-one":
|
|
323
|
+
value = element.value;
|
|
324
|
+
break;
|
|
325
|
+
case "select-multiple":
|
|
326
|
+
value = element.value;
|
|
327
|
+
|
|
328
|
+
let options = element?.selectedOptions;
|
|
329
|
+
if (options === undefined)
|
|
330
|
+
options = element.querySelectorAll(":scope option:checked");
|
|
331
|
+
value = Array.from(options).map(({ value }) => value);
|
|
332
|
+
|
|
333
|
+
break;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// values from customelements
|
|
337
|
+
} else if (
|
|
338
|
+
(element?.constructor?.prototype &&
|
|
339
|
+
!!Object.getOwnPropertyDescriptor(
|
|
340
|
+
element.constructor.prototype,
|
|
341
|
+
"value",
|
|
342
|
+
)?.["get"]) ||
|
|
343
|
+
element.hasOwnProperty("value")
|
|
344
|
+
) {
|
|
345
|
+
value = element?.["value"];
|
|
346
|
+
} else {
|
|
347
|
+
throw new Error("unsupported object");
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
const copy = clone(this[internalSymbol].subject.getRealSubject());
|
|
351
|
+
const pf = new Pathfinder(copy);
|
|
352
|
+
pf.setVia(path, value);
|
|
353
|
+
|
|
354
|
+
const diffResult = diff(copy, this[internalSymbol].subject.getRealSubject());
|
|
355
|
+
|
|
356
|
+
if (diffResult.length > 0) {
|
|
357
|
+
pathfinder.setVia(path, value);
|
|
358
|
+
}
|
|
350
359
|
}
|
|
351
360
|
|
|
352
361
|
/**
|
|
@@ -356,15 +365,15 @@ function retrieveAndSetValue(element) {
|
|
|
356
365
|
* @private
|
|
357
366
|
*/
|
|
358
367
|
function retrieveFromBindings() {
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
+
if (this[internalSymbol].element.matches(`[${ATTRIBUTE_UPDATER_BIND}]`)) {
|
|
369
|
+
retrieveAndSetValue.call(this, this[internalSymbol].element);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
for (const [, element] of this[internalSymbol].element
|
|
373
|
+
.querySelectorAll(`[${ATTRIBUTE_UPDATER_BIND}]`)
|
|
374
|
+
.entries()) {
|
|
375
|
+
retrieveAndSetValue.call(this, element);
|
|
376
|
+
}
|
|
368
377
|
}
|
|
369
378
|
|
|
370
379
|
/**
|
|
@@ -375,13 +384,11 @@ function retrieveFromBindings() {
|
|
|
375
384
|
* @return {void}
|
|
376
385
|
*/
|
|
377
386
|
function removeElement(change) {
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
element.parentNode.removeChild(element);
|
|
384
|
-
}
|
|
387
|
+
for (const [, element] of this[internalSymbol].element
|
|
388
|
+
.querySelectorAll(`:scope [${ATTRIBUTE_UPDATER_REMOVE}]`)
|
|
389
|
+
.entries()) {
|
|
390
|
+
element.parentNode.removeChild(element);
|
|
391
|
+
}
|
|
385
392
|
}
|
|
386
393
|
|
|
387
394
|
/**
|
|
@@ -397,124 +404,133 @@ function removeElement(change) {
|
|
|
397
404
|
* @this Updater
|
|
398
405
|
*/
|
|
399
406
|
function insertElement(change) {
|
|
400
|
-
|
|
401
|
-
const subject = self[internalSymbol].subject.getRealSubject();
|
|
407
|
+
const subject = this[internalSymbol].subject.getRealSubject();
|
|
402
408
|
|
|
403
|
-
|
|
404
|
-
|
|
409
|
+
const mem = new WeakSet();
|
|
410
|
+
let wd = 0;
|
|
405
411
|
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
while (true) {
|
|
409
|
-
let found = false;
|
|
410
|
-
wd++;
|
|
411
|
-
|
|
412
|
-
let p = clone(change?.["path"]);
|
|
413
|
-
if (!isArray(p)) return self;
|
|
412
|
+
const container = this[internalSymbol].element;
|
|
414
413
|
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
414
|
+
while (true) {
|
|
415
|
+
let found = false;
|
|
416
|
+
wd++;
|
|
417
|
+
|
|
418
|
+
const p = clone(change?.["path"]);
|
|
419
|
+
if (!isArray(p)) return this;
|
|
420
|
+
|
|
421
|
+
while (p.length > 0) {
|
|
422
|
+
const current = p.join(".");
|
|
423
|
+
|
|
424
|
+
let iterator = new Set();
|
|
425
|
+
const query = `[${ATTRIBUTE_UPDATER_INSERT}*="path:${current}"]`;
|
|
426
|
+
|
|
427
|
+
const e = container.querySelectorAll(query);
|
|
428
|
+
|
|
429
|
+
if (e.length > 0) {
|
|
430
|
+
iterator = new Set([...e]);
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
if (container.matches(query)) {
|
|
434
|
+
iterator.add(container);
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
for (const [, containerElement] of iterator.entries()) {
|
|
438
|
+
if (mem.has(containerElement)) continue;
|
|
439
|
+
mem.add(containerElement);
|
|
440
|
+
|
|
441
|
+
found = true;
|
|
442
|
+
|
|
443
|
+
const attributes = containerElement.getAttribute(
|
|
444
|
+
ATTRIBUTE_UPDATER_INSERT,
|
|
445
|
+
);
|
|
446
|
+
if (attributes === null) continue;
|
|
447
|
+
|
|
448
|
+
const def = trimSpaces(attributes);
|
|
449
|
+
const i = def.indexOf(" ");
|
|
450
|
+
const key = trimSpaces(def.substr(0, i));
|
|
451
|
+
const refPrefix = `${key}-`;
|
|
452
|
+
const cmd = trimSpaces(def.substr(i));
|
|
453
|
+
|
|
454
|
+
// this case is actually excluded by the query but is nevertheless checked again here
|
|
455
|
+
if (cmd.indexOf("|") > 0) {
|
|
456
|
+
throw new Error("pipes are not allowed when cloning a node.");
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
const pipe = new Pipe(cmd);
|
|
460
|
+
this[internalSymbol].callbacks.forEach((f, n) => {
|
|
461
|
+
pipe.setCallback(n, f);
|
|
462
|
+
});
|
|
463
|
+
|
|
464
|
+
let value;
|
|
465
|
+
try {
|
|
466
|
+
containerElement.removeAttribute(ATTRIBUTE_ERRORMESSAGE);
|
|
467
|
+
value = pipe.run(subject);
|
|
468
|
+
} catch (e) {
|
|
469
|
+
containerElement.setAttribute(ATTRIBUTE_ERRORMESSAGE, e.message);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
const dataPath = cmd.split(":").pop();
|
|
473
|
+
|
|
474
|
+
let insertPoint;
|
|
475
|
+
if (containerElement.hasChildNodes()) {
|
|
476
|
+
insertPoint = containerElement.lastChild;
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
if (!isIterable(value)) {
|
|
480
|
+
throw new Error("the value is not iterable");
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
const available = new Set();
|
|
484
|
+
|
|
485
|
+
for (const [i, obj] of Object.entries(value)) {
|
|
486
|
+
const ref = refPrefix + i;
|
|
487
|
+
const currentPath = `${dataPath}.${i}`;
|
|
488
|
+
|
|
489
|
+
available.add(ref);
|
|
490
|
+
const refElement = containerElement.querySelector(
|
|
491
|
+
`[${ATTRIBUTE_UPDATER_INSERT_REFERENCE}="${ref}"]`,
|
|
492
|
+
);
|
|
493
|
+
|
|
494
|
+
if (refElement instanceof HTMLElement) {
|
|
495
|
+
insertPoint = refElement;
|
|
496
|
+
continue;
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
appendNewDocumentFragment(containerElement, key, ref, currentPath);
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
const nodes = containerElement.querySelectorAll(
|
|
503
|
+
`[${ATTRIBUTE_UPDATER_INSERT_REFERENCE}*="${refPrefix}"]`,
|
|
504
|
+
);
|
|
505
|
+
|
|
506
|
+
for (const [, node] of Object.entries(nodes)) {
|
|
507
|
+
if (
|
|
508
|
+
!available.has(
|
|
509
|
+
node.getAttribute(ATTRIBUTE_UPDATER_INSERT_REFERENCE),
|
|
510
|
+
)
|
|
511
|
+
) {
|
|
512
|
+
try {
|
|
513
|
+
containerElement.removeChild(node);
|
|
514
|
+
} catch (e) {
|
|
515
|
+
containerElement.setAttribute(
|
|
516
|
+
ATTRIBUTE_ERRORMESSAGE,
|
|
517
|
+
`${containerElement.getAttribute(ATTRIBUTE_ERRORMESSAGE)}, ${
|
|
518
|
+
e.message
|
|
519
|
+
}`.trim(),
|
|
520
|
+
);
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
p.pop();
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
if (found === false) break;
|
|
530
|
+
if (wd++ > 200) {
|
|
531
|
+
throw new Error("the maximum depth for the recursion is reached.");
|
|
532
|
+
}
|
|
533
|
+
}
|
|
518
534
|
}
|
|
519
535
|
|
|
520
536
|
/**
|
|
@@ -529,17 +545,17 @@ function insertElement(change) {
|
|
|
529
545
|
* @throws {Error} no template was found with the specified key.
|
|
530
546
|
*/
|
|
531
547
|
function appendNewDocumentFragment(container, key, ref, path) {
|
|
532
|
-
|
|
548
|
+
const template = findDocumentTemplate(key, container);
|
|
533
549
|
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
550
|
+
const nodes = template.createDocumentFragment();
|
|
551
|
+
for (const [, node] of Object.entries(nodes.childNodes)) {
|
|
552
|
+
if (node instanceof HTMLElement) {
|
|
553
|
+
applyRecursive(node, key, path);
|
|
554
|
+
node.setAttribute(ATTRIBUTE_UPDATER_INSERT_REFERENCE, ref);
|
|
555
|
+
}
|
|
540
556
|
|
|
541
|
-
|
|
542
|
-
|
|
557
|
+
container.appendChild(node);
|
|
558
|
+
}
|
|
543
559
|
}
|
|
544
560
|
|
|
545
561
|
/**
|
|
@@ -552,21 +568,27 @@ function appendNewDocumentFragment(container, key, ref, path) {
|
|
|
552
568
|
* @return {void}
|
|
553
569
|
*/
|
|
554
570
|
function applyRecursive(node, key, path) {
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
571
|
+
if (node instanceof HTMLElement) {
|
|
572
|
+
if (node.hasAttribute(ATTRIBUTE_UPDATER_REPLACE)) {
|
|
573
|
+
const value = node.getAttribute(ATTRIBUTE_UPDATER_REPLACE);
|
|
574
|
+
node.setAttribute(
|
|
575
|
+
ATTRIBUTE_UPDATER_REPLACE,
|
|
576
|
+
value.replaceAll(`path:${key}`, `path:${path}`),
|
|
577
|
+
);
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
if (node.hasAttribute(ATTRIBUTE_UPDATER_ATTRIBUTES)) {
|
|
581
|
+
const value = node.getAttribute(ATTRIBUTE_UPDATER_ATTRIBUTES);
|
|
582
|
+
node.setAttribute(
|
|
583
|
+
ATTRIBUTE_UPDATER_ATTRIBUTES,
|
|
584
|
+
value.replaceAll(`path:${key}`, `path:${path}`),
|
|
585
|
+
);
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
for (const [, child] of Object.entries(node.childNodes)) {
|
|
589
|
+
applyRecursive(child, key, path);
|
|
590
|
+
}
|
|
591
|
+
}
|
|
570
592
|
}
|
|
571
593
|
|
|
572
594
|
/**
|
|
@@ -578,20 +600,19 @@ function applyRecursive(node, key, path) {
|
|
|
578
600
|
* @this Updater
|
|
579
601
|
*/
|
|
580
602
|
function updateContent(change) {
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
}
|
|
603
|
+
const subject = this[internalSymbol].subject.getRealSubject();
|
|
604
|
+
|
|
605
|
+
const p = clone(change?.["path"]);
|
|
606
|
+
runUpdateContent.call(this, this[internalSymbol].element, p, subject);
|
|
607
|
+
|
|
608
|
+
const slots = this[internalSymbol].element.querySelectorAll("slot");
|
|
609
|
+
if (slots.length > 0) {
|
|
610
|
+
for (const [, slot] of Object.entries(slots)) {
|
|
611
|
+
for (const [, element] of Object.entries(slot.assignedNodes())) {
|
|
612
|
+
runUpdateContent.call(this, element, p, subject);
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
}
|
|
595
616
|
}
|
|
596
617
|
|
|
597
618
|
/**
|
|
@@ -604,67 +625,69 @@ function updateContent(change) {
|
|
|
604
625
|
* @return {void}
|
|
605
626
|
*/
|
|
606
627
|
function runUpdateContent(container, parts, subject) {
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
628
|
+
if (!isArray(parts)) return;
|
|
629
|
+
if (!(container instanceof HTMLElement)) return;
|
|
630
|
+
parts = clone(parts);
|
|
631
|
+
|
|
632
|
+
const mem = new WeakSet();
|
|
633
|
+
|
|
634
|
+
while (parts.length > 0) {
|
|
635
|
+
const current = parts.join(".");
|
|
636
|
+
parts.pop();
|
|
637
|
+
|
|
638
|
+
// Unfortunately, static data is always changed as well, since it is not possible to react to changes here.
|
|
639
|
+
const query = `[${ATTRIBUTE_UPDATER_REPLACE}^="path:${current}"], [${ATTRIBUTE_UPDATER_REPLACE}^="static:"], [${ATTRIBUTE_UPDATER_REPLACE}^="i18n:"]`;
|
|
640
|
+
const e = container.querySelectorAll(`${query}`);
|
|
641
|
+
|
|
642
|
+
const iterator = new Set([...e]);
|
|
643
|
+
|
|
644
|
+
if (container.matches(query)) {
|
|
645
|
+
iterator.add(container);
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
/**
|
|
649
|
+
* @type {HTMLElement}
|
|
650
|
+
*/
|
|
651
|
+
for (const [element] of iterator.entries()) {
|
|
652
|
+
if (mem.has(element)) return;
|
|
653
|
+
mem.add(element);
|
|
654
|
+
|
|
655
|
+
const attributes = element.getAttribute(ATTRIBUTE_UPDATER_REPLACE);
|
|
656
|
+
const cmd = trimSpaces(attributes);
|
|
657
|
+
|
|
658
|
+
const pipe = new Pipe(cmd);
|
|
659
|
+
this[internalSymbol].callbacks.forEach((f, n) => {
|
|
660
|
+
pipe.setCallback(n, f);
|
|
661
|
+
});
|
|
662
|
+
|
|
663
|
+
let value;
|
|
664
|
+
try {
|
|
665
|
+
element.removeAttribute(ATTRIBUTE_ERRORMESSAGE);
|
|
666
|
+
value = pipe.run(subject);
|
|
667
|
+
} catch (e) {
|
|
668
|
+
element.setAttribute(ATTRIBUTE_ERRORMESSAGE, e.message);
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
if (value instanceof HTMLElement) {
|
|
672
|
+
while (element.firstChild) {
|
|
673
|
+
element.removeChild(element.firstChild);
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
try {
|
|
677
|
+
element.appendChild(value);
|
|
678
|
+
} catch (e) {
|
|
679
|
+
element.setAttribute(
|
|
680
|
+
ATTRIBUTE_ERRORMESSAGE,
|
|
681
|
+
`${element.getAttribute(ATTRIBUTE_ERRORMESSAGE)}, ${
|
|
682
|
+
e.message
|
|
683
|
+
}`.trim(),
|
|
684
|
+
);
|
|
685
|
+
}
|
|
686
|
+
} else {
|
|
687
|
+
element.innerHTML = value;
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
}
|
|
668
691
|
}
|
|
669
692
|
|
|
670
693
|
/**
|
|
@@ -676,9 +699,9 @@ function runUpdateContent(container, parts, subject) {
|
|
|
676
699
|
* @return {void}
|
|
677
700
|
*/
|
|
678
701
|
function updateAttributes(change) {
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
702
|
+
const subject = this[internalSymbol].subject.getRealSubject();
|
|
703
|
+
const p = clone(change?.["path"]);
|
|
704
|
+
runUpdateAttributes.call(this, this[internalSymbol].element, p, subject);
|
|
682
705
|
}
|
|
683
706
|
|
|
684
707
|
/**
|
|
@@ -690,72 +713,70 @@ function updateAttributes(change) {
|
|
|
690
713
|
* @this Updater
|
|
691
714
|
*/
|
|
692
715
|
function runUpdateAttributes(container, parts, subject) {
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
if (!isArray(parts)) return;
|
|
696
|
-
parts = clone(parts);
|
|
716
|
+
if (!isArray(parts)) return;
|
|
717
|
+
parts = clone(parts);
|
|
697
718
|
|
|
698
|
-
|
|
719
|
+
const mem = new WeakSet();
|
|
699
720
|
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
721
|
+
while (parts.length > 0) {
|
|
722
|
+
const current = parts.join(".");
|
|
723
|
+
parts.pop();
|
|
703
724
|
|
|
704
|
-
|
|
725
|
+
let iterator = new Set();
|
|
705
726
|
|
|
706
|
-
|
|
727
|
+
const query = `[${ATTRIBUTE_UPDATER_SELECT_THIS}][${ATTRIBUTE_UPDATER_ATTRIBUTES}], [${ATTRIBUTE_UPDATER_ATTRIBUTES}*="path:${current}"], [${ATTRIBUTE_UPDATER_ATTRIBUTES}^="static:"], [${ATTRIBUTE_UPDATER_ATTRIBUTES}^="i18n:"]`;
|
|
707
728
|
|
|
708
|
-
|
|
729
|
+
const e = container.querySelectorAll(query);
|
|
709
730
|
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
731
|
+
if (e.length > 0) {
|
|
732
|
+
iterator = new Set([...e]);
|
|
733
|
+
}
|
|
713
734
|
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
735
|
+
if (container.matches(query)) {
|
|
736
|
+
iterator.add(container);
|
|
737
|
+
}
|
|
717
738
|
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
739
|
+
for (const [element] of iterator.entries()) {
|
|
740
|
+
if (mem.has(element)) return;
|
|
741
|
+
mem.add(element);
|
|
721
742
|
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
743
|
+
// this case occurs when the ATTRIBUTE_UPDATER_SELECT_THIS attribute is set
|
|
744
|
+
if (!element.hasAttribute(ATTRIBUTE_UPDATER_ATTRIBUTES)) {
|
|
745
|
+
continue;
|
|
746
|
+
}
|
|
726
747
|
|
|
727
|
-
|
|
748
|
+
const attributes = element.getAttribute(ATTRIBUTE_UPDATER_ATTRIBUTES);
|
|
728
749
|
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
750
|
+
for (let [, def] of Object.entries(attributes.split(","))) {
|
|
751
|
+
def = trimSpaces(def);
|
|
752
|
+
const i = def.indexOf(" ");
|
|
753
|
+
const name = trimSpaces(def.substr(0, i));
|
|
754
|
+
const cmd = trimSpaces(def.substr(i));
|
|
734
755
|
|
|
735
|
-
|
|
756
|
+
const pipe = new Pipe(cmd);
|
|
736
757
|
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
758
|
+
this[internalSymbol].callbacks.forEach((f, n) => {
|
|
759
|
+
pipe.setCallback(n, f, element);
|
|
760
|
+
});
|
|
740
761
|
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
762
|
+
let value;
|
|
763
|
+
try {
|
|
764
|
+
element.removeAttribute(ATTRIBUTE_ERRORMESSAGE);
|
|
765
|
+
value = pipe.run(subject);
|
|
766
|
+
} catch (e) {
|
|
767
|
+
element.setAttribute(ATTRIBUTE_ERRORMESSAGE, e.message);
|
|
768
|
+
}
|
|
748
769
|
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
770
|
+
if (value === undefined) {
|
|
771
|
+
element.removeAttribute(name);
|
|
772
|
+
} else if (element.getAttribute(name) !== value) {
|
|
773
|
+
element.setAttribute(name, value);
|
|
774
|
+
}
|
|
754
775
|
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
776
|
+
handleInputControlAttributeUpdate.call(this, element, name, value);
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
}
|
|
759
780
|
}
|
|
760
781
|
|
|
761
782
|
/**
|
|
@@ -768,68 +789,66 @@ function runUpdateAttributes(container, parts, subject) {
|
|
|
768
789
|
*/
|
|
769
790
|
|
|
770
791
|
function handleInputControlAttributeUpdate(element, name, value) {
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
}
|
|
832
|
-
}
|
|
792
|
+
if (element instanceof HTMLSelectElement) {
|
|
793
|
+
switch (element.type) {
|
|
794
|
+
case "select-multiple":
|
|
795
|
+
for (const [index, opt] of Object.entries(element.options)) {
|
|
796
|
+
if (value.indexOf(opt.value) !== -1) {
|
|
797
|
+
opt.selected = true;
|
|
798
|
+
} else {
|
|
799
|
+
opt.selected = false;
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
break;
|
|
804
|
+
case "select-one":
|
|
805
|
+
// Only one value may be selected
|
|
806
|
+
|
|
807
|
+
for (const [index, opt] of Object.entries(element.options)) {
|
|
808
|
+
if (opt.value === value) {
|
|
809
|
+
element.selectedIndex = index;
|
|
810
|
+
break;
|
|
811
|
+
}
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
break;
|
|
815
|
+
}
|
|
816
|
+
} else if (element instanceof HTMLInputElement) {
|
|
817
|
+
switch (element.type) {
|
|
818
|
+
case "radio":
|
|
819
|
+
if (name === "checked") {
|
|
820
|
+
if (value !== undefined) {
|
|
821
|
+
element.checked = true;
|
|
822
|
+
} else {
|
|
823
|
+
element.checked = false;
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
break;
|
|
828
|
+
|
|
829
|
+
case "checkbox":
|
|
830
|
+
if (name === "checked") {
|
|
831
|
+
if (value !== undefined) {
|
|
832
|
+
element.checked = true;
|
|
833
|
+
} else {
|
|
834
|
+
element.checked = false;
|
|
835
|
+
}
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
break;
|
|
839
|
+
case "text":
|
|
840
|
+
default:
|
|
841
|
+
if (name === "value") {
|
|
842
|
+
element.value = value === undefined ? "" : value;
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
break;
|
|
846
|
+
}
|
|
847
|
+
} else if (element instanceof HTMLTextAreaElement) {
|
|
848
|
+
if (name === "value") {
|
|
849
|
+
element.value = value === undefined ? "" : value;
|
|
850
|
+
}
|
|
851
|
+
}
|
|
833
852
|
}
|
|
834
853
|
|
|
835
854
|
/**
|
|
@@ -845,45 +864,48 @@ function handleInputControlAttributeUpdate(element, name, value) {
|
|
|
845
864
|
* @throws {TypeError} symbol must be an instance of Symbol
|
|
846
865
|
*/
|
|
847
866
|
function addObjectWithUpdaterToElement(elements, symbol, object) {
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
867
|
+
if (!(this instanceof HTMLElement)) {
|
|
868
|
+
throw new TypeError(
|
|
869
|
+
"the context of this function must be an instance of HTMLElement",
|
|
870
|
+
);
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
if (!(typeof symbol === "symbol")) {
|
|
874
|
+
throw new TypeError("symbol must be an instance of Symbol");
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
const updaters = new Set();
|
|
878
|
+
|
|
879
|
+
if (elements instanceof NodeList) {
|
|
880
|
+
elements = new Set([...elements]);
|
|
881
|
+
} else if (elements instanceof HTMLElement) {
|
|
882
|
+
elements = new Set([elements]);
|
|
883
|
+
} else if (elements instanceof Set) {
|
|
884
|
+
} else {
|
|
885
|
+
throw new TypeError(
|
|
886
|
+
`elements is not a valid type. (actual: ${typeof elements})`,
|
|
887
|
+
);
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
const result = [];
|
|
891
|
+
|
|
892
|
+
elements.forEach((element) => {
|
|
893
|
+
if (!(element instanceof HTMLElement)) return;
|
|
894
|
+
if (element instanceof HTMLTemplateElement) return;
|
|
895
|
+
|
|
896
|
+
const u = new Updater(element, object);
|
|
897
|
+
updaters.add(u);
|
|
898
|
+
|
|
899
|
+
result.push(
|
|
900
|
+
u.run().then(() => {
|
|
901
|
+
return u.enableEventProcessing();
|
|
902
|
+
}),
|
|
903
|
+
);
|
|
904
|
+
});
|
|
905
|
+
|
|
906
|
+
if (updaters.size > 0) {
|
|
907
|
+
addToObjectLink(this, symbol, updaters);
|
|
908
|
+
}
|
|
909
|
+
|
|
910
|
+
return result;
|
|
889
911
|
}
|