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.
Files changed (161) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/controllers/ajax/async_block_controller.d.ts +18 -18
  3. package/dist/controllers/ajax/lazy_block_controller.d.ts +9 -9
  4. package/dist/controllers/ajax/load_block_controller.d.ts +19 -19
  5. package/dist/controllers/ajax/poll_block_controller.d.ts +16 -16
  6. package/dist/controllers/anchor_spy_controller.d.ts +15 -15
  7. package/dist/controllers/back_link_controller.d.ts +19 -19
  8. package/dist/controllers/clipboard_controller.d.ts +18 -18
  9. package/dist/controllers/confirm_controller.d.ts +13 -13
  10. package/dist/controllers/confirm_navigation_controller.d.ts +15 -15
  11. package/dist/controllers/debug_controller.d.ts +6 -6
  12. package/dist/controllers/disable_with_controller.d.ts +25 -25
  13. package/dist/controllers/dismissable_controller.d.ts +6 -6
  14. package/dist/controllers/element_save_controller.d.ts +25 -25
  15. package/dist/controllers/empty_dom_controller.d.ts +29 -29
  16. package/dist/controllers/forms/auto_submit_form_controller.d.ts +15 -14
  17. package/dist/controllers/forms/auto_submit_form_controller.d.ts.map +1 -1
  18. package/dist/controllers/forms/autosize_controller.d.ts +9 -9
  19. package/dist/controllers/forms/char_count_controller.d.ts +26 -26
  20. package/dist/controllers/forms/checkbox_select_all_controller.d.ts +14 -14
  21. package/dist/controllers/forms/detect_dirty_controller.d.ts +16 -16
  22. package/dist/controllers/forms/detect_dirty_form_controller.d.ts +19 -19
  23. package/dist/controllers/forms/disable_inputs_controller.d.ts +16 -16
  24. package/dist/controllers/forms/enable_inputs_controller.d.ts +16 -16
  25. package/dist/controllers/forms/form_rc_controller.d.ts +13 -7
  26. package/dist/controllers/forms/form_rc_controller.d.ts.map +1 -1
  27. package/dist/controllers/forms/form_save_controller.d.ts +33 -33
  28. package/dist/controllers/forms/limited_selection_checkboxes_controller.d.ts +17 -17
  29. package/dist/controllers/forms/navigate_form_errors_controller.d.ts +34 -34
  30. package/dist/controllers/forms/nested_form_controller.d.ts +21 -21
  31. package/dist/controllers/forms/password_confirm_controller.d.ts +17 -17
  32. package/dist/controllers/forms/password_peek_controller.d.ts +8 -8
  33. package/dist/controllers/forms/remote_form_controller.d.ts +13 -13
  34. package/dist/controllers/forms/sync_inputs_controller.d.ts +21 -21
  35. package/dist/controllers/forms/value_warn_controller.d.ts +39 -39
  36. package/dist/controllers/forms/word_count_controller.d.ts +26 -26
  37. package/dist/controllers/media/fallback_image_controller.d.ts +27 -27
  38. package/dist/controllers/media/lightbox_image_controller.d.ts +29 -29
  39. package/dist/controllers/media/media_player_controller.d.ts +12 -12
  40. package/dist/controllers/prefetch_controller.d.ts +18 -18
  41. package/dist/controllers/responsive_iframe_controller.d.ts +23 -23
  42. package/dist/controllers/scroll/scroll_container_controller.d.ts +21 -21
  43. package/dist/controllers/scroll/scroll_into_focus_controller.d.ts +15 -15
  44. package/dist/controllers/scroll/scroll_to_bottom_controller.d.ts +11 -11
  45. package/dist/controllers/scroll/scroll_to_controller.d.ts +17 -17
  46. package/dist/controllers/scroll/scroll_to_top_controller.d.ts +11 -11
  47. package/dist/controllers/self_destruct_controller.d.ts +10 -10
  48. package/dist/controllers/sticky_controller.d.ts +19 -19
  49. package/dist/controllers/tables/table_sort_controller.d.ts +20 -20
  50. package/dist/controllers/tables/table_truncate_controller.d.ts +26 -26
  51. package/dist/controllers/teleport_controller.d.ts +15 -15
  52. package/dist/controllers/temporary_state_controller.d.ts +28 -28
  53. package/dist/controllers/toggle_class_controller.d.ts +35 -35
  54. package/dist/controllers/turbo_frame_rc_controller.d.ts +20 -20
  55. package/dist/controllers/turbo_frame_refresh_controller.d.ts +16 -16
  56. package/dist/controllers/utility/intersection_controller.d.ts +13 -13
  57. package/dist/controllers/utility/interval_controller.d.ts +13 -13
  58. package/dist/controllers/utility/presence_controller.d.ts +5 -5
  59. package/dist/controllers/utility/timeout_controller.d.ts +12 -12
  60. package/dist/controllers/utility/user_focus_controller.d.ts +10 -10
  61. package/dist/controllers/visual/clock_controller.d.ts +18 -18
  62. package/dist/controllers/visual/countdown_controller.d.ts +53 -53
  63. package/dist/controllers/visual/duration_controller.d.ts +27 -27
  64. package/dist/controllers/visual/tabs_controller.d.ts +37 -37
  65. package/dist/controllers/visual/time_distance_controller.d.ts +18 -18
  66. package/dist/controllers/visual/tree_view_controller.d.ts +29 -29
  67. package/dist/index.d.ts +66 -66
  68. package/dist/stimulus-library.cjs.js +2 -0
  69. package/dist/stimulus-library.cjs.js.map +1 -0
  70. package/dist/stimulus-library.es.js +2 -0
  71. package/dist/stimulus-library.es.js.map +1 -0
  72. package/dist/stimulus-library.umd.js +1 -1
  73. package/dist/stimulus-library.umd.js.map +1 -1
  74. package/dist/utilities/base_controller.d.ts +13 -13
  75. package/dist/utilities/base_controller.d.ts.map +1 -1
  76. package/dist/utilities/elements.d.ts +13 -13
  77. package/dist/utilities/ephemeral_controller.d.ts +5 -5
  78. package/dist/utilities/event_bus.d.ts +3 -3
  79. package/dist/utilities/requestSubmit.d.ts +2 -2
  80. package/dist/utilities/scroll.d.ts +10 -10
  81. package/dist/utilities/turbo.d.ts +1 -1
  82. package/package.json +16 -10
  83. package/dist/stimulus-library.js +0 -2
  84. package/dist/stimulus-library.js.map +0 -1
  85. package/dist/stimulus-library.modern.js +0 -2
  86. package/dist/stimulus-library.modern.js.map +0 -1
  87. package/dist/stimulus-library.module.js +0 -2
  88. package/dist/stimulus-library.module.js.map +0 -1
  89. package/src/controllers/ajax/async_block_controller.ts +0 -28
  90. package/src/controllers/ajax/lazy_block_controller.ts +0 -31
  91. package/src/controllers/ajax/load_block_controller.ts +0 -59
  92. package/src/controllers/ajax/poll_block_controller.ts +0 -32
  93. package/src/controllers/anchor_spy_controller.ts +0 -47
  94. package/src/controllers/back_link_controller.ts +0 -49
  95. package/src/controllers/clipboard_controller.ts +0 -47
  96. package/src/controllers/confirm_controller.ts +0 -50
  97. package/src/controllers/confirm_navigation_controller.ts +0 -51
  98. package/src/controllers/debug_controller.ts +0 -11
  99. package/src/controllers/disable_with_controller.ts +0 -116
  100. package/src/controllers/dismissable_controller.ts +0 -12
  101. package/src/controllers/element_save_controller.ts +0 -93
  102. package/src/controllers/empty_dom_controller.ts +0 -105
  103. package/src/controllers/forms/auto_submit_form_controller.ts +0 -59
  104. package/src/controllers/forms/autosize_controller.ts +0 -41
  105. package/src/controllers/forms/char_count_controller.ts +0 -91
  106. package/src/controllers/forms/checkbox_select_all_controller.ts +0 -57
  107. package/src/controllers/forms/detect_dirty_controller.ts +0 -116
  108. package/src/controllers/forms/detect_dirty_form_controller.ts +0 -127
  109. package/src/controllers/forms/disable_inputs_controller.ts +0 -44
  110. package/src/controllers/forms/enable_inputs_controller.ts +0 -44
  111. package/src/controllers/forms/form_rc_controller.ts +0 -20
  112. package/src/controllers/forms/form_save_controller.ts +0 -141
  113. package/src/controllers/forms/limited_selection_checkboxes_controller.ts +0 -44
  114. package/src/controllers/forms/navigate_form_errors_controller.ts +0 -144
  115. package/src/controllers/forms/nested_form_controller.ts +0 -68
  116. package/src/controllers/forms/password_confirm_controller.ts +0 -68
  117. package/src/controllers/forms/password_peek_controller.ts +0 -27
  118. package/src/controllers/forms/remote_form_controller.ts +0 -34
  119. package/src/controllers/forms/sync_inputs_controller.ts +0 -89
  120. package/src/controllers/forms/value_warn_controller.ts +0 -107
  121. package/src/controllers/forms/word_count_controller.ts +0 -86
  122. package/src/controllers/media/fallback_image_controller.ts +0 -108
  123. package/src/controllers/media/lightbox_image_controller.ts +0 -89
  124. package/src/controllers/media/media_player_controller.ts +0 -37
  125. package/src/controllers/prefetch_controller.ts +0 -99
  126. package/src/controllers/responsive_iframe_controller.ts +0 -75
  127. package/src/controllers/scroll/scroll_container_controller.ts +0 -73
  128. package/src/controllers/scroll/scroll_into_focus_controller.ts +0 -34
  129. package/src/controllers/scroll/scroll_to_bottom_controller.ts +0 -35
  130. package/src/controllers/scroll/scroll_to_controller.ts +0 -38
  131. package/src/controllers/scroll/scroll_to_top_controller.ts +0 -35
  132. package/src/controllers/self_destruct_controller.ts +0 -23
  133. package/src/controllers/sticky_controller.ts +0 -84
  134. package/src/controllers/tables/table_sort_controller.ts +0 -105
  135. package/src/controllers/tables/table_truncate_controller.ts +0 -106
  136. package/src/controllers/teleport_controller.ts +0 -64
  137. package/src/controllers/temporary_state_controller.ts +0 -82
  138. package/src/controllers/toggle_class_controller.ts +0 -149
  139. package/src/controllers/turbo_frame_rc_controller.ts +0 -77
  140. package/src/controllers/turbo_frame_refresh_controller.ts +0 -51
  141. package/src/controllers/utility/intersection_controller.ts +0 -51
  142. package/src/controllers/utility/interval_controller.ts +0 -34
  143. package/src/controllers/utility/presence_controller.ts +0 -13
  144. package/src/controllers/utility/timeout_controller.ts +0 -30
  145. package/src/controllers/utility/user_focus_controller.ts +0 -40
  146. package/src/controllers/visual/clock_controller.ts +0 -75
  147. package/src/controllers/visual/countdown_controller.ts +0 -198
  148. package/src/controllers/visual/duration_controller.ts +0 -106
  149. package/src/controllers/visual/tabs_controller.ts +0 -162
  150. package/src/controllers/visual/time_distance_controller.ts +0 -66
  151. package/src/controllers/visual/tree_view_controller.ts +0 -154
  152. package/src/index.ts +0 -71
  153. package/src/utilities/base_controller.ts +0 -143
  154. package/src/utilities/elements.ts +0 -47
  155. package/src/utilities/ephemeral_controller.ts +0 -45
  156. package/src/utilities/event_bus.ts +0 -3
  157. package/src/utilities/requestSubmit.ts +0 -23
  158. package/src/utilities/scroll.ts +0 -101
  159. package/src/utilities/turbo.ts +0 -3
  160. package/src/utilities/types.d.ts +0 -4
  161. 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
- }