hotwire_combobox 0.1.32 → 0.1.33

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -0
  3. data/app/assets/javascripts/controllers/hw_combobox_controller.js +3 -2
  4. data/app/assets/javascripts/{helpers.js → hw_combobox/helpers.js} +6 -0
  5. data/app/assets/javascripts/{models → hw_combobox/models}/combobox/actors.js +1 -1
  6. data/app/assets/javascripts/{models → hw_combobox/models}/combobox/async_loading.js +1 -1
  7. data/app/assets/javascripts/{models → hw_combobox/models}/combobox/autocomplete.js +17 -2
  8. data/app/assets/javascripts/{models → hw_combobox/models}/combobox/dialog.js +1 -1
  9. data/app/assets/javascripts/{models → hw_combobox/models}/combobox/filtering.js +13 -11
  10. data/app/assets/javascripts/{models → hw_combobox/models}/combobox/navigation.js +2 -2
  11. data/app/assets/javascripts/hw_combobox/models/combobox/new_options.js +37 -0
  12. data/app/assets/javascripts/{models → hw_combobox/models}/combobox/options.js +2 -10
  13. data/app/assets/javascripts/{models → hw_combobox/models}/combobox/selection.js +16 -4
  14. data/app/assets/javascripts/{models → hw_combobox/models}/combobox/toggle.js +3 -5
  15. data/app/assets/javascripts/{models → hw_combobox/models}/combobox/validity.js +1 -1
  16. data/app/assets/javascripts/hw_combobox/models/combobox.js +15 -0
  17. data/app/assets/stylesheets/hotwire_combobox.css +0 -1
  18. data/app/presenters/hotwire_combobox/component.rb +10 -4
  19. data/lib/hotwire_combobox/engine.rb +1 -1
  20. data/lib/hotwire_combobox/helper.rb +28 -16
  21. data/lib/hotwire_combobox/version.rb +1 -1
  22. metadata +20 -22
  23. data/app/assets/javascripts/controllers/application.js +0 -9
  24. data/app/assets/javascripts/controllers/index.js +0 -3
  25. data/app/assets/javascripts/hotwire_combobox_application.js +0 -1
  26. data/app/assets/javascripts/models/combobox.js +0 -14
  27. /data/app/assets/javascripts/{models → hw_combobox/models}/combobox/base.js +0 -0
  28. /data/app/assets/javascripts/{vendor → hw_combobox/vendor}/bodyScrollLock.js +0 -0
  29. /data/app/assets/javascripts/{vendor → hw_combobox/vendor}/requestjs.js +0 -0
  30. /data/config/{importmap.rb → hw_importmap.rb} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eb06e6c688920de5447b5fbea7fd20c242e228a7d335b8e9841cd07c7df03cb0
4
- data.tar.gz: 338aad9ff496b0449e509543698c45b7581cbe9d6c13e869b25a86fa8819b726
3
+ metadata.gz: 415f50ba9630121312ea65c8f04435ff57ba386ffb9851dc9e09da8a6dc68352
4
+ data.tar.gz: de3d2d2bfb9d9f9e21292acf49152484ad05317b16daade967ea695afbf3bc87
5
5
  SHA512:
6
- metadata.gz: 84e88c954657e5f527ac5b564ff210ddeb42cd8e9dcb33a5ef40a9882d6edabbbe40fd53211a95b46056336399babf728bb11c7e5993dd845e2a8cbc86fe7b47
7
- data.tar.gz: 9803e31d7244ec3b87d6a6e0dc3532db155f206a540c69d4ee07d586e5e781da0dc5a267e5fa9c8bd4394b006272cfa361d511fb48c29c4d37d7c9a03627107b
6
+ metadata.gz: aab8d6575ec896e26035b5040afa0765b3dacd92d101589b20f305840a5831174cad852325bc64971e83f182260454d2d836be665f19a33cf845d972d90b8134
7
+ data.tar.gz: 5f4393d0d3dbf29c9bf194210cf7d845c35062a7fd4d952e6acafae2c407ce158d63735f703419311c15ab3996002fa573617cbff26b98406d7e98bdf0e85e9f
data/README.md CHANGED
@@ -18,6 +18,8 @@ Add this line to your application's Gemfile and run `bundle install`:
18
18
  gem "hotwire_combobox"
19
19
  ```
20
20
 
21
+ Only apps that use importmaps are currently supported. Suport for other JS solutions is in progress.
22
+
21
23
  ## Docs
22
24
 
23
25
  <p align="center">
@@ -1,5 +1,5 @@
1
- import Combobox from "models/combobox"
2
- import { Concerns } from "helpers"
1
+ import Combobox from "hw_combobox/models/combobox"
2
+ import { Concerns } from "hw_combobox/helpers"
3
3
  import { Controller } from "@hotwired/stimulus"
4
4
 
5
5
  const concerns = [
@@ -10,6 +10,7 @@ const concerns = [
10
10
  Combobox.Dialog,
11
11
  Combobox.Filtering,
12
12
  Combobox.Navigation,
13
+ Combobox.NewOptions,
13
14
  Combobox.Options,
14
15
  Combobox.Selection,
15
16
  Combobox.Toggle,
@@ -1,3 +1,5 @@
1
+ export const nullEvent = new Event("NULL")
2
+
1
3
  export function Concerns(Base, ...mixins) {
2
4
  return mixins.reduce((accumulator, current) => current(accumulator), Base)
3
5
  }
@@ -50,3 +52,7 @@ export function debounce(fn, delay = 150) {
50
52
  timeoutId = setTimeout(callback, delay)
51
53
  }
52
54
  }
55
+
56
+ export function isDeleteEvent(event) {
57
+ return event.inputType === "deleteContentBackward" || event.inputType === "deleteWordBackward"
58
+ }
@@ -1,4 +1,4 @@
1
- import Combobox from "models/combobox/base"
1
+ import Combobox from "hw_combobox/models/combobox/base"
2
2
 
3
3
  Combobox.Actors = Base => class extends Base {
4
4
  _initializeActors() {
@@ -1,4 +1,4 @@
1
- import Combobox from "models/combobox/base"
1
+ import Combobox from "hw_combobox/models/combobox/base"
2
2
 
3
3
  Combobox.AsyncLoading = Base => class extends Base {
4
4
  get _isAsync() {
@@ -1,5 +1,5 @@
1
- import Combobox from "models/combobox/base"
2
- import { startsWith } from "helpers"
1
+ import Combobox from "hw_combobox/models/combobox/base"
2
+ import { startsWith } from "hw_combobox/helpers"
3
3
 
4
4
  Combobox.Autocomplete = Base => class extends Base {
5
5
  _connectListAutocomplete() {
@@ -29,6 +29,17 @@ Combobox.Autocomplete = Base => class extends Base {
29
29
  this.listboxTarget.style.display = "none"
30
30
  }
31
31
 
32
+ get _isExactAutocompleteMatch() {
33
+ return this._immediatelyAutocompletableValue === this._actingCombobox.value
34
+ }
35
+
36
+ // All `_isExactAutocompleteMatch` matches are `_isPartialAutocompleteMatch` matches
37
+ // but not all `_isPartialAutocompleteMatch` matches are `_isExactAutocompleteMatch` matches.
38
+ get _isPartialAutocompleteMatch() {
39
+ return !!this._immediatelyAutocompletableValue &&
40
+ startsWith(this._immediatelyAutocompletableValue, this._actingCombobox.value)
41
+ }
42
+
32
43
  get _autocompletesList() {
33
44
  return this.autocompleteValue === "both" || this.autocompleteValue === "list"
34
45
  }
@@ -36,4 +47,8 @@ Combobox.Autocomplete = Base => class extends Base {
36
47
  get _autocompletesInline() {
37
48
  return this.autocompleteValue === "both" || this.autocompleteValue === "inline"
38
49
  }
50
+
51
+ get _immediatelyAutocompletableValue() {
52
+ return this._visibleOptionElements[0]?.getAttribute(this.autocompletableAttributeValue)
53
+ }
39
54
  }
@@ -1,4 +1,4 @@
1
- import Combobox from "models/combobox/base"
1
+ import Combobox from "hw_combobox/models/combobox/base"
2
2
 
3
3
  Combobox.Dialog = Base => class extends Base {
4
4
  _connectDialog() {
@@ -1,7 +1,7 @@
1
1
 
2
- import Combobox from "models/combobox/base"
3
- import { applyFilter, nextFrame, debounce } from "helpers"
4
- import { get } from "vendor/requestjs"
2
+ import Combobox from "hw_combobox/models/combobox/base"
3
+ import { applyFilter, nextFrame, debounce, isDeleteEvent } from "hw_combobox/helpers"
4
+ import { get } from "hw_combobox/vendor/requestjs"
5
5
 
6
6
  Combobox.Filtering = Base => class extends Base {
7
7
  filter(event) {
@@ -25,7 +25,7 @@ Combobox.Filtering = Base => class extends Base {
25
25
 
26
26
  await get(this.asyncSrcValue, { responseKind: "turbo-stream", query: { q } })
27
27
 
28
- this._afterTurboStreamRender(() => this._commitFilter(q, event))
28
+ this._afterTurboStreamRender(() => this._commitFilter(event))
29
29
  }
30
30
 
31
31
  _filterSync(event) {
@@ -35,15 +35,13 @@ Combobox.Filtering = Base => class extends Base {
35
35
 
36
36
  this._allOptionElements.forEach(applyFilter(query, { matching: this.filterableAttributeValue }))
37
37
 
38
- this._commitFilter(query, event)
38
+ this._commitFilter(event)
39
39
  }
40
40
 
41
- _commitFilter(query, event) {
42
- const isDeleting = event.inputType === "deleteContentBackward"
43
-
44
- if (this._isValidNewOption(query, { ignoreAutocomplete: isDeleting })) {
45
- this._selectNew(query)
46
- } else if (isDeleting) {
41
+ _commitFilter(event) {
42
+ if (this._shouldTreatAsNewOptionForFiltering(!isDeleteEvent(event))) {
43
+ this._selectNew()
44
+ } else if (isDeleteEvent(event)) {
47
45
  this._deselect()
48
46
  } else {
49
47
  this._select(this._visibleOptionElements[0])
@@ -54,4 +52,8 @@ Combobox.Filtering = Base => class extends Base {
54
52
  await nextFrame()
55
53
  callback()
56
54
  }
55
+
56
+ get _isQueried() {
57
+ return this._actingCombobox.value.length > 0
58
+ }
57
59
  }
@@ -1,5 +1,5 @@
1
- import Combobox from "models/combobox/base"
2
- import { cancel } from "helpers"
1
+ import Combobox from "hw_combobox/models/combobox/base"
2
+ import { cancel } from "hw_combobox/helpers"
3
3
 
4
4
  Combobox.Navigation = Base => class extends Base {
5
5
  navigate(event) {
@@ -0,0 +1,37 @@
1
+ import Combobox from "hw_combobox/models/combobox/base"
2
+
3
+ Combobox.NewOptions = Base => class extends Base {
4
+ _shouldTreatAsNewOptionForFiltering(queryIsBeingRefined) {
5
+ if (queryIsBeingRefined) {
6
+ return this._isNewOptionWithNoPotentialMatches
7
+ } else {
8
+ return this._isNewOptionWithPotentialMatches
9
+ }
10
+ }
11
+
12
+ // If the user is going to keep refining the query, we can't be sure whether
13
+ // the option will end up being new or not unless there are no potential matches.
14
+ // +_isNewOptionWithNoPotentialMatches+ allows us to make our best guess
15
+ // while the state of the combobox is still in flux.
16
+ //
17
+ // It's okay for the combobox to say it's not new even if it will be eventually,
18
+ // as only the final state matters for submission purposes. This method exists
19
+ // as a best effort to keep the state accurate as often as we can.
20
+ //
21
+ // Note that the first visible option is automatically selected as you type.
22
+ // So if there's a partial match, it's not a new option at this point.
23
+ //
24
+ // The final state is locked-in upon closing the combobox via `_isNewOptionWithPotentialMatches`.
25
+ get _isNewOptionWithNoPotentialMatches() {
26
+ return this._isNewOptionWithPotentialMatches && !this._isPartialAutocompleteMatch
27
+ }
28
+
29
+ // If the query is finalized, we don't care that there are potential matches
30
+ // because new options can be substrings of existing options.
31
+ //
32
+ // We can't use `_isNewOptionWithNoPotentialMatches` because that would
33
+ // rule out new options that are partial matches.
34
+ get _isNewOptionWithPotentialMatches() {
35
+ return this._isQueried && this._allowNew && !this._isExactAutocompleteMatch
36
+ }
37
+ }
@@ -1,5 +1,5 @@
1
- import Combobox from "models/combobox/base"
2
- import { visible, startsWith } from "helpers"
1
+ import Combobox from "hw_combobox/models/combobox/base"
2
+ import { visible } from "hw_combobox/helpers"
3
3
 
4
4
  Combobox.Options = Base => class extends Base {
5
5
  _resetOptions() {
@@ -7,14 +7,6 @@ Combobox.Options = Base => class extends Base {
7
7
  this.hiddenFieldTarget.name = this.originalNameValue
8
8
  }
9
9
 
10
- _isValidNewOption(query, { ignoreAutocomplete = false } = {}) {
11
- const typedValue = this._actingCombobox.value
12
- const autocompletedValue = this._visibleOptionElements[0]?.getAttribute(this.autocompletableAttributeValue)
13
- const insufficientAutocomplete = !autocompletedValue || !startsWith(autocompletedValue, typedValue)
14
-
15
- return query.length > 0 && this._allowNew && (ignoreAutocomplete || insufficientAutocomplete)
16
- }
17
-
18
10
  get _allowNew() {
19
11
  return !!this.nameWhenNewValue
20
12
  }
@@ -1,9 +1,10 @@
1
- import Combobox from "models/combobox/base"
2
- import { wrapAroundAccess } from "helpers"
1
+ import Combobox from "hw_combobox/models/combobox/base"
2
+ import { wrapAroundAccess, nullEvent } from "hw_combobox/helpers"
3
3
 
4
4
  Combobox.Selection = Base => class extends Base {
5
5
  selectOption(event) {
6
6
  this._select(event.currentTarget)
7
+ this.filter(event)
7
8
  this.close()
8
9
  }
9
10
 
@@ -49,9 +50,9 @@ Combobox.Selection = Base => class extends Base {
49
50
  if (option) this._commitSelection(option, { selected: false })
50
51
  }
51
52
 
52
- _selectNew(query) {
53
+ _selectNew() {
53
54
  this._resetOptions()
54
- this.hiddenFieldTarget.value = query
55
+ this.hiddenFieldTarget.value = this._actingCombobox.value
55
56
  this.hiddenFieldTarget.name = this.nameWhenNewValue
56
57
  }
57
58
 
@@ -70,7 +71,18 @@ Combobox.Selection = Base => class extends Base {
70
71
  }
71
72
  }
72
73
 
74
+ _selectFuzzyMatch() {
75
+ if (this._isFuzzyMatch) {
76
+ this._select(this._visibleOptionElements[0], { force: true })
77
+ this.filter(nullEvent)
78
+ }
79
+ }
80
+
73
81
  get _hasValueButNoSelection() {
74
82
  return this.hiddenFieldTarget.value && !this._selectedOptionElement
75
83
  }
84
+
85
+ get _isFuzzyMatch() {
86
+ return this._isQueried && !!this._visibleOptionElements[0] && !this._isNewOptionWithPotentialMatches
87
+ }
76
88
  }
@@ -1,5 +1,5 @@
1
- import Combobox from "models/combobox/base"
2
- import { disableBodyScroll, enableBodyScroll } from "vendor/bodyScrollLock"
1
+ import Combobox from "hw_combobox/models/combobox/base"
2
+ import { disableBodyScroll, enableBodyScroll } from "hw_combobox/vendor/bodyScrollLock"
3
3
 
4
4
  Combobox.Toggle = Base => class extends Base {
5
5
  open() {
@@ -51,9 +51,7 @@ Combobox.Toggle = Base => class extends Base {
51
51
  }
52
52
 
53
53
  _ensureSelection() {
54
- if (!this._isValidNewOption(this._actingCombobox.value, { ignoreAutocomplete: true })) {
55
- this._select(this._selectedOptionElement, { force: true })
56
- }
54
+ this._selectFuzzyMatch()
57
55
  }
58
56
 
59
57
  _openByFocusing() {
@@ -1,4 +1,4 @@
1
- import Combobox from "models/combobox/base"
1
+ import Combobox from "hw_combobox/models/combobox/base"
2
2
 
3
3
  Combobox.Validity = Base => class extends Base {
4
4
  _markValid() {
@@ -0,0 +1,15 @@
1
+ import Combobox from "hw_combobox/models/combobox/base"
2
+
3
+ import "hw_combobox/models/combobox/actors"
4
+ import "hw_combobox/models/combobox/async_loading"
5
+ import "hw_combobox/models/combobox/autocomplete"
6
+ import "hw_combobox/models/combobox/dialog"
7
+ import "hw_combobox/models/combobox/filtering"
8
+ import "hw_combobox/models/combobox/navigation"
9
+ import "hw_combobox/models/combobox/new_options"
10
+ import "hw_combobox/models/combobox/options"
11
+ import "hw_combobox/models/combobox/selection"
12
+ import "hw_combobox/models/combobox/toggle"
13
+ import "hw_combobox/models/combobox/validity"
14
+
15
+ export default Combobox
@@ -47,7 +47,6 @@
47
47
  margin: 0;
48
48
  padding: 0;
49
49
  position: relative;
50
- isolation: isolate;
51
50
 
52
51
  &, * {
53
52
  box-sizing: border-box;
@@ -19,7 +19,7 @@ class HotwireCombobox::Component
19
19
  **rest
20
20
  @view, @autocomplete, @id, @name, @value, @form, @async_src,
21
21
  @name_when_new, @open, @data, @mobile_at, @options, @dialog_label =
22
- view, autocomplete, id, name, value, form, async_src,
22
+ view, autocomplete, id, name.to_s, value, form, async_src,
23
23
  name_when_new, open, data, mobile_at, options, dialog_label
24
24
 
25
25
  @combobox_attrs = input.reverse_merge(rest).with_indifferent_access
@@ -146,8 +146,8 @@ class HotwireCombobox::Component
146
146
  :association_name
147
147
 
148
148
  def infer_association_name
149
- if name.to_s.include?("_id")
150
- name.to_s.sub(/_id\z/, "")
149
+ if name.include?("_id")
150
+ name.sub(/_id\z/, "")
151
151
  end
152
152
  end
153
153
 
@@ -204,7 +204,13 @@ class HotwireCombobox::Component
204
204
  end
205
205
 
206
206
  def hidden_field_value
207
- form&.object&.public_send(name) || value
207
+ return value if value
208
+
209
+ if form&.object&.defined_enums&.try :[], name
210
+ form.object.public_send "#{name}_before_type_cast"
211
+ else
212
+ form&.object&.try name
213
+ end
208
214
  end
209
215
 
210
216
 
@@ -21,7 +21,7 @@ module HotwireCombobox
21
21
 
22
22
  initializer "hotwire_combobox.importmap", before: "importmap" do |app|
23
23
  if Rails.application.respond_to?(:importmap)
24
- app.config.importmap.paths << Engine.root.join("config/importmap.rb")
24
+ app.config.importmap.paths << Engine.root.join("config/hw_importmap.rb")
25
25
  end
26
26
  end
27
27
 
@@ -27,13 +27,8 @@ module HotwireCombobox
27
27
  if options.first.is_a? HotwireCombobox::Listbox::Option
28
28
  options
29
29
  else
30
- content = if render_in.present?
31
- ->(object) { render(**render_in.merge(object: object)) }
32
- else
33
- methods[:content]
34
- end
35
-
36
- hw_parse_combobox_options options, **methods.merge(display: display, content: content)
30
+ render_in_proc = ->(object) { render(**render_in.merge(object: object)) } if render_in.present?
31
+ hw_parse_combobox_options options, render_in: render_in_proc, **methods.merge(display: display)
37
32
  end
38
33
  end
39
34
  hw_alias :hw_combobox_options
@@ -86,19 +81,36 @@ module HotwireCombobox
86
81
  url_or_path
87
82
  end
88
83
 
89
- def hw_parse_combobox_options(options, **methods)
84
+ def hw_parse_combobox_options(options, render_in: nil, **methods)
90
85
  options.map do |option|
91
- attrs = option.is_a?(Hash) ? option : hw_option_attrs_for_obj(option, **methods)
92
- HotwireCombobox::Listbox::Option.new **attrs
86
+ HotwireCombobox::Listbox::Option.new **hw_option_attrs_for(option, render_in: render_in, **methods)
93
87
  end
94
88
  end
95
89
 
96
- def hw_option_attrs_for_obj(option, **methods)
97
- {}.tap do |attrs|
98
- attrs[:id] = hw_call_method_or_proc(option, methods[:id]) if methods[:id]
99
- attrs[:value] = hw_call_method_or_proc(option, methods[:value] || :id)
100
- attrs[:display] = hw_call_method_or_proc(option, methods[:display]) if methods[:display]
101
- attrs[:content] = hw_call_method_or_proc(option, methods[:content]) if methods[:content]
90
+ def hw_option_attrs_for(option, render_in: nil, **methods)
91
+ case option
92
+ when Hash
93
+ option
94
+ when String
95
+ {}.tap do |attrs|
96
+ attrs[:display] = option
97
+ attrs[:value] = option
98
+ attrs[:content] = render_in.(option) if render_in
99
+ end
100
+ when Array
101
+ {}.tap do |attrs|
102
+ attrs[:display] = option.first
103
+ attrs[:value] = option.last
104
+ attrs[:content] = render_in.(option.first) if render_in
105
+ end
106
+ else
107
+ {}.tap do |attrs|
108
+ attrs[:value] = hw_call_method_or_proc(option, methods[:value] || :id)
109
+
110
+ attrs[:id] = hw_call_method_or_proc(option, methods[:id]) if methods[:id]
111
+ attrs[:display] = hw_call_method_or_proc(option, methods[:display]) if methods[:display]
112
+ attrs[:content] = hw_call_method_or_proc(option, render_in || methods[:content]) if render_in || methods[:content]
113
+ end
102
114
  end
103
115
  end
104
116
 
@@ -1,3 +1,3 @@
1
1
  module HotwireCombobox
2
- VERSION = "0.1.32"
2
+ VERSION = "0.1.33"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hotwire_combobox
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.32
4
+ version: 0.1.33
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jose Farias
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-08 00:00:00.000000000 Z
11
+ date: 2024-02-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -63,25 +63,23 @@ files:
63
63
  - README.md
64
64
  - Rakefile
65
65
  - app/assets/config/hw_combobox_manifest.js
66
- - app/assets/javascripts/controllers/application.js
67
66
  - app/assets/javascripts/controllers/hw_combobox_controller.js
68
- - app/assets/javascripts/controllers/index.js
69
- - app/assets/javascripts/helpers.js
70
- - app/assets/javascripts/hotwire_combobox_application.js
71
- - app/assets/javascripts/models/combobox.js
72
- - app/assets/javascripts/models/combobox/actors.js
73
- - app/assets/javascripts/models/combobox/async_loading.js
74
- - app/assets/javascripts/models/combobox/autocomplete.js
75
- - app/assets/javascripts/models/combobox/base.js
76
- - app/assets/javascripts/models/combobox/dialog.js
77
- - app/assets/javascripts/models/combobox/filtering.js
78
- - app/assets/javascripts/models/combobox/navigation.js
79
- - app/assets/javascripts/models/combobox/options.js
80
- - app/assets/javascripts/models/combobox/selection.js
81
- - app/assets/javascripts/models/combobox/toggle.js
82
- - app/assets/javascripts/models/combobox/validity.js
83
- - app/assets/javascripts/vendor/bodyScrollLock.js
84
- - app/assets/javascripts/vendor/requestjs.js
67
+ - app/assets/javascripts/hw_combobox/helpers.js
68
+ - app/assets/javascripts/hw_combobox/models/combobox.js
69
+ - app/assets/javascripts/hw_combobox/models/combobox/actors.js
70
+ - app/assets/javascripts/hw_combobox/models/combobox/async_loading.js
71
+ - app/assets/javascripts/hw_combobox/models/combobox/autocomplete.js
72
+ - app/assets/javascripts/hw_combobox/models/combobox/base.js
73
+ - app/assets/javascripts/hw_combobox/models/combobox/dialog.js
74
+ - app/assets/javascripts/hw_combobox/models/combobox/filtering.js
75
+ - app/assets/javascripts/hw_combobox/models/combobox/navigation.js
76
+ - app/assets/javascripts/hw_combobox/models/combobox/new_options.js
77
+ - app/assets/javascripts/hw_combobox/models/combobox/options.js
78
+ - app/assets/javascripts/hw_combobox/models/combobox/selection.js
79
+ - app/assets/javascripts/hw_combobox/models/combobox/toggle.js
80
+ - app/assets/javascripts/hw_combobox/models/combobox/validity.js
81
+ - app/assets/javascripts/hw_combobox/vendor/bodyScrollLock.js
82
+ - app/assets/javascripts/hw_combobox/vendor/requestjs.js
85
83
  - app/assets/stylesheets/hotwire_combobox.css
86
84
  - app/presenters/hotwire_combobox/component.rb
87
85
  - app/presenters/hotwire_combobox/listbox/option.rb
@@ -93,7 +91,7 @@ files:
93
91
  - app/views/hotwire_combobox/combobox/_hidden_field.html.erb
94
92
  - app/views/hotwire_combobox/combobox/_input.html.erb
95
93
  - app/views/hotwire_combobox/combobox/_paginated_listbox.html.erb
96
- - config/importmap.rb
94
+ - config/hw_importmap.rb
97
95
  - lib/hotwire_combobox.rb
98
96
  - lib/hotwire_combobox/engine.rb
99
97
  - lib/hotwire_combobox/helper.rb
@@ -120,7 +118,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
120
118
  - !ruby/object:Gem::Version
121
119
  version: '0'
122
120
  requirements: []
123
- rubygems_version: 3.4.18
121
+ rubygems_version: 3.5.6
124
122
  signing_key:
125
123
  specification_version: 4
126
124
  summary: Autocomplete for Rails apps using Hotwire
@@ -1,9 +0,0 @@
1
- import { Application } from "@hotwired/stimulus"
2
-
3
- const application = Application.start()
4
-
5
- // Configure Stimulus development experience
6
- application.debug = false
7
- window.Stimulus = application
8
-
9
- export { application }
@@ -1,3 +0,0 @@
1
- import { application } from "controllers/application"
2
- import { eagerLoadControllersFrom } from "@hotwired/stimulus-loading"
3
- eagerLoadControllersFrom("controllers", application)
@@ -1 +0,0 @@
1
- import "controllers"
@@ -1,14 +0,0 @@
1
- import Combobox from "models/combobox/base"
2
-
3
- import "models/combobox/actors"
4
- import "models/combobox/async_loading"
5
- import "models/combobox/autocomplete"
6
- import "models/combobox/dialog"
7
- import "models/combobox/filtering"
8
- import "models/combobox/navigation"
9
- import "models/combobox/options"
10
- import "models/combobox/selection"
11
- import "models/combobox/toggle"
12
- import "models/combobox/validity"
13
-
14
- export default Combobox
File without changes