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,107 +0,0 @@
|
|
|
1
|
-
import {BaseController} from "../../utilities/base_controller";
|
|
2
|
-
|
|
3
|
-
export class ValueWarnController extends BaseController {
|
|
4
|
-
static classes = ["inputWarning", "warningHide"];
|
|
5
|
-
static targets = ["input", "warning"];
|
|
6
|
-
static values = {max: Number, min: Number, minMessage: String, maxMessage: String};/* Classes*/
|
|
7
|
-
declare readonly inputWarningClass: string;
|
|
8
|
-
declare readonly hasInputWarningClass: boolean;
|
|
9
|
-
declare readonly warningHideClass: string;
|
|
10
|
-
declare readonly hasWarningHideClass: boolean;/* Targets*/
|
|
11
|
-
declare readonly inputTarget: HTMLInputElement;
|
|
12
|
-
declare readonly warningTarget: HTMLElement;/* Values*/
|
|
13
|
-
declare readonly maxValue: number;
|
|
14
|
-
declare readonly hasMaxValue: boolean;
|
|
15
|
-
declare readonly minValue: number;
|
|
16
|
-
declare readonly hasMinValue: boolean;
|
|
17
|
-
declare readonly minMessageValue: string;
|
|
18
|
-
declare readonly hasMinMessageValue: boolean;
|
|
19
|
-
declare readonly maxMessageValue: string;
|
|
20
|
-
declare readonly hasMaxMessageValue: boolean;
|
|
21
|
-
|
|
22
|
-
get _maxMessage(): string {
|
|
23
|
-
return this.hasMaxMessageValue ? this.maxMessageValue : `Value must be less than ${this.maxValue}`;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
get _minMessage(): string {
|
|
27
|
-
return this.hasMinMessageValue ? this.minMessageValue : `Value must be greater than ${this.minValue}`;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
get _warningHideClasses(): string[] {
|
|
31
|
-
return this.warningHideClass.split(" ");
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
get _defaultWarningHideClasses(): string[] {
|
|
35
|
-
return ["hide"];
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
get _inputWarningClasses(): string[] {
|
|
39
|
-
return this.inputWarningClass.split(" ");
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
get _defaultInputWarningClasses(): string[] {
|
|
43
|
-
return [""];
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
initialize() {
|
|
47
|
-
this._check = this._check.bind(this);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
connect() {
|
|
51
|
-
this._addWarningHideClasses(this.warningTarget);
|
|
52
|
-
this.inputTarget.addEventListener("input", this._check);
|
|
53
|
-
this._check();
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
disconnect() {
|
|
57
|
-
this.inputTarget.removeEventListener("input", this._check);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
private _check() {
|
|
61
|
-
if (this.hasMinValue && Number.parseFloat(this.inputTarget.value) < this.minValue) {
|
|
62
|
-
this._removeWarningHideClasses(this.warningTarget);
|
|
63
|
-
this._addInputWarningClasses(this.inputTarget);
|
|
64
|
-
this.warningTarget.innerText = this._minMessage;
|
|
65
|
-
} else if (this.hasMaxValue && Number.parseFloat(this.inputTarget.value) > this.maxValue) {
|
|
66
|
-
this._removeWarningHideClasses(this.warningTarget);
|
|
67
|
-
this._addInputWarningClasses(this.inputTarget);
|
|
68
|
-
this.warningTarget.innerText = this._maxMessage;
|
|
69
|
-
} else {
|
|
70
|
-
this._addWarningHideClasses(this.warningTarget);
|
|
71
|
-
this._removeInputWarningClasses(this.inputTarget);
|
|
72
|
-
this.warningTarget.innerText = "";
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
private _addWarningHideClasses(el: HTMLElement = this.el) {
|
|
77
|
-
if (this.hasWarningHideClass) {
|
|
78
|
-
el.classList.add(...this._warningHideClasses);
|
|
79
|
-
} else {
|
|
80
|
-
el.classList.add(...this._defaultWarningHideClasses);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
private _removeWarningHideClasses(el: HTMLElement = this.el) {
|
|
85
|
-
if (this.hasWarningHideClass) {
|
|
86
|
-
el.classList.remove(...this._warningHideClasses);
|
|
87
|
-
} else {
|
|
88
|
-
el.classList.remove(...this._defaultWarningHideClasses);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
private _addInputWarningClasses(el: HTMLElement = this.el) {
|
|
93
|
-
if (this.hasInputWarningClass) {
|
|
94
|
-
el.classList.add(...this._inputWarningClasses);
|
|
95
|
-
} else {
|
|
96
|
-
el.classList.add(...this._defaultInputWarningClasses);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
private _removeInputWarningClasses(el: HTMLElement = this.el) {
|
|
101
|
-
if (this.hasInputWarningClass) {
|
|
102
|
-
el.classList.remove(...this._inputWarningClasses);
|
|
103
|
-
} else {
|
|
104
|
-
el.classList.remove(...this._defaultInputWarningClasses);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import {BaseController} from "../../utilities/base_controller";
|
|
2
|
-
|
|
3
|
-
export class WordCountController extends BaseController {
|
|
4
|
-
|
|
5
|
-
static targets = ["input", "output"];
|
|
6
|
-
static values = {min: Number, max: Number};
|
|
7
|
-
static classes = ["error"];
|
|
8
|
-
|
|
9
|
-
declare readonly inputTarget: HTMLInputElement | HTMLTextAreaElement;
|
|
10
|
-
declare readonly outputTarget: HTMLElement;
|
|
11
|
-
declare minValue: number;
|
|
12
|
-
declare hasMinValue: boolean;
|
|
13
|
-
declare maxValue: number;
|
|
14
|
-
declare hasMaxValue: boolean;
|
|
15
|
-
|
|
16
|
-
declare readonly errorClass: string;
|
|
17
|
-
declare readonly hasErrorClass: boolean;
|
|
18
|
-
|
|
19
|
-
get _errorClasses(): string[] {
|
|
20
|
-
return this.errorClass.split(' ');
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
get _defaultErrorClasses(): string[] {
|
|
24
|
-
return [];
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
initialize() {
|
|
28
|
-
this._updateWordCount = this._updateWordCount.bind(this);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
connect() {
|
|
32
|
-
this._updateWordCount();
|
|
33
|
-
this.inputTarget.addEventListener("input", this._updateWordCount);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
disconnect() {
|
|
37
|
-
this.inputTarget.removeEventListener("input", this._updateWordCount);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
_updateWordCount() {
|
|
41
|
-
let wordCount = 0;
|
|
42
|
-
let textAreaValue = this.inputTarget.value;
|
|
43
|
-
let matches = textAreaValue.match(/\S+/g);
|
|
44
|
-
wordCount = (matches && matches.length) || 0;
|
|
45
|
-
this.outputTarget.innerText = wordCount.toString();
|
|
46
|
-
if (this.hasErrorClass) {
|
|
47
|
-
if (this._isValidCount(wordCount)) {
|
|
48
|
-
this._removeErrorClasses(this.outputTarget);
|
|
49
|
-
} else {
|
|
50
|
-
this._addErrorClasses(this.outputTarget);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
private _addErrorClasses(el: HTMLElement = this.el) {
|
|
56
|
-
if (this.hasErrorClass) {
|
|
57
|
-
el.classList.add(...this._errorClasses);
|
|
58
|
-
} else {
|
|
59
|
-
el.classList.add(...this._defaultErrorClasses);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
private _removeErrorClasses(el: HTMLElement = this.el) {
|
|
64
|
-
if (this.hasErrorClass) {
|
|
65
|
-
el.classList.remove(...this._errorClasses);
|
|
66
|
-
} else {
|
|
67
|
-
el.classList.remove(...this._defaultErrorClasses);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
private _isValidCount(count: number) {
|
|
72
|
-
let min = 0;
|
|
73
|
-
let max = 99999;
|
|
74
|
-
|
|
75
|
-
if (this.hasMinValue) {
|
|
76
|
-
min = this.minValue;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
if (this.hasMaxValue) {
|
|
80
|
-
max = this.maxValue;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
return count >= min && count <= max;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
}
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import {BaseController} from "../../utilities/base_controller";
|
|
2
|
-
|
|
3
|
-
export class FallbackImageController extends BaseController {
|
|
4
|
-
|
|
5
|
-
static values = {placeholder: String};
|
|
6
|
-
static classes = ["success", "fail"];
|
|
7
|
-
|
|
8
|
-
declare readonly placeholderValue: string;
|
|
9
|
-
declare readonly hasPlaceholderValue: boolean;
|
|
10
|
-
declare readonly successClass: string;
|
|
11
|
-
declare readonly hasSuccessClass: boolean;
|
|
12
|
-
declare readonly failClass: string;
|
|
13
|
-
declare readonly hasFailClass: boolean;
|
|
14
|
-
|
|
15
|
-
get _successClasses(): string[] {
|
|
16
|
-
return this.successClass.split(' ');
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
get _defaultSuccessClasses(): string[] {
|
|
20
|
-
return [];
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
get _failClasses(): string[] {
|
|
24
|
-
return this.failClass.split(' ');
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
get _defaultFailClasses(): string[] {
|
|
28
|
-
return [];
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
initialize() {
|
|
32
|
-
this._hasLoadedSuccessfully = this._hasLoadedSuccessfully.bind(this);
|
|
33
|
-
this._success = this._success.bind(this);
|
|
34
|
-
this._fail = this._fail.bind(this);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
connect() {
|
|
38
|
-
let element = this.el as HTMLImageElement;
|
|
39
|
-
|
|
40
|
-
element.onerror = this._fail;
|
|
41
|
-
if (element.complete && !this._hasLoadedSuccessfully()) {
|
|
42
|
-
this._fail();
|
|
43
|
-
} else {
|
|
44
|
-
this._success();
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
disconnect() {
|
|
49
|
-
this._removeSuccessClasses();
|
|
50
|
-
this._removeFailClasses();
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
private _success() {
|
|
54
|
-
this._addSuccessClasses();
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
private _fail() {
|
|
58
|
-
let element = this.el as HTMLImageElement;
|
|
59
|
-
this._addFailClasses();
|
|
60
|
-
|
|
61
|
-
if (this.hasPlaceholderValue && element.src !== this.placeholderValue) {
|
|
62
|
-
this.dispatch(element, "fallback-image:placeholder");
|
|
63
|
-
element.src = this.placeholderValue;
|
|
64
|
-
element.onerror = this._fail;
|
|
65
|
-
} else {
|
|
66
|
-
this.dispatch(element, "fallback-image:fail");
|
|
67
|
-
element.style.display = "none";
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
private _hasLoadedSuccessfully(): boolean {
|
|
72
|
-
let element = this.el as HTMLImageElement;
|
|
73
|
-
return element.naturalHeight > 0 && element.naturalWidth > 0;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
private _addFailClasses(el: HTMLElement = this.el) {
|
|
77
|
-
if (this.hasFailClass) {
|
|
78
|
-
el.classList.add(...this._failClasses);
|
|
79
|
-
} else {
|
|
80
|
-
el.classList.add(...this._defaultFailClasses);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
private _removeFailClasses(el: HTMLElement = this.el) {
|
|
85
|
-
if (this.hasFailClass) {
|
|
86
|
-
el.classList.remove(...this._failClasses);
|
|
87
|
-
} else {
|
|
88
|
-
el.classList.remove(...this._defaultFailClasses);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
private _addSuccessClasses(el: HTMLElement = this.el) {
|
|
93
|
-
if (this.hasSuccessClass) {
|
|
94
|
-
el.classList.add(...this._successClasses);
|
|
95
|
-
} else {
|
|
96
|
-
el.classList.add(...this._defaultSuccessClasses);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
private _removeSuccessClasses(el: HTMLElement = this.el) {
|
|
101
|
-
if (this.hasSuccessClass) {
|
|
102
|
-
el.classList.remove(...this._successClasses);
|
|
103
|
-
} else {
|
|
104
|
-
el.classList.remove(...this._defaultSuccessClasses);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import dialogPolyfill from "dialog-polyfill";
|
|
2
|
-
import {BaseController} from "../../utilities/base_controller";
|
|
3
|
-
import {scrollToElement} from "../../utilities/scroll";
|
|
4
|
-
|
|
5
|
-
export class LightboxImageController extends BaseController {
|
|
6
|
-
|
|
7
|
-
static values = {
|
|
8
|
-
src: String,
|
|
9
|
-
srcSet: String,
|
|
10
|
-
sizes: String,
|
|
11
|
-
};
|
|
12
|
-
static classes = ["modal", "image"];
|
|
13
|
-
|
|
14
|
-
declare readonly hasModalClass: boolean;
|
|
15
|
-
declare readonly modalClass: string;
|
|
16
|
-
declare readonly hasImageClass: boolean;
|
|
17
|
-
declare readonly imageClass: string;
|
|
18
|
-
declare readonly hasSrcValue: boolean;
|
|
19
|
-
declare readonly srcValue: string;
|
|
20
|
-
declare readonly hasSrcSetValue: boolean;
|
|
21
|
-
declare readonly srcSetValue: string;
|
|
22
|
-
declare readonly hasSizesValue: boolean;
|
|
23
|
-
declare readonly sizesValue: string;
|
|
24
|
-
_dialog: HTMLDialogElement | null = null;
|
|
25
|
-
|
|
26
|
-
get _src(): string {
|
|
27
|
-
return this.hasSrcValue ? this.srcValue : (this.el as HTMLImageElement).src;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
get _srcSet(): string {
|
|
31
|
-
return this.hasSrcSetValue ? this.srcSetValue : (this.el as HTMLImageElement).srcset;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
get _sizes(): string {
|
|
35
|
-
return this.hasSizesValue ? this.sizesValue : (this.el as HTMLImageElement).sizes;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
get _modalClassName() {
|
|
39
|
-
return this.hasModalClass ? this.modalClass : "image-lightbox-dialog";
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
get _imageClassName() {
|
|
43
|
-
return this.hasImageClass ? this.imageClass : "image-lightbox-image";
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
initialize() {
|
|
47
|
-
this.open = this.open.bind(this);
|
|
48
|
-
this.close = this.close.bind(this);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
connect() {
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
open() {
|
|
55
|
-
let element = this.el as HTMLImageElement;
|
|
56
|
-
if (this._dialog) {
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
this._dialog = document.createElement("dialog");
|
|
60
|
-
|
|
61
|
-
let image = document.createElement("img") as HTMLImageElement;
|
|
62
|
-
image.className = this._imageClassName;
|
|
63
|
-
image.src = this._src;
|
|
64
|
-
image.srcset = this._srcSet;
|
|
65
|
-
image.sizes = this._sizes;
|
|
66
|
-
this._dialog.appendChild(image);
|
|
67
|
-
|
|
68
|
-
element.insertAdjacentElement("afterend", this._dialog);
|
|
69
|
-
dialogPolyfill.registerDialog(this._dialog);
|
|
70
|
-
this._dialog.className = this._modalClassName;
|
|
71
|
-
// @ts-ignore Experimental API
|
|
72
|
-
this._dialog.showModal();
|
|
73
|
-
scrollToElement(this._dialog, {behavior: "smooth", block: "end"}).catch(() => this._dialog!.scrollIntoView(false));
|
|
74
|
-
this._dialog.addEventListener("click", this.close);
|
|
75
|
-
this._dialog.addEventListener("cancel", this.close);
|
|
76
|
-
this._dialog.addEventListener("close", this.close);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
close() {
|
|
80
|
-
if (this._dialog) {
|
|
81
|
-
// @ts-ignore Experimental API
|
|
82
|
-
this._dialog.close();
|
|
83
|
-
this._dialog.remove();
|
|
84
|
-
this._dialog = null;
|
|
85
|
-
scrollToElement(this.el, {behavior: "smooth", block: "end"}).catch(() => this.el.scrollIntoView(false));
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import {BaseController} from "../../utilities/base_controller";
|
|
2
|
-
|
|
3
|
-
export class MediaPlayerController extends BaseController {
|
|
4
|
-
|
|
5
|
-
static targets = ["media"];
|
|
6
|
-
|
|
7
|
-
declare readonly mediaTarget: HTMLMediaElement;
|
|
8
|
-
|
|
9
|
-
initialize() {
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
connect() {
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
disconnect() {
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
async play(event?: Event) {
|
|
19
|
-
event?.preventDefault();
|
|
20
|
-
await this.mediaTarget.play();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
pause(event?: Event) {
|
|
24
|
-
event?.preventDefault();
|
|
25
|
-
this.mediaTarget.pause();
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
restart(event?: Event) {
|
|
29
|
-
event?.preventDefault();
|
|
30
|
-
this.mediaTarget.currentTime = 0;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
seek(event?: Event) {
|
|
34
|
-
event?.preventDefault();
|
|
35
|
-
this.mediaTarget.currentTime += 5;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import {BaseController} from "../utilities/base_controller";
|
|
2
|
-
|
|
3
|
-
export class PrefetchController extends BaseController {
|
|
4
|
-
|
|
5
|
-
static values = {mode: String};
|
|
6
|
-
|
|
7
|
-
declare readonly modeValue: "intersect" | "mouseover";
|
|
8
|
-
declare readonly hasModeValue: boolean;
|
|
9
|
-
|
|
10
|
-
get _mode(): string {
|
|
11
|
-
return this.hasModeValue ? this.modeValue : "mouseover";
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
get _supportsPrefetch(): boolean {
|
|
15
|
-
const link: HTMLLinkElement = document.createElement('link');
|
|
16
|
-
return link.relList?.supports && link.relList?.supports('prefetch');
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
get _href(): string {
|
|
20
|
-
return (this.el as HTMLAnchorElement).href;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
get _existingPrefetch(): boolean {
|
|
24
|
-
return (document.head.querySelectorAll(`link[rel="prefetch"][href="${this._href}"]`) || []).length > 0;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
get _connectionSuitable(): boolean {
|
|
28
|
-
// @ts-ignore
|
|
29
|
-
const connection = navigator.connection;
|
|
30
|
-
|
|
31
|
-
// no way to know what network state is. Allow prefetching
|
|
32
|
-
if (!connection) {
|
|
33
|
-
return true;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// Don't prefetch if network conditions are poor or user has enabled data-saving mode
|
|
37
|
-
if (connection) {
|
|
38
|
-
// @ts-ignore Experimental API
|
|
39
|
-
if (connection.saveData) {
|
|
40
|
-
this.warn('Data Saving is enabled');
|
|
41
|
-
return false;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// @ts-ignore Experimental API
|
|
45
|
-
if (/2g/.test(connection.effectiveType)) {
|
|
46
|
-
this.warn("Network is too slow");
|
|
47
|
-
return false;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
return true;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
initialize(): void {
|
|
54
|
-
this.prefetch = this.prefetch.bind(this);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
connect(): void {
|
|
58
|
-
if (!this._supportsPrefetch) {
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
switch (this._mode) {
|
|
63
|
-
case "intersect":
|
|
64
|
-
this._setupObserver();
|
|
65
|
-
break;
|
|
66
|
-
case "mouseover":
|
|
67
|
-
this.el.addEventListener("mouseover", this.prefetch, {once: true});
|
|
68
|
-
break;
|
|
69
|
-
default:
|
|
70
|
-
throw new Error(`'${this._mode}' is not a supported prefetch mode`);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
disconnect() {
|
|
75
|
-
this.el.removeEventListener("mouseover", this.prefetch);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
_setupObserver(): void {
|
|
79
|
-
const observer: IntersectionObserver = new IntersectionObserver(
|
|
80
|
-
([entry]: IntersectionObserverEntry[], observer: IntersectionObserver) => {
|
|
81
|
-
if (entry.isIntersecting) {
|
|
82
|
-
this.prefetch();
|
|
83
|
-
observer.unobserve(entry.target);
|
|
84
|
-
}
|
|
85
|
-
},
|
|
86
|
-
);
|
|
87
|
-
observer.observe(this.element);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
prefetch() {
|
|
91
|
-
if (this._existingPrefetch || !this._connectionSuitable) {
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
const link: HTMLLinkElement = document.createElement('link');
|
|
95
|
-
Object.assign(link, {rel: 'prefetch', href: this._href, as: 'document'});
|
|
96
|
-
document.head.appendChild(link);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import {useDebounce, useWindowResize} from "stimulus-use";
|
|
2
|
-
import {WindowResizePayload} from "stimulus-use/dist/use-window-resize/use-window-resize";
|
|
3
|
-
import {BaseController} from "../utilities/base_controller";
|
|
4
|
-
|
|
5
|
-
interface ResponsiveIframeMessage {
|
|
6
|
-
name: string,
|
|
7
|
-
height: number,
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export class ResponsiveIframeWrapperController extends BaseController {
|
|
11
|
-
|
|
12
|
-
initialize() {
|
|
13
|
-
this.messageReceived = this.messageReceived.bind(this);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
connect() {
|
|
17
|
-
window.addEventListener("message", this.messageReceived);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
disconnect() {
|
|
21
|
-
window.removeEventListener("message", this.messageReceived);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
messageReceived(message: MessageEvent<ResponsiveIframeMessage>) {
|
|
25
|
-
let data = message.data;
|
|
26
|
-
if (data.hasOwnProperty("name") && data.name === "iframe-body" && data.hasOwnProperty("height")) {
|
|
27
|
-
this.resize(data.height);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
resize(height: number) {
|
|
32
|
-
(this.el as HTMLIFrameElement).style.height = `${height}px`;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export class ResponsiveIframeBodyController extends BaseController {
|
|
38
|
-
|
|
39
|
-
static debounces = ["postUpdate"];
|
|
40
|
-
|
|
41
|
-
declare observe: () => void;
|
|
42
|
-
declare unobserve: () => void;
|
|
43
|
-
|
|
44
|
-
connect() {
|
|
45
|
-
// If this Window is inside a frame
|
|
46
|
-
if (window.self !== window.top) {
|
|
47
|
-
useWindowResize(this);
|
|
48
|
-
useDebounce(this, {});
|
|
49
|
-
this.postUpdate();
|
|
50
|
-
} else {
|
|
51
|
-
// Not an iframe
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
windowResize(payload: WindowResizePayload) {
|
|
56
|
-
this.postUpdate();
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
postUpdate() {
|
|
60
|
-
let payload: ResponsiveIframeMessage = {name: "iframe-body", height: this.getHeight()};
|
|
61
|
-
window.parent.postMessage(
|
|
62
|
-
payload,
|
|
63
|
-
"*",
|
|
64
|
-
);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
getHeight(): number {
|
|
68
|
-
const body = document.body;
|
|
69
|
-
const html = document.documentElement;
|
|
70
|
-
|
|
71
|
-
// Get the largest height out of body and html's various height measurements
|
|
72
|
-
return Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import {BaseController} from "../../utilities/base_controller";
|
|
2
|
-
import {scrollAbsoluteBottom, scrollAbsoluteLeft, scrollAbsoluteTop, scrollDown, scrollLeft, scrollRight, scrollUp} from "../../utilities/scroll";
|
|
3
|
-
|
|
4
|
-
export class ScrollContainerController extends BaseController {
|
|
5
|
-
|
|
6
|
-
static values = {
|
|
7
|
-
behaviour: String,
|
|
8
|
-
increment: Number,
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
declare readonly behaviourValue: ScrollBehavior;
|
|
12
|
-
declare readonly hasBehaviourValue: boolean;
|
|
13
|
-
|
|
14
|
-
declare readonly incrementValue: number;
|
|
15
|
-
declare readonly hasIncrementValue: boolean;
|
|
16
|
-
|
|
17
|
-
get _increment(): number {
|
|
18
|
-
return this.hasIncrementValue ? this.incrementValue : 50;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
get _behaviour(): ScrollBehavior {
|
|
22
|
-
if (this.hasBehaviourValue) {
|
|
23
|
-
if (["auto", "smooth"].includes(this.behaviourValue)) {
|
|
24
|
-
return this.behaviourValue;
|
|
25
|
-
} else {
|
|
26
|
-
throw new Error(`'${this.behaviourValue}' is not a recognised scroll behaviour`);
|
|
27
|
-
}
|
|
28
|
-
} else {
|
|
29
|
-
return "auto";
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
async scrollTop(event?: Event) {
|
|
34
|
-
event?.preventDefault();
|
|
35
|
-
await scrollAbsoluteTop(this.el, {behavior: this._behaviour});
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
async scrollBottom(event?: Event) {
|
|
39
|
-
event?.preventDefault();
|
|
40
|
-
await scrollAbsoluteBottom(this.el, {behavior: this._behaviour});
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
async scrollLeft(event?: Event) {
|
|
44
|
-
event?.preventDefault();
|
|
45
|
-
await scrollAbsoluteLeft(this.el, {behavior: this._behaviour});
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
async scrollRight(event?: Event) {
|
|
49
|
-
event?.preventDefault();
|
|
50
|
-
await scrollAbsoluteLeft(this.el, {behavior: this._behaviour});
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
async up(event?: Event) {
|
|
54
|
-
event?.preventDefault();
|
|
55
|
-
await scrollUp(this.el, this._increment, {behavior: this._behaviour});
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
async down(event?: Event) {
|
|
59
|
-
event?.preventDefault();
|
|
60
|
-
await scrollDown(this.el, this._increment, {behavior: this._behaviour});
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
async left(event?: Event) {
|
|
64
|
-
event?.preventDefault();
|
|
65
|
-
await scrollLeft(this.el, this._increment, {behavior: this._behaviour});
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
async right(event?: Event) {
|
|
69
|
-
event?.preventDefault();
|
|
70
|
-
await scrollRight(this.el, this._increment, {behavior: this._behaviour});
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|