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,105 +0,0 @@
|
|
|
1
|
-
import {useMutation} from "stimulus-use";
|
|
2
|
-
import {BaseController} from "../utilities/base_controller";
|
|
3
|
-
|
|
4
|
-
export class EmptyDomController extends BaseController {
|
|
5
|
-
|
|
6
|
-
static targets = ["container"];
|
|
7
|
-
static classes = ["empty", "notEmpty"];
|
|
8
|
-
static values = {scopeSelector: String};
|
|
9
|
-
|
|
10
|
-
declare readonly hasContainerTarget: boolean;
|
|
11
|
-
declare readonly containerTarget: HTMLElement;
|
|
12
|
-
|
|
13
|
-
declare readonly emptyClass: string;
|
|
14
|
-
declare readonly hasEmptyClass: boolean;
|
|
15
|
-
declare readonly notEmptyClass: string;
|
|
16
|
-
declare readonly hasNotEmptyClass: boolean;
|
|
17
|
-
|
|
18
|
-
declare hasScopeSelectorValue: boolean;
|
|
19
|
-
declare scopeSelectorValue: string;
|
|
20
|
-
|
|
21
|
-
get _container() {
|
|
22
|
-
return this.hasContainerTarget ? this.containerTarget : this.el;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
get _notEmptyClasses(): string[] {
|
|
26
|
-
return this.notEmptyClass.split(' ');
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
get _defaultNotEmptyClasses(): string[] {
|
|
30
|
-
return [];
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
get _emptyClasses(): string[] {
|
|
34
|
-
return this.emptyClass.split(' ');
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
get _defaultEmptyClasses(): string[] {
|
|
38
|
-
return [];
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
get _children(): Element[] {
|
|
42
|
-
let element = this._container;
|
|
43
|
-
if (this.hasScopeSelectorValue) {
|
|
44
|
-
return Array.from(element.querySelectorAll(this.scopeSelectorValue));
|
|
45
|
-
} else {
|
|
46
|
-
return Array.from(element.children);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
connect() {
|
|
51
|
-
useMutation(this, {element: this._container, childList: true});
|
|
52
|
-
this.checkEmpty();
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
mutate(entries: MutationRecord[]) {
|
|
56
|
-
this.checkEmpty();
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
checkEmpty() {
|
|
60
|
-
let element = this._container;
|
|
61
|
-
let children = this._children;
|
|
62
|
-
if (children.length === 0) {
|
|
63
|
-
this._removeNotEmptyClasses();
|
|
64
|
-
this._addEmptyClasses();
|
|
65
|
-
this.dispatch(element as HTMLElement, "dom:empty");
|
|
66
|
-
} else {
|
|
67
|
-
this._addNotEmptyClasses();
|
|
68
|
-
this._removeEmptyClasses();
|
|
69
|
-
this.dispatch(element as HTMLElement, "dom:not-empty", {detail: {count: children.length}});
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
private _addNotEmptyClasses(el: HTMLElement = this.el) {
|
|
74
|
-
if (this.hasNotEmptyClass) {
|
|
75
|
-
el.classList.add(...this._notEmptyClasses);
|
|
76
|
-
} else {
|
|
77
|
-
el.classList.add(...this._defaultNotEmptyClasses);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
private _removeNotEmptyClasses(el: HTMLElement = this.el) {
|
|
82
|
-
if (this.hasNotEmptyClass) {
|
|
83
|
-
el.classList.remove(...this._notEmptyClasses);
|
|
84
|
-
} else {
|
|
85
|
-
el.classList.remove(...this._defaultNotEmptyClasses);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
private _addEmptyClasses(el: HTMLElement = this.el) {
|
|
90
|
-
if (this.hasEmptyClass) {
|
|
91
|
-
el.classList.add(...this._emptyClasses);
|
|
92
|
-
} else {
|
|
93
|
-
el.classList.add(...this._defaultEmptyClasses);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
private _removeEmptyClasses(el: HTMLElement = this.el) {
|
|
98
|
-
if (this.hasEmptyClass) {
|
|
99
|
-
el.classList.remove(...this._emptyClasses);
|
|
100
|
-
} else {
|
|
101
|
-
el.classList.remove(...this._defaultEmptyClasses);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import {BaseController} from "../../utilities/base_controller";
|
|
2
|
-
import {requestSubmit} from "../../utilities/requestSubmit";
|
|
3
|
-
|
|
4
|
-
export class AutoSubmitFormController extends BaseController {
|
|
5
|
-
|
|
6
|
-
static values = {
|
|
7
|
-
mode: String,
|
|
8
|
-
};
|
|
9
|
-
declare readonly modeValue: "direct" | "request";
|
|
10
|
-
declare readonly hasModeValue: boolean;
|
|
11
|
-
|
|
12
|
-
get _mode(): "direct" | "request" {
|
|
13
|
-
if (this.hasModeValue) {
|
|
14
|
-
if (!["direct", "request"].includes(this.modeValue)) {
|
|
15
|
-
throw new Error(`The modeValue provided '${this.modeValue}' is not one of the recognised configuration options`);
|
|
16
|
-
}
|
|
17
|
-
return this.modeValue;
|
|
18
|
-
} else {
|
|
19
|
-
return "request";
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
get submitButton(): HTMLButtonElement {
|
|
24
|
-
let button: HTMLButtonElement | null = this.element.querySelector('button[type="submit"]');
|
|
25
|
-
if (!button) {
|
|
26
|
-
button = document.createElement('button');
|
|
27
|
-
button.type = 'submit';
|
|
28
|
-
button.style.display = 'none';
|
|
29
|
-
button.dataset.sythentic = 'true';
|
|
30
|
-
this.element.insertAdjacentElement('beforeend', button);
|
|
31
|
-
}
|
|
32
|
-
return button;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
initialize() {
|
|
36
|
-
this.submit = this.submit.bind(this);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
connect() {
|
|
40
|
-
this.el.querySelectorAll("input, select, textarea").forEach(el => el.addEventListener("change", this.submit));
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
disconnect() {
|
|
44
|
-
this.el.querySelectorAll("input, select, textarea").forEach(el => el.removeEventListener("change", this.submit));
|
|
45
|
-
if (this.submitButton.dataset.synthetic == 'true') {
|
|
46
|
-
this.submitButton.remove();
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
private submit() {
|
|
51
|
-
let el = this.el as HTMLFormElement;
|
|
52
|
-
if (this._mode == 'request') {
|
|
53
|
-
requestSubmit(el);
|
|
54
|
-
} else {
|
|
55
|
-
// Call submit directly, do not dispatch events, do not pass go, do not collect $200.
|
|
56
|
-
el.submit();
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import {useWindowResize} from "stimulus-use";
|
|
2
|
-
import {BaseController} from "../../utilities/base_controller";
|
|
3
|
-
|
|
4
|
-
export class AutosizeController extends BaseController {
|
|
5
|
-
|
|
6
|
-
initialize() {
|
|
7
|
-
this._handler = this._handler.bind(this);
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
connect() {
|
|
11
|
-
useWindowResize(this);
|
|
12
|
-
requestAnimationFrame(() => {
|
|
13
|
-
this._handler();
|
|
14
|
-
let target = this.el as HTMLTextAreaElement;
|
|
15
|
-
target.style.resize = "none";
|
|
16
|
-
target.style.boxSizing = "border-box";
|
|
17
|
-
target.addEventListener("input", this._handler);
|
|
18
|
-
target.addEventListener("focus", this._handler);
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
disconnect() {
|
|
23
|
-
this.el.removeEventListener("input", this._handler);
|
|
24
|
-
this.el.removeEventListener("focus", this._handler);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
windowResize() {
|
|
28
|
-
this._handler();
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
private _handler() {
|
|
32
|
-
this.autosize(this.el as HTMLTextAreaElement);
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
private autosize(element: HTMLTextAreaElement) {
|
|
36
|
-
let offset = element.offsetHeight - element.clientHeight;
|
|
37
|
-
element.style.height = "auto";
|
|
38
|
-
element.style.height = element.scrollHeight + offset + "px";
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
}
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
import {BaseController} from "../../utilities/base_controller";
|
|
2
|
-
|
|
3
|
-
export class CharCountController extends BaseController {
|
|
4
|
-
|
|
5
|
-
// Config
|
|
6
|
-
static targets = ["input", "output"];
|
|
7
|
-
static values = {min: Number, max: Number};
|
|
8
|
-
static classes = ["error"];
|
|
9
|
-
|
|
10
|
-
// Targets
|
|
11
|
-
declare readonly inputTarget: HTMLInputElement | HTMLTextAreaElement;
|
|
12
|
-
declare readonly outputTarget: HTMLElement;
|
|
13
|
-
// Values
|
|
14
|
-
declare minValue: number;
|
|
15
|
-
declare hasMinValue: boolean;
|
|
16
|
-
declare maxValue: number;
|
|
17
|
-
declare hasMaxValue: boolean;
|
|
18
|
-
// Classes
|
|
19
|
-
declare readonly errorClass: string;
|
|
20
|
-
declare readonly hasErrorClass: boolean;
|
|
21
|
-
|
|
22
|
-
// Getters
|
|
23
|
-
get _errorClasses(): string[] {
|
|
24
|
-
return this.errorClass.split(' ');
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
get _defaultErrorClasses(): string[] {
|
|
28
|
-
return [];
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// Lifecycle Methods
|
|
32
|
-
initialize() {
|
|
33
|
-
this._updateCharCount = this._updateCharCount.bind(this);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
connect() {
|
|
37
|
-
requestAnimationFrame(() => {
|
|
38
|
-
this.inputTarget.addEventListener("input", this._updateCharCount);
|
|
39
|
-
this._updateCharCount();
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
disconnect() {
|
|
44
|
-
this.inputTarget.removeEventListener("input", this._updateCharCount);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// Methods
|
|
48
|
-
private _addErrorClasses(el: HTMLElement = this.el) {
|
|
49
|
-
if (this.hasErrorClass) {
|
|
50
|
-
el.classList.add(...this._errorClasses);
|
|
51
|
-
} else {
|
|
52
|
-
el.classList.add(...this._defaultErrorClasses);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
private _removeErrorClasses(el: HTMLElement = this.el) {
|
|
57
|
-
if (this.hasErrorClass) {
|
|
58
|
-
el.classList.remove(...this._errorClasses);
|
|
59
|
-
} else {
|
|
60
|
-
el.classList.remove(...this._defaultErrorClasses);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
private _updateCharCount() {
|
|
65
|
-
let charCount = this.inputTarget.value.length;
|
|
66
|
-
this.outputTarget.innerText = charCount.toString();
|
|
67
|
-
if (this.hasErrorClass) {
|
|
68
|
-
if (this._isValidCount(charCount)) {
|
|
69
|
-
this._removeErrorClasses(this.outputTarget);
|
|
70
|
-
} else {
|
|
71
|
-
this._addErrorClasses(this.outputTarget);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
private _isValidCount(count: number) {
|
|
77
|
-
let min = 0;
|
|
78
|
-
let max = 99999;
|
|
79
|
-
|
|
80
|
-
if (this.hasMinValue) {
|
|
81
|
-
min = this.minValue;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
if (this.hasMaxValue) {
|
|
85
|
-
max = this.maxValue;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
return count >= min && count <= max;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import {BaseController} from '../../utilities/base_controller';
|
|
2
|
-
|
|
3
|
-
export class CheckboxSelectAllController extends BaseController {
|
|
4
|
-
static targets = ['selectAll', 'checkbox'];
|
|
5
|
-
|
|
6
|
-
declare readonly hasSelectAllTarget: boolean;
|
|
7
|
-
declare readonly selectAllTarget: HTMLInputElement;
|
|
8
|
-
declare readonly checkboxTargets: HTMLInputElement[];
|
|
9
|
-
|
|
10
|
-
private get _checked() {
|
|
11
|
-
return this.checkboxTargets.filter(checkbox => checkbox.checked);
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
private get _unchecked() {
|
|
15
|
-
return this.checkboxTargets.filter(checkbox => !checkbox.checked);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
initialize() {
|
|
19
|
-
this._toggle = this._toggle.bind(this);
|
|
20
|
-
this._refresh = this._refresh.bind(this);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
connect() {
|
|
24
|
-
requestAnimationFrame(() => {
|
|
25
|
-
if (!this.hasSelectAllTarget) {
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
this.selectAllTarget.addEventListener('change', this._toggle);
|
|
30
|
-
this.checkboxTargets.forEach(checkbox => checkbox.addEventListener('change', this._refresh));
|
|
31
|
-
this._refresh();
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
disconnect() {
|
|
36
|
-
if (!this.hasSelectAllTarget) {
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
this.selectAllTarget.removeEventListener('change', this._toggle);
|
|
41
|
-
this.checkboxTargets.forEach((checkbox) => checkbox.removeEventListener('change', this._refresh));
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
private _toggle(event: Event) {
|
|
45
|
-
event.preventDefault();
|
|
46
|
-
let target = event.target as HTMLInputElement;
|
|
47
|
-
this.checkboxTargets.forEach((checkbox) => checkbox.checked = target.checked);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
private _refresh() {
|
|
51
|
-
const checkboxesCount = this.checkboxTargets.length;
|
|
52
|
-
const checkboxesCheckedCount = this._checked.length;
|
|
53
|
-
|
|
54
|
-
this.selectAllTarget.checked = checkboxesCheckedCount > 0;
|
|
55
|
-
this.selectAllTarget.indeterminate = checkboxesCheckedCount > 0 && checkboxesCheckedCount < checkboxesCount;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
import {BaseController} from "../../utilities/base_controller";
|
|
2
|
-
import {isElementCheckable, isHTMLSelectElement} from "../../utilities/elements";
|
|
3
|
-
|
|
4
|
-
export class DetectDirtyController extends BaseController {
|
|
5
|
-
|
|
6
|
-
get _cacheAttrName(): string {
|
|
7
|
-
return 'detect-dirty-load-value';
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
initialize() {
|
|
11
|
-
this._checkDirty = this._checkDirty.bind(this);
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
connect() {
|
|
15
|
-
let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;
|
|
16
|
-
|
|
17
|
-
this._cacheLoadValues();
|
|
18
|
-
this._checkDirty();
|
|
19
|
-
element.addEventListener("input", this._checkDirty);
|
|
20
|
-
element.addEventListener("change", this._checkDirty);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
disconnect() {
|
|
24
|
-
let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;
|
|
25
|
-
element.removeEventListener("input", this._checkDirty);
|
|
26
|
-
element.removeEventListener("change", this._checkDirty);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
restore(event?: Event) {
|
|
30
|
-
event?.preventDefault();
|
|
31
|
-
this._restoreElementFromLoadValue();
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
private _getElementValue(): boolean | string {
|
|
35
|
-
let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;
|
|
36
|
-
return isElementCheckable(element) ? element.checked : element.value;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
private _getElementLoadValue(): boolean | string {
|
|
40
|
-
let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;
|
|
41
|
-
let value = element.getAttribute(this._cacheAttrName);
|
|
42
|
-
if (isElementCheckable(element)) {
|
|
43
|
-
return value == null ? element.defaultChecked : value == "true";
|
|
44
|
-
} else if (value !== null) {
|
|
45
|
-
return value;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
if (isHTMLSelectElement(element)) {
|
|
49
|
-
let options = Array.from(element.options);
|
|
50
|
-
options.forEach((option) => {
|
|
51
|
-
if (option.defaultSelected) {
|
|
52
|
-
element.value = option.value;
|
|
53
|
-
return option.value;
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
return value!;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
private _elementHasCachedLoadValue(): boolean {
|
|
62
|
-
let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;
|
|
63
|
-
return element.hasAttribute(this._cacheAttrName);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
private _checkDirty() {
|
|
67
|
-
let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;
|
|
68
|
-
if (this._isElementDirty()) {
|
|
69
|
-
element.setAttribute('data-dirty', "true");
|
|
70
|
-
} else {
|
|
71
|
-
element.removeAttribute('data-dirty');
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
private _isElementDirty(): boolean {
|
|
76
|
-
return this._getElementValue() !== this._getElementLoadValue();
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
private _restoreElementFromLoadValue() {
|
|
80
|
-
let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;
|
|
81
|
-
let cacheValue = element.getAttribute(this._cacheAttrName);
|
|
82
|
-
|
|
83
|
-
if (isElementCheckable(element)) {
|
|
84
|
-
element.setAttribute(this._cacheAttrName, element.checked.toString());
|
|
85
|
-
element.checked = cacheValue == null ? element.defaultChecked : cacheValue == "true";
|
|
86
|
-
} else if (isHTMLSelectElement(element)) {
|
|
87
|
-
if (cacheValue == null) {
|
|
88
|
-
let options = Array.from(element.options);
|
|
89
|
-
options.forEach((option) => {
|
|
90
|
-
if (option.defaultSelected) {
|
|
91
|
-
element.value = option.value;
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
} else {
|
|
96
|
-
element.value = cacheValue;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
} else {
|
|
100
|
-
element.value = cacheValue == null ? element.defaultValue : cacheValue;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
private _cacheLoadValues(): void {
|
|
105
|
-
let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;
|
|
106
|
-
if (!this._elementHasCachedLoadValue() && isElementCheckable(element)) {
|
|
107
|
-
element.setAttribute(this._cacheAttrName, element.checked.toString());
|
|
108
|
-
} else {
|
|
109
|
-
element.setAttribute(this._cacheAttrName, element.value.toString());
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
export function isDirty(element: HTMLElement) {
|
|
115
|
-
return element.hasAttribute("data-dirty");
|
|
116
|
-
}
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
import {BaseController} from "../../utilities/base_controller";
|
|
2
|
-
import {isElementCheckable, isHTMLSelectElement} from "../../utilities/elements";
|
|
3
|
-
|
|
4
|
-
export class DetectDirtyFormController extends BaseController {
|
|
5
|
-
|
|
6
|
-
get _formElements(): Array<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement> {
|
|
7
|
-
return Array.from(this.el.querySelectorAll('input, select, textarea'));
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
get _cacheAttrName(): string {
|
|
11
|
-
return 'detect-dirty-load-value';
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
initialize() {
|
|
15
|
-
this._checkDirty = this._checkDirty.bind(this);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
connect() {
|
|
19
|
-
let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;
|
|
20
|
-
|
|
21
|
-
this._cacheLoadValues();
|
|
22
|
-
this._checkDirty();
|
|
23
|
-
element.addEventListener("input", this._checkDirty);
|
|
24
|
-
element.addEventListener("change", this._checkDirty);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
disconnect() {
|
|
28
|
-
let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;
|
|
29
|
-
element.removeEventListener("input", this._checkDirty);
|
|
30
|
-
element.removeEventListener("change", this._checkDirty);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
restore(event?: Event) {
|
|
34
|
-
event?.preventDefault();
|
|
35
|
-
this._formElements.forEach(element => this._restoreElementFromLoadValue(element));
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
private _getElementValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean | string {
|
|
39
|
-
return isElementCheckable(element) ? element.checked : element.value;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
private _getElementLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean | string {
|
|
43
|
-
let value = element.getAttribute(this._cacheAttrName);
|
|
44
|
-
if (isElementCheckable(element)) {
|
|
45
|
-
return value == null ? element.defaultChecked : value == "true";
|
|
46
|
-
} else if (value !== null) {
|
|
47
|
-
return value;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
if (isHTMLSelectElement(element)) {
|
|
51
|
-
let options = Array.from(element.options);
|
|
52
|
-
options.forEach((option) => {
|
|
53
|
-
if (option.defaultSelected) {
|
|
54
|
-
element.value = option.value;
|
|
55
|
-
return option.value;
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
return value!;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
private _elementHasCachedLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean {
|
|
64
|
-
return element.hasAttribute(this._cacheAttrName);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
private _checkElementDirty(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {
|
|
68
|
-
if (this._isElementDirty(element)) {
|
|
69
|
-
element.setAttribute('data-dirty', "true");
|
|
70
|
-
} else {
|
|
71
|
-
element.removeAttribute('data-dirty');
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
private _isElementDirty(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean {
|
|
76
|
-
return this._getElementValue(element) !== this._getElementLoadValue(element);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
private _cacheElementLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {
|
|
80
|
-
if (!this._elementHasCachedLoadValue(element) && isElementCheckable(element)) {
|
|
81
|
-
element.setAttribute(this._cacheAttrName, element.checked.toString());
|
|
82
|
-
} else {
|
|
83
|
-
element.setAttribute(this._cacheAttrName, element.value.toString());
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
private _restoreElementFromLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {
|
|
88
|
-
let cacheValue = element.getAttribute(this._cacheAttrName);
|
|
89
|
-
|
|
90
|
-
if (isElementCheckable(element)) {
|
|
91
|
-
element.setAttribute(this._cacheAttrName, element.checked.toString());
|
|
92
|
-
element.checked = cacheValue == null ? element.defaultChecked : cacheValue == "true";
|
|
93
|
-
} else if (isHTMLSelectElement(element)) {
|
|
94
|
-
if (cacheValue == null) {
|
|
95
|
-
let options = Array.from(element.options);
|
|
96
|
-
options.forEach((option) => {
|
|
97
|
-
if (option.defaultSelected) {
|
|
98
|
-
element.value = option.value;
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
} else {
|
|
103
|
-
element.value = cacheValue;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
} else {
|
|
107
|
-
element.value = cacheValue == null ? element.defaultValue : cacheValue;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
private _cacheLoadValues(): void {
|
|
112
|
-
this._formElements.forEach(el => this._cacheElementLoadValue(el));
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
private _checkDirty(): void {
|
|
116
|
-
this._formElements.forEach(el => this._checkElementDirty(el));
|
|
117
|
-
if (this._formElements.some(el => isFormDirty(el))) {
|
|
118
|
-
this.el.setAttribute("data-dirty", "true");
|
|
119
|
-
} else {
|
|
120
|
-
this.el.removeAttribute("data-dirty");
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
export function isFormDirty(element: HTMLElement) {
|
|
126
|
-
return element.hasAttribute("data-dirty");
|
|
127
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import {BaseController} from "../../utilities/base_controller";
|
|
2
|
-
|
|
3
|
-
export class DisableInputsController extends BaseController {
|
|
4
|
-
|
|
5
|
-
static targets = ["disabler", "disable"];
|
|
6
|
-
|
|
7
|
-
static values = {
|
|
8
|
-
clear: Boolean,
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
declare readonly hasDisablerTarget: boolean;
|
|
12
|
-
declare readonly disablerTarget: HTMLInputElement;
|
|
13
|
-
declare readonly disableTargets: Array<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>;
|
|
14
|
-
declare readonly clearValue: boolean;
|
|
15
|
-
declare readonly hasClearValue: boolean;
|
|
16
|
-
|
|
17
|
-
connect() {
|
|
18
|
-
this.toggle();
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
toggle() {
|
|
22
|
-
if (this.hasDisablerTarget && this.disablerTarget.checked) {
|
|
23
|
-
this.disableInputs();
|
|
24
|
-
} else {
|
|
25
|
-
this.enableInputs();
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
disableInputs() {
|
|
30
|
-
let shouldClear = this.hasClearValue && this.clearValue;
|
|
31
|
-
this.disableTargets.forEach((el, _) => {
|
|
32
|
-
if (shouldClear) {
|
|
33
|
-
el.value = "";
|
|
34
|
-
}
|
|
35
|
-
el.disabled = true;
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
enableInputs() {
|
|
40
|
-
this.disableTargets.forEach((el, _) => {
|
|
41
|
-
el.disabled = false;
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import {BaseController} from "../../utilities/base_controller";
|
|
2
|
-
|
|
3
|
-
export class EnableInputsController extends BaseController {
|
|
4
|
-
|
|
5
|
-
static targets = ["enabler", "enable"];
|
|
6
|
-
|
|
7
|
-
static values = {
|
|
8
|
-
clear: Boolean,
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
declare readonly hasEnablerTarget: boolean;
|
|
12
|
-
declare readonly enablerTarget: HTMLInputElement;
|
|
13
|
-
declare readonly enableTargets: Array<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>;
|
|
14
|
-
declare readonly clearValue: boolean;
|
|
15
|
-
declare readonly hasClearValue: boolean;
|
|
16
|
-
|
|
17
|
-
connect() {
|
|
18
|
-
this.toggle();
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
toggle() {
|
|
22
|
-
if (this.hasEnablerTarget && this.enablerTarget.checked) {
|
|
23
|
-
this.enableInputs();
|
|
24
|
-
} else {
|
|
25
|
-
this.disableInputs();
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
disableInputs() {
|
|
30
|
-
let shouldClear = this.hasClearValue && this.clearValue;
|
|
31
|
-
this.enableTargets.forEach((el, _) => {
|
|
32
|
-
if (shouldClear) {
|
|
33
|
-
el.value = "";
|
|
34
|
-
}
|
|
35
|
-
el.disabled = true;
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
enableInputs() {
|
|
40
|
-
this.enableTargets.forEach((el, _) => {
|
|
41
|
-
el.disabled = false;
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
}
|