stimulus-library 0.7.3 → 0.8.0-beta
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/README.md +1 -1
- package/dist/controllers/ajax/async_block_controller.js +30 -0
- package/dist/controllers/ajax/{index.d.ts → index.js} +0 -1
- package/dist/controllers/ajax/lazy_block_controller.js +37 -0
- package/dist/controllers/ajax/load_block_controller.js +63 -0
- package/dist/controllers/ajax/poll_block_controller.js +35 -0
- package/dist/controllers/anchor_spy_controller.js +47 -0
- package/dist/controllers/back_link_controller.js +25 -0
- package/dist/controllers/clipboard_controller.js +35 -0
- package/dist/controllers/confirm_controller.js +33 -0
- package/dist/controllers/confirm_navigation_controller.js +29 -0
- package/dist/controllers/debug_controller.js +7 -0
- package/dist/controllers/disable_with_controller.js +66 -0
- package/dist/controllers/dismissable_controller.js +8 -0
- package/dist/controllers/element_save_controller.js +80 -0
- package/dist/controllers/empty_dom_controller.js +42 -0
- package/dist/controllers/equalize_controller.js +39 -0
- package/dist/controllers/forms/auto_submit_form_controller.js +62 -0
- package/dist/controllers/forms/autosize_controller.js +32 -0
- package/dist/controllers/forms/char_count_controller.js +37 -0
- package/dist/controllers/forms/checkbox_disable_inputs_controller.js +32 -0
- package/dist/controllers/forms/checkbox_enable_inputs_controller.js +32 -0
- package/dist/controllers/forms/checkbox_select_all_controller.js +35 -0
- package/dist/controllers/forms/checkbox_xor_controller.js +24 -0
- package/dist/controllers/forms/detect_dirty_controller.js +98 -0
- package/dist/controllers/forms/detect_dirty_form_controller.js +107 -0
- package/dist/controllers/forms/enable_inputs_controller.js +21 -0
- package/dist/controllers/forms/focus_steal_controller.js +28 -0
- package/dist/controllers/forms/form_rc_controller.js +47 -0
- package/dist/controllers/forms/form_save_controller.js +109 -0
- package/dist/controllers/forms/{index.d.ts → index.js} +0 -1
- package/dist/controllers/forms/limited_selection_checkboxes_controller.js +28 -0
- package/dist/controllers/forms/navigate_form_errors_controller.js +154 -0
- package/dist/controllers/forms/nested_form_controller.js +49 -0
- package/dist/controllers/forms/password_confirm_controller.js +26 -0
- package/dist/controllers/forms/password_peek_controller.js +21 -0
- package/dist/controllers/forms/remote_form_controller.js +26 -0
- package/dist/controllers/forms/sync_inputs_controller.js +67 -0
- package/dist/controllers/forms/value_warn_controller.js +45 -0
- package/dist/controllers/forms/word_count_controller.js +37 -0
- package/dist/controllers/{index.d.ts → index.js} +3 -1
- package/dist/controllers/media/fallback_image_controller.js +44 -0
- package/dist/controllers/media/{index.d.ts → index.js} +0 -1
- package/dist/controllers/media/lightbox_image_controller.js +71 -0
- package/dist/controllers/media/media_player_controller.js +31 -0
- package/dist/controllers/prefetch_controller.js +74 -0
- package/dist/controllers/print_button_controller.js +18 -0
- package/dist/controllers/responsive_iframe_controller.js +35 -0
- package/dist/controllers/scroll/{index.d.ts → index.js} +0 -1
- package/dist/controllers/scroll/scroll_container_controller.js +81 -0
- package/dist/controllers/scroll/scroll_into_focus_controller.js +20 -0
- package/dist/controllers/scroll/scroll_to_bottom_controller.js +37 -0
- package/dist/controllers/scroll/scroll_to_controller.js +22 -0
- package/dist/controllers/scroll/scroll_to_top_controller.js +37 -0
- package/dist/controllers/self_destruct_controller.js +11 -0
- package/dist/controllers/signal/events.js +12 -0
- package/dist/controllers/signal/expressions.js +54 -0
- package/dist/controllers/signal/{index.d.ts → index.js} +0 -1
- package/dist/controllers/signal/signal_action_controller.js +31 -0
- package/dist/controllers/signal/signal_dom_children_controller.js +40 -0
- package/dist/controllers/signal/signal_input_controller.js +36 -0
- package/dist/controllers/signal/signal_visibility_controller.js +44 -0
- package/dist/controllers/sticky_controller.js +44 -0
- package/dist/controllers/tables/{index.d.ts → index.js} +0 -1
- package/dist/controllers/tables/table_sort_controller.js +97 -0
- package/dist/controllers/tables/table_truncate_controller.js +81 -0
- package/dist/controllers/teleport_controller.js +48 -0
- package/dist/controllers/temporary_state_controller.js +65 -0
- package/dist/controllers/toggle_class_controller.js +115 -0
- package/dist/controllers/trix_modifier_controller.js +121 -0
- package/dist/controllers/turbo_frame_rc_controller.js +65 -0
- package/dist/controllers/turbo_frame_refresh_controller.js +32 -0
- package/dist/controllers/utility/alert_controller.js +7 -0
- package/dist/controllers/utility/fullscreen_controller.js +10 -0
- package/dist/controllers/utility/{index.d.ts → index.js} +0 -1
- package/dist/controllers/utility/intersection_controller.js +25 -0
- package/dist/controllers/utility/interval_controller.js +16 -0
- package/dist/controllers/utility/presence_controller.js +19 -0
- package/dist/controllers/utility/print_controller.js +7 -0
- package/dist/controllers/utility/timeout_controller.js +13 -0
- package/dist/controllers/utility/user_focus_controller.js +23 -0
- package/dist/controllers/visual/clock_controller.js +51 -0
- package/dist/controllers/visual/countdown_controller.js +116 -0
- package/dist/controllers/visual/duration_controller.js +79 -0
- package/dist/controllers/visual/{index.d.ts → index.js} +0 -1
- package/dist/controllers/visual/tabs_controller.js +79 -0
- package/dist/controllers/visual/time_distance_controller.js +50 -0
- package/dist/controllers/visual/tree_view_controller.js +92 -0
- package/dist/{index.d.ts → index.js} +3 -1
- package/dist/mixins/create_mixin.js +11 -0
- package/dist/mixins/{index.d.ts → index.js} +0 -1
- package/dist/mixins/install_class_methods.js +28 -0
- package/dist/mixins/use_click_outside.js +17 -0
- package/dist/mixins/use_event_bus.js +19 -0
- package/dist/mixins/use_event_listener.js +34 -0
- package/dist/mixins/use_fullscreen.js +42 -0
- package/dist/mixins/use_geolocation.js +62 -0
- package/dist/mixins/use_hover.js +29 -0
- package/dist/mixins/use_injected_html.js +37 -0
- package/dist/mixins/use_intersection.js +45 -0
- package/dist/mixins/use_interval.js +13 -0
- package/dist/mixins/use_localstorage.js +122 -0
- package/dist/mixins/use_mutation_observer.js +9 -0
- package/dist/mixins/use_temporary_content.js +38 -0
- package/dist/mixins/use_timeout.js +20 -0
- package/dist/mixins/use_trix_modifiers.js +71 -0
- package/dist/polyfills/string.replaceAll.js +13 -0
- package/dist/utilities/arrays.js +3 -0
- package/dist/utilities/base_controller.js +56 -0
- package/dist/utilities/elements.js +102 -0
- package/dist/utilities/ephemeral_controller.js +42 -0
- package/dist/utilities/event_bus.js +2 -0
- package/dist/utilities/events.js +10 -0
- package/dist/utilities/fetchRetry.js +22 -0
- package/dist/utilities/{index.d.ts → index.js} +0 -1
- package/dist/utilities/logging.js +82 -0
- package/dist/utilities/reactive.js +23 -0
- package/dist/utilities/request_submit.js +20 -0
- package/dist/utilities/scroll.js +89 -0
- package/dist/utilities/stimulus.js +13 -0
- package/dist/utilities/strings.js +5 -0
- package/dist/utilities/turbo.js +3 -0
- package/package.json +8 -18
- package/CHANGELOG.md +0 -499
- package/dist/controllers/ajax/async_block_controller.d.ts +0 -18
- package/dist/controllers/ajax/async_block_controller.d.ts.map +0 -1
- package/dist/controllers/ajax/index.d.ts.map +0 -1
- package/dist/controllers/ajax/lazy_block_controller.d.ts +0 -10
- package/dist/controllers/ajax/lazy_block_controller.d.ts.map +0 -1
- package/dist/controllers/ajax/load_block_controller.d.ts +0 -24
- package/dist/controllers/ajax/load_block_controller.d.ts.map +0 -1
- package/dist/controllers/ajax/poll_block_controller.d.ts +0 -16
- package/dist/controllers/ajax/poll_block_controller.d.ts.map +0 -1
- package/dist/controllers/anchor_spy_controller.d.ts +0 -21
- package/dist/controllers/anchor_spy_controller.d.ts.map +0 -1
- package/dist/controllers/back_link_controller.d.ts +0 -17
- package/dist/controllers/back_link_controller.d.ts.map +0 -1
- package/dist/controllers/clipboard_controller.d.ts +0 -19
- package/dist/controllers/clipboard_controller.d.ts.map +0 -1
- package/dist/controllers/confirm_controller.d.ts +0 -13
- package/dist/controllers/confirm_controller.d.ts.map +0 -1
- package/dist/controllers/confirm_navigation_controller.d.ts +0 -15
- package/dist/controllers/confirm_navigation_controller.d.ts.map +0 -1
- package/dist/controllers/debug_controller.d.ts +0 -7
- package/dist/controllers/debug_controller.d.ts.map +0 -1
- package/dist/controllers/disable_with_controller.d.ts +0 -20
- package/dist/controllers/disable_with_controller.d.ts.map +0 -1
- package/dist/controllers/dismissable_controller.d.ts +0 -7
- package/dist/controllers/dismissable_controller.d.ts.map +0 -1
- package/dist/controllers/element_save_controller.d.ts +0 -31
- package/dist/controllers/element_save_controller.d.ts.map +0 -1
- package/dist/controllers/empty_dom_controller.d.ts +0 -22
- package/dist/controllers/empty_dom_controller.d.ts.map +0 -1
- package/dist/controllers/forms/auto_submit_form_controller.d.ts +0 -23
- package/dist/controllers/forms/auto_submit_form_controller.d.ts.map +0 -1
- package/dist/controllers/forms/autosize_controller.d.ts +0 -9
- package/dist/controllers/forms/autosize_controller.d.ts.map +0 -1
- package/dist/controllers/forms/char_count_controller.d.ts +0 -21
- package/dist/controllers/forms/char_count_controller.d.ts.map +0 -1
- package/dist/controllers/forms/checkbox_disable_inputs_controller.d.ts +0 -17
- package/dist/controllers/forms/checkbox_disable_inputs_controller.d.ts.map +0 -1
- package/dist/controllers/forms/checkbox_enable_inputs_controller.d.ts +0 -17
- package/dist/controllers/forms/checkbox_enable_inputs_controller.d.ts.map +0 -1
- package/dist/controllers/forms/checkbox_select_all_controller.d.ts +0 -14
- package/dist/controllers/forms/checkbox_select_all_controller.d.ts.map +0 -1
- package/dist/controllers/forms/checkbox_xor_controller.d.ts +0 -9
- package/dist/controllers/forms/checkbox_xor_controller.d.ts.map +0 -1
- package/dist/controllers/forms/detect_dirty_controller.d.ts +0 -15
- package/dist/controllers/forms/detect_dirty_controller.d.ts.map +0 -1
- package/dist/controllers/forms/detect_dirty_form_controller.d.ts +0 -18
- package/dist/controllers/forms/detect_dirty_form_controller.d.ts.map +0 -1
- package/dist/controllers/forms/enable_inputs_controller.d.ts +0 -14
- package/dist/controllers/forms/enable_inputs_controller.d.ts.map +0 -1
- package/dist/controllers/forms/focus_steal_controller.d.ts +0 -12
- package/dist/controllers/forms/focus_steal_controller.d.ts.map +0 -1
- package/dist/controllers/forms/form_rc_controller.d.ts +0 -18
- package/dist/controllers/forms/form_rc_controller.d.ts.map +0 -1
- package/dist/controllers/forms/form_save_controller.d.ts +0 -32
- package/dist/controllers/forms/form_save_controller.d.ts.map +0 -1
- package/dist/controllers/forms/index.d.ts.map +0 -1
- package/dist/controllers/forms/limited_selection_checkboxes_controller.d.ts +0 -17
- package/dist/controllers/forms/limited_selection_checkboxes_controller.d.ts.map +0 -1
- package/dist/controllers/forms/navigate_form_errors_controller.d.ts +0 -41
- package/dist/controllers/forms/navigate_form_errors_controller.d.ts.map +0 -1
- package/dist/controllers/forms/nested_form_controller.d.ts +0 -22
- package/dist/controllers/forms/nested_form_controller.d.ts.map +0 -1
- package/dist/controllers/forms/password_confirm_controller.d.ts +0 -12
- package/dist/controllers/forms/password_confirm_controller.d.ts.map +0 -1
- package/dist/controllers/forms/password_peek_controller.d.ts +0 -9
- package/dist/controllers/forms/password_peek_controller.d.ts.map +0 -1
- package/dist/controllers/forms/remote_form_controller.d.ts +0 -14
- package/dist/controllers/forms/remote_form_controller.d.ts.map +0 -1
- package/dist/controllers/forms/sync_inputs_controller.d.ts +0 -20
- package/dist/controllers/forms/sync_inputs_controller.d.ts.map +0 -1
- package/dist/controllers/forms/value_warn_controller.d.ts +0 -31
- package/dist/controllers/forms/value_warn_controller.d.ts.map +0 -1
- package/dist/controllers/forms/word_count_controller.d.ts +0 -21
- package/dist/controllers/forms/word_count_controller.d.ts.map +0 -1
- package/dist/controllers/index.d.ts.map +0 -1
- package/dist/controllers/media/fallback_image_controller.d.ts +0 -20
- package/dist/controllers/media/fallback_image_controller.d.ts.map +0 -1
- package/dist/controllers/media/index.d.ts.map +0 -1
- package/dist/controllers/media/lightbox_image_controller.d.ts +0 -31
- package/dist/controllers/media/lightbox_image_controller.d.ts.map +0 -1
- package/dist/controllers/media/media_player_controller.d.ts +0 -10
- package/dist/controllers/media/media_player_controller.d.ts.map +0 -1
- package/dist/controllers/prefetch_controller.d.ts +0 -17
- package/dist/controllers/prefetch_controller.d.ts.map +0 -1
- package/dist/controllers/print_button_controller.d.ts +0 -8
- package/dist/controllers/print_button_controller.d.ts.map +0 -1
- package/dist/controllers/responsive_iframe_controller.d.ts +0 -17
- package/dist/controllers/responsive_iframe_controller.d.ts.map +0 -1
- package/dist/controllers/scroll/index.d.ts.map +0 -1
- package/dist/controllers/scroll/scroll_container_controller.d.ts +0 -22
- package/dist/controllers/scroll/scroll_container_controller.d.ts.map +0 -1
- package/dist/controllers/scroll/scroll_into_focus_controller.d.ts +0 -16
- package/dist/controllers/scroll/scroll_into_focus_controller.d.ts.map +0 -1
- package/dist/controllers/scroll/scroll_to_bottom_controller.d.ts +0 -12
- package/dist/controllers/scroll/scroll_to_bottom_controller.d.ts.map +0 -1
- package/dist/controllers/scroll/scroll_to_controller.d.ts +0 -18
- package/dist/controllers/scroll/scroll_to_controller.d.ts.map +0 -1
- package/dist/controllers/scroll/scroll_to_top_controller.d.ts +0 -12
- package/dist/controllers/scroll/scroll_to_top_controller.d.ts.map +0 -1
- package/dist/controllers/self_destruct_controller.d.ts +0 -9
- package/dist/controllers/self_destruct_controller.d.ts.map +0 -1
- package/dist/controllers/signal/events.d.ts +0 -5
- package/dist/controllers/signal/events.d.ts.map +0 -1
- package/dist/controllers/signal/expressions.d.ts +0 -2
- package/dist/controllers/signal/expressions.d.ts.map +0 -1
- package/dist/controllers/signal/index.d.ts.map +0 -1
- package/dist/controllers/signal/signal_action_controller.d.ts +0 -15
- package/dist/controllers/signal/signal_action_controller.d.ts.map +0 -1
- package/dist/controllers/signal/signal_dom_children_controller.d.ts +0 -17
- package/dist/controllers/signal/signal_dom_children_controller.d.ts.map +0 -1
- package/dist/controllers/signal/signal_input_controller.d.ts +0 -20
- package/dist/controllers/signal/signal_input_controller.d.ts.map +0 -1
- package/dist/controllers/signal/signal_visibility_controller.d.ts +0 -18
- package/dist/controllers/signal/signal_visibility_controller.d.ts.map +0 -1
- package/dist/controllers/sticky_controller.d.ts +0 -16
- package/dist/controllers/sticky_controller.d.ts.map +0 -1
- package/dist/controllers/tables/index.d.ts.map +0 -1
- package/dist/controllers/tables/table_sort_controller.d.ts +0 -20
- package/dist/controllers/tables/table_sort_controller.d.ts.map +0 -1
- package/dist/controllers/tables/table_truncate_controller.d.ts +0 -26
- package/dist/controllers/tables/table_truncate_controller.d.ts.map +0 -1
- package/dist/controllers/teleport_controller.d.ts +0 -16
- package/dist/controllers/teleport_controller.d.ts.map +0 -1
- package/dist/controllers/temporary_state_controller.d.ts +0 -27
- package/dist/controllers/temporary_state_controller.d.ts.map +0 -1
- package/dist/controllers/toggle_class_controller.d.ts +0 -36
- package/dist/controllers/toggle_class_controller.d.ts.map +0 -1
- package/dist/controllers/trix_modifier_controller.d.ts +0 -88
- package/dist/controllers/trix_modifier_controller.d.ts.map +0 -1
- package/dist/controllers/turbo_frame_rc_controller.d.ts +0 -21
- package/dist/controllers/turbo_frame_rc_controller.d.ts.map +0 -1
- package/dist/controllers/turbo_frame_refresh_controller.d.ts +0 -14
- package/dist/controllers/turbo_frame_refresh_controller.d.ts.map +0 -1
- package/dist/controllers/utility/alert_controller.d.ts +0 -9
- package/dist/controllers/utility/alert_controller.d.ts.map +0 -1
- package/dist/controllers/utility/fullscreen_controller.d.ts +0 -8
- package/dist/controllers/utility/fullscreen_controller.d.ts.map +0 -1
- package/dist/controllers/utility/index.d.ts.map +0 -1
- package/dist/controllers/utility/intersection_controller.d.ts +0 -14
- package/dist/controllers/utility/intersection_controller.d.ts.map +0 -1
- package/dist/controllers/utility/interval_controller.d.ts +0 -11
- package/dist/controllers/utility/interval_controller.d.ts.map +0 -1
- package/dist/controllers/utility/presence_controller.d.ts +0 -14
- package/dist/controllers/utility/presence_controller.d.ts.map +0 -1
- package/dist/controllers/utility/print_controller.d.ts +0 -5
- package/dist/controllers/utility/print_controller.d.ts.map +0 -1
- package/dist/controllers/utility/timeout_controller.d.ts +0 -10
- package/dist/controllers/utility/timeout_controller.d.ts.map +0 -1
- package/dist/controllers/utility/user_focus_controller.d.ts +0 -9
- package/dist/controllers/utility/user_focus_controller.d.ts.map +0 -1
- package/dist/controllers/visual/clock_controller.d.ts +0 -16
- package/dist/controllers/visual/clock_controller.d.ts.map +0 -1
- package/dist/controllers/visual/countdown_controller.d.ts +0 -46
- package/dist/controllers/visual/countdown_controller.d.ts.map +0 -1
- package/dist/controllers/visual/duration_controller.d.ts +0 -26
- package/dist/controllers/visual/duration_controller.d.ts.map +0 -1
- package/dist/controllers/visual/index.d.ts.map +0 -1
- package/dist/controllers/visual/tabs_controller.d.ts +0 -30
- package/dist/controllers/visual/tabs_controller.d.ts.map +0 -1
- package/dist/controllers/visual/time_distance_controller.d.ts +0 -16
- package/dist/controllers/visual/time_distance_controller.d.ts.map +0 -1
- package/dist/controllers/visual/tree_view_controller.d.ts +0 -26
- package/dist/controllers/visual/tree_view_controller.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/mixins/create_mixin.d.ts +0 -3
- package/dist/mixins/create_mixin.d.ts.map +0 -1
- package/dist/mixins/index.d.ts.map +0 -1
- package/dist/mixins/install_class_methods.d.ts +0 -6
- package/dist/mixins/install_class_methods.d.ts.map +0 -1
- package/dist/mixins/use_click_outside.d.ts +0 -5
- package/dist/mixins/use_click_outside.d.ts.map +0 -1
- package/dist/mixins/use_event_bus.d.ts +0 -8
- package/dist/mixins/use_event_bus.d.ts.map +0 -1
- package/dist/mixins/use_event_listener.d.ts +0 -20
- package/dist/mixins/use_event_listener.d.ts.map +0 -1
- package/dist/mixins/use_fullscreen.d.ts +0 -9
- package/dist/mixins/use_fullscreen.d.ts.map +0 -1
- package/dist/mixins/use_geolocation.d.ts +0 -19
- package/dist/mixins/use_geolocation.d.ts.map +0 -1
- package/dist/mixins/use_hover.d.ts +0 -5
- package/dist/mixins/use_hover.d.ts.map +0 -1
- package/dist/mixins/use_injected_html.d.ts +0 -11
- package/dist/mixins/use_injected_html.d.ts.map +0 -1
- package/dist/mixins/use_intersection.d.ts +0 -14
- package/dist/mixins/use_intersection.d.ts.map +0 -1
- package/dist/mixins/use_interval.d.ts +0 -3
- package/dist/mixins/use_interval.d.ts.map +0 -1
- package/dist/mixins/use_localstorage.d.ts +0 -21
- package/dist/mixins/use_localstorage.d.ts.map +0 -1
- package/dist/mixins/use_mutation_observer.d.ts +0 -3
- package/dist/mixins/use_mutation_observer.d.ts.map +0 -1
- package/dist/mixins/use_temporary_content.d.ts +0 -6
- package/dist/mixins/use_temporary_content.d.ts.map +0 -1
- package/dist/mixins/use_timeout.d.ts +0 -3
- package/dist/mixins/use_timeout.d.ts.map +0 -1
- package/dist/mixins/use_trix_modifiers.d.ts +0 -11
- package/dist/mixins/use_trix_modifiers.d.ts.map +0 -1
- package/dist/stimulus-library.cjs.js +0 -2
- package/dist/stimulus-library.cjs.js.map +0 -1
- package/dist/stimulus-library.es.js +0 -4719
- package/dist/stimulus-library.es.js.map +0 -1
- package/dist/stimulus-library.umd.js +0 -2
- package/dist/stimulus-library.umd.js.map +0 -1
- package/dist/utilities/arrays.d.ts +0 -2
- package/dist/utilities/arrays.d.ts.map +0 -1
- package/dist/utilities/base_controller.d.ts +0 -11
- package/dist/utilities/base_controller.d.ts.map +0 -1
- package/dist/utilities/elements.d.ts +0 -49
- package/dist/utilities/elements.d.ts.map +0 -1
- package/dist/utilities/ephemeral_controller.d.ts +0 -6
- package/dist/utilities/ephemeral_controller.d.ts.map +0 -1
- package/dist/utilities/event_bus.d.ts +0 -4
- package/dist/utilities/event_bus.d.ts.map +0 -1
- package/dist/utilities/events.d.ts +0 -3
- package/dist/utilities/events.d.ts.map +0 -1
- package/dist/utilities/fetchRetry.d.ts +0 -2
- package/dist/utilities/fetchRetry.d.ts.map +0 -1
- package/dist/utilities/index.d.ts.map +0 -1
- package/dist/utilities/logging.d.ts +0 -6
- package/dist/utilities/logging.d.ts.map +0 -1
- package/dist/utilities/reactive.d.ts +0 -2
- package/dist/utilities/reactive.d.ts.map +0 -1
- package/dist/utilities/request_submit.d.ts +0 -3
- package/dist/utilities/request_submit.d.ts.map +0 -1
- package/dist/utilities/scroll.d.ts +0 -11
- package/dist/utilities/scroll.d.ts.map +0 -1
- package/dist/utilities/stimulus.d.ts +0 -3
- package/dist/utilities/stimulus.d.ts.map +0 -1
- package/dist/utilities/strings.d.ts +0 -2
- package/dist/utilities/strings.d.ts.map +0 -1
- package/dist/utilities/turbo.d.ts +0 -2
- package/dist/utilities/turbo.d.ts.map +0 -1
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { BaseController } from "../../utilities/base_controller";
|
|
2
|
+
import { useInterval } from "../../mixins/use_interval";
|
|
3
|
+
export class IntervalController extends BaseController {
|
|
4
|
+
connect() {
|
|
5
|
+
if (!this.hasSecondsValue) {
|
|
6
|
+
throw new Error('Expected `secondsValue` to be present');
|
|
7
|
+
}
|
|
8
|
+
requestAnimationFrame(() => {
|
|
9
|
+
useInterval(this, this._interval, this.secondsValue * 1000);
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
_interval() {
|
|
13
|
+
this.dispatchEvent(this.el, "interval:action");
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
IntervalController.values = { seconds: Number };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { BaseController } from "../../utilities/base_controller";
|
|
2
|
+
export class PresenceController extends BaseController {
|
|
3
|
+
get name() {
|
|
4
|
+
return this.hasNameValue ? this.nameValue : ``;
|
|
5
|
+
}
|
|
6
|
+
get _addedEventName() {
|
|
7
|
+
return [this.name, 'presence', 'added'].filter(el => !!el).join(':');
|
|
8
|
+
}
|
|
9
|
+
get _removedEventName() {
|
|
10
|
+
return [this.name, 'presence', 'removed'].filter(el => !!el).join(':');
|
|
11
|
+
}
|
|
12
|
+
connect() {
|
|
13
|
+
this.dispatchEvent(this.el, this._addedEventName);
|
|
14
|
+
}
|
|
15
|
+
disconnect() {
|
|
16
|
+
this.dispatchEvent(this.el, this._removedEventName);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
PresenceController.values = { name: String };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { BaseController } from "../../utilities/base_controller";
|
|
2
|
+
import { useTimeout } from "../../mixins/use_timeout";
|
|
3
|
+
export class TimeoutController extends BaseController {
|
|
4
|
+
connect() {
|
|
5
|
+
requestAnimationFrame(() => {
|
|
6
|
+
useTimeout(this, this._timeout, this.secondsValue * 1000);
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
_timeout() {
|
|
10
|
+
this.dispatchEvent(this.el, "timeout");
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
TimeoutController.values = { seconds: Number };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { BaseController } from "../../utilities/base_controller";
|
|
2
|
+
import { useEventListener } from "../../mixins/use_event_listener";
|
|
3
|
+
export class UserFocusController extends BaseController {
|
|
4
|
+
connect() {
|
|
5
|
+
useEventListener(this, window, ["focus", "blur"], this._handleVisibility);
|
|
6
|
+
useEventListener(this, document, "visibilitychange", this._handleVisibility);
|
|
7
|
+
requestAnimationFrame(() => {
|
|
8
|
+
this._handleVisibility();
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
appear() {
|
|
12
|
+
this.dispatchEvent(this.el, "user-focus:active");
|
|
13
|
+
}
|
|
14
|
+
away() {
|
|
15
|
+
this.dispatchEvent(this.el, "user-focus:away");
|
|
16
|
+
}
|
|
17
|
+
_handleVisibility() {
|
|
18
|
+
this._documentIsActive() ? this.appear() : this.away();
|
|
19
|
+
}
|
|
20
|
+
_documentIsActive() {
|
|
21
|
+
return document.visibilityState == "visible" && document.hasFocus();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { BaseController } from "../../utilities/base_controller";
|
|
2
|
+
import { useInterval } from "../../mixins/use_interval";
|
|
3
|
+
export class ClockController extends BaseController {
|
|
4
|
+
get _tickInterval() {
|
|
5
|
+
if (this.hasMillisecondsTarget) {
|
|
6
|
+
return 1; // 1 ms
|
|
7
|
+
}
|
|
8
|
+
else if (this.hasSecondsTarget) {
|
|
9
|
+
return 1000; // 1 seconds
|
|
10
|
+
}
|
|
11
|
+
else if (this.hasMinutesTarget) {
|
|
12
|
+
return 15000; // 15 seconds
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
return 300000; // Every 5 minutes
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
connect() {
|
|
19
|
+
requestAnimationFrame(() => {
|
|
20
|
+
useInterval(this, this._tick, this._tickInterval);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
_tick() {
|
|
24
|
+
let current = new Date();
|
|
25
|
+
if (this.hasHoursTarget) {
|
|
26
|
+
this.hoursTarget.innerHTML = current
|
|
27
|
+
.getHours()
|
|
28
|
+
.toString()
|
|
29
|
+
.padStart(2, "0");
|
|
30
|
+
}
|
|
31
|
+
if (this.hasMinutesTarget) {
|
|
32
|
+
this.minutesTarget.innerHTML = current
|
|
33
|
+
.getMinutes()
|
|
34
|
+
.toString()
|
|
35
|
+
.padStart(2, "0");
|
|
36
|
+
}
|
|
37
|
+
if (this.hasSecondsTarget) {
|
|
38
|
+
this.secondsTarget.innerHTML = current
|
|
39
|
+
.getSeconds()
|
|
40
|
+
.toString()
|
|
41
|
+
.padStart(2, "0");
|
|
42
|
+
}
|
|
43
|
+
if (this.hasMillisecondsTarget) {
|
|
44
|
+
this.millisecondsTarget.innerHTML = current
|
|
45
|
+
.getMilliseconds()
|
|
46
|
+
.toString()
|
|
47
|
+
.padStart(3, "0");
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
ClockController.targets = ["hours", "minutes", "seconds", "milliseconds"];
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import intervalToDuration from "date-fns/intervalToDuration";
|
|
2
|
+
import isPast from "date-fns/isPast";
|
|
3
|
+
import { BaseController } from "../../utilities/base_controller";
|
|
4
|
+
export class CountdownController extends BaseController {
|
|
5
|
+
constructor() {
|
|
6
|
+
super(...arguments);
|
|
7
|
+
// Instance Data
|
|
8
|
+
this._interval = null;
|
|
9
|
+
}
|
|
10
|
+
get _removeUnused() {
|
|
11
|
+
return this.hasRemoveUnusedValue ? this.removeUnusedValue : false;
|
|
12
|
+
}
|
|
13
|
+
get _deadlineDate() {
|
|
14
|
+
return new Date(this.deadlineValue);
|
|
15
|
+
}
|
|
16
|
+
connect() {
|
|
17
|
+
this._interval = setInterval(this._tick.bind(this), 1000);
|
|
18
|
+
this.addCountingDownClasses();
|
|
19
|
+
}
|
|
20
|
+
disconnect() {
|
|
21
|
+
this._clearTick();
|
|
22
|
+
this.removeCountingDownClasses();
|
|
23
|
+
this.removeEndedClasses();
|
|
24
|
+
}
|
|
25
|
+
deadlineValueChanged() {
|
|
26
|
+
// Countdown had previously ended, restart ticking. Updating mid-tick will just work.
|
|
27
|
+
if (this._interval == null) {
|
|
28
|
+
this._interval = setInterval(this._tick.bind(this), 1000);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
_tick() {
|
|
32
|
+
try {
|
|
33
|
+
const now = new Date();
|
|
34
|
+
let distance = {};
|
|
35
|
+
if (isPast(this._deadlineDate)) {
|
|
36
|
+
distance = { years: 0, months: 0, days: 0, hours: 0, minutes: 0, seconds: 0 };
|
|
37
|
+
// Countdown has ended, stop ticking
|
|
38
|
+
this._clearTick();
|
|
39
|
+
this.removeCountingDownClasses();
|
|
40
|
+
this.addEndedClasses();
|
|
41
|
+
this.dispatchEvent(this.el, "countdown:ended");
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
distance = intervalToDuration({ start: this._deadlineDate, end: now });
|
|
45
|
+
}
|
|
46
|
+
if (this.hasYearsTarget) {
|
|
47
|
+
this._updateTarget(this.yearsTarget, this._years(distance));
|
|
48
|
+
}
|
|
49
|
+
if (this.hasMonthsTarget) {
|
|
50
|
+
this._updateTarget(this.monthsTarget, this._months(distance));
|
|
51
|
+
}
|
|
52
|
+
if (this.hasDaysTarget) {
|
|
53
|
+
this._updateTarget(this.daysTarget, this._days(distance));
|
|
54
|
+
}
|
|
55
|
+
if (this.hasHoursTarget) {
|
|
56
|
+
this._updateTarget(this.hoursTarget, this._hours(distance));
|
|
57
|
+
}
|
|
58
|
+
if (this.hasMinutesTarget) {
|
|
59
|
+
this._updateTarget(this.minutesTarget, this._minutes(distance));
|
|
60
|
+
}
|
|
61
|
+
if (this.hasSecondsTarget) {
|
|
62
|
+
this._updateTarget(this.secondsTarget, this._seconds(distance));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
console.error(e);
|
|
67
|
+
this._clearTick();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
_clearTick() {
|
|
71
|
+
if (this._interval) {
|
|
72
|
+
clearInterval(this._interval);
|
|
73
|
+
this._interval = null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
_updateTarget(target, value) {
|
|
77
|
+
this._removeTargetIfUnused(target, value);
|
|
78
|
+
target.innerHTML = value.toString();
|
|
79
|
+
}
|
|
80
|
+
_removeTargetIfUnused(target, value) {
|
|
81
|
+
if (this._removeUnused) {
|
|
82
|
+
if (value === 0 && target.dataset.unused) {
|
|
83
|
+
if (Number.parseInt(target.dataset.unused) > Date.now() + 1500) {
|
|
84
|
+
target.remove();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else if (value == 0) {
|
|
88
|
+
target.dataset.unused = Date.now().toString();
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
target.dataset.unused = undefined;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
_years(duration) {
|
|
96
|
+
return duration.years || 0;
|
|
97
|
+
}
|
|
98
|
+
_months(duration) {
|
|
99
|
+
return duration.months || 0;
|
|
100
|
+
}
|
|
101
|
+
_days(duration) {
|
|
102
|
+
return duration.days || 0;
|
|
103
|
+
}
|
|
104
|
+
_hours(duration) {
|
|
105
|
+
return duration.hours || 0;
|
|
106
|
+
}
|
|
107
|
+
_minutes(duration) {
|
|
108
|
+
return duration.minutes || 0;
|
|
109
|
+
}
|
|
110
|
+
_seconds(duration) {
|
|
111
|
+
return duration.seconds || 0;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
CountdownController.values = { deadline: String, removeUnused: Boolean };
|
|
115
|
+
CountdownController.targets = ["years", "months", "days", "hours", "minutes", "seconds"];
|
|
116
|
+
CountdownController.classes = ["countingDown", "ended"];
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import formatDuration from "date-fns/formatDuration";
|
|
2
|
+
import intervalToDuration from "date-fns/intervalToDuration";
|
|
3
|
+
import toDate from "date-fns/toDate";
|
|
4
|
+
import { BaseController } from "../../utilities/base_controller";
|
|
5
|
+
import { useInterval } from "../../mixins/use_interval";
|
|
6
|
+
export class DurationController extends BaseController {
|
|
7
|
+
get _format() {
|
|
8
|
+
return [
|
|
9
|
+
"years",
|
|
10
|
+
"months",
|
|
11
|
+
"weeks",
|
|
12
|
+
"days",
|
|
13
|
+
"hours",
|
|
14
|
+
...(this._minutes ? ["minutes"] : []),
|
|
15
|
+
...(this._seconds ? ["seconds"] : []),
|
|
16
|
+
];
|
|
17
|
+
}
|
|
18
|
+
get _output() {
|
|
19
|
+
let { years, months, weeks, days, hours, minutes, seconds } = this._duration;
|
|
20
|
+
years || (years = 0);
|
|
21
|
+
months || (months = 0);
|
|
22
|
+
weeks || (weeks = 0);
|
|
23
|
+
days || (days = 0);
|
|
24
|
+
hours || (hours = 0);
|
|
25
|
+
minutes || (minutes = 0);
|
|
26
|
+
seconds || (seconds = 0);
|
|
27
|
+
let largeDenominators = [years, months, weeks, days, hours];
|
|
28
|
+
if (!this._minutes && !this._seconds && largeDenominators.every((x) => x === 0)) {
|
|
29
|
+
minutes = minutes + seconds / 60.0;
|
|
30
|
+
return `${(minutes / 60).toFixed(1)} hours`;
|
|
31
|
+
}
|
|
32
|
+
return formatDuration(this._duration, { format: this._format, delimiter: ", " });
|
|
33
|
+
}
|
|
34
|
+
get _seconds() {
|
|
35
|
+
return this.hasSecondsValue ? this.secondsValue : true;
|
|
36
|
+
}
|
|
37
|
+
get _minutes() {
|
|
38
|
+
return this.hasMinutesValue ? this.minutesValue : true;
|
|
39
|
+
}
|
|
40
|
+
get _timestamp() {
|
|
41
|
+
if (this.hasTimestampValue) {
|
|
42
|
+
return toDate(this.timestampValue * 1000);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
throw new Error("Expected `timestampValue` to be present");
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
get _duration() {
|
|
49
|
+
return intervalToDuration({ start: new Date(), end: this._timestamp });
|
|
50
|
+
}
|
|
51
|
+
get _tickInterval() {
|
|
52
|
+
if (this._seconds) {
|
|
53
|
+
return 1000; // 1 seconds
|
|
54
|
+
}
|
|
55
|
+
else if (this._minutes) {
|
|
56
|
+
return 15000; // 15 seconds
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
return 120000; // 2 minutes
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
connect() {
|
|
63
|
+
this._clearInterval = useInterval(this, this._update, this._tickInterval);
|
|
64
|
+
this._update();
|
|
65
|
+
}
|
|
66
|
+
_update() {
|
|
67
|
+
try {
|
|
68
|
+
this.el.innerHTML = this._output;
|
|
69
|
+
}
|
|
70
|
+
catch (_a) {
|
|
71
|
+
this._clearInterval();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
DurationController.values = {
|
|
76
|
+
timestamp: Number,
|
|
77
|
+
minutes: Boolean,
|
|
78
|
+
seconds: Boolean,
|
|
79
|
+
};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { BaseController } from "../../utilities/base_controller";
|
|
2
|
+
import clamp from "lodash-es/clamp";
|
|
3
|
+
import { useCollectionEventListener } from "../../mixins/use_event_listener";
|
|
4
|
+
export class TabsController extends BaseController {
|
|
5
|
+
get defaultHideClasses() {
|
|
6
|
+
return ["hide"];
|
|
7
|
+
}
|
|
8
|
+
get defaultActiveClasses() {
|
|
9
|
+
return ["is-active"];
|
|
10
|
+
}
|
|
11
|
+
get _currentTab() {
|
|
12
|
+
return this.hasCurrentTabValue ? this.currentTabValue : 0;
|
|
13
|
+
}
|
|
14
|
+
get _equalize() {
|
|
15
|
+
return this.hasEqualizeValue ? this.equalizeValue : false;
|
|
16
|
+
}
|
|
17
|
+
connect() {
|
|
18
|
+
useCollectionEventListener(this, this.linkTargets, "click", this.switchTabs);
|
|
19
|
+
if (this._equalize) {
|
|
20
|
+
this._setMinHeight();
|
|
21
|
+
}
|
|
22
|
+
this.currentTabValue = this._currentTab;
|
|
23
|
+
}
|
|
24
|
+
switchTabs(event) {
|
|
25
|
+
event.preventDefault();
|
|
26
|
+
this.currentTabValue = this.linkTargets.indexOf(event.currentTarget);
|
|
27
|
+
}
|
|
28
|
+
currentTabValueChanged() {
|
|
29
|
+
let index = this._currentTab;
|
|
30
|
+
index = this._clampIndex(index);
|
|
31
|
+
this._selectTab(index);
|
|
32
|
+
}
|
|
33
|
+
_selectTab(index) {
|
|
34
|
+
index = this._clampIndex(index);
|
|
35
|
+
let links = this.linkTargets;
|
|
36
|
+
let panels = this.contentTargets;
|
|
37
|
+
let activePanel = panels[index];
|
|
38
|
+
let activeLink = links[index];
|
|
39
|
+
let otherPanels = [...panels.slice(0, index), ...panels.slice(index + 1)];
|
|
40
|
+
let otherLinks = [...links.slice(0, index), ...links.slice(index + 1)];
|
|
41
|
+
this.addActiveClasses(activeLink);
|
|
42
|
+
activeLink.setAttribute('aria-selected', "true");
|
|
43
|
+
this.addActiveClasses(activePanel);
|
|
44
|
+
this.removeHideClasses(activePanel);
|
|
45
|
+
otherLinks.forEach((link) => {
|
|
46
|
+
link.removeAttribute('aria-selected');
|
|
47
|
+
this.removeActiveClasses(link);
|
|
48
|
+
});
|
|
49
|
+
otherPanels.forEach((panel) => {
|
|
50
|
+
this.removeActiveClasses(panel);
|
|
51
|
+
this.addHideClasses(panel);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
_clampIndex(index) {
|
|
55
|
+
return clamp(index, 0, this.contentTargets.length - 1);
|
|
56
|
+
}
|
|
57
|
+
_setMinHeight() {
|
|
58
|
+
let minHeight = 0;
|
|
59
|
+
// determine the minimum height
|
|
60
|
+
this.contentTargets.forEach((content) => {
|
|
61
|
+
let hidden = content.hasAttribute("tab-hidden");
|
|
62
|
+
if (hidden) {
|
|
63
|
+
this.removeHideClasses(content);
|
|
64
|
+
}
|
|
65
|
+
let height = content.offsetHeight;
|
|
66
|
+
if (height > minHeight) {
|
|
67
|
+
minHeight = height;
|
|
68
|
+
}
|
|
69
|
+
if (hidden) {
|
|
70
|
+
this.addHideClasses(content);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
// apply to all tabs
|
|
74
|
+
this.contentTargets.forEach((content) => content.style.minHeight = minHeight + "px");
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
TabsController.values = { currentTab: Number, equalize: Boolean };
|
|
78
|
+
TabsController.targets = ["link", "content"];
|
|
79
|
+
TabsController.classes = ["active", "hide"];
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import formatDistanceToNow from "date-fns/formatDistanceToNow";
|
|
2
|
+
import intervalToDuration from "date-fns/intervalToDuration";
|
|
3
|
+
import isPast from "date-fns/isPast";
|
|
4
|
+
import toDate from "date-fns/toDate";
|
|
5
|
+
import { BaseController } from "../../utilities/base_controller";
|
|
6
|
+
import { useTimeout } from "../../mixins/use_timeout";
|
|
7
|
+
export class TimeDistanceController extends BaseController {
|
|
8
|
+
get _duration() {
|
|
9
|
+
return isPast(this._timestamp) ? intervalToDuration({ start: this._timestamp, end: new Date() }) : intervalToDuration({ start: new Date(), end: this._timestamp });
|
|
10
|
+
}
|
|
11
|
+
get _nextUpdate() {
|
|
12
|
+
let duration = this._duration;
|
|
13
|
+
if (duration.years && duration.years > 0) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
else if (duration.months && duration.months > 0) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
else if (duration.days && duration.days > 0) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
else if (duration.hours && duration.hours > 0) {
|
|
23
|
+
return 1800000; // Update every 30 mins
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
return 30000; // Update every 30 seconds
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
timestampValueChanged() {
|
|
30
|
+
this._timestamp = toDate(this.timestampValue * 1000);
|
|
31
|
+
}
|
|
32
|
+
connect() {
|
|
33
|
+
if (!this.hasTimestampValue) {
|
|
34
|
+
throw new Error("Expected `timestampValue` to be present");
|
|
35
|
+
}
|
|
36
|
+
this._update();
|
|
37
|
+
}
|
|
38
|
+
_update() {
|
|
39
|
+
this.el.innerHTML = formatDistanceToNow(this._timestamp, {
|
|
40
|
+
addSuffix: true,
|
|
41
|
+
includeSeconds: true,
|
|
42
|
+
});
|
|
43
|
+
if (this._nextUpdate) {
|
|
44
|
+
useTimeout(this, this._update, this._nextUpdate);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
TimeDistanceController.values = {
|
|
49
|
+
timestamp: Number,
|
|
50
|
+
};
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { useMutationObserver } from "../../mixins/use_mutation_observer";
|
|
2
|
+
import { BaseController } from "../../utilities/base_controller";
|
|
3
|
+
import { installClassMethods } from "../../mixins/install_class_methods";
|
|
4
|
+
export class TreeViewController extends BaseController {
|
|
5
|
+
get defaultActiveClasses() {
|
|
6
|
+
return ["active"];
|
|
7
|
+
}
|
|
8
|
+
get defaultCollapsedClasses() {
|
|
9
|
+
return ["collapsed"];
|
|
10
|
+
}
|
|
11
|
+
initialize() {
|
|
12
|
+
this._nodeClicked = this._nodeClicked.bind(this);
|
|
13
|
+
}
|
|
14
|
+
connect() {
|
|
15
|
+
installClassMethods(this);
|
|
16
|
+
useMutationObserver(this, this.el, this.mutate, { subtree: true, childList: true });
|
|
17
|
+
this._setup();
|
|
18
|
+
}
|
|
19
|
+
disconnect() {
|
|
20
|
+
this._teardown();
|
|
21
|
+
}
|
|
22
|
+
_setup() {
|
|
23
|
+
this._setupNode(this.el);
|
|
24
|
+
}
|
|
25
|
+
_setupNode(el) {
|
|
26
|
+
const process = (e) => {
|
|
27
|
+
let parent = e.parentElement;
|
|
28
|
+
if (parent) {
|
|
29
|
+
if (!this._nodeActive(parent)) {
|
|
30
|
+
this._hideNode(parent);
|
|
31
|
+
}
|
|
32
|
+
parent.removeEventListener("click", this._nodeClicked);
|
|
33
|
+
parent.addEventListener("click", this._nodeClicked);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
if (el.tagName === 'UL' || el.tagName === 'OL') {
|
|
37
|
+
process(el);
|
|
38
|
+
}
|
|
39
|
+
el.querySelectorAll("ul, ol").forEach(e => process(e));
|
|
40
|
+
}
|
|
41
|
+
_teardown() {
|
|
42
|
+
this.el.querySelectorAll("ul, ol, li").forEach((el) => this._teardownNode(el));
|
|
43
|
+
}
|
|
44
|
+
_teardownNode(el) {
|
|
45
|
+
[el, ...Array.from(el.querySelectorAll('ul, ol, li'))].forEach((x) => {
|
|
46
|
+
x.removeEventListener("click", this._nodeClicked);
|
|
47
|
+
this.removeActiveClasses(x);
|
|
48
|
+
this.removeCollapsedClasses(x);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
_nodeClicked(event) {
|
|
52
|
+
if (event) {
|
|
53
|
+
event.stopImmediatePropagation();
|
|
54
|
+
}
|
|
55
|
+
let el = event.target;
|
|
56
|
+
if (!el || !this._hasNested(el)) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (this._nodeActive(el)) {
|
|
60
|
+
this._hideNode(el);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
this._showNode(el);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
_nodeActive(el) {
|
|
67
|
+
return this.activeClassesPresent(el);
|
|
68
|
+
}
|
|
69
|
+
_showNode(el) {
|
|
70
|
+
this.removeCollapsedClasses(el);
|
|
71
|
+
this.addActiveClasses(el);
|
|
72
|
+
}
|
|
73
|
+
_hideNode(el) {
|
|
74
|
+
this.removeActiveClasses(el);
|
|
75
|
+
this.addCollapsedClasses(el);
|
|
76
|
+
}
|
|
77
|
+
_hasNested(el) {
|
|
78
|
+
return el.querySelectorAll("ul, ol").length > 0;
|
|
79
|
+
}
|
|
80
|
+
mutate(entries) {
|
|
81
|
+
for (const mutation of entries) {
|
|
82
|
+
if (mutation.type === "childList") {
|
|
83
|
+
Array.from(mutation.addedNodes || []).forEach(el => this._setupNode(el));
|
|
84
|
+
Array.from(mutation.removedNodes || []).forEach(el => this._teardownNode(el));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
TreeViewController.classes = [
|
|
90
|
+
"active",
|
|
91
|
+
"collapsed",
|
|
92
|
+
];
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export function useMixin(controller, setup, teardown) {
|
|
2
|
+
const controllerDisconnect = controller.disconnect.bind(controller);
|
|
3
|
+
setup();
|
|
4
|
+
Object.assign(controller, {
|
|
5
|
+
disconnect() {
|
|
6
|
+
teardown();
|
|
7
|
+
controllerDisconnect();
|
|
8
|
+
},
|
|
9
|
+
});
|
|
10
|
+
return controllerDisconnect;
|
|
11
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Controller } from "@hotwired/stimulus";
|
|
2
|
+
import { controllerMethod } from "../utilities/stimulus";
|
|
3
|
+
import { pascalCase } from "../utilities/strings";
|
|
4
|
+
export class InstallClassMethodComposableController extends Controller {
|
|
5
|
+
}
|
|
6
|
+
function addMethodsForClassDefinition(controller, name) {
|
|
7
|
+
let defaultElement = controller.element;
|
|
8
|
+
let hasClass = () => controller[`has${pascalCase(name)}Class`] == true;
|
|
9
|
+
let classes = () => controller[`${name}Classes`];
|
|
10
|
+
let defaultClasses = () => controllerMethod(controller, `default${pascalCase(name)}Classes`).call(controller) || [];
|
|
11
|
+
let classOrDefault = () => hasClass() ? classes() : defaultClasses();
|
|
12
|
+
if (controller[`${name}Classes`] == undefined) {
|
|
13
|
+
Object.defineProperty(controller, `${name}Classes`, {
|
|
14
|
+
get: () => hasClass() ? controller[`${name}Class`].split(' ') : defaultClasses(),
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
let methods = {
|
|
18
|
+
[`add${pascalCase(name)}Classes`]: (element = defaultElement) => element.classList.add(...classOrDefault()),
|
|
19
|
+
[`remove${pascalCase(name)}Classes`]: (element = defaultElement) => element.classList.remove(...classOrDefault()),
|
|
20
|
+
[`${name}ClassesPresent`]: (element = defaultElement) => classOrDefault().every((klass) => element.classList.contains(klass)),
|
|
21
|
+
};
|
|
22
|
+
Object.assign(controller, methods);
|
|
23
|
+
}
|
|
24
|
+
export function installClassMethods(controller) {
|
|
25
|
+
// @ts-ignore
|
|
26
|
+
let classes = controller.constructor.classes || [];
|
|
27
|
+
classes.forEach((classDefinition) => addMethodsForClassDefinition(controller, classDefinition));
|
|
28
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { isElementInViewport } from "../utilities/elements";
|
|
2
|
+
import { useEventListener } from "../mixins/use_event_listener";
|
|
3
|
+
import { useMixin } from "./create_mixin";
|
|
4
|
+
export function useClickOutside(controller, element, callback) {
|
|
5
|
+
callback = callback.bind(controller);
|
|
6
|
+
const handler = (event) => {
|
|
7
|
+
if (element.contains(event.target) || (!isElementInViewport(element))) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
callback(event);
|
|
11
|
+
};
|
|
12
|
+
let { teardown } = useEventListener(controller, window, ["click", "touchend"], handler);
|
|
13
|
+
useMixin(controller, () => void 0, teardown);
|
|
14
|
+
return {
|
|
15
|
+
teardown,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import debounce from "lodash-es/debounce";
|
|
2
|
+
import { EventBus } from "../utilities/event_bus";
|
|
3
|
+
import { wrapArray } from "../utilities/arrays";
|
|
4
|
+
import { useMixin } from "./create_mixin";
|
|
5
|
+
export function useEventBus(controller, eventNameOrNames, handler, opts) {
|
|
6
|
+
let options = opts;
|
|
7
|
+
if (options === null || options === void 0 ? void 0 : options.debounce) {
|
|
8
|
+
handler = debounce(handler.bind(controller), options.debounce);
|
|
9
|
+
delete options.debounce;
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
handler = handler.bind(controller);
|
|
13
|
+
}
|
|
14
|
+
let eventNames = wrapArray(eventNameOrNames);
|
|
15
|
+
let setup = () => eventNames.forEach(eventName => EventBus.on(eventName, handler));
|
|
16
|
+
let teardown = () => eventNames.forEach(eventName => EventBus.off(eventName, handler));
|
|
17
|
+
useMixin(controller, setup, teardown);
|
|
18
|
+
return { setup, teardown };
|
|
19
|
+
}
|