stimulus-library 0.3.19 → 0.4.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 +14 -0
- package/dist/controllers/ajax/async_block_controller.d.ts +18 -18
- package/dist/controllers/ajax/lazy_block_controller.d.ts +9 -9
- package/dist/controllers/ajax/load_block_controller.d.ts +19 -19
- package/dist/controllers/ajax/poll_block_controller.d.ts +16 -16
- package/dist/controllers/anchor_spy_controller.d.ts +15 -15
- package/dist/controllers/back_link_controller.d.ts +19 -19
- package/dist/controllers/clipboard_controller.d.ts +18 -18
- package/dist/controllers/confirm_controller.d.ts +13 -13
- package/dist/controllers/confirm_navigation_controller.d.ts +15 -15
- package/dist/controllers/debug_controller.d.ts +6 -6
- package/dist/controllers/disable_with_controller.d.ts +25 -25
- package/dist/controllers/dismissable_controller.d.ts +6 -6
- package/dist/controllers/element_save_controller.d.ts +25 -25
- package/dist/controllers/empty_dom_controller.d.ts +29 -29
- package/dist/controllers/forms/auto_submit_form_controller.d.ts +15 -14
- package/dist/controllers/forms/auto_submit_form_controller.d.ts.map +1 -1
- package/dist/controllers/forms/autosize_controller.d.ts +9 -9
- package/dist/controllers/forms/char_count_controller.d.ts +26 -26
- package/dist/controllers/forms/checkbox_select_all_controller.d.ts +14 -14
- package/dist/controllers/forms/detect_dirty_controller.d.ts +16 -16
- package/dist/controllers/forms/detect_dirty_form_controller.d.ts +19 -19
- package/dist/controllers/forms/disable_inputs_controller.d.ts +16 -16
- package/dist/controllers/forms/enable_inputs_controller.d.ts +16 -16
- package/dist/controllers/forms/form_rc_controller.d.ts +13 -7
- package/dist/controllers/forms/form_rc_controller.d.ts.map +1 -1
- package/dist/controllers/forms/form_save_controller.d.ts +33 -33
- package/dist/controllers/forms/limited_selection_checkboxes_controller.d.ts +17 -17
- package/dist/controllers/forms/navigate_form_errors_controller.d.ts +34 -34
- package/dist/controllers/forms/nested_form_controller.d.ts +21 -21
- package/dist/controllers/forms/password_confirm_controller.d.ts +17 -17
- 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 +21 -21
- package/dist/controllers/forms/value_warn_controller.d.ts +39 -39
- package/dist/controllers/forms/word_count_controller.d.ts +26 -26
- package/dist/controllers/media/fallback_image_controller.d.ts +27 -27
- package/dist/controllers/media/lightbox_image_controller.d.ts +29 -29
- package/dist/controllers/media/media_player_controller.d.ts +12 -12
- package/dist/controllers/prefetch_controller.d.ts +18 -18
- package/dist/controllers/responsive_iframe_controller.d.ts +23 -23
- 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 +10 -10
- package/dist/controllers/sticky_controller.d.ts +19 -19
- package/dist/controllers/tables/table_sort_controller.d.ts +20 -20
- package/dist/controllers/tables/table_truncate_controller.d.ts +26 -26
- package/dist/controllers/teleport_controller.d.ts +15 -15
- package/dist/controllers/temporary_state_controller.d.ts +28 -28
- package/dist/controllers/toggle_class_controller.d.ts +35 -35
- package/dist/controllers/turbo_frame_rc_controller.d.ts +20 -20
- package/dist/controllers/turbo_frame_refresh_controller.d.ts +16 -16
- package/dist/controllers/utility/intersection_controller.d.ts +13 -13
- package/dist/controllers/utility/interval_controller.d.ts +13 -13
- package/dist/controllers/utility/presence_controller.d.ts +5 -5
- package/dist/controllers/utility/timeout_controller.d.ts +12 -12
- package/dist/controllers/utility/user_focus_controller.d.ts +10 -10
- package/dist/controllers/visual/clock_controller.d.ts +18 -18
- package/dist/controllers/visual/countdown_controller.d.ts +53 -53
- package/dist/controllers/visual/duration_controller.d.ts +27 -27
- package/dist/controllers/visual/tabs_controller.d.ts +37 -37
- package/dist/controllers/visual/time_distance_controller.d.ts +18 -18
- package/dist/controllers/visual/tree_view_controller.d.ts +29 -29
- package/dist/index.d.ts +66 -66
- package/dist/stimulus-library.cjs.js +2 -0
- package/dist/stimulus-library.cjs.js.map +1 -0
- package/dist/stimulus-library.es.js +2 -0
- package/dist/stimulus-library.es.js.map +1 -0
- package/dist/stimulus-library.umd.js +1 -1
- package/dist/stimulus-library.umd.js.map +1 -1
- package/dist/utilities/base_controller.d.ts +13 -13
- package/dist/utilities/base_controller.d.ts.map +1 -1
- package/dist/utilities/elements.d.ts +13 -13
- package/dist/utilities/ephemeral_controller.d.ts +5 -5
- package/dist/utilities/event_bus.d.ts +3 -3
- package/dist/utilities/requestSubmit.d.ts +2 -2
- package/dist/utilities/scroll.d.ts +10 -10
- package/dist/utilities/turbo.d.ts +1 -1
- package/package.json +16 -10
- package/dist/stimulus-library.js +0 -2
- package/dist/stimulus-library.js.map +0 -1
- package/dist/stimulus-library.modern.js +0 -2
- package/dist/stimulus-library.modern.js.map +0 -1
- package/dist/stimulus-library.module.js +0 -2
- package/dist/stimulus-library.module.js.map +0 -1
- package/src/controllers/ajax/async_block_controller.ts +0 -28
- package/src/controllers/ajax/lazy_block_controller.ts +0 -31
- package/src/controllers/ajax/load_block_controller.ts +0 -59
- package/src/controllers/ajax/poll_block_controller.ts +0 -32
- package/src/controllers/anchor_spy_controller.ts +0 -47
- package/src/controllers/back_link_controller.ts +0 -49
- package/src/controllers/clipboard_controller.ts +0 -47
- package/src/controllers/confirm_controller.ts +0 -50
- package/src/controllers/confirm_navigation_controller.ts +0 -51
- package/src/controllers/debug_controller.ts +0 -11
- package/src/controllers/disable_with_controller.ts +0 -116
- package/src/controllers/dismissable_controller.ts +0 -12
- package/src/controllers/element_save_controller.ts +0 -93
- package/src/controllers/empty_dom_controller.ts +0 -105
- package/src/controllers/forms/auto_submit_form_controller.ts +0 -59
- package/src/controllers/forms/autosize_controller.ts +0 -41
- package/src/controllers/forms/char_count_controller.ts +0 -91
- package/src/controllers/forms/checkbox_select_all_controller.ts +0 -57
- package/src/controllers/forms/detect_dirty_controller.ts +0 -116
- package/src/controllers/forms/detect_dirty_form_controller.ts +0 -127
- package/src/controllers/forms/disable_inputs_controller.ts +0 -44
- package/src/controllers/forms/enable_inputs_controller.ts +0 -44
- package/src/controllers/forms/form_rc_controller.ts +0 -20
- package/src/controllers/forms/form_save_controller.ts +0 -141
- package/src/controllers/forms/limited_selection_checkboxes_controller.ts +0 -44
- package/src/controllers/forms/navigate_form_errors_controller.ts +0 -144
- package/src/controllers/forms/nested_form_controller.ts +0 -68
- package/src/controllers/forms/password_confirm_controller.ts +0 -68
- package/src/controllers/forms/password_peek_controller.ts +0 -27
- package/src/controllers/forms/remote_form_controller.ts +0 -34
- package/src/controllers/forms/sync_inputs_controller.ts +0 -89
- package/src/controllers/forms/value_warn_controller.ts +0 -107
- package/src/controllers/forms/word_count_controller.ts +0 -86
- package/src/controllers/media/fallback_image_controller.ts +0 -108
- package/src/controllers/media/lightbox_image_controller.ts +0 -89
- package/src/controllers/media/media_player_controller.ts +0 -37
- package/src/controllers/prefetch_controller.ts +0 -99
- package/src/controllers/responsive_iframe_controller.ts +0 -75
- package/src/controllers/scroll/scroll_container_controller.ts +0 -73
- package/src/controllers/scroll/scroll_into_focus_controller.ts +0 -34
- package/src/controllers/scroll/scroll_to_bottom_controller.ts +0 -35
- package/src/controllers/scroll/scroll_to_controller.ts +0 -38
- package/src/controllers/scroll/scroll_to_top_controller.ts +0 -35
- package/src/controllers/self_destruct_controller.ts +0 -23
- package/src/controllers/sticky_controller.ts +0 -84
- package/src/controllers/tables/table_sort_controller.ts +0 -105
- package/src/controllers/tables/table_truncate_controller.ts +0 -106
- package/src/controllers/teleport_controller.ts +0 -64
- package/src/controllers/temporary_state_controller.ts +0 -82
- package/src/controllers/toggle_class_controller.ts +0 -149
- package/src/controllers/turbo_frame_rc_controller.ts +0 -77
- package/src/controllers/turbo_frame_refresh_controller.ts +0 -51
- package/src/controllers/utility/intersection_controller.ts +0 -51
- package/src/controllers/utility/interval_controller.ts +0 -34
- package/src/controllers/utility/presence_controller.ts +0 -13
- package/src/controllers/utility/timeout_controller.ts +0 -30
- package/src/controllers/utility/user_focus_controller.ts +0 -40
- package/src/controllers/visual/clock_controller.ts +0 -75
- package/src/controllers/visual/countdown_controller.ts +0 -198
- package/src/controllers/visual/duration_controller.ts +0 -106
- package/src/controllers/visual/tabs_controller.ts +0 -162
- package/src/controllers/visual/time_distance_controller.ts +0 -66
- package/src/controllers/visual/tree_view_controller.ts +0 -154
- package/src/index.ts +0 -71
- package/src/utilities/base_controller.ts +0 -143
- package/src/utilities/elements.ts +0 -47
- package/src/utilities/ephemeral_controller.ts +0 -45
- package/src/utilities/event_bus.ts +0 -3
- package/src/utilities/requestSubmit.ts +0 -23
- package/src/utilities/scroll.ts +0 -101
- package/src/utilities/turbo.ts +0 -3
- package/src/utilities/types.d.ts +0 -4
- package/tsconfig.json +0 -27
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import {LoadBlockController} from "./load_block_controller";
|
|
2
|
-
|
|
3
|
-
export class AsyncBlockController extends LoadBlockController {
|
|
4
|
-
static targets = ["replace"];
|
|
5
|
-
static values = {endpoint: String, errorMessage: String, selector: String};
|
|
6
|
-
|
|
7
|
-
declare readonly replaceTarget: HTMLElement;
|
|
8
|
-
declare readonly hasReplaceTarget: boolean;
|
|
9
|
-
declare readonly endpointValue: string;
|
|
10
|
-
|
|
11
|
-
declare readonly hasSelectorValue: boolean;
|
|
12
|
-
declare readonly selectorValue: string;
|
|
13
|
-
|
|
14
|
-
declare readonly hasErrorMessageValue: boolean;
|
|
15
|
-
declare readonly errorMessageValue: string;
|
|
16
|
-
|
|
17
|
-
get _errorMessage(): string {
|
|
18
|
-
return this.hasErrorMessageValue ? this.errorMessageValue : "This content failed to load";
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
// This is a simple controller to load a block of content when the page loads.
|
|
22
|
-
// It should be used to give a quick initial response before calling out to an
|
|
23
|
-
// an AJAX endpoint to do some expensive work.
|
|
24
|
-
async connect() {
|
|
25
|
-
await this.loadContent();
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import {useIntersection} from "stimulus-use";
|
|
2
|
-
import {LoadBlockController} from "./load_block_controller";
|
|
3
|
-
|
|
4
|
-
export class LazyBlockController extends LoadBlockController {
|
|
5
|
-
|
|
6
|
-
declare observe: () => void;
|
|
7
|
-
declare unobserve: () => void;
|
|
8
|
-
declare isVisible: boolean;
|
|
9
|
-
declare disappear: () => void;
|
|
10
|
-
|
|
11
|
-
async connect() {
|
|
12
|
-
let element = this.el;
|
|
13
|
-
|
|
14
|
-
if ("IntersectionObserver" in window) {
|
|
15
|
-
[this.observe, this.unobserve] = useIntersection(this, {element, threshold: 0.3});
|
|
16
|
-
} else {
|
|
17
|
-
// Client doesn't support intersection observer, fallback to pre-loading
|
|
18
|
-
await this.loadContent();
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
async appear(entry: IntersectionObserverEntry) {
|
|
23
|
-
if (entry.target === this.el && entry.isIntersecting) {
|
|
24
|
-
await this.loadContent();
|
|
25
|
-
if (this.unobserve) {
|
|
26
|
-
this.unobserve();
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import {BaseController} from "../../utilities/base_controller";
|
|
2
|
-
|
|
3
|
-
export class LoadBlockController extends BaseController {
|
|
4
|
-
|
|
5
|
-
static targets = ["replace"];
|
|
6
|
-
static values = {endpoint: String, errorMessage: String, selector: String};
|
|
7
|
-
|
|
8
|
-
declare readonly replaceTarget: HTMLElement;
|
|
9
|
-
declare readonly hasReplaceTarget: boolean;
|
|
10
|
-
declare readonly endpointValue: string;
|
|
11
|
-
|
|
12
|
-
declare readonly hasSelectorValue: boolean;
|
|
13
|
-
declare readonly selectorValue: string;
|
|
14
|
-
|
|
15
|
-
declare readonly hasErrorMessageValue: boolean;
|
|
16
|
-
declare readonly errorMessageValue: string;
|
|
17
|
-
|
|
18
|
-
get _errorMessage(): string {
|
|
19
|
-
return this.hasErrorMessageValue ? this.errorMessageValue : "This content failed to load";
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
connect() {
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
async loadContent(event: Event | null = null) {
|
|
26
|
-
event?.preventDefault();
|
|
27
|
-
|
|
28
|
-
let self = this;
|
|
29
|
-
let el = this.hasReplaceTarget ? this.replaceTarget : this.el;
|
|
30
|
-
|
|
31
|
-
let failure = () => {
|
|
32
|
-
el.replaceWith(this._errorMessage);
|
|
33
|
-
self.dispatch(el, "ajax:error");
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
try {
|
|
37
|
-
let response = await fetch(this.endpointValue);
|
|
38
|
-
if (!response.ok) {
|
|
39
|
-
failure();
|
|
40
|
-
}
|
|
41
|
-
let text = await response.text();
|
|
42
|
-
let newEl = document.createElement("div");
|
|
43
|
-
|
|
44
|
-
newEl.innerHTML = text;
|
|
45
|
-
if (this.hasSelectorValue) {
|
|
46
|
-
let selectedContent = newEl.querySelectorAll(this.selectorValue);
|
|
47
|
-
el.replaceWith(...selectedContent);
|
|
48
|
-
} else {
|
|
49
|
-
el.replaceWith(...newEl.children);
|
|
50
|
-
}
|
|
51
|
-
// Trigger event to show block has loaded
|
|
52
|
-
self.dispatch(el, "ajax:success");
|
|
53
|
-
} catch (e) {
|
|
54
|
-
failure();
|
|
55
|
-
} finally {
|
|
56
|
-
self.dispatch(el, "ajax:complete");
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import {LoadBlockController} from "./load_block_controller";
|
|
2
|
-
|
|
3
|
-
export class PollBlockController extends LoadBlockController {
|
|
4
|
-
|
|
5
|
-
static targets = ["replace"];
|
|
6
|
-
static values = {endpoint: String, errorMessage: String, selector: String, seconds: Number};
|
|
7
|
-
|
|
8
|
-
declare readonly secondsValue: number;
|
|
9
|
-
_intervalHandle: null | number = null;
|
|
10
|
-
|
|
11
|
-
initialize() {
|
|
12
|
-
this._timeout = this._timeout.bind(this);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
connect() {
|
|
16
|
-
requestAnimationFrame(() => {
|
|
17
|
-
this._timeout();
|
|
18
|
-
this._intervalHandle = window.setInterval(this._timeout, this.secondsValue * 1000);
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
disconnect() {
|
|
23
|
-
if (this._intervalHandle) {
|
|
24
|
-
window.clearInterval(this._intervalHandle);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
async _timeout() {
|
|
29
|
-
await this.loadContent();
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import {BaseController} from "../utilities/base_controller";
|
|
2
|
-
|
|
3
|
-
export class AnchorSpyController extends BaseController {
|
|
4
|
-
static values = {key: String};
|
|
5
|
-
|
|
6
|
-
declare readonly keyValue: string;
|
|
7
|
-
|
|
8
|
-
get _key(): string {
|
|
9
|
-
return this.keyValue.replaceAll('#', '');
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
get _anchor(): string {
|
|
13
|
-
return window.location.hash.substr(1);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
set _anchor(value: string) {
|
|
17
|
-
window.location.hash = value;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
initialize() {
|
|
21
|
-
this._checkAnchor = this._checkAnchor.bind(this);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
connect() {
|
|
25
|
-
requestAnimationFrame(() => {
|
|
26
|
-
this._checkAnchor();
|
|
27
|
-
window.addEventListener("hashchange", this._checkAnchor);
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
disconnect() {
|
|
32
|
-
window.removeEventListener("hashchange", this._checkAnchor);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
write(event?: Event) {
|
|
36
|
-
event?.preventDefault();
|
|
37
|
-
this._anchor = this._key;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
private _checkAnchor() {
|
|
41
|
-
if (this._key === this._anchor) {
|
|
42
|
-
this.dispatch(this.el, "anchor-spy:active");
|
|
43
|
-
} else {
|
|
44
|
-
this.dispatch(this.el, "anchor-spy:inactive");
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import {BaseController} from "../utilities/base_controller";
|
|
2
|
-
|
|
3
|
-
export class BackLinkController extends BaseController {
|
|
4
|
-
|
|
5
|
-
static values = {timeout: Number, pages: Number};
|
|
6
|
-
|
|
7
|
-
declare readonly timeoutValue: number;
|
|
8
|
-
declare readonly hasTimeoutValue: boolean;
|
|
9
|
-
declare readonly pagesValue: number;
|
|
10
|
-
declare readonly hasPagesValue: boolean;
|
|
11
|
-
_timeoutHandle: null | ReturnType<typeof window.setTimeout> = null;
|
|
12
|
-
|
|
13
|
-
get _pages(): number {
|
|
14
|
-
return this.hasPagesValue ? Math.abs(this.pagesValue) : 1;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
get _timeout(): number {
|
|
18
|
-
return this.hasTimeoutValue ? this.timeoutValue : 1500;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
initialize() {
|
|
22
|
-
this.goBack = this.goBack.bind(this);
|
|
23
|
-
this.fallback = this.fallback.bind(this);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
connect() {
|
|
27
|
-
this.el.addEventListener("click", this.goBack);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
disconnect() {
|
|
31
|
-
this.el.removeEventListener("click", this.goBack);
|
|
32
|
-
if (this._timeoutHandle) {
|
|
33
|
-
clearTimeout(this._timeoutHandle);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
goBack(event?: Event) {
|
|
38
|
-
event?.preventDefault();
|
|
39
|
-
history.go(-this._pages);
|
|
40
|
-
if ((this.el as HTMLAnchorElement).href) {
|
|
41
|
-
this._timeoutHandle = setTimeout(this.fallback, this._timeout);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
fallback() {
|
|
46
|
-
window.location.href = (this.el as HTMLAnchorElement).href;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import {BaseController} from "../utilities/base_controller";
|
|
2
|
-
|
|
3
|
-
export class ClipboardController extends BaseController {
|
|
4
|
-
|
|
5
|
-
static targets = ["source", "button", "copy", "fallback"];
|
|
6
|
-
static values = {removeUnused: Boolean};
|
|
7
|
-
|
|
8
|
-
declare readonly sourceTarget: HTMLElement;
|
|
9
|
-
declare readonly copyTarget: HTMLElement;
|
|
10
|
-
declare readonly hasCopyTarget: boolean;
|
|
11
|
-
declare readonly fallbackTarget: HTMLElement;
|
|
12
|
-
declare readonly hasFallbackTarget: boolean;
|
|
13
|
-
|
|
14
|
-
declare readonly hasRemoveUnusedValue: boolean;
|
|
15
|
-
declare readonly removeUnusedValue: boolean;
|
|
16
|
-
|
|
17
|
-
_supported = false;
|
|
18
|
-
|
|
19
|
-
connect() {
|
|
20
|
-
this._supported = document.queryCommandSupported("copy");
|
|
21
|
-
|
|
22
|
-
if (this.hasRemoveUnusedValue && this.removeUnusedValue) {
|
|
23
|
-
if (this._supported && this.hasFallbackTarget) {
|
|
24
|
-
this.fallbackTarget.remove();
|
|
25
|
-
} else if (this.hasCopyTarget) {
|
|
26
|
-
this.copyTarget.remove();
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
select(event: MouseEvent) {
|
|
32
|
-
if (event) {
|
|
33
|
-
event.preventDefault();
|
|
34
|
-
}
|
|
35
|
-
(this.sourceTarget as HTMLInputElement | HTMLTextAreaElement).select();
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
copy(event: ClipboardEvent) {
|
|
39
|
-
if (event) {
|
|
40
|
-
event.preventDefault();
|
|
41
|
-
}
|
|
42
|
-
(this.sourceTarget as HTMLInputElement | HTMLTextAreaElement).select();
|
|
43
|
-
if (this._supported) {
|
|
44
|
-
document.execCommand("copy");
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import {BaseController} from '../utilities/base_controller';
|
|
2
|
-
import {isHTMLAnchorElement, isHTMLFormElement} from "../utilities/elements";
|
|
3
|
-
|
|
4
|
-
export class ConfirmController extends BaseController {
|
|
5
|
-
|
|
6
|
-
static values = {
|
|
7
|
-
message: String,
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
declare readonly messageValue: string;
|
|
11
|
-
declare readonly hasMessageValue: boolean;
|
|
12
|
-
|
|
13
|
-
get _message(): string {
|
|
14
|
-
return this.hasMessageValue ? this.messageValue : 'Are you sure?';
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
initialize() {
|
|
18
|
-
this.confirm = this.confirm.bind(this);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
connect() {
|
|
22
|
-
requestAnimationFrame(() => {
|
|
23
|
-
let element = this.el;
|
|
24
|
-
if (isHTMLFormElement(element)) {
|
|
25
|
-
element.addEventListener("submit", this.confirm);
|
|
26
|
-
} else if (isHTMLAnchorElement(element)) {
|
|
27
|
-
element.addEventListener("click", this.confirm);
|
|
28
|
-
} else {
|
|
29
|
-
throw new Error("Can't handle confirmation on attached element");
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
disconnect() {
|
|
35
|
-
let element = this.el;
|
|
36
|
-
if (isHTMLFormElement(element)) {
|
|
37
|
-
element.removeEventListener("submit", this.confirm);
|
|
38
|
-
} else if (isHTMLAnchorElement(element)) {
|
|
39
|
-
element.removeEventListener("click", this.confirm);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
confirm(event: Event) {
|
|
44
|
-
if (!(window.confirm(this._message))) {
|
|
45
|
-
event.preventDefault();
|
|
46
|
-
this.dispatch(this.el, "confirm:cancelled");
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import {BaseController} from "../utilities/base_controller";
|
|
2
|
-
|
|
3
|
-
export class ConfirmNavigationController extends BaseController {
|
|
4
|
-
|
|
5
|
-
static values = {message: String};
|
|
6
|
-
|
|
7
|
-
declare readonly messageValue: string;
|
|
8
|
-
declare readonly hasMessageValue: boolean;
|
|
9
|
-
|
|
10
|
-
get _message(): string {
|
|
11
|
-
return this.hasMessageValue ? this.messageValue : "Do you want to leave this page? Changes you made may not be saved";
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
initialize() {
|
|
15
|
-
this.allowSubmit = this.allowSubmit.bind(this);
|
|
16
|
-
this.confirmNavigation = this.confirmNavigation.bind(this);
|
|
17
|
-
this.confirmTurboNavigation = this.confirmTurboNavigation.bind(this);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
connect() {
|
|
21
|
-
window.onbeforeunload = () => this._message;
|
|
22
|
-
window.addEventListener("popstate", this.confirmNavigation);
|
|
23
|
-
window.addEventListener("submit", this.allowSubmit);
|
|
24
|
-
window.addEventListener("turbolinks:before-visit", this.confirmTurboNavigation);
|
|
25
|
-
window.addEventListener("turbo:before-visit", this.confirmTurboNavigation);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
disconnect() {
|
|
29
|
-
window.removeEventListener("popstate", this.confirmNavigation);
|
|
30
|
-
window.onbeforeunload = null;
|
|
31
|
-
window.removeEventListener("submit", this.allowSubmit);
|
|
32
|
-
window.removeEventListener("turbolinks:before-visit", this.confirmTurboNavigation);
|
|
33
|
-
window.removeEventListener("turbo:before-visit", this.confirmTurboNavigation);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
allowSubmit(_event: Event) {
|
|
37
|
-
window.removeEventListener("popstate", this.confirmNavigation);
|
|
38
|
-
window.onbeforeunload = null;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
confirmNavigation(_event: PopStateEvent) {
|
|
42
|
-
return false;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
confirmTurboNavigation(event: Event) {
|
|
46
|
-
if (!confirm(this._message)) {
|
|
47
|
-
event.preventDefault();
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import {BaseController} from "../utilities/base_controller";
|
|
2
|
-
|
|
3
|
-
export class DebugController extends BaseController {
|
|
4
|
-
|
|
5
|
-
static targets = ["test"];
|
|
6
|
-
declare testTargets: HTMLElement[];
|
|
7
|
-
|
|
8
|
-
connect() {
|
|
9
|
-
console.log("Debug Controller", this, this.testTargets);
|
|
10
|
-
}
|
|
11
|
-
}
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
import {BaseController} from '../utilities/base_controller';
|
|
2
|
-
import {isHTMLAnchorElement, isHTMLButtonElement, isHTMLInputElement} from "../utilities/elements";
|
|
3
|
-
|
|
4
|
-
export class DisableWithController extends BaseController {
|
|
5
|
-
|
|
6
|
-
static values = {
|
|
7
|
-
message: String,
|
|
8
|
-
timeout: Number,
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
declare readonly messageValue: string;
|
|
12
|
-
declare readonly hasMessageValue: boolean;
|
|
13
|
-
declare readonly timeoutValue: number;
|
|
14
|
-
declare readonly hasTimeoutValue: boolean;
|
|
15
|
-
|
|
16
|
-
_cacheText?: string;
|
|
17
|
-
_timeoutHandle?: ReturnType<typeof window.setTimeout>;
|
|
18
|
-
|
|
19
|
-
get _message(): string {
|
|
20
|
-
return this.hasMessageValue ? this.messageValue : 'Submitting...';
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
get _timeout(): number {
|
|
24
|
-
return this.hasTimeoutValue ? this.timeoutValue : 1000;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
initialize() {
|
|
28
|
-
this.enable = this.enable.bind(this);
|
|
29
|
-
this.disable = this.disable.bind(this);
|
|
30
|
-
this._enable = this._enable.bind(this);
|
|
31
|
-
this._disable = this._disable.bind(this);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
connect() {
|
|
35
|
-
requestAnimationFrame(() => {
|
|
36
|
-
this.el.addEventListener("click", this.disable);
|
|
37
|
-
window.addEventListener("turbo:load", this._enable);
|
|
38
|
-
window.addEventListener("turbolinks:load", this._enable);
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
disconnect() {
|
|
43
|
-
if (this._timeoutHandle) {
|
|
44
|
-
clearTimeout(this._timeoutHandle);
|
|
45
|
-
}
|
|
46
|
-
this.el.removeEventListener("click", this.disable);
|
|
47
|
-
window.addEventListener("turbo:load", this._enable);
|
|
48
|
-
window.addEventListener("turbolinks:load", this._enable);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
disable(event?: Event) {
|
|
52
|
-
let element = this.el;
|
|
53
|
-
|
|
54
|
-
if (this._isDisabled(element)) {
|
|
55
|
-
event?.preventDefault();
|
|
56
|
-
event?.stopImmediatePropagation();
|
|
57
|
-
} else {
|
|
58
|
-
this._cacheText = this._getElText(element);
|
|
59
|
-
this._setElText(element, this._message);
|
|
60
|
-
this._disable();
|
|
61
|
-
setTimeout(this.enable, this._timeout);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
enable(event?: Event) {
|
|
66
|
-
event?.preventDefault();
|
|
67
|
-
let element = this.el;
|
|
68
|
-
if (this._isDisabled(element)) {
|
|
69
|
-
this._setElText(element, this._cacheText!);
|
|
70
|
-
this._enable();
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
_isDisabled(el: HTMLElement): boolean {
|
|
75
|
-
if ((isHTMLInputElement(el) && el.type == "submit") || isHTMLButtonElement(el)) {
|
|
76
|
-
return el.disabled;
|
|
77
|
-
} else {
|
|
78
|
-
return el.dataset.disabled == "true";
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
_getElText(el: HTMLElement): string {
|
|
83
|
-
if (isHTMLInputElement(el) && el.type == "submit") {
|
|
84
|
-
return el.value;
|
|
85
|
-
} else {
|
|
86
|
-
return el.innerText;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
_setElText(el: HTMLElement, str: string) {
|
|
91
|
-
if (isHTMLInputElement(el) && el.type == "submit") {
|
|
92
|
-
el.value = str;
|
|
93
|
-
} else if (isHTMLButtonElement(el) || isHTMLAnchorElement(el)) {
|
|
94
|
-
el.innerText = str;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
_disable() {
|
|
99
|
-
let el = this.el;
|
|
100
|
-
if ((isHTMLInputElement(el) && el.type == "submit") || isHTMLButtonElement(el)) {
|
|
101
|
-
el.disabled = true;
|
|
102
|
-
} else {
|
|
103
|
-
el.dataset.disabled = "true";
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
_enable() {
|
|
108
|
-
let el = this.el;
|
|
109
|
-
if (isHTMLInputElement(el) && el.type == "submit" || isHTMLButtonElement(el)) {
|
|
110
|
-
el.disabled = false;
|
|
111
|
-
} else {
|
|
112
|
-
el.dataset.disabled = undefined;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import {get as _get, set as _set} from "lodash-es";
|
|
2
|
-
import {BaseController} from '../utilities/base_controller';
|
|
3
|
-
|
|
4
|
-
export class ElementSaveController extends BaseController {
|
|
5
|
-
|
|
6
|
-
static targets = [
|
|
7
|
-
"element",
|
|
8
|
-
];
|
|
9
|
-
static values = {
|
|
10
|
-
id: String,
|
|
11
|
-
attributes: String,
|
|
12
|
-
restoreOnLoad: Boolean,
|
|
13
|
-
};
|
|
14
|
-
declare readonly hasElementTarget: boolean;
|
|
15
|
-
declare readonly elementTarget: HTMLElement;
|
|
16
|
-
declare readonly elementTargets: HTMLElement[];
|
|
17
|
-
declare readonly idValue: string;
|
|
18
|
-
declare readonly attributesValue: string;
|
|
19
|
-
declare readonly hasIdValue: boolean;
|
|
20
|
-
declare readonly restoreOnLoadValue: boolean;
|
|
21
|
-
declare readonly hasRestoreOnLoadValue: boolean;
|
|
22
|
-
|
|
23
|
-
get _id() {
|
|
24
|
-
if (this.hasIdValue) {
|
|
25
|
-
return this.idValue;
|
|
26
|
-
}
|
|
27
|
-
let elementID = this.el.id;
|
|
28
|
-
|
|
29
|
-
if (elementID !== "") {
|
|
30
|
-
return elementID;
|
|
31
|
-
} else {
|
|
32
|
-
throw new Error(`No ID value to uniquely identify this element. Please either specify data-${this.identifier}-id-value or give this element an 'id' attribute. `);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
get _uniqueIdentifier() {
|
|
37
|
-
const url = location.href;
|
|
38
|
-
return `${url} ${this._id}`;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
get _restoreOnLoad() {
|
|
42
|
-
return this.hasRestoreOnLoadValue ? this.restoreOnLoadValue : true;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
get _element(): HTMLElement {
|
|
46
|
-
return this.hasElementTarget ? this.elementTarget : this.el;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
connect() {
|
|
50
|
-
requestAnimationFrame(() => {
|
|
51
|
-
if (this._restoreOnLoad) {
|
|
52
|
-
this.restore();
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
clear(event?: Event) {
|
|
58
|
-
if (event) {
|
|
59
|
-
event.preventDefault();
|
|
60
|
-
}
|
|
61
|
-
localStorage.removeItem(this._uniqueIdentifier);
|
|
62
|
-
this.dispatch(this._element, `element-save:cleared`);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
save(event?: Event) {
|
|
66
|
-
if (event) {
|
|
67
|
-
event.preventDefault();
|
|
68
|
-
}
|
|
69
|
-
let element = this._element;
|
|
70
|
-
let attributes = this.attributesValue.split(" ");
|
|
71
|
-
let data: { [idx: string]: any } = {};
|
|
72
|
-
attributes.forEach((attr: string) => data[attr] = _get(element, attr));
|
|
73
|
-
localStorage.setItem(this._uniqueIdentifier, JSON.stringify(data));
|
|
74
|
-
this.dispatch(element, `element-save:save:success`);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
restore(event?: Event) {
|
|
78
|
-
if (event) {
|
|
79
|
-
event.preventDefault();
|
|
80
|
-
}
|
|
81
|
-
let element = this._element;
|
|
82
|
-
if (localStorage.getItem(this._uniqueIdentifier)) {
|
|
83
|
-
const savedData = JSON.parse(localStorage.getItem(this._uniqueIdentifier)!); // get and parse the saved data from localStorage
|
|
84
|
-
Object.keys(savedData).forEach((attr: string) => {
|
|
85
|
-
_set(element as HTMLElement, attr, savedData[attr]);
|
|
86
|
-
});
|
|
87
|
-
this.dispatch(element, `element-save:restore:success`);
|
|
88
|
-
} else {
|
|
89
|
-
this.dispatch(element, `element-save:restore:empty`);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
}
|