stimulus-library 0.6.5 → 0.7.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 +22 -0
- package/dist/controllers/ajax/async_block_controller.d.ts +17 -17
- package/dist/controllers/ajax/index.d.ts +4 -4
- package/dist/controllers/ajax/lazy_block_controller.d.ts +9 -9
- package/dist/controllers/ajax/load_block_controller.d.ts +23 -23
- package/dist/controllers/ajax/poll_block_controller.d.ts +15 -15
- package/dist/controllers/anchor_spy_controller.d.ts +20 -20
- package/dist/controllers/back_link_controller.d.ts +16 -16
- package/dist/controllers/clipboard_controller.d.ts +18 -18
- package/dist/controllers/confirm_controller.d.ts +12 -12
- package/dist/controllers/confirm_navigation_controller.d.ts +14 -14
- package/dist/controllers/debug_controller.d.ts +6 -6
- package/dist/controllers/disable_with_controller.d.ts +19 -22
- package/dist/controllers/disable_with_controller.d.ts.map +1 -1
- package/dist/controllers/dismissable_controller.d.ts +6 -6
- package/dist/controllers/element_save_controller.d.ts +30 -25
- package/dist/controllers/element_save_controller.d.ts.map +1 -1
- package/dist/controllers/empty_dom_controller.d.ts +21 -21
- package/dist/controllers/forms/auto_submit_form_controller.d.ts +22 -21
- package/dist/controllers/forms/auto_submit_form_controller.d.ts.map +1 -1
- package/dist/controllers/forms/autosize_controller.d.ts +8 -8
- package/dist/controllers/forms/char_count_controller.d.ts +20 -20
- package/dist/controllers/forms/checkbox_disable_inputs_controller.d.ts +16 -16
- package/dist/controllers/forms/checkbox_enable_inputs_controller.d.ts +16 -16
- package/dist/controllers/forms/checkbox_select_all_controller.d.ts +13 -13
- package/dist/controllers/forms/checkbox_xor_controller.d.ts +8 -8
- package/dist/controllers/forms/detect_dirty_controller.d.ts +14 -14
- package/dist/controllers/forms/detect_dirty_form_controller.d.ts +17 -17
- package/dist/controllers/forms/enable_inputs_controller.d.ts +13 -13
- package/dist/controllers/forms/focus_steal_controller.d.ts +11 -11
- package/dist/controllers/forms/form_rc_controller.d.ts +17 -17
- package/dist/controllers/forms/form_save_controller.d.ts +31 -31
- package/dist/controllers/forms/index.d.ts +22 -22
- package/dist/controllers/forms/limited_selection_checkboxes_controller.d.ts +16 -16
- package/dist/controllers/forms/navigate_form_errors_controller.d.ts +40 -40
- package/dist/controllers/forms/nested_form_controller.d.ts +21 -21
- package/dist/controllers/forms/password_confirm_controller.d.ts +11 -11
- package/dist/controllers/forms/password_peek_controller.d.ts +8 -8
- package/dist/controllers/forms/remote_form_controller.d.ts +13 -13
- package/dist/controllers/forms/sync_inputs_controller.d.ts +19 -19
- package/dist/controllers/forms/value_warn_controller.d.ts +30 -30
- package/dist/controllers/forms/word_count_controller.d.ts +20 -20
- package/dist/controllers/index.d.ts +29 -29
- package/dist/controllers/media/fallback_image_controller.d.ts +19 -19
- package/dist/controllers/media/index.d.ts +3 -3
- package/dist/controllers/media/lightbox_image_controller.d.ts +30 -30
- package/dist/controllers/media/media_player_controller.d.ts +9 -9
- package/dist/controllers/prefetch_controller.d.ts +16 -16
- package/dist/controllers/prefetch_controller.d.ts.map +1 -1
- package/dist/controllers/print_button_controller.d.ts +7 -7
- package/dist/controllers/responsive_iframe_controller.d.ts +16 -16
- package/dist/controllers/scroll/index.d.ts +5 -5
- package/dist/controllers/scroll/scroll_container_controller.d.ts +21 -21
- package/dist/controllers/scroll/scroll_into_focus_controller.d.ts +15 -15
- package/dist/controllers/scroll/scroll_to_bottom_controller.d.ts +11 -11
- package/dist/controllers/scroll/scroll_to_controller.d.ts +17 -17
- package/dist/controllers/scroll/scroll_to_top_controller.d.ts +11 -11
- package/dist/controllers/self_destruct_controller.d.ts +8 -8
- package/dist/controllers/signal/events.d.ts +3 -3
- package/dist/controllers/signal/expressions.d.ts +1 -1
- package/dist/controllers/signal/index.d.ts +3 -3
- package/dist/controllers/signal/signal_action_controller.d.ts +14 -14
- package/dist/controllers/signal/signal_input_controller.d.ts +19 -19
- package/dist/controllers/signal/signal_visibility_controller.d.ts +17 -17
- package/dist/controllers/sticky_controller.d.ts +15 -15
- package/dist/controllers/tables/index.d.ts +2 -2
- package/dist/controllers/tables/table_sort_controller.d.ts +19 -19
- package/dist/controllers/tables/table_truncate_controller.d.ts +25 -25
- package/dist/controllers/teleport_controller.d.ts +15 -15
- package/dist/controllers/temporary_state_controller.d.ts +26 -26
- package/dist/controllers/toggle_class_controller.d.ts +35 -35
- package/dist/controllers/trix_modifier_controller.d.ts +87 -87
- package/dist/controllers/turbo_frame_rc_controller.d.ts +20 -20
- package/dist/controllers/turbo_frame_refresh_controller.d.ts +13 -13
- package/dist/controllers/utility/alert_controller.d.ts +8 -8
- package/dist/controllers/utility/fullscreen_controller.d.ts +7 -7
- package/dist/controllers/utility/index.d.ts +8 -8
- package/dist/controllers/utility/intersection_controller.d.ts +13 -13
- package/dist/controllers/utility/intersection_controller.d.ts.map +1 -1
- package/dist/controllers/utility/interval_controller.d.ts +10 -10
- package/dist/controllers/utility/presence_controller.d.ts +13 -13
- package/dist/controllers/utility/print_controller.d.ts +4 -4
- package/dist/controllers/utility/timeout_controller.d.ts +9 -9
- package/dist/controllers/utility/user_focus_controller.d.ts +8 -8
- package/dist/controllers/visual/clock_controller.d.ts +15 -15
- package/dist/controllers/visual/countdown_controller.d.ts +45 -45
- package/dist/controllers/visual/duration_controller.d.ts +25 -25
- package/dist/controllers/visual/index.d.ts +6 -6
- package/dist/controllers/visual/tabs_controller.d.ts +29 -29
- package/dist/controllers/visual/time_distance_controller.d.ts +15 -15
- package/dist/controllers/visual/tree_view_controller.d.ts +25 -25
- package/dist/controllers/visual/tree_view_controller.d.ts.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/mixins/create_mixin.d.ts +2 -2
- package/dist/mixins/index.d.ts +8 -7
- package/dist/mixins/index.d.ts.map +1 -1
- package/dist/mixins/install_class_methods.d.ts +5 -5
- package/dist/mixins/install_class_methods.d.ts.map +1 -1
- package/dist/mixins/use_click_outside.d.ts +4 -4
- package/dist/mixins/use_event_bus.d.ts +7 -7
- package/dist/mixins/use_event_listener.d.ts +19 -19
- package/dist/mixins/use_fullscreen.d.ts +8 -8
- package/dist/mixins/use_geolocation.d.ts +18 -18
- package/dist/mixins/use_hover.d.ts +4 -4
- package/dist/mixins/use_injected_html.d.ts +10 -10
- package/dist/mixins/use_intersection.d.ts +13 -13
- package/dist/mixins/use_interval.d.ts +2 -2
- package/dist/mixins/use_localstorage.d.ts +20 -14
- package/dist/mixins/use_localstorage.d.ts.map +1 -1
- package/dist/mixins/use_mutation_observer.d.ts +2 -2
- package/dist/mixins/use_temporary_content.d.ts +6 -0
- package/dist/mixins/use_temporary_content.d.ts.map +1 -0
- package/dist/mixins/use_timeout.d.ts +2 -2
- package/dist/mixins/use_trix_modifiers.d.ts +10 -10
- package/dist/stimulus-library.cjs.js +1 -1
- package/dist/stimulus-library.cjs.js.map +1 -1
- package/dist/stimulus-library.es.js +300 -225
- package/dist/stimulus-library.es.js.map +1 -1
- package/dist/stimulus-library.umd.js +1 -1
- package/dist/stimulus-library.umd.js.map +1 -1
- package/dist/utilities/arrays.d.ts +1 -1
- package/dist/utilities/base_controller.d.ts +10 -13
- package/dist/utilities/base_controller.d.ts.map +1 -1
- package/dist/utilities/elements.d.ts +48 -20
- package/dist/utilities/elements.d.ts.map +1 -1
- package/dist/utilities/ephemeral_controller.d.ts +5 -5
- package/dist/utilities/event_bus.d.ts +3 -3
- package/dist/utilities/events.d.ts +3 -0
- package/dist/utilities/events.d.ts.map +1 -0
- package/dist/utilities/fetchRetry.d.ts +1 -1
- package/dist/utilities/index.d.ts +7 -7
- package/dist/utilities/logging.d.ts +6 -0
- package/dist/utilities/logging.d.ts.map +1 -0
- package/dist/utilities/reactive.d.ts +1 -1
- package/dist/utilities/request_submit.d.ts +2 -2
- package/dist/utilities/scroll.d.ts +10 -10
- package/dist/utilities/stimulus.d.ts +2 -2
- package/dist/utilities/strings.d.ts +1 -1
- package/dist/utilities/turbo.d.ts +1 -1
- package/package.json +3 -3
|
@@ -21,6 +21,78 @@ var __publicField = (obj, key, value) => {
|
|
|
21
21
|
import { Controller } from "stimulus";
|
|
22
22
|
import { camelCase, debounce, upperFirst, clamp, get, set } from "lodash-es";
|
|
23
23
|
import { isPast, intervalToDuration, formatDuration, toDate, formatDistanceToNow } from "date-fns";
|
|
24
|
+
function logProperty(prop) {
|
|
25
|
+
switch (prop) {
|
|
26
|
+
case "application":
|
|
27
|
+
case "el":
|
|
28
|
+
case "element":
|
|
29
|
+
case "constructor":
|
|
30
|
+
case "initialize":
|
|
31
|
+
case "log":
|
|
32
|
+
case "logEvent":
|
|
33
|
+
case "dispatch":
|
|
34
|
+
case "data":
|
|
35
|
+
case "valueDescriptorMap":
|
|
36
|
+
case "mutate":
|
|
37
|
+
case "identifier":
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
if (/^_.*?$/.test(prop)) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
if (/^.*?Target(s)?$/.test(prop)) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
if (/^.*?Value$/.test(prop)) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
if (/^.*?ValueChanged$/.test(prop)) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
if (/^.*?Class$/.test(prop)) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
if (/^.*?Classes$/.test(prop)) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
if (/^.*?ClassesPresent$/.test(prop)) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
function log(controller, functionName, args = {}) {
|
|
64
|
+
if (!controller.application.debug) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
let logger = console;
|
|
68
|
+
logger.groupCollapsed(`%c${controller.identifier} %c#${functionName}`, "color: #3B82F6", "color: unset");
|
|
69
|
+
logger.log(__spreadValues({
|
|
70
|
+
element: controller.element,
|
|
71
|
+
controller
|
|
72
|
+
}, args));
|
|
73
|
+
logger.groupEnd();
|
|
74
|
+
}
|
|
75
|
+
function warn(controller, warning, args = {}) {
|
|
76
|
+
if (!controller.application.debug) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
let logger = console;
|
|
80
|
+
logger.groupCollapsed(`%c${controller.identifier} %c#${warning}`, "color: F39B1AFF", "color: unset");
|
|
81
|
+
logger.warn(__spreadValues({
|
|
82
|
+
element: controller.element,
|
|
83
|
+
controller
|
|
84
|
+
}, args));
|
|
85
|
+
logger.groupEnd();
|
|
86
|
+
}
|
|
87
|
+
function logEvent(controller, eventName, event, element) {
|
|
88
|
+
if (!controller.application.debug) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
let logger = console;
|
|
92
|
+
logger.groupCollapsed(`%c${controller.identifier} %c${eventName}%c`, "color: #3B82F6", "color: #0be000", "color: unset");
|
|
93
|
+
logger.log({ element });
|
|
94
|
+
logger.groupEnd();
|
|
95
|
+
}
|
|
24
96
|
class BaseController extends Controller {
|
|
25
97
|
constructor(context) {
|
|
26
98
|
super(context);
|
|
@@ -35,14 +107,14 @@ class BaseController extends Controller {
|
|
|
35
107
|
if (typeof returnVal == "function") {
|
|
36
108
|
return new Proxy(returnVal, {
|
|
37
109
|
apply(target, thisArg, argArray) {
|
|
38
|
-
|
|
110
|
+
log(self, prop.toString(), {
|
|
39
111
|
args: argArray
|
|
40
112
|
});
|
|
41
113
|
return Reflect.apply(target, thisArg, argArray);
|
|
42
114
|
}
|
|
43
115
|
});
|
|
44
116
|
} else {
|
|
45
|
-
|
|
117
|
+
log(this, prop.toString());
|
|
46
118
|
}
|
|
47
119
|
}
|
|
48
120
|
return returnVal;
|
|
@@ -65,87 +137,9 @@ class BaseController extends Controller {
|
|
|
65
137
|
const element = document.head.querySelector(`meta[name="${name}"]`);
|
|
66
138
|
return (element == null ? void 0 : element.getAttribute("content")) || null;
|
|
67
139
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
if (!!mergedOptions.detail.target) {
|
|
71
|
-
mergedOptions.detail.target = element;
|
|
72
|
-
}
|
|
73
|
-
let event = new CustomEvent(eventName, mergedOptions);
|
|
74
|
-
this.logEvent(eventName, event, element);
|
|
75
|
-
element.dispatchEvent(event);
|
|
76
|
-
}
|
|
77
|
-
log(functionName, args = {}) {
|
|
78
|
-
if (!this.application.debug) {
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
let logger = console;
|
|
82
|
-
logger.groupCollapsed(`%c${this.identifier} %c#${functionName}`, "color: #3B82F6", "color: unset");
|
|
83
|
-
logger.log(__spreadValues({
|
|
84
|
-
element: this.element,
|
|
85
|
-
controller: this
|
|
86
|
-
}, args));
|
|
87
|
-
logger.groupEnd();
|
|
88
|
-
}
|
|
89
|
-
warn(warning, args = {}) {
|
|
90
|
-
if (!this.application.debug) {
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
let logger = console;
|
|
94
|
-
logger.groupCollapsed(`%c${this.identifier} %c#${warning}`, "color: F39B1AFF", "color: unset");
|
|
95
|
-
logger.warn(__spreadValues({
|
|
96
|
-
element: this.element,
|
|
97
|
-
controller: this
|
|
98
|
-
}, args));
|
|
99
|
-
logger.groupEnd();
|
|
100
|
-
}
|
|
101
|
-
logEvent(eventName, event, element) {
|
|
102
|
-
if (!this.application.debug) {
|
|
103
|
-
return;
|
|
104
|
-
}
|
|
105
|
-
let logger = console;
|
|
106
|
-
logger.groupCollapsed(`%c${this.identifier} %c${eventName}%c`, "color: #3B82F6", "color: #0be000", "color: unset");
|
|
107
|
-
logger.log({ element });
|
|
108
|
-
logger.groupEnd();
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
function logProperty(prop) {
|
|
112
|
-
switch (prop) {
|
|
113
|
-
case "application":
|
|
114
|
-
case "el":
|
|
115
|
-
case "element":
|
|
116
|
-
case "constructor":
|
|
117
|
-
case "initialize":
|
|
118
|
-
case "log":
|
|
119
|
-
case "logEvent":
|
|
120
|
-
case "dispatch":
|
|
121
|
-
case "data":
|
|
122
|
-
case "valueDescriptorMap":
|
|
123
|
-
case "mutate":
|
|
124
|
-
case "identifier":
|
|
125
|
-
return false;
|
|
126
|
-
}
|
|
127
|
-
if (/^_.*?$/.test(prop)) {
|
|
128
|
-
return false;
|
|
129
|
-
}
|
|
130
|
-
if (/^.*?Target(s)?$/.test(prop)) {
|
|
131
|
-
return false;
|
|
132
|
-
}
|
|
133
|
-
if (/^.*?Value$/.test(prop)) {
|
|
134
|
-
return false;
|
|
135
|
-
}
|
|
136
|
-
if (/^.*?ValueChanged$/.test(prop)) {
|
|
137
|
-
return false;
|
|
138
|
-
}
|
|
139
|
-
if (/^.*?Class$/.test(prop)) {
|
|
140
|
-
return false;
|
|
141
|
-
}
|
|
142
|
-
if (/^.*?Classes$/.test(prop)) {
|
|
143
|
-
return false;
|
|
144
|
-
}
|
|
145
|
-
if (/^.*?ClassesPresent$/.test(prop)) {
|
|
146
|
-
return false;
|
|
140
|
+
dispatchEvent(element, eventName, options = {}) {
|
|
141
|
+
this.dispatchEvent(element, eventName, options);
|
|
147
142
|
}
|
|
148
|
-
return true;
|
|
149
143
|
}
|
|
150
144
|
class EphemeralController extends BaseController {
|
|
151
145
|
_cleanupSelf() {
|
|
@@ -299,6 +293,9 @@ function isHTMLFormElement(element) {
|
|
|
299
293
|
function isHTMLInputElement(element) {
|
|
300
294
|
return element.nodeName == "INPUT";
|
|
301
295
|
}
|
|
296
|
+
function isHTMLLabelElement(element) {
|
|
297
|
+
return element.nodeName == "LABEL";
|
|
298
|
+
}
|
|
302
299
|
function isHTMLTextAreaElement(element) {
|
|
303
300
|
return element.nodeName == "TEXTAREA";
|
|
304
301
|
}
|
|
@@ -311,6 +308,33 @@ function isHTMLSelectElement(element) {
|
|
|
311
308
|
function isHTMLImageElement(element) {
|
|
312
309
|
return element.nodeName == "IMG";
|
|
313
310
|
}
|
|
311
|
+
function isHTMLButtonInputElement(element) {
|
|
312
|
+
return element.nodeName == "INPUT" && element.type == "button";
|
|
313
|
+
}
|
|
314
|
+
function isHTMLSubmitInputElement(element) {
|
|
315
|
+
return element.nodeName == "INPUT" && element.type == "submit";
|
|
316
|
+
}
|
|
317
|
+
function isHTMLResetInputElement(element) {
|
|
318
|
+
return element.nodeName == "INPUT" && element.type == "reset";
|
|
319
|
+
}
|
|
320
|
+
function isHTMLButtonButtonElement(element) {
|
|
321
|
+
return element.nodeName == "BUTTON" && element.type == "button";
|
|
322
|
+
}
|
|
323
|
+
function isHTMLSubmitButtonElement(element) {
|
|
324
|
+
return element.nodeName == "BUTTON" && element.type == "submit";
|
|
325
|
+
}
|
|
326
|
+
function isHTMLResetButtonElement(element) {
|
|
327
|
+
return element.nodeName == "BUTTON" && element.type == "reset";
|
|
328
|
+
}
|
|
329
|
+
function isTypeOfResetButtonElement(element) {
|
|
330
|
+
return isHTMLResetButtonElement(element) || isHTMLResetInputElement(element);
|
|
331
|
+
}
|
|
332
|
+
function isTypeOfSubmitButtonElement(element) {
|
|
333
|
+
return isHTMLSubmitButtonElement(element) || isHTMLSubmitInputElement(element);
|
|
334
|
+
}
|
|
335
|
+
function isTypeOfButtonableElement(element) {
|
|
336
|
+
return isTypeOfResetButtonElement(element) || isTypeOfSubmitButtonElement(element) || isHTMLButtonButtonElement(element);
|
|
337
|
+
}
|
|
314
338
|
function isElementCheckable(element) {
|
|
315
339
|
return isHTMLInputElement(element) && (element.type === "radio" || element.type === "checkbox");
|
|
316
340
|
}
|
|
@@ -566,109 +590,130 @@ function useInjectedElement(controller, targetElement, insertPosition, element,
|
|
|
566
590
|
let [nodes, teardown] = useInjectedFragment(controller, targetElement, insertPosition, fragment, options);
|
|
567
591
|
return [nodes[0], teardown];
|
|
568
592
|
}
|
|
593
|
+
function useInterval(controller, handler, interval) {
|
|
594
|
+
handler = handler.bind(controller);
|
|
595
|
+
let intervalHandle = null;
|
|
596
|
+
let setup = () => intervalHandle = setInterval(handler, interval);
|
|
597
|
+
let teardown = () => {
|
|
598
|
+
if (intervalHandle !== null) {
|
|
599
|
+
clearInterval(intervalHandle);
|
|
600
|
+
}
|
|
601
|
+
};
|
|
602
|
+
useMixin(controller, setup, teardown);
|
|
603
|
+
return teardown;
|
|
604
|
+
}
|
|
569
605
|
const StorageSerializers = {
|
|
570
606
|
boolean: {
|
|
571
|
-
|
|
572
|
-
|
|
607
|
+
deserialize: (v) => v === "true",
|
|
608
|
+
serialize: (v) => String(v),
|
|
609
|
+
isEmpty: (v) => v === "" || v === null
|
|
573
610
|
},
|
|
574
611
|
object: {
|
|
575
|
-
|
|
576
|
-
|
|
612
|
+
deserialize: (v) => JSON.parse(v),
|
|
613
|
+
serialize: (v) => JSON.stringify(v),
|
|
614
|
+
isEmpty: (v) => {
|
|
615
|
+
const values = Object.values(JSON.parse(v));
|
|
616
|
+
return values.length === 0 || values.every((v2) => v2 === "" || v2 === null);
|
|
617
|
+
}
|
|
577
618
|
},
|
|
578
619
|
number: {
|
|
579
|
-
|
|
580
|
-
|
|
620
|
+
deserialize: (v) => Number.parseFloat(v),
|
|
621
|
+
serialize: (v) => String(v),
|
|
622
|
+
isEmpty: (v) => v === "" || v === null
|
|
581
623
|
},
|
|
582
624
|
any: {
|
|
583
|
-
|
|
584
|
-
|
|
625
|
+
deserialize: (v) => v,
|
|
626
|
+
serialize: (v) => String(v),
|
|
627
|
+
isEmpty: (v) => v === "" || v === null
|
|
585
628
|
},
|
|
586
629
|
string: {
|
|
587
|
-
|
|
588
|
-
|
|
630
|
+
deserialize: (v) => v,
|
|
631
|
+
serialize: (v) => String(v),
|
|
632
|
+
isEmpty: (v) => v === "" || v === null
|
|
589
633
|
},
|
|
590
634
|
map: {
|
|
591
|
-
|
|
592
|
-
|
|
635
|
+
deserialize: (v) => new Map(JSON.parse(v)),
|
|
636
|
+
serialize: (v) => JSON.stringify(Array.from(v.entries())),
|
|
637
|
+
isEmpty: (v) => {
|
|
638
|
+
const values = Array.from(v.values());
|
|
639
|
+
return values.length === 0 || values.every((v2) => v2 === "" || v2 === null);
|
|
640
|
+
}
|
|
593
641
|
},
|
|
594
642
|
set: {
|
|
595
|
-
|
|
596
|
-
|
|
643
|
+
deserialize: (v) => new Set(JSON.parse(v)),
|
|
644
|
+
serialize: (v) => JSON.stringify(Array.from(v.entries())),
|
|
645
|
+
isEmpty: (v) => {
|
|
646
|
+
const values = Array.from(v.values());
|
|
647
|
+
return values.length === 0 || values.every((v2) => v2 === "" || v2 === null);
|
|
648
|
+
}
|
|
597
649
|
}
|
|
598
650
|
};
|
|
599
|
-
function useLocalStorage(controller, key, defaultValue, opts) {
|
|
600
|
-
let type
|
|
651
|
+
function useLocalStorage(controller, key, defaultValue, opts = { writeDefaults: true }) {
|
|
652
|
+
let type;
|
|
601
653
|
let { writeDefaults } = opts;
|
|
602
654
|
if (defaultValue == null) {
|
|
603
655
|
type = "any";
|
|
604
|
-
}
|
|
605
|
-
if (defaultValue instanceof Set) {
|
|
656
|
+
} else if (defaultValue instanceof Set) {
|
|
606
657
|
type = "set";
|
|
607
|
-
}
|
|
608
|
-
if (defaultValue instanceof Map) {
|
|
658
|
+
} else if (defaultValue instanceof Map) {
|
|
609
659
|
type = "map";
|
|
610
|
-
}
|
|
611
|
-
if (typeof defaultValue === "boolean") {
|
|
660
|
+
} else if (typeof defaultValue === "boolean") {
|
|
612
661
|
type = "boolean";
|
|
613
|
-
}
|
|
614
|
-
if (typeof defaultValue === "string") {
|
|
662
|
+
} else if (typeof defaultValue === "string") {
|
|
615
663
|
type = "string";
|
|
616
|
-
}
|
|
617
|
-
if (typeof defaultValue === "object") {
|
|
664
|
+
} else if (typeof defaultValue === "object") {
|
|
618
665
|
type = "object";
|
|
619
|
-
}
|
|
620
|
-
if (Array.isArray(defaultValue)) {
|
|
666
|
+
} else if (Array.isArray(defaultValue)) {
|
|
621
667
|
type = "object";
|
|
622
|
-
}
|
|
623
|
-
if (!Number.isNaN(defaultValue)) {
|
|
668
|
+
} else if (!Number.isNaN(defaultValue)) {
|
|
624
669
|
type = "number";
|
|
670
|
+
} else {
|
|
671
|
+
type = "any";
|
|
625
672
|
}
|
|
626
673
|
let data = reactive({
|
|
627
674
|
value: defaultValue
|
|
628
675
|
});
|
|
629
676
|
let storage = localStorage;
|
|
630
677
|
const serializer = StorageSerializers[type];
|
|
631
|
-
const read = (
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
if (rawValue == null) {
|
|
638
|
-
data.value = defaultValue;
|
|
639
|
-
if (writeDefaults && defaultValue !== null) {
|
|
640
|
-
storage.setItem(key, serializer.write(defaultValue));
|
|
641
|
-
}
|
|
642
|
-
} else {
|
|
643
|
-
data.value = serializer.read(rawValue);
|
|
678
|
+
const read = () => {
|
|
679
|
+
const rawValue = storage.getItem(key);
|
|
680
|
+
if (rawValue == null) {
|
|
681
|
+
data.value = defaultValue;
|
|
682
|
+
if (writeDefaults && defaultValue !== null) {
|
|
683
|
+
storage.setItem(key, serializer.serialize(defaultValue));
|
|
644
684
|
}
|
|
645
|
-
}
|
|
685
|
+
} else {
|
|
686
|
+
data.value = serializer.deserialize(rawValue);
|
|
646
687
|
}
|
|
688
|
+
return data.value;
|
|
689
|
+
};
|
|
690
|
+
const write = (value) => {
|
|
691
|
+
storage.setItem(key, serializer.serialize(value));
|
|
692
|
+
data.value = value;
|
|
693
|
+
};
|
|
694
|
+
const clear = () => {
|
|
695
|
+
storage.removeItem(key);
|
|
696
|
+
data.value = defaultValue;
|
|
697
|
+
return data.value;
|
|
698
|
+
};
|
|
699
|
+
const isEmpty = () => {
|
|
700
|
+
let rawValue = storage.getItem(key);
|
|
701
|
+
return serializer.isEmpty(rawValue);
|
|
647
702
|
};
|
|
648
703
|
read();
|
|
649
704
|
return {
|
|
650
705
|
get value() {
|
|
651
|
-
return
|
|
706
|
+
return read();
|
|
652
707
|
},
|
|
653
708
|
set value(value) {
|
|
654
|
-
|
|
655
|
-
storage.setItem(key, serializer.write(value));
|
|
709
|
+
write(value);
|
|
656
710
|
},
|
|
657
|
-
read
|
|
711
|
+
read,
|
|
712
|
+
clear,
|
|
713
|
+
write,
|
|
714
|
+
isEmpty
|
|
658
715
|
};
|
|
659
716
|
}
|
|
660
|
-
function useInterval(controller, handler, interval) {
|
|
661
|
-
handler = handler.bind(controller);
|
|
662
|
-
let intervalHandle = null;
|
|
663
|
-
let setup = () => intervalHandle = setInterval(handler, interval);
|
|
664
|
-
let teardown = () => {
|
|
665
|
-
if (intervalHandle !== null) {
|
|
666
|
-
clearInterval(intervalHandle);
|
|
667
|
-
}
|
|
668
|
-
};
|
|
669
|
-
useMixin(controller, setup, teardown);
|
|
670
|
-
return teardown;
|
|
671
|
-
}
|
|
672
717
|
function useTimeout(controller, handler, timeout) {
|
|
673
718
|
let controllerDisconnect;
|
|
674
719
|
let timeoutHandle = null;
|
|
@@ -688,6 +733,40 @@ function useTimeout(controller, handler, timeout) {
|
|
|
688
733
|
controllerDisconnect = useMixin(controller, setup, teardown);
|
|
689
734
|
return teardown;
|
|
690
735
|
}
|
|
736
|
+
function useTemporaryContent(controller, target, content, timeout, teardownCallback) {
|
|
737
|
+
const setContent = (element, text) => {
|
|
738
|
+
if (isHTMLInputElement(element)) {
|
|
739
|
+
element.value = text;
|
|
740
|
+
} else {
|
|
741
|
+
element.textContent = text;
|
|
742
|
+
}
|
|
743
|
+
};
|
|
744
|
+
const getContent = (element) => {
|
|
745
|
+
return isHTMLInputElement(element) ? element.value : element.innerHTML;
|
|
746
|
+
};
|
|
747
|
+
let cleanupTimeout = () => void 0;
|
|
748
|
+
let originalText = getContent(target);
|
|
749
|
+
const teardown = () => {
|
|
750
|
+
setContent(target, originalText);
|
|
751
|
+
cleanupTimeout();
|
|
752
|
+
if (teardownCallback) {
|
|
753
|
+
teardownCallback.call(controller);
|
|
754
|
+
}
|
|
755
|
+
};
|
|
756
|
+
const setup = () => {
|
|
757
|
+
setContent(target, content);
|
|
758
|
+
if (timeout !== void 0) {
|
|
759
|
+
cleanupTimeout = useTimeout(controller, teardown, timeout);
|
|
760
|
+
}
|
|
761
|
+
};
|
|
762
|
+
useMixin(controller, setup, teardown);
|
|
763
|
+
return {
|
|
764
|
+
teardown,
|
|
765
|
+
update(newContent) {
|
|
766
|
+
setContent(target, newContent);
|
|
767
|
+
}
|
|
768
|
+
};
|
|
769
|
+
}
|
|
691
770
|
async function fetchRetry(n, input, init) {
|
|
692
771
|
try {
|
|
693
772
|
return await fetch(input, init);
|
|
@@ -713,7 +792,7 @@ class LoadBlockController extends BaseController {
|
|
|
713
792
|
let el = this.hasReplaceTarget ? this.replaceTarget : this.el;
|
|
714
793
|
let failure = () => {
|
|
715
794
|
el.replaceWith(this._errorMessage);
|
|
716
|
-
self.
|
|
795
|
+
self.dispatchEvent(el, "ajax:error");
|
|
717
796
|
};
|
|
718
797
|
try {
|
|
719
798
|
let response = await fetchRetry(this._maxRetries, this.endpointValue);
|
|
@@ -729,11 +808,11 @@ class LoadBlockController extends BaseController {
|
|
|
729
808
|
} else {
|
|
730
809
|
el.replaceWith(...newEl.children);
|
|
731
810
|
}
|
|
732
|
-
self.
|
|
811
|
+
self.dispatchEvent(el, "ajax:success");
|
|
733
812
|
} catch (e) {
|
|
734
813
|
failure();
|
|
735
814
|
} finally {
|
|
736
|
-
self.
|
|
815
|
+
self.dispatchEvent(el, "ajax:complete");
|
|
737
816
|
}
|
|
738
817
|
}
|
|
739
818
|
}
|
|
@@ -845,18 +924,22 @@ __publicField(PollBlockController, "values", {
|
|
|
845
924
|
seconds: Number
|
|
846
925
|
});
|
|
847
926
|
class AutoSubmitFormController extends BaseController {
|
|
848
|
-
get
|
|
927
|
+
get _eventModes() {
|
|
849
928
|
if (this.hasEventModeValue) {
|
|
850
|
-
|
|
929
|
+
let modes = this.eventModeValue.split(" ").map((mode) => mode.trim());
|
|
930
|
+
if (modes.length === 1 && modes[0] === "debounced") {
|
|
931
|
+
return ["change", "input"];
|
|
932
|
+
}
|
|
933
|
+
if (!modes.every((mode) => ["change", "input"].includes(mode))) {
|
|
851
934
|
throw new Error(`The modeValue provided '${this.eventModeValue}' is not one of the recognised configuration options`);
|
|
852
935
|
}
|
|
853
|
-
return
|
|
936
|
+
return modes;
|
|
854
937
|
} else {
|
|
855
|
-
return "change";
|
|
938
|
+
return ["change"];
|
|
856
939
|
}
|
|
857
940
|
}
|
|
858
941
|
get _debounceTimeout() {
|
|
859
|
-
return this.hasDebounceIntervalValue ? this.debounceIntervalValue :
|
|
942
|
+
return this.hasDebounceIntervalValue ? this.debounceIntervalValue : -1;
|
|
860
943
|
}
|
|
861
944
|
get _mode() {
|
|
862
945
|
if (this.hasSubmitModeValue) {
|
|
@@ -874,13 +957,18 @@ class AutoSubmitFormController extends BaseController {
|
|
|
874
957
|
return inputTypes.map((type) => type.concat(ignore)).join(",");
|
|
875
958
|
}
|
|
876
959
|
get inputElements() {
|
|
877
|
-
|
|
960
|
+
let subElements = Array.from(this.element.querySelectorAll(this._cssSelector));
|
|
961
|
+
subElements = subElements.filter((el) => !this._ancestorIsTrix(el));
|
|
962
|
+
return subElements;
|
|
878
963
|
}
|
|
879
964
|
connect() {
|
|
880
965
|
this.inputElements.forEach((el) => {
|
|
881
|
-
return useEventListener(this, el, this.
|
|
966
|
+
return useEventListener(this, el, this._eventModes, this.submit, { debounce: this._debounceTimeout && this._debounceTimeout > 0 ? this._debounceTimeout : void 0 });
|
|
882
967
|
});
|
|
883
968
|
}
|
|
969
|
+
_ancestorIsTrix(element) {
|
|
970
|
+
return element.closest("trix-toolbar") !== null && element.closest("trix-editor") !== null;
|
|
971
|
+
}
|
|
884
972
|
submit() {
|
|
885
973
|
let el = this.el;
|
|
886
974
|
if (this._mode == "request") {
|
|
@@ -948,12 +1036,10 @@ function addMethodsForClassDefinition(controller, name) {
|
|
|
948
1036
|
[`remove${pascalCase(name)}Classes`]: (element = defaultElement) => element.classList.remove(...classOrDefault()),
|
|
949
1037
|
[`${name}ClassesPresent`]: (element = defaultElement) => classOrDefault().every((klass) => element.classList.contains(klass))
|
|
950
1038
|
};
|
|
951
|
-
console.log(methods);
|
|
952
1039
|
Object.assign(controller, methods);
|
|
953
1040
|
}
|
|
954
1041
|
function installClassMethods(controller) {
|
|
955
1042
|
let classes = controller.constructor.classes || [];
|
|
956
|
-
console.log(classes);
|
|
957
1043
|
classes.forEach((classDefinition) => addMethodsForClassDefinition(controller, classDefinition));
|
|
958
1044
|
}
|
|
959
1045
|
class CharCountController extends BaseController {
|
|
@@ -1097,7 +1183,7 @@ class CheckboxXORController extends BaseController {
|
|
|
1097
1183
|
if (target.checked) {
|
|
1098
1184
|
others.forEach((checkbox) => {
|
|
1099
1185
|
checkbox.checked = false;
|
|
1100
|
-
this.
|
|
1186
|
+
this.dispatchEvent(this.el, "change");
|
|
1101
1187
|
});
|
|
1102
1188
|
}
|
|
1103
1189
|
}
|
|
@@ -1433,7 +1519,7 @@ class FormSaveController extends BaseController {
|
|
|
1433
1519
|
}
|
|
1434
1520
|
_clear() {
|
|
1435
1521
|
localStorage.removeItem(this._formIdentifier);
|
|
1436
|
-
this.
|
|
1522
|
+
this.dispatchEvent(this.el, `form-save:cleared`);
|
|
1437
1523
|
}
|
|
1438
1524
|
clear(event) {
|
|
1439
1525
|
event == null ? void 0 : event.preventDefault();
|
|
@@ -1443,7 +1529,7 @@ class FormSaveController extends BaseController {
|
|
|
1443
1529
|
event.preventDefault();
|
|
1444
1530
|
let data = this._formData;
|
|
1445
1531
|
localStorage.setItem(this._formIdentifier, JSON.stringify(data[this._formIdentifier]));
|
|
1446
|
-
this.
|
|
1532
|
+
this.dispatchEvent(this.el, `form-save:save:success`);
|
|
1447
1533
|
}
|
|
1448
1534
|
restore(event) {
|
|
1449
1535
|
event == null ? void 0 : event.preventDefault();
|
|
@@ -1463,9 +1549,9 @@ class FormSaveController extends BaseController {
|
|
|
1463
1549
|
}
|
|
1464
1550
|
}
|
|
1465
1551
|
}
|
|
1466
|
-
this.
|
|
1552
|
+
this.dispatchEvent(this.el, `form-save:restore:success`);
|
|
1467
1553
|
} else {
|
|
1468
|
-
this.
|
|
1554
|
+
this.dispatchEvent(this.el, `form-save:restore:empty`);
|
|
1469
1555
|
}
|
|
1470
1556
|
}
|
|
1471
1557
|
}
|
|
@@ -1484,13 +1570,13 @@ class LimitedSelectionCheckboxesController extends BaseController {
|
|
|
1484
1570
|
if (tickedInputs > this.maxValue) {
|
|
1485
1571
|
event.preventDefault();
|
|
1486
1572
|
target.checked = false;
|
|
1487
|
-
this.
|
|
1488
|
-
this.
|
|
1573
|
+
this.dispatchEvent(target, "change");
|
|
1574
|
+
this.dispatchEvent(target, "limited-selection:too-many");
|
|
1489
1575
|
if (this.hasErrorTarget && this.hasMessageValue) {
|
|
1490
1576
|
this.errorTarget.innerHTML = this.messageValue;
|
|
1491
1577
|
}
|
|
1492
1578
|
} else {
|
|
1493
|
-
this.
|
|
1579
|
+
this.dispatchEvent(target, "limited-selection:selection");
|
|
1494
1580
|
if (this.hasErrorTarget) {
|
|
1495
1581
|
this.errorTarget.innerHTML = "";
|
|
1496
1582
|
}
|
|
@@ -1685,10 +1771,10 @@ class PasswordConfirmController extends BaseController {
|
|
|
1685
1771
|
_checkPasswordsMatch() {
|
|
1686
1772
|
let element = this.el;
|
|
1687
1773
|
if (this._allPasswordsMatch()) {
|
|
1688
|
-
this.
|
|
1774
|
+
this.dispatchEvent(element, "password-confirm:match");
|
|
1689
1775
|
this.passwordTargets.forEach((el) => this.removeErrorClasses(el));
|
|
1690
1776
|
} else {
|
|
1691
|
-
this.
|
|
1777
|
+
this.dispatchEvent(element, "password-confirm:no-match");
|
|
1692
1778
|
this.passwordTargets.forEach((el) => this.addErrorClasses(el));
|
|
1693
1779
|
}
|
|
1694
1780
|
}
|
|
@@ -1730,7 +1816,7 @@ class RemoteFormController extends BaseController {
|
|
|
1730
1816
|
throw new Error("expected form to have a DOM parent, could not execute replaceChild");
|
|
1731
1817
|
}
|
|
1732
1818
|
parentNode.replaceChild(newElement, this.el);
|
|
1733
|
-
this.
|
|
1819
|
+
this.dispatchEvent(newElement, "remote-form:replace");
|
|
1734
1820
|
} else {
|
|
1735
1821
|
console.log("Unknown", data);
|
|
1736
1822
|
}
|
|
@@ -1908,11 +1994,11 @@ class FallbackImageController extends BaseController {
|
|
|
1908
1994
|
let element = this.el;
|
|
1909
1995
|
this.addFailClasses();
|
|
1910
1996
|
if (this.hasPlaceholderValue && element.src !== this.placeholderValue) {
|
|
1911
|
-
this.
|
|
1997
|
+
this.dispatchEvent(element, "fallback-image:placeholder");
|
|
1912
1998
|
element.src = this.placeholderValue;
|
|
1913
1999
|
element.onerror = this._fail;
|
|
1914
2000
|
} else {
|
|
1915
|
-
this.
|
|
2001
|
+
this.dispatchEvent(element, "fallback-image:fail");
|
|
1916
2002
|
element.style.display = "none";
|
|
1917
2003
|
}
|
|
1918
2004
|
}
|
|
@@ -2781,13 +2867,13 @@ class SignalActionController extends BaseController {
|
|
|
2781
2867
|
_onSignal(payload) {
|
|
2782
2868
|
let value = payload.value;
|
|
2783
2869
|
if (!this.hasWhenValue) {
|
|
2784
|
-
this.
|
|
2870
|
+
this.dispatchEvent(this.el, signalEventName(this.nameValue, "match"));
|
|
2785
2871
|
return;
|
|
2786
2872
|
}
|
|
2787
2873
|
if (this._predicates.every((predicate) => predicate(value))) {
|
|
2788
|
-
this.
|
|
2874
|
+
this.dispatchEvent(this.el, signalEventName(this.nameValue, "match"), { detail: { element: this.el, value } });
|
|
2789
2875
|
} else {
|
|
2790
|
-
this.
|
|
2876
|
+
this.dispatchEvent(this.el, signalEventName(this.nameValue, "no-match"), { detail: { element: this.el, value } });
|
|
2791
2877
|
}
|
|
2792
2878
|
}
|
|
2793
2879
|
}
|
|
@@ -3050,6 +3136,15 @@ class FullscreenController extends BaseController {
|
|
|
3050
3136
|
this.toggle = toggle;
|
|
3051
3137
|
}
|
|
3052
3138
|
}
|
|
3139
|
+
function dispatchEvent(controller, element, eventName, options = {}) {
|
|
3140
|
+
let mergedOptions = Object.assign({}, { bubbles: true, cancelable: true, detail: { target: element } }, options);
|
|
3141
|
+
if (!!mergedOptions.detail.target) {
|
|
3142
|
+
mergedOptions.detail.target = element;
|
|
3143
|
+
}
|
|
3144
|
+
let event = new CustomEvent(eventName, mergedOptions);
|
|
3145
|
+
logEvent(controller, eventName, event, element);
|
|
3146
|
+
element.dispatchEvent(event);
|
|
3147
|
+
}
|
|
3053
3148
|
class IntersectionController extends BaseController {
|
|
3054
3149
|
get _threshold() {
|
|
3055
3150
|
if (this.hasThresholdValue) {
|
|
@@ -3062,10 +3157,10 @@ class IntersectionController extends BaseController {
|
|
|
3062
3157
|
useIntersection(this, this.el, this.appear, this.disappear, { threshold: this._threshold });
|
|
3063
3158
|
}
|
|
3064
3159
|
appear(entry) {
|
|
3065
|
-
|
|
3160
|
+
dispatchEvent(this, this.el, "intersection:appear");
|
|
3066
3161
|
}
|
|
3067
3162
|
disappear(entry) {
|
|
3068
|
-
|
|
3163
|
+
dispatchEvent(this, this.el, "intersection:disappear");
|
|
3069
3164
|
}
|
|
3070
3165
|
}
|
|
3071
3166
|
__publicField(IntersectionController, "values", { threshold: String });
|
|
@@ -3079,7 +3174,7 @@ class IntervalController extends BaseController {
|
|
|
3079
3174
|
});
|
|
3080
3175
|
}
|
|
3081
3176
|
_interval() {
|
|
3082
|
-
this.
|
|
3177
|
+
this.dispatchEvent(this.el, "interval:action");
|
|
3083
3178
|
}
|
|
3084
3179
|
}
|
|
3085
3180
|
__publicField(IntervalController, "values", { seconds: Number });
|
|
@@ -3094,10 +3189,10 @@ class PresenceController extends BaseController {
|
|
|
3094
3189
|
return [this.name, "presence", "removed"].filter((el) => !!el).join(":");
|
|
3095
3190
|
}
|
|
3096
3191
|
connect() {
|
|
3097
|
-
this.
|
|
3192
|
+
this.dispatchEvent(this.el, this._addedEventName);
|
|
3098
3193
|
}
|
|
3099
3194
|
disconnect() {
|
|
3100
|
-
this.
|
|
3195
|
+
this.dispatchEvent(this.el, this._removedEventName);
|
|
3101
3196
|
}
|
|
3102
3197
|
}
|
|
3103
3198
|
__publicField(PresenceController, "values", { name: String });
|
|
@@ -3114,7 +3209,7 @@ class TimeoutController extends BaseController {
|
|
|
3114
3209
|
});
|
|
3115
3210
|
}
|
|
3116
3211
|
_timeout() {
|
|
3117
|
-
this.
|
|
3212
|
+
this.dispatchEvent(this.el, "timeout");
|
|
3118
3213
|
}
|
|
3119
3214
|
}
|
|
3120
3215
|
__publicField(TimeoutController, "values", { seconds: Number });
|
|
@@ -3127,10 +3222,10 @@ class UserFocusController extends BaseController {
|
|
|
3127
3222
|
});
|
|
3128
3223
|
}
|
|
3129
3224
|
appear() {
|
|
3130
|
-
this.
|
|
3225
|
+
this.dispatchEvent(this.el, "user-focus:active");
|
|
3131
3226
|
}
|
|
3132
3227
|
away() {
|
|
3133
|
-
this.
|
|
3228
|
+
this.dispatchEvent(this.el, "user-focus:away");
|
|
3134
3229
|
}
|
|
3135
3230
|
_handleVisibility() {
|
|
3136
3231
|
this._documentIsActive() ? this.appear() : this.away();
|
|
@@ -3207,7 +3302,7 @@ class CountdownController extends BaseController {
|
|
|
3207
3302
|
this._clearTick();
|
|
3208
3303
|
this.removeCountingDownClasses();
|
|
3209
3304
|
this.addEndedClasses();
|
|
3210
|
-
this.
|
|
3305
|
+
this.dispatchEvent(this.el, "countdown:ended");
|
|
3211
3306
|
} else {
|
|
3212
3307
|
distance = intervalToDuration({ start: this._deadlineDate, end: now });
|
|
3213
3308
|
}
|
|
@@ -3539,7 +3634,6 @@ class TreeViewController extends BaseController {
|
|
|
3539
3634
|
return el.querySelectorAll("ul, ol").length > 0;
|
|
3540
3635
|
}
|
|
3541
3636
|
mutate(entries) {
|
|
3542
|
-
console.log("mutate", entries);
|
|
3543
3637
|
for (const mutation of entries) {
|
|
3544
3638
|
if (mutation.type === "childList") {
|
|
3545
3639
|
Array.from(mutation.addedNodes || []).forEach((el) => this._setupNode(el));
|
|
@@ -3581,11 +3675,11 @@ class AnchorSpyController extends BaseController {
|
|
|
3581
3675
|
}
|
|
3582
3676
|
_checkAnchor() {
|
|
3583
3677
|
if (this._key === this._anchor) {
|
|
3584
|
-
this.
|
|
3678
|
+
this.dispatchEvent(this.el, "anchor-spy:active");
|
|
3585
3679
|
this.addActiveClasses(this.el);
|
|
3586
3680
|
this.removeInactiveClasses(this.el);
|
|
3587
3681
|
} else {
|
|
3588
|
-
this.
|
|
3682
|
+
this.dispatchEvent(this.el, "anchor-spy:inactive");
|
|
3589
3683
|
this.addInactiveClasses(this.el);
|
|
3590
3684
|
this.removeActiveClasses(this.el);
|
|
3591
3685
|
}
|
|
@@ -3669,7 +3763,7 @@ class ConfirmController extends BaseController {
|
|
|
3669
3763
|
confirm(event) {
|
|
3670
3764
|
if (!window.confirm(this._message)) {
|
|
3671
3765
|
event.preventDefault();
|
|
3672
|
-
this.
|
|
3766
|
+
this.dispatchEvent(this.el, "confirm:cancelled");
|
|
3673
3767
|
}
|
|
3674
3768
|
}
|
|
3675
3769
|
}
|
|
@@ -3710,10 +3804,6 @@ class DebugController extends BaseController {
|
|
|
3710
3804
|
}
|
|
3711
3805
|
__publicField(DebugController, "targets", ["test"]);
|
|
3712
3806
|
class DisableWithController extends BaseController {
|
|
3713
|
-
constructor() {
|
|
3714
|
-
super(...arguments);
|
|
3715
|
-
__publicField(this, "_cacheText");
|
|
3716
|
-
}
|
|
3717
3807
|
get _message() {
|
|
3718
3808
|
return this.hasMessageValue ? this.messageValue : "Submitting...";
|
|
3719
3809
|
}
|
|
@@ -3732,44 +3822,27 @@ class DisableWithController extends BaseController {
|
|
|
3732
3822
|
event == null ? void 0 : event.preventDefault();
|
|
3733
3823
|
event == null ? void 0 : event.stopImmediatePropagation();
|
|
3734
3824
|
} else {
|
|
3735
|
-
this._cacheText = this._getElText(element);
|
|
3736
|
-
this._setElText(element, this._message);
|
|
3737
3825
|
this._disable();
|
|
3738
|
-
|
|
3826
|
+
useTemporaryContent(this, element, this._message, this._timeout, this._enable);
|
|
3739
3827
|
}
|
|
3740
3828
|
}
|
|
3741
3829
|
enable(event) {
|
|
3742
3830
|
event == null ? void 0 : event.preventDefault();
|
|
3743
3831
|
let element = this.el;
|
|
3744
3832
|
if (this._isDisabled(element)) {
|
|
3745
|
-
this._setElText(element, this._cacheText);
|
|
3746
3833
|
this._enable();
|
|
3747
3834
|
}
|
|
3748
3835
|
}
|
|
3749
3836
|
_isDisabled(el) {
|
|
3750
|
-
if (
|
|
3837
|
+
if (isTypeOfButtonableElement(el)) {
|
|
3751
3838
|
return el.disabled;
|
|
3752
3839
|
} else {
|
|
3753
3840
|
return el.dataset.disabled == "true";
|
|
3754
3841
|
}
|
|
3755
3842
|
}
|
|
3756
|
-
_getElText(el) {
|
|
3757
|
-
if (isHTMLInputElement(el) && el.type == "submit") {
|
|
3758
|
-
return el.value;
|
|
3759
|
-
} else {
|
|
3760
|
-
return el.innerText;
|
|
3761
|
-
}
|
|
3762
|
-
}
|
|
3763
|
-
_setElText(el, str) {
|
|
3764
|
-
if (isHTMLInputElement(el) && el.type == "submit") {
|
|
3765
|
-
el.value = str;
|
|
3766
|
-
} else if (isHTMLButtonElement(el) || isHTMLAnchorElement(el)) {
|
|
3767
|
-
el.innerText = str;
|
|
3768
|
-
}
|
|
3769
|
-
}
|
|
3770
3843
|
_disable() {
|
|
3771
3844
|
let el = this.el;
|
|
3772
|
-
if (
|
|
3845
|
+
if (isTypeOfButtonableElement(el)) {
|
|
3773
3846
|
el.disabled = true;
|
|
3774
3847
|
} else {
|
|
3775
3848
|
el.dataset.disabled = "true";
|
|
@@ -3777,7 +3850,7 @@ class DisableWithController extends BaseController {
|
|
|
3777
3850
|
}
|
|
3778
3851
|
_enable() {
|
|
3779
3852
|
let el = this.el;
|
|
3780
|
-
if (
|
|
3853
|
+
if (isTypeOfButtonableElement(el)) {
|
|
3781
3854
|
el.disabled = false;
|
|
3782
3855
|
} else {
|
|
3783
3856
|
el.dataset.disabled = void 0;
|
|
@@ -3817,7 +3890,11 @@ class ElementSaveController extends BaseController {
|
|
|
3817
3890
|
get _element() {
|
|
3818
3891
|
return this.hasElementTarget ? this.elementTarget : this.el;
|
|
3819
3892
|
}
|
|
3893
|
+
initialize() {
|
|
3894
|
+
this.save = debounce(this.save.bind(this), 300);
|
|
3895
|
+
}
|
|
3820
3896
|
connect() {
|
|
3897
|
+
this._store = useLocalStorage(this, this._uniqueIdentifier, {});
|
|
3821
3898
|
requestAnimationFrame(() => {
|
|
3822
3899
|
if (this._restoreOnLoad) {
|
|
3823
3900
|
this.restore();
|
|
@@ -3828,8 +3905,8 @@ class ElementSaveController extends BaseController {
|
|
|
3828
3905
|
if (event) {
|
|
3829
3906
|
event.preventDefault();
|
|
3830
3907
|
}
|
|
3831
|
-
|
|
3832
|
-
this.
|
|
3908
|
+
this._store.clear();
|
|
3909
|
+
this.dispatchEvent(this._element, `element-save:cleared`);
|
|
3833
3910
|
}
|
|
3834
3911
|
save(event) {
|
|
3835
3912
|
if (event) {
|
|
@@ -3839,22 +3916,20 @@ class ElementSaveController extends BaseController {
|
|
|
3839
3916
|
let attributes = this.attributesValue.split(" ");
|
|
3840
3917
|
let data = {};
|
|
3841
3918
|
attributes.forEach((attr) => data[attr] = get(element, attr));
|
|
3842
|
-
|
|
3843
|
-
this.
|
|
3919
|
+
this._store.value = data;
|
|
3920
|
+
this.dispatchEvent(element, `element-save:save:success`);
|
|
3844
3921
|
}
|
|
3845
3922
|
restore(event) {
|
|
3846
3923
|
if (event) {
|
|
3847
3924
|
event.preventDefault();
|
|
3848
3925
|
}
|
|
3849
3926
|
let element = this._element;
|
|
3850
|
-
if (
|
|
3851
|
-
const savedData =
|
|
3852
|
-
Object.keys(savedData).forEach((attr) =>
|
|
3853
|
-
|
|
3854
|
-
});
|
|
3855
|
-
this.dispatch(element, `element-save:restore:success`);
|
|
3927
|
+
if (!this._store.isEmpty()) {
|
|
3928
|
+
const savedData = this._store.value;
|
|
3929
|
+
Object.keys(savedData).forEach((attr) => set(element, attr, savedData[attr]));
|
|
3930
|
+
this.dispatchEvent(element, `element-save:restore:success`);
|
|
3856
3931
|
} else {
|
|
3857
|
-
this.
|
|
3932
|
+
this.dispatchEvent(element, `element-save:restore:empty`);
|
|
3858
3933
|
}
|
|
3859
3934
|
}
|
|
3860
3935
|
}
|
|
@@ -3892,11 +3967,11 @@ class EmptyDomController extends BaseController {
|
|
|
3892
3967
|
if (children.length === 0) {
|
|
3893
3968
|
this.removeNotEmptyClasses();
|
|
3894
3969
|
this.addEmptyClasses();
|
|
3895
|
-
this.
|
|
3970
|
+
this.dispatchEvent(element, "dom:empty");
|
|
3896
3971
|
} else {
|
|
3897
3972
|
this.addNotEmptyClasses();
|
|
3898
3973
|
this.removeEmptyClasses();
|
|
3899
|
-
this.
|
|
3974
|
+
this.dispatchEvent(element, "dom:not-empty", { detail: { count: children.length } });
|
|
3900
3975
|
}
|
|
3901
3976
|
}
|
|
3902
3977
|
}
|
|
@@ -3925,11 +4000,11 @@ class PrefetchController extends BaseController {
|
|
|
3925
4000
|
}
|
|
3926
4001
|
if (connection) {
|
|
3927
4002
|
if (connection.saveData) {
|
|
3928
|
-
|
|
4003
|
+
warn(this, "Data Saving is enabled");
|
|
3929
4004
|
return false;
|
|
3930
4005
|
}
|
|
3931
4006
|
if (/2g/.test(connection.effectiveType)) {
|
|
3932
|
-
|
|
4007
|
+
warn(this, "Network is too slow");
|
|
3933
4008
|
return false;
|
|
3934
4009
|
}
|
|
3935
4010
|
}
|
|
@@ -4080,7 +4155,7 @@ class TeleportController extends EphemeralController {
|
|
|
4080
4155
|
let element = this.el;
|
|
4081
4156
|
let destination = document.querySelector(this.targetValue);
|
|
4082
4157
|
if (destination == null) {
|
|
4083
|
-
this.
|
|
4158
|
+
this.dispatchEvent(element, "teleport:error");
|
|
4084
4159
|
return;
|
|
4085
4160
|
}
|
|
4086
4161
|
let copy = element.cloneNode(true);
|
|
@@ -4581,5 +4656,5 @@ __publicField(TurboFrameRefreshController, "values", {
|
|
|
4581
4656
|
interval: Number,
|
|
4582
4657
|
poll: Boolean
|
|
4583
4658
|
});
|
|
4584
|
-
export { AlertController, AnchorSpyController, AsyncBlockController, AutoSubmitFormController, AutosizeController, BackLinkController, BaseController, CharCountController, CheckboxDisableInputsController, CheckboxEnableInputsController, CheckboxSelectAllController, CheckboxXORController, ClipboardController, ClockController, ConfirmController, ConfirmNavigationController, CountdownController, DebugController, DetectDirtyController, DetectDirtyFormController, DisableWithController, DismissableController, DurationController, ElementSaveController, EmptyDomController, EnableInputsController, EphemeralController, EventBus, FallbackImageController, FocusStealController, FormRcController, FormSaveController, FullscreenController, IntersectionController, IntervalController, LazyBlockController, LightboxImageController, LimitedSelectionCheckboxesController, LoadBlockController, MediaPlayerController, NavigateFormErrorsController, NestedFormController, PasswordConfirmController, PasswordPeekController, PollBlockController, PrefetchController, PresenceController, PrintButtonController, PrintController, RemoteFormController, RemoveController, ResponsiveIframeBodyController, ResponsiveIframeWrapperController, ScrollContainerController, ScrollIntoFocusController, ScrollToBottomController, ScrollToController, ScrollToTopController, SelfDestructController, SignalActionController, SignalInputController, SignalVisibilityController, StickyController, StorageSerializers, SyncInputsController, TableSortController, TableTruncateController, TabsController, TeleportController, TemporaryStateController, TimeDistanceController, TimeoutController, ToggleClassController, TreeViewController, TrixModifierController, TurboFrameRCController, TurboFrameRefreshController, UserFocusController, ValueWarnController, WordCountController, applyTemporaryClass, applyTemporaryState, createHiddenButton, createHiddenInput, getAllRadiosInGroup, getOtherRadiosInGroup, getScrollParent, insertElement, insertHiddenButton, insertHiddenInput, isDirty, isElementCheckable, isElementInViewport, isFormDirty, isHTMLAnchorElement, isHTMLButtonElement, isHTMLFormElement, isHTMLImageElement, isHTMLInputElement, isHTMLLinkElement, isHTMLSelectElement, isHTMLTextAreaElement, isTurboFrame, isTypeOfFormInputElement, requestReset, requestSubmit, scrollAbsoluteBottom, scrollAbsoluteLeft, scrollAbsoluteRight, scrollAbsoluteTop, scrollDown, scrollLeft, scrollRight, scrollToElement, scrollUp, useCollectionEventListener, useCollectionEventListeners, useEventListener, useEventListeners, useFullscreen, useGeolocation, useInjectedElement, useInjectedFragment, useInjectedHTML, useInterval, useLocalStorage, useTimeout };
|
|
4659
|
+
export { AlertController, AnchorSpyController, AsyncBlockController, AutoSubmitFormController, AutosizeController, BackLinkController, BaseController, CharCountController, CheckboxDisableInputsController, CheckboxEnableInputsController, CheckboxSelectAllController, CheckboxXORController, ClipboardController, ClockController, ConfirmController, ConfirmNavigationController, CountdownController, DebugController, DetectDirtyController, DetectDirtyFormController, DisableWithController, DismissableController, DurationController, ElementSaveController, EmptyDomController, EnableInputsController, EphemeralController, EventBus, FallbackImageController, FocusStealController, FormRcController, FormSaveController, FullscreenController, IntersectionController, IntervalController, LazyBlockController, LightboxImageController, LimitedSelectionCheckboxesController, LoadBlockController, MediaPlayerController, NavigateFormErrorsController, NestedFormController, PasswordConfirmController, PasswordPeekController, PollBlockController, PrefetchController, PresenceController, PrintButtonController, PrintController, RemoteFormController, RemoveController, ResponsiveIframeBodyController, ResponsiveIframeWrapperController, ScrollContainerController, ScrollIntoFocusController, ScrollToBottomController, ScrollToController, ScrollToTopController, SelfDestructController, SignalActionController, SignalInputController, SignalVisibilityController, StickyController, StorageSerializers, SyncInputsController, TableSortController, TableTruncateController, TabsController, TeleportController, TemporaryStateController, TimeDistanceController, TimeoutController, ToggleClassController, TreeViewController, TrixModifierController, TurboFrameRCController, TurboFrameRefreshController, UserFocusController, ValueWarnController, WordCountController, applyTemporaryClass, applyTemporaryState, createHiddenButton, createHiddenInput, getAllRadiosInGroup, getOtherRadiosInGroup, getScrollParent, insertElement, insertHiddenButton, insertHiddenInput, isDirty, isElementCheckable, isElementInViewport, isFormDirty, isHTMLAnchorElement, isHTMLButtonButtonElement, isHTMLButtonElement, isHTMLButtonInputElement, isHTMLFormElement, isHTMLImageElement, isHTMLInputElement, isHTMLLabelElement, isHTMLLinkElement, isHTMLResetButtonElement, isHTMLResetInputElement, isHTMLSelectElement, isHTMLSubmitButtonElement, isHTMLSubmitInputElement, isHTMLTextAreaElement, isTurboFrame, isTypeOfButtonableElement, isTypeOfFormInputElement, isTypeOfResetButtonElement, isTypeOfSubmitButtonElement, requestReset, requestSubmit, scrollAbsoluteBottom, scrollAbsoluteLeft, scrollAbsoluteRight, scrollAbsoluteTop, scrollDown, scrollLeft, scrollRight, scrollToElement, scrollUp, useCollectionEventListener, useCollectionEventListeners, useEventListener, useEventListeners, useFullscreen, useGeolocation, useInjectedElement, useInjectedFragment, useInjectedHTML, useInterval, useLocalStorage, useTemporaryContent, useTimeout };
|
|
4585
4660
|
//# sourceMappingURL=stimulus-library.es.js.map
|