shadcn_phlexcomponents 0.1.18 → 0.1.19

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 (128) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +321 -23
  3. data/app/javascript/controllers/accordion_controller.js +101 -90
  4. data/app/javascript/controllers/alert_dialog_controller.js +5 -4
  5. data/app/javascript/controllers/avatar_controller.js +12 -11
  6. data/app/javascript/controllers/checkbox_controller.js +26 -26
  7. data/app/javascript/controllers/collapsible_controller.js +35 -36
  8. data/app/javascript/controllers/combobox_controller.js +262 -231
  9. data/app/javascript/controllers/command_controller.js +205 -184
  10. data/app/javascript/controllers/date_picker_controller.js +252 -253
  11. data/app/javascript/controllers/date_range_picker_controller.js +189 -200
  12. data/app/javascript/controllers/dialog_controller.js +79 -78
  13. data/app/javascript/controllers/dropdown_menu_controller.js +229 -208
  14. data/app/javascript/controllers/dropdown_menu_sub_controller.js +111 -97
  15. data/app/javascript/controllers/form_field_controller.js +17 -16
  16. data/app/javascript/controllers/hover_card_controller.js +69 -71
  17. data/app/javascript/controllers/loading_button_controller.js +11 -10
  18. data/app/javascript/controllers/popover_controller.js +85 -78
  19. data/app/javascript/controllers/progress_controller.js +12 -11
  20. data/app/javascript/controllers/radio_group_controller.js +75 -74
  21. data/app/javascript/controllers/select_controller.js +247 -232
  22. data/app/javascript/controllers/sidebar_controller.js +26 -27
  23. data/app/javascript/controllers/sidebar_trigger_controller.js +12 -9
  24. data/app/javascript/controllers/slider_controller.js +74 -74
  25. data/app/javascript/controllers/switch_controller.js +23 -23
  26. data/app/javascript/controllers/tabs_controller.js +61 -61
  27. data/app/javascript/controllers/theme_switcher_controller.js +28 -27
  28. data/app/javascript/controllers/toast_container_controller.js +45 -31
  29. data/app/javascript/controllers/toast_controller.js +19 -18
  30. data/app/javascript/controllers/toggle_controller.js +17 -17
  31. data/app/javascript/controllers/toggle_group_controller.js +17 -17
  32. data/app/javascript/controllers/tooltip_controller.js +75 -77
  33. data/app/javascript/shadcn_phlexcomponents.js +27 -60
  34. data/app/javascript/utils/command.js +390 -334
  35. data/app/javascript/utils/floating_ui.js +139 -107
  36. data/app/javascript/utils/index.js +253 -190
  37. data/app/typescript/controllers/accordion_controller.ts +2 -0
  38. data/app/typescript/controllers/alert_dialog_controller.ts +2 -0
  39. data/app/typescript/controllers/avatar_controller.ts +2 -0
  40. data/app/typescript/controllers/checkbox_controller.ts +2 -0
  41. data/app/typescript/controllers/collapsible_controller.ts +2 -0
  42. data/app/typescript/controllers/combobox_controller.ts +2 -0
  43. data/app/typescript/controllers/command_controller.ts +2 -0
  44. data/app/typescript/controllers/date_picker_controller.ts +2 -0
  45. data/app/typescript/controllers/date_range_picker_controller.ts +2 -0
  46. data/app/typescript/controllers/dialog_controller.ts +2 -0
  47. data/app/typescript/controllers/dropdown_menu_controller.ts +2 -0
  48. data/app/typescript/controllers/dropdown_menu_sub_controller.ts +2 -0
  49. data/app/typescript/controllers/form_field_controller.ts +2 -0
  50. data/app/typescript/controllers/hover_card_controller.ts +2 -0
  51. data/app/typescript/controllers/loading_button_controller.ts +2 -0
  52. data/app/typescript/controllers/popover_controller.ts +2 -0
  53. data/app/typescript/controllers/progress_controller.ts +2 -0
  54. data/app/typescript/controllers/radio_group_controller.ts +2 -0
  55. data/app/typescript/controllers/select_controller.ts +2 -0
  56. data/app/typescript/controllers/slider_controller.ts +2 -0
  57. data/app/typescript/controllers/switch_controller.ts +2 -0
  58. data/app/typescript/controllers/tabs_controller.ts +2 -0
  59. data/app/typescript/controllers/theme_switcher_controller.ts +2 -0
  60. data/app/typescript/controllers/toast_container_controller.ts +2 -0
  61. data/app/typescript/controllers/toast_controller.ts +2 -0
  62. data/app/typescript/controllers/toggle_controller.ts +2 -0
  63. data/app/typescript/controllers/toggle_group_controller.ts +2 -0
  64. data/app/typescript/controllers/tooltip_controller.ts +2 -0
  65. data/app/typescript/shadcn_phlexcomponents.ts +27 -61
  66. data/app/typescript/utils/index.ts +7 -0
  67. data/lib/install/upgrade_shadcn_phlexcomponents.rb +28 -0
  68. data/lib/shadcn_phlexcomponents/components/accordion.rb +55 -12
  69. data/lib/shadcn_phlexcomponents/components/alert.rb +35 -16
  70. data/lib/shadcn_phlexcomponents/components/alert_dialog.rb +52 -12
  71. data/lib/shadcn_phlexcomponents/components/aspect_ratio.rb +33 -2
  72. data/lib/shadcn_phlexcomponents/components/avatar.rb +24 -7
  73. data/lib/shadcn_phlexcomponents/components/badge.rb +23 -18
  74. data/lib/shadcn_phlexcomponents/components/breadcrumb.rb +46 -6
  75. data/lib/shadcn_phlexcomponents/components/button.rb +32 -27
  76. data/lib/shadcn_phlexcomponents/components/card.rb +59 -10
  77. data/lib/shadcn_phlexcomponents/components/checkbox.rb +51 -30
  78. data/lib/shadcn_phlexcomponents/components/checkbox_group.rb +24 -4
  79. data/lib/shadcn_phlexcomponents/components/combobox.rb +212 -69
  80. data/lib/shadcn_phlexcomponents/components/command.rb +156 -52
  81. data/lib/shadcn_phlexcomponents/components/date_picker.rb +134 -48
  82. data/lib/shadcn_phlexcomponents/components/date_range_picker.rb +20 -42
  83. data/lib/shadcn_phlexcomponents/components/dialog.rb +80 -26
  84. data/lib/shadcn_phlexcomponents/components/dropdown_menu.rb +74 -25
  85. data/lib/shadcn_phlexcomponents/components/dropdown_menu_sub.rb +52 -24
  86. data/lib/shadcn_phlexcomponents/components/form/form_checkbox.rb +1 -1
  87. data/lib/shadcn_phlexcomponents/components/form/form_checkbox_group.rb +1 -1
  88. data/lib/shadcn_phlexcomponents/components/form/form_combobox.rb +1 -1
  89. data/lib/shadcn_phlexcomponents/components/form/form_date_picker.rb +1 -1
  90. data/lib/shadcn_phlexcomponents/components/form/form_date_range_picker.rb +1 -1
  91. data/lib/shadcn_phlexcomponents/components/form/form_error.rb +8 -1
  92. data/lib/shadcn_phlexcomponents/components/form/form_helpers.rb +3 -2
  93. data/lib/shadcn_phlexcomponents/components/form/form_hint.rb +8 -1
  94. data/lib/shadcn_phlexcomponents/components/form/form_input.rb +1 -1
  95. data/lib/shadcn_phlexcomponents/components/form/form_radio_group.rb +1 -1
  96. data/lib/shadcn_phlexcomponents/components/form/form_select.rb +1 -1
  97. data/lib/shadcn_phlexcomponents/components/form/form_slider.rb +1 -1
  98. data/lib/shadcn_phlexcomponents/components/form/form_switch.rb +1 -1
  99. data/lib/shadcn_phlexcomponents/components/form/form_textarea.rb +1 -1
  100. data/lib/shadcn_phlexcomponents/components/form.rb +22 -6
  101. data/lib/shadcn_phlexcomponents/components/hover_card.rb +48 -18
  102. data/lib/shadcn_phlexcomponents/components/input.rb +13 -8
  103. data/lib/shadcn_phlexcomponents/components/label.rb +9 -4
  104. data/lib/shadcn_phlexcomponents/components/link.rb +8 -1
  105. data/lib/shadcn_phlexcomponents/components/pagination.rb +34 -6
  106. data/lib/shadcn_phlexcomponents/components/popover.rb +43 -13
  107. data/lib/shadcn_phlexcomponents/components/progress.rb +37 -6
  108. data/lib/shadcn_phlexcomponents/components/radio_group.rb +41 -15
  109. data/lib/shadcn_phlexcomponents/components/select.rb +99 -42
  110. data/lib/shadcn_phlexcomponents/components/separator.rb +9 -4
  111. data/lib/shadcn_phlexcomponents/components/sheet.rb +87 -21
  112. data/lib/shadcn_phlexcomponents/components/skeleton.rb +8 -1
  113. data/lib/shadcn_phlexcomponents/components/switch.rb +45 -17
  114. data/lib/shadcn_phlexcomponents/components/table.rb +84 -17
  115. data/lib/shadcn_phlexcomponents/components/tabs.rb +36 -12
  116. data/lib/shadcn_phlexcomponents/components/textarea.rb +12 -7
  117. data/lib/shadcn_phlexcomponents/components/toast.rb +46 -20
  118. data/lib/shadcn_phlexcomponents/components/toast_container.rb +19 -14
  119. data/lib/shadcn_phlexcomponents/components/toggle.rb +28 -23
  120. data/lib/shadcn_phlexcomponents/components/tooltip.rb +49 -14
  121. data/lib/shadcn_phlexcomponents/configuration.rb +46 -0
  122. data/lib/shadcn_phlexcomponents/initializers/shadcn_phlexcomponents.rb +28 -0
  123. data/lib/shadcn_phlexcomponents/version.rb +1 -1
  124. data/lib/shadcn_phlexcomponents.rb +12 -1
  125. data/lib/tasks/upgrade.rake +10 -0
  126. metadata +15 -14
  127. data/app/typescript/controllers/sidebar_controller.ts +0 -39
  128. data/app/typescript/controllers/sidebar_trigger_controller.ts +0 -21
@@ -1,251 +1,266 @@
1
- import { useClickOutside } from 'stimulus-use';
2
- import { onKeydown, focusItemByIndex } from './dropdown_menu_controller';
3
- import { initFloatingUi } from '../utils/floating_ui';
4
- import { getSameLevelItems, focusTrigger, hideContent, showContent, lockScroll, unlockScroll, onClickOutside, setGroupLabelsId, getNextEnabledIndex, getPreviousEnabledIndex, focusElement, } from '../utils';
5
- import { Controller } from '@hotwired/stimulus';
1
+ import { useClickOutside } from "stimulus-use";
2
+ import { onKeydown, focusItemByIndex } from "./dropdown_menu_controller";
3
+ import { initFloatingUi } from "../utils/floating_ui";
4
+ import {
5
+ getSameLevelItems,
6
+ focusTrigger,
7
+ hideContent,
8
+ showContent,
9
+ lockScroll,
10
+ unlockScroll,
11
+ onClickOutside,
12
+ setGroupLabelsId,
13
+ getNextEnabledIndex,
14
+ getPreviousEnabledIndex,
15
+ focusElement,
16
+ } from "../utils";
17
+ import { Controller } from "@hotwired/stimulus";
6
18
  const SelectController = class extends Controller {
7
- // targets
8
- static targets = [
9
- 'trigger',
10
- 'contentContainer',
11
- 'content',
12
- 'item',
13
- 'triggerText',
14
- 'group',
15
- 'select',
16
- ];
17
- // values
18
- static values = {
19
- isOpen: Boolean,
20
- selected: String,
21
- };
22
- connect() {
23
- this.items = getSameLevelItems({
24
- content: this.contentTarget,
25
- items: this.itemTargets,
26
- closestContentSelector: '[data-select-target="content"]',
27
- });
28
- this.itemsInnerText = this.items.map((i) => i.innerText.trim());
29
- this.searchString = '';
30
- useClickOutside(this, { element: this.contentTarget, dispatchEvent: false });
31
- this.DOMKeydownListener = this.onDOMKeydown.bind(this);
32
- setGroupLabelsId(this);
33
- }
34
- toggle(event) {
35
- if (this.isOpenValue) {
36
- this.close();
37
- }
38
- else {
39
- this.open(event);
40
- }
41
- }
42
- open(event) {
43
- this.isOpenValue = true;
44
- let elementToFocus = null;
45
- if (this.selectedValue) {
46
- const item = this.itemTargets.find((i) => i.dataset.value === this.selectedValue);
47
- if (item && !item.dataset.disabled) {
48
- elementToFocus = item;
49
- }
50
- }
51
- if (!elementToFocus) {
52
- if (event instanceof KeyboardEvent) {
53
- const key = event.key;
54
- if (['ArrowDown', 'Enter', ' '].includes(key)) {
55
- elementToFocus = this.items[0];
56
- }
57
- }
58
- else {
59
- elementToFocus = this.contentTarget;
60
- }
61
- }
62
- focusElement(elementToFocus);
63
- }
64
- close() {
65
- this.isOpenValue = false;
66
- }
67
- onItemFocus(event) {
68
- const item = event.currentTarget;
69
- item.tabIndex = 0;
70
- }
71
- onItemBlur(event) {
72
- const item = event.currentTarget;
73
- item.tabIndex = -1;
19
+ static name = "select";
20
+ // targets
21
+ static targets = [
22
+ "trigger",
23
+ "contentContainer",
24
+ "content",
25
+ "item",
26
+ "triggerText",
27
+ "group",
28
+ "select",
29
+ ];
30
+ // values
31
+ static values = {
32
+ isOpen: Boolean,
33
+ selected: String,
34
+ };
35
+ connect() {
36
+ this.items = getSameLevelItems({
37
+ content: this.contentTarget,
38
+ items: this.itemTargets,
39
+ closestContentSelector: '[data-select-target="content"]',
40
+ });
41
+ this.itemsInnerText = this.items.map((i) => i.innerText.trim());
42
+ this.searchString = "";
43
+ useClickOutside(this, {
44
+ element: this.contentTarget,
45
+ dispatchEvent: false,
46
+ });
47
+ this.DOMKeydownListener = this.onDOMKeydown.bind(this);
48
+ setGroupLabelsId(this);
49
+ }
50
+ toggle(event) {
51
+ if (this.isOpenValue) {
52
+ this.close();
53
+ } else {
54
+ this.open(event);
74
55
  }
75
- focusItemByIndex(event = null, index = null) {
76
- focusItemByIndex(this, event, index);
56
+ }
57
+ open(event) {
58
+ this.isOpenValue = true;
59
+ let elementToFocus = null;
60
+ if (this.selectedValue) {
61
+ const item = this.itemTargets.find(
62
+ (i) => i.dataset.value === this.selectedValue,
63
+ );
64
+ if (item && !item.dataset.disabled) {
65
+ elementToFocus = item;
66
+ }
77
67
  }
78
- focusItem(event) {
79
- const item = event.currentTarget;
80
- const index = this.items.indexOf(item);
81
- if (event instanceof KeyboardEvent) {
82
- const key = event.key;
83
- let newIndex = 0;
84
- if (key === 'ArrowUp') {
85
- newIndex = getPreviousEnabledIndex({
86
- items: this.items,
87
- currentIndex: index,
88
- wrapAround: false,
89
- });
90
- }
91
- else {
92
- newIndex = getNextEnabledIndex({
93
- items: this.items,
94
- currentIndex: index,
95
- wrapAround: false,
96
- });
97
- }
98
- this.items[newIndex].focus();
68
+ if (!elementToFocus) {
69
+ if (event instanceof KeyboardEvent) {
70
+ const key = event.key;
71
+ if (["ArrowDown", "Enter", " "].includes(key)) {
72
+ elementToFocus = this.items[0];
99
73
  }
100
- else {
101
- // item mouseover event
102
- this.items[index].focus();
103
- }
104
- }
105
- focusContent() {
106
- this.contentTarget.focus();
107
- }
108
- select(event) {
109
- const item = event.currentTarget;
110
- const value = item.dataset.value;
111
- this.selectedValue = value;
112
- this.close();
74
+ } else {
75
+ elementToFocus = this.contentTarget;
76
+ }
113
77
  }
114
- clickOutside(event) {
115
- onClickOutside(this, event);
78
+ focusElement(elementToFocus);
79
+ }
80
+ close() {
81
+ this.isOpenValue = false;
82
+ }
83
+ onItemFocus(event) {
84
+ const item = event.currentTarget;
85
+ item.tabIndex = 0;
86
+ }
87
+ onItemBlur(event) {
88
+ const item = event.currentTarget;
89
+ item.tabIndex = -1;
90
+ }
91
+ focusItemByIndex(event = null, index = null) {
92
+ focusItemByIndex(this, event, index);
93
+ }
94
+ focusItem(event) {
95
+ const item = event.currentTarget;
96
+ const index = this.items.indexOf(item);
97
+ if (event instanceof KeyboardEvent) {
98
+ const key = event.key;
99
+ let newIndex = 0;
100
+ if (key === "ArrowUp") {
101
+ newIndex = getPreviousEnabledIndex({
102
+ items: this.items,
103
+ currentIndex: index,
104
+ wrapAround: false,
105
+ });
106
+ } else {
107
+ newIndex = getNextEnabledIndex({
108
+ items: this.items,
109
+ currentIndex: index,
110
+ wrapAround: false,
111
+ });
112
+ }
113
+ this.items[newIndex].focus();
114
+ } else {
115
+ // item mouseover event
116
+ this.items[index].focus();
116
117
  }
117
- isOpenValueChanged(isOpen, previousIsOpen) {
118
- if (isOpen) {
119
- lockScroll(this.contentTarget.id);
120
- showContent({
121
- trigger: this.triggerTarget,
122
- content: this.contentTarget,
123
- contentContainer: this.contentContainerTarget,
124
- setEqualWidth: true,
125
- });
126
- this.cleanup = initFloatingUi({
127
- referenceElement: this.triggerTarget,
128
- floatingElement: this.contentContainerTarget,
129
- side: this.contentTarget.dataset.side,
130
- align: this.contentTarget.dataset.align,
131
- sideOffset: 4,
132
- });
133
- this.setupEventListeners();
134
- }
135
- else {
136
- unlockScroll(this.contentTarget.id);
137
- hideContent({
138
- trigger: this.triggerTarget,
139
- content: this.contentTarget,
140
- contentContainer: this.contentContainerTarget,
141
- });
142
- if (previousIsOpen) {
143
- focusTrigger(this.triggerTarget);
144
- }
145
- this.cleanupEventListeners();
146
- }
118
+ }
119
+ focusContent() {
120
+ this.contentTarget.focus();
121
+ }
122
+ select(event) {
123
+ const item = event.currentTarget;
124
+ const value = item.dataset.value;
125
+ this.selectedValue = value;
126
+ this.close();
127
+ }
128
+ clickOutside(event) {
129
+ onClickOutside(this, event);
130
+ }
131
+ isOpenValueChanged(isOpen, previousIsOpen) {
132
+ if (isOpen) {
133
+ lockScroll(this.contentTarget.id);
134
+ showContent({
135
+ trigger: this.triggerTarget,
136
+ content: this.contentTarget,
137
+ contentContainer: this.contentContainerTarget,
138
+ setEqualWidth: true,
139
+ });
140
+ this.cleanup = initFloatingUi({
141
+ referenceElement: this.triggerTarget,
142
+ floatingElement: this.contentContainerTarget,
143
+ side: this.contentTarget.dataset.side,
144
+ align: this.contentTarget.dataset.align,
145
+ sideOffset: 4,
146
+ });
147
+ this.setupEventListeners();
148
+ } else {
149
+ unlockScroll(this.contentTarget.id);
150
+ hideContent({
151
+ trigger: this.triggerTarget,
152
+ content: this.contentTarget,
153
+ contentContainer: this.contentContainerTarget,
154
+ });
155
+ if (previousIsOpen) {
156
+ focusTrigger(this.triggerTarget);
157
+ }
158
+ this.cleanupEventListeners();
147
159
  }
148
- selectedValueChanged(value) {
149
- const item = this.itemTargets.find((i) => i.dataset.value === value);
150
- if (item) {
151
- this.triggerTextTarget.textContent = item.textContent;
152
- this.itemTargets.forEach((i) => {
153
- if (i.dataset.value === value) {
154
- i.setAttribute('aria-selected', 'true');
155
- }
156
- else {
157
- i.setAttribute('aria-selected', 'false');
158
- }
159
- });
160
- this.selectTarget.value = value;
161
- }
162
- this.triggerTarget.dataset.hasValue = `${!!value && value.length > 0}`;
163
- const placeholder = this.triggerTarget.dataset.placeholder;
164
- if (placeholder && this.triggerTarget.dataset.hasValue === 'false') {
165
- this.triggerTextTarget.textContent = placeholder;
160
+ }
161
+ selectedValueChanged(value) {
162
+ const item = this.itemTargets.find((i) => i.dataset.value === value);
163
+ if (item) {
164
+ this.triggerTextTarget.textContent = item.textContent;
165
+ this.itemTargets.forEach((i) => {
166
+ if (i.dataset.value === value) {
167
+ i.setAttribute("aria-selected", "true");
168
+ } else {
169
+ i.setAttribute("aria-selected", "false");
166
170
  }
171
+ });
172
+ this.selectTarget.value = value;
167
173
  }
168
- disconnect() {
169
- this.cleanupEventListeners();
174
+ this.triggerTarget.dataset.hasValue = `${!!value && value.length > 0}`;
175
+ const placeholder = this.triggerTarget.dataset.placeholder;
176
+ if (placeholder && this.triggerTarget.dataset.hasValue === "false") {
177
+ this.triggerTextTarget.textContent = placeholder;
170
178
  }
171
- onDOMKeydown(event) {
172
- if (!this.isOpenValue)
173
- return;
174
- onKeydown(this, event);
175
- const { key, altKey, ctrlKey, metaKey } = event;
176
- if (key === 'Backspace' ||
177
- key === 'Clear' ||
178
- (key.length === 1 && key !== ' ' && !altKey && !ctrlKey && !metaKey)) {
179
- this.handleSearch(key);
180
- }
179
+ }
180
+ disconnect() {
181
+ this.cleanupEventListeners();
182
+ }
183
+ onDOMKeydown(event) {
184
+ if (!this.isOpenValue) return;
185
+ onKeydown(this, event);
186
+ const { key, altKey, ctrlKey, metaKey } = event;
187
+ if (
188
+ key === "Backspace" ||
189
+ key === "Clear" ||
190
+ (key.length === 1 && key !== " " && !altKey && !ctrlKey && !metaKey)
191
+ ) {
192
+ this.handleSearch(key);
181
193
  }
182
- setupEventListeners() {
183
- document.addEventListener('keydown', this.DOMKeydownListener);
194
+ }
195
+ setupEventListeners() {
196
+ document.addEventListener("keydown", this.DOMKeydownListener);
197
+ }
198
+ cleanupEventListeners() {
199
+ if (this.cleanup) this.cleanup();
200
+ document.removeEventListener("keydown", this.DOMKeydownListener);
201
+ }
202
+ // https://www.w3.org/WAI/ARIA/apg/patterns/combobox/examples/combobox-select-only/
203
+ handleSearch(char) {
204
+ const searchString = this.getSearchString(char);
205
+ const focusedItem = this.items.find(
206
+ (item) => document.activeElement === item,
207
+ );
208
+ const focusedIndex = focusedItem ? this.items.indexOf(focusedItem) : 0;
209
+ const searchIndex = this.getIndexByLetter(searchString, focusedIndex + 1);
210
+ // if a match was found, go to it
211
+ if (searchIndex >= 0) {
212
+ this.focusItemByIndex(null, searchIndex);
184
213
  }
185
- cleanupEventListeners() {
186
- if (this.cleanup)
187
- this.cleanup();
188
- document.removeEventListener('keydown', this.DOMKeydownListener);
214
+ // if no matches, clear the timeout and search string
215
+ else {
216
+ window.clearTimeout(this.searchTimeout);
217
+ this.searchString = "";
189
218
  }
190
- // https://www.w3.org/WAI/ARIA/apg/patterns/combobox/examples/combobox-select-only/
191
- handleSearch(char) {
192
- const searchString = this.getSearchString(char);
193
- const focusedItem = this.items.find((item) => document.activeElement === item);
194
- const focusedIndex = focusedItem ? this.items.indexOf(focusedItem) : 0;
195
- const searchIndex = this.getIndexByLetter(searchString, focusedIndex + 1);
196
- // if a match was found, go to it
197
- if (searchIndex >= 0) {
198
- this.focusItemByIndex(null, searchIndex);
199
- }
200
- // if no matches, clear the timeout and search string
201
- else {
202
- window.clearTimeout(this.searchTimeout);
203
- this.searchString = '';
204
- }
219
+ }
220
+ filterItemsInnerText(items, filter) {
221
+ return items.filter((item) => {
222
+ const matches = item.toLowerCase().indexOf(filter.toLowerCase()) === 0;
223
+ return matches;
224
+ });
225
+ }
226
+ getSearchString(char) {
227
+ // reset typing timeout and start new timeout
228
+ // this allows us to make multiple-letter matches, like a native select
229
+ if (typeof this.searchTimeout === "number") {
230
+ window.clearTimeout(this.searchTimeout);
205
231
  }
206
- filterItemsInnerText(items, filter) {
207
- return items.filter((item) => {
208
- const matches = item.toLowerCase().indexOf(filter.toLowerCase()) === 0;
209
- return matches;
210
- });
232
+ this.searchTimeout = window.setTimeout(() => {
233
+ this.searchString = "";
234
+ }, 500);
235
+ // add most recent letter to saved search string
236
+ this.searchString += char;
237
+ return this.searchString;
238
+ }
239
+ // return the index of an option from an array of options, based on a search string
240
+ // if the filter is multiple iterations of the same letter (e.g "aaa"), then cycle through first-letter matches
241
+ getIndexByLetter(filter, startIndex) {
242
+ const orderedItems = [
243
+ ...this.itemsInnerText.slice(startIndex),
244
+ ...this.itemsInnerText.slice(0, startIndex),
245
+ ];
246
+ const firstMatch = this.filterItemsInnerText(orderedItems, filter)[0];
247
+ const allSameLetter = (array) =>
248
+ array.every((letter) => letter === array[0]);
249
+ // first check if there is an exact match for the typed string
250
+ if (firstMatch) {
251
+ const index = this.itemsInnerText.indexOf(firstMatch);
252
+ return index;
211
253
  }
212
- getSearchString(char) {
213
- // reset typing timeout and start new timeout
214
- // this allows us to make multiple-letter matches, like a native select
215
- if (typeof this.searchTimeout === 'number') {
216
- window.clearTimeout(this.searchTimeout);
217
- }
218
- this.searchTimeout = window.setTimeout(() => {
219
- this.searchString = '';
220
- }, 500);
221
- // add most recent letter to saved search string
222
- this.searchString += char;
223
- return this.searchString;
254
+ // if the same letter is being repeated, cycle through first-letter matches
255
+ else if (allSameLetter(filter.split(""))) {
256
+ const matches = this.filterItemsInnerText(orderedItems, filter[0]);
257
+ const index = this.itemsInnerText.indexOf(matches[0]);
258
+ return index;
224
259
  }
225
- // return the index of an option from an array of options, based on a search string
226
- // if the filter is multiple iterations of the same letter (e.g "aaa"), then cycle through first-letter matches
227
- getIndexByLetter(filter, startIndex) {
228
- const orderedItems = [
229
- ...this.itemsInnerText.slice(startIndex),
230
- ...this.itemsInnerText.slice(0, startIndex),
231
- ];
232
- const firstMatch = this.filterItemsInnerText(orderedItems, filter)[0];
233
- const allSameLetter = (array) => array.every((letter) => letter === array[0]);
234
- // first check if there is an exact match for the typed string
235
- if (firstMatch) {
236
- const index = this.itemsInnerText.indexOf(firstMatch);
237
- return index;
238
- }
239
- // if the same letter is being repeated, cycle through first-letter matches
240
- else if (allSameLetter(filter.split(''))) {
241
- const matches = this.filterItemsInnerText(orderedItems, filter[0]);
242
- const index = this.itemsInnerText.indexOf(matches[0]);
243
- return index;
244
- }
245
- // if no matches, return -1
246
- else {
247
- return -1;
248
- }
260
+ // if no matches, return -1
261
+ else {
262
+ return -1;
249
263
  }
264
+ }
250
265
  };
251
266
  export { SelectController };
@@ -1,30 +1,29 @@
1
- import { Controller } from '@hotwired/stimulus';
1
+ import { Controller } from "@hotwired/stimulus";
2
2
  export default class default_1 extends Controller {
3
- static targets = ['panel', 'panelOffset'];
4
- connect() {
5
- this.width = this.element.offsetWidth;
6
- }
7
- toggle() {
8
- if (this.isOpen()) {
9
- this.close();
10
- }
11
- else {
12
- this.open();
13
- }
14
- }
15
- open() {
16
- this.element.dataset.state = 'expanded';
17
- this.element.dataset.collapsible = '';
18
- this.panelTarget.style.removeProperty('left');
19
- this.panelOffsetTarget.style.removeProperty('width');
20
- }
21
- close() {
22
- this.element.dataset.state = 'collapsed';
23
- this.element.dataset.collapsible = 'offcanvas';
24
- this.panelTarget.style.left = `-${this.width}px`;
25
- this.panelOffsetTarget.style.width = `${0}`;
26
- }
27
- isOpen() {
28
- return this.element.dataset.state === 'expanded';
3
+ static targets = ["panel", "panelOffset"];
4
+ connect() {
5
+ this.width = this.element.offsetWidth;
6
+ }
7
+ toggle() {
8
+ if (this.isOpen()) {
9
+ this.close();
10
+ } else {
11
+ this.open();
29
12
  }
13
+ }
14
+ open() {
15
+ this.element.dataset.state = "expanded";
16
+ this.element.dataset.collapsible = "";
17
+ this.panelTarget.style.removeProperty("left");
18
+ this.panelOffsetTarget.style.removeProperty("width");
19
+ }
20
+ close() {
21
+ this.element.dataset.state = "collapsed";
22
+ this.element.dataset.collapsible = "offcanvas";
23
+ this.panelTarget.style.left = `-${this.width}px`;
24
+ this.panelOffsetTarget.style.width = `${0}`;
25
+ }
26
+ isOpen() {
27
+ return this.element.dataset.state === "expanded";
28
+ }
30
29
  }
@@ -1,12 +1,15 @@
1
- import { Controller } from '@hotwired/stimulus';
1
+ import { Controller } from "@hotwired/stimulus";
2
2
  export default class extends Controller {
3
- connect() {
4
- this.sidebarId = this.element.dataset.sidebarId;
5
- }
6
- toggle() {
7
- const sidebar = this.application.getControllerForElementAndIdentifier(document.querySelector(`#${this.sidebarId}`), 'sidebar');
8
- if (sidebar) {
9
- sidebar.toggle();
10
- }
3
+ connect() {
4
+ this.sidebarId = this.element.dataset.sidebarId;
5
+ }
6
+ toggle() {
7
+ const sidebar = this.application.getControllerForElementAndIdentifier(
8
+ document.querySelector(`#${this.sidebarId}`),
9
+ "sidebar",
10
+ );
11
+ if (sidebar) {
12
+ sidebar.toggle();
11
13
  }
14
+ }
12
15
  }