refine-rails 2.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (141) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +413 -0
  3. data/Rakefile +8 -0
  4. data/app/assets/config/refine_rails_manifest.js +0 -0
  5. data/app/assets/javascripts/refine-stimulus.esm.js +2 -0
  6. data/app/assets/javascripts/refine-stimulus.esm.js.map +1 -0
  7. data/app/assets/javascripts/refine-stimulus.js +2 -0
  8. data/app/assets/javascripts/refine-stimulus.js.map +1 -0
  9. data/app/assets/javascripts/refine-stimulus.modern.js +2 -0
  10. data/app/assets/javascripts/refine-stimulus.modern.js.map +1 -0
  11. data/app/assets/javascripts/refine-stimulus.umd.js +2 -0
  12. data/app/assets/javascripts/refine-stimulus.umd.js.map +1 -0
  13. data/app/assets/stylesheets/index.css +1873 -0
  14. data/app/assets/stylesheets/index.tailwind.css +1035 -0
  15. data/app/controllers/refine/blueprints_controller.rb +80 -0
  16. data/app/controllers/refine/filter_application_controller.rb +29 -0
  17. data/app/controllers/refine/inline/criteria_controller.rb +161 -0
  18. data/app/controllers/refine/inline/stored_filters_controller.rb +84 -0
  19. data/app/controllers/refine/stored_filters_controller.rb +69 -0
  20. data/app/javascript/controllers/index.js +66 -0
  21. data/app/javascript/controllers/refine/add-controller.js +42 -0
  22. data/app/javascript/controllers/refine/criterion-form-controller.js +31 -0
  23. data/app/javascript/controllers/refine/date-controller.js +113 -0
  24. data/app/javascript/controllers/refine/defaults-controller.js +32 -0
  25. data/app/javascript/controllers/refine/delete-controller.js +13 -0
  26. data/app/javascript/controllers/refine/filter-pills-controller.js +63 -0
  27. data/app/javascript/controllers/refine/form-controller.js +51 -0
  28. data/app/javascript/controllers/refine/inline-conditions-controller.js +33 -0
  29. data/app/javascript/controllers/refine/popup-controller.js +46 -0
  30. data/app/javascript/controllers/refine/search-filter-controller.js +50 -0
  31. data/app/javascript/controllers/refine/server-refresh-controller.js +43 -0
  32. data/app/javascript/controllers/refine/state-controller.js +220 -0
  33. data/app/javascript/controllers/refine/stored-filter-controller.js +23 -0
  34. data/app/javascript/controllers/refine/submit-form-controller.js +8 -0
  35. data/app/javascript/controllers/refine/toggle-controller.js +12 -0
  36. data/app/javascript/controllers/refine/turbo-stream-form-controller.js +24 -0
  37. data/app/javascript/controllers/refine/turbo-stream-link-controller.js +24 -0
  38. data/app/javascript/controllers/refine/update-controller.js +86 -0
  39. data/app/javascript/index.js +1 -0
  40. data/app/javascript/refine/helpers/index.js +77 -0
  41. data/app/models/refine/blueprints/blueprint.rb +58 -0
  42. data/app/models/refine/blueprints/blueprint_example.json +25 -0
  43. data/app/models/refine/conditions/boolean_condition.rb +112 -0
  44. data/app/models/refine/conditions/clause.rb +38 -0
  45. data/app/models/refine/conditions/clauses.rb +38 -0
  46. data/app/models/refine/conditions/condition.rb +285 -0
  47. data/app/models/refine/conditions/condition_error.rb +1 -0
  48. data/app/models/refine/conditions/date_condition.rb +464 -0
  49. data/app/models/refine/conditions/date_with_time_condition.rb +8 -0
  50. data/app/models/refine/conditions/errors/condition_clause_error.rb +7 -0
  51. data/app/models/refine/conditions/errors/criteria_limit_exceeded_error.rb +2 -0
  52. data/app/models/refine/conditions/errors/option_error.rb +2 -0
  53. data/app/models/refine/conditions/errors/relationship_error.rb +1 -0
  54. data/app/models/refine/conditions/filter_condition.rb +93 -0
  55. data/app/models/refine/conditions/has_clauses.rb +117 -0
  56. data/app/models/refine/conditions/has_meta.rb +10 -0
  57. data/app/models/refine/conditions/has_refinements.rb +156 -0
  58. data/app/models/refine/conditions/numeric_condition.rb +224 -0
  59. data/app/models/refine/conditions/option_condition.rb +260 -0
  60. data/app/models/refine/conditions/text_condition.rb +152 -0
  61. data/app/models/refine/conditions/uses_attributes.rb +168 -0
  62. data/app/models/refine/filter.rb +302 -0
  63. data/app/models/refine/filters/blueprint_editor.rb +102 -0
  64. data/app/models/refine/filters/builder.rb +59 -0
  65. data/app/models/refine/filters/criterion.rb +87 -0
  66. data/app/models/refine/filters/query.rb +82 -0
  67. data/app/models/refine/inline/criteria/input.rb +50 -0
  68. data/app/models/refine/inline/criteria/numeric_refinement.rb +13 -0
  69. data/app/models/refine/inline/criteria/option.rb +2 -0
  70. data/app/models/refine/inline/criterion.rb +141 -0
  71. data/app/models/refine/invalid_filter_error.rb +8 -0
  72. data/app/models/refine/stabilize.rb +29 -0
  73. data/app/models/refine/stabilizers/database_stabilizer.rb +21 -0
  74. data/app/models/refine/stabilizers/errors/url_stabilizer_error.rb +2 -0
  75. data/app/models/refine/stabilizers/url_encoded_stabilizer.rb +21 -0
  76. data/app/models/refine/stored_filter.rb +14 -0
  77. data/app/models/refine/tracks_pending_relationship_subqueries.rb +196 -0
  78. data/app/views/_filter_builder_dropdown.html.erb +63 -0
  79. data/app/views/_filter_pills.html.erb +40 -0
  80. data/app/views/_loading.html.erb +32 -0
  81. data/app/views/refine/blueprints/_add_and.html.erb +25 -0
  82. data/app/views/refine/blueprints/_add_group.html.erb +24 -0
  83. data/app/views/refine/blueprints/_clause_select.html.erb +24 -0
  84. data/app/views/refine/blueprints/_condition_select.html.erb +53 -0
  85. data/app/views/refine/blueprints/_criterion.html.erb +41 -0
  86. data/app/views/refine/blueprints/_criterion_errors.html.erb +7 -0
  87. data/app/views/refine/blueprints/_delete_criterion.html.erb +11 -0
  88. data/app/views/refine/blueprints/_group.html.erb +13 -0
  89. data/app/views/refine/blueprints/_query.html.erb +34 -0
  90. data/app/views/refine/blueprints/_stored_filters.html.erb +23 -0
  91. data/app/views/refine/blueprints/clauses/_date_condition.html.erb +80 -0
  92. data/app/views/refine/blueprints/clauses/_date_picker.html.erb +26 -0
  93. data/app/views/refine/blueprints/clauses/_filter_condition.html.erb +36 -0
  94. data/app/views/refine/blueprints/clauses/_numeric_condition.html.erb +35 -0
  95. data/app/views/refine/blueprints/clauses/_option_condition.html.erb +37 -0
  96. data/app/views/refine/blueprints/clauses/_text_condition.html.erb +13 -0
  97. data/app/views/refine/blueprints/create.turbo_stream.erb +22 -0
  98. data/app/views/refine/blueprints/new.html.erb +7 -0
  99. data/app/views/refine/blueprints/show.html.erb +4 -0
  100. data/app/views/refine/blueprints/show.turbo_stream.erb +22 -0
  101. data/app/views/refine/inline/criteria/_form_fields.html.erb +62 -0
  102. data/app/views/refine/inline/criteria/create.turbo_stream.erb +19 -0
  103. data/app/views/refine/inline/criteria/edit.turbo_stream.erb +26 -0
  104. data/app/views/refine/inline/criteria/index.html.erb +64 -0
  105. data/app/views/refine/inline/criteria/new.turbo_stream.erb +24 -0
  106. data/app/views/refine/inline/filters/_add_first_condition_button.html.erb +19 -0
  107. data/app/views/refine/inline/filters/_and_button.html.erb +26 -0
  108. data/app/views/refine/inline/filters/_criterion.html.erb +23 -0
  109. data/app/views/refine/inline/filters/_group.html.erb +13 -0
  110. data/app/views/refine/inline/filters/_load_button.html.erb +15 -0
  111. data/app/views/refine/inline/filters/_or_button.html.erb +26 -0
  112. data/app/views/refine/inline/filters/_popup.html.erb +26 -0
  113. data/app/views/refine/inline/filters/_save_button.html.erb +15 -0
  114. data/app/views/refine/inline/filters/_show.html.erb +40 -0
  115. data/app/views/refine/inline/inputs/_date_condition.html.erb +7 -0
  116. data/app/views/refine/inline/inputs/_date_condition_days.html.erb +18 -0
  117. data/app/views/refine/inline/inputs/_date_condition_range.html.erb +22 -0
  118. data/app/views/refine/inline/inputs/_date_condition_single.html.erb +9 -0
  119. data/app/views/refine/inline/inputs/_date_picker.html.erb +20 -0
  120. data/app/views/refine/inline/inputs/_numeric_condition.html.erb +23 -0
  121. data/app/views/refine/inline/inputs/_option_condition.html.erb +14 -0
  122. data/app/views/refine/inline/inputs/_text_condition.html.erb +8 -0
  123. data/app/views/refine/inline/stored_filters/find.turbo_stream.erb +19 -0
  124. data/app/views/refine/inline/stored_filters/index.html.erb +28 -0
  125. data/app/views/refine/inline/stored_filters/new.turbo_stream.erb +47 -0
  126. data/app/views/refine/stored_filters/create.turbo_stream.erb +2 -0
  127. data/app/views/refine/stored_filters/find.turbo_stream.erb +5 -0
  128. data/app/views/refine/stored_filters/index.html.erb +39 -0
  129. data/app/views/refine/stored_filters/new.html.erb +29 -0
  130. data/app/views/refine/stored_filters/show.html.erb +1 -0
  131. data/config/locales/en/dates.en.yml +29 -0
  132. data/config/locales/en/en.yml +20 -0
  133. data/config/locales/en/refine.en.yml +187 -0
  134. data/config/routes.rb +17 -0
  135. data/lib/generators/filter/filter_generator.rb +27 -0
  136. data/lib/generators/filter/templates/filter.rb.erb +20 -0
  137. data/lib/refine/rails/engine.rb +15 -0
  138. data/lib/refine/rails/version.rb +5 -0
  139. data/lib/refine/rails.rb +38 -0
  140. data/lib/tasks/refine/rails_tasks.rake +13 -0
  141. metadata +202 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 89f6505a5ab34fd0aac124680ee4c0d478de69a6d9449e57bf1c8aeea717b3fa
4
+ data.tar.gz: cb19bfe97dc8d2bdfd8421f51283247e508191b131646b549ebe0b576e004a2a
5
+ SHA512:
6
+ metadata.gz: d9c85e53a17d8ab5060273d2ea061dc57f89ef7308b7a96d4f3285fa74e5d87ca8d782151761a7358f91707940a95875b9e62eaf1ae4aea5a1c60a8ee94b96ae
7
+ data.tar.gz: 46b44612a9b8ba2aafbe98cc8a316f51da9c81aa5a535b0c9eef9f2089297061317fac4dda5999a0353288cc1c683e968f26616f1e1bc02485242c97e630937b
data/README.md ADDED
@@ -0,0 +1,413 @@
1
+ ## How to integrate the refine filter
2
+
3
+ Refer to the [installation instructions](/docs/installation.md)
4
+
5
+ ## Troubleshooting
6
+
7
+ ### Stimulus package
8
+ Depending on how you import Stimulus Controllers and define `application` it may be `Stimulus.load(refineControllers)`
9
+
10
+ To confirm the Stimulus controllers are loaded, add `window.Stimulus=application` to `controllers/index.js`
11
+ Then in the console inspect the stimulus object:
12
+ ```bash
13
+ Stimulus.router.modulesByIdentifier
14
+ ```
15
+ You should see the `refine--....` controllers listed.
16
+
17
+ ### StyleSheets
18
+ Instead of importing the plain `index.css`, include the raw tailwind file in your app's tailwind-parsed source css files. Tailwind v3 is required for this.
19
+
20
+ ```css
21
+ /* in application.css */
22
+ @import '@hammerstone/refine-stimulus/app/assets/stylesheets/index.tailwind.css';
23
+ ```
24
+
25
+ ### Errors
26
+ You may have to restart your server if you encounter the error:
27
+ ```
28
+ NameError (uninitialized constant ApplicationController::Hammerstone
29
+ web |
30
+ web | include Hammerstone::FilterApplicationController
31
+ ```
32
+
33
+ ## Custom configuration
34
+ ### Define your own apply_filter_method
35
+ If you prefer, you can remove it and define your own `apply_filter`.
36
+
37
+ This is a helper method you can inspect in `Hammerstone::FilterApplicationController`. You probably *do not* want to use this method but want to implement your own. It will return `@refine_filter` which is generated from the stable_id. The `stable_id` comes in from the params when the form is submitted or the URL is directly changed.
38
+
39
+ **SIDE NOTE for Pagy/Jumpstart**
40
+ ```
41
+ apply_filter(ContactsFilter, initial_query: (Contact.sort_by_params(params[:sort], sort_direction))
42
+ @pagy, @contacts = pagy(@refine_filter.get_query)
43
+ ```
44
+
45
+ # TODO: Everything below this header was not covered in the installation guide. Not sure if it is deprecated
46
+
47
+ 12. Add the `reveal` controller to your application if using the `filter_builder_dropdown` partial
48
+
49
+ `yarn add stimulus-reveal`
50
+
51
+ ```javascript
52
+ //index.js
53
+ import RevealController from 'stimulus-reveal'
54
+
55
+ application.register('reveal', RevealController)
56
+ ```
57
+
58
+ ~13. If the gems tailwind styles are being purged with JIT you can add the gem to `tmp/gems` and add this to your tailwing config.~
59
+
60
+ ``` tailwind.config.js
61
+ './tmp/gems/*/app/views/**/*.html.erb',
62
+ './tmp/gems/*/app/helpers/**/*.rb',
63
+ './tmp/gems/*/app/assets/stylesheets/**/*.css',
64
+ './tmp/gems/*/app/javascript/**/*.js',
65
+ ```
66
+
67
+ ~Run the following rake task:~
68
+ ```
69
+ task :add_temp_gems do
70
+ target = `bundle show refine-rails`.chomp
71
+ if target.present?
72
+ puts "Linking refine-rails to '#{target}'."
73
+ `ln -s #{target} tmp/gems/refine-rails`
74
+ end
75
+ end
76
+ ```
77
+
78
+ Don't forget to restart the server!
79
+
80
+ 14. Add external styles - currently themify icons (can be overriden - the trash can icon is located in `_criterion.html.erb`) and `daterangepicker`
81
+ A quick way to load them is in the `head` section. Also available as an npm package.
82
+
83
+ ```
84
+ <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.css" />
85
+ <link rel="stylesheet" href="https://unpkg.com/@icon/themify-icons/themify-icons.css">
86
+ ```
87
+
88
+
89
+ ## How it works
90
+
91
+ The query builder component emits javascript events which give you information about the state of the filter. The filter emits the following events:
92
+ - blueprint-updated
93
+ - filter-unstable
94
+ - filter-stabilized
95
+ - filter-invalid
96
+ - filter-stored
97
+
98
+ #### blueprint-updated
99
+ This event is emitted when user input has resulted in a change to the blueprint. Refine uses this event internally and you can use it in your own code to listen for changes and get the latest state of the form.
100
+
101
+ event.detail includes the following properties:
102
+ - blueprint: a Javascript object detailing the user input to the filter form
103
+
104
+ #### filter-unstable
105
+ This event is emitted when the filter is validating and fetching a new URL-encoded stable ID from the server. This event signals that the current stable_id is out of date. The stable_id should not be used until a filter-stabilized event is emitted.
106
+
107
+ When the round-trip to the server completes a filter-stabilized event is emitted if the filter is valid. If the filter is not valid a filter-invalid event will be emitted.
108
+
109
+ event.detail includes the following properties:
110
+ - blueprint: a Javascript object detailing the user input to the filter form
111
+
112
+ #### filter-stabilized
113
+
114
+ This event is emitted when the filter has been automatically URL encoded and completed the server side calls. At this point it is safe to use the stable_id. The stable_id will look something like `H4sIAPJsT2IAAzWNwQoDIQxE%252F2XOHrpX....` The stable_id allows the user to copy, share, refresh, or otherwise store the URL, but does not save it to the database. This stabilizer is a great way to allow users to not lose all of their progress without having to save every filter to the database. Note: All filters in the CF repo are automatically URL encode stabilized unless you have explicitly set it differently in your filter class.
115
+
116
+ event.detail includes the following properties:
117
+ - stableId: the URL encoded ID that can be used to reconstruct the filter.
118
+ - filterName: the class name of the filter this ID is for defined in your ruby code
119
+
120
+ #### filter-invalid
121
+ This event is emitted when Refine has attempted to refresh the stable_id for the filter but was unable to do so because the user input is not valid.
122
+
123
+ event.detail includes the following properties:
124
+ - blueprint: a Javascript object detailing the user input to the filter form
125
+ - errors: an array of error messages describing why the filter is not valid
126
+
127
+ #### filter-stored: This event is emitted when the filter has been saved to the database (i.e. the user clicked "Save Filter").
128
+ event.detail includes the following properties
129
+ storedFilterId: the primary key of the associated record in the hammerstone_refine_stored_filters_table
130
+
131
+ ## Forcing validations
132
+ To force validations, make a POST request to /refine/blueprints with the following JSON payload:
133
+ - filter: the ruby class name of the filter
134
+ - blueprint: a JSON-stringifed version of the user-input blueprint
135
+ - id_suffix: the string appended to DOM-ids used to uniquely identify this filter
136
+
137
+ The server will respond with a JSON payload that either includes the URL-encoded stable_id (if valid) or a JSON payload or HTML markup that can be used to rerender the form including validation messages
138
+
139
+ Example:
140
+
141
+ ```js
142
+ const response = await fetch('/refine/blueprints', {
143
+ headers: {
144
+ 'Accept': 'application/json',
145
+ 'Content-Type': 'application/json',
146
+ 'X-CSRF-Token': document.querySelector("meta[name='csrf-token']")?.content
147
+ },
148
+ method: "POST",
149
+ body: JSON.stringify({
150
+ filter: 'ContactsFilter',
151
+ blueprint: JSON.stringify(blueprint),
152
+ id_suffix: 'contacts'
153
+ })
154
+ })
155
+ ```
156
+
157
+ #### Fetching a stable_id from the server
158
+ If you need to get a URL-encoded stable_id for a filter without relying on the filter-stabilized event, you can make a PUT request to /hammerstone/update_stable_id with the following JSON payload:
159
+ - filter: the ruby class name of the filter
160
+ - blueprint: JSON stringified version of the current blueprint
161
+
162
+ Example:
163
+
164
+ ```js
165
+ const response = await fetch(this.updateStableIdUrlValue, {
166
+ method: 'PUT',
167
+ headers: {
168
+ accept: 'application/json',
169
+ 'content-type': 'application/json',
170
+ 'X-CSRF-Token': token,
171
+ },
172
+ body: JSON.stringify({
173
+ filter: 'ContactsFilter',
174
+ blueprint: JSON.stringify(blueprint),
175
+ })
176
+ })
177
+ ```
178
+
179
+ If the filter is valid, the server responds 200 OK with the stable_id in the JSON response
180
+ If the filter is not valid, the server responds 422 Unprocessable Entity with an errors array in the JSON response
181
+
182
+ ## Customizing the datepicker
183
+ By default date filters use [flatpickr](https://flatpickr.js.org/getting-started/). End users can specify an alternative datepicker in their application javascript. Here's an example using the daterangepicker that ships with Bullet Train:
184
+
185
+ ```javascript
186
+ import $ from 'jquery' // ensure jquery is loaded before daterangepicker
187
+ import 'daterangepicker'
188
+ import 'daterangepicker/daterangepicker.css'
189
+
190
+ window.HammerstoneRefine ||= {}
191
+ window.HammerstoneRefine.datePicker = {
192
+ connect: function() {
193
+ $(this.fieldTarget).daterangepicker({
194
+ singleDatePicker: true,
195
+ autoUpdateInput: false,
196
+ minDate: this.futureOnlyValue ? new Date() : false,
197
+ locale: {
198
+ cancelLabel: "Cancel",
199
+ applyLabel: "Apply",
200
+ format: 'MM/DD/YYYY',
201
+ },
202
+ parentEl: $(this.element),
203
+ drops: this.dropsValue ? this.dropsValue : 'down',
204
+ })
205
+
206
+ $(this.fieldTarget).on('apply.daterangepicker', (event, picker) => {
207
+ const format =
208
+ $(this.fieldTarget).val(picker.startDate.format('MM/DD/YYYY'))
209
+ $(this.hiddenFieldTarget).val(picker.startDate.format('YYYY-MM-DD'))
210
+ this.hiddenFieldTarget.dispatchEvent(new Event('change', {bubbles: true}))
211
+ })
212
+
213
+ this.plugin = $(this.fieldTarget).data('daterangepicker')
214
+ },
215
+ disconnect: function() {
216
+ if (this.plugin === undefined) {
217
+ return
218
+ }
219
+
220
+ $(this.fieldTarget).off('apply.daterangepicker')
221
+
222
+ // revert to original markup, remove any event listeners
223
+ this.plugin.remove()
224
+ }
225
+ }
226
+ ````
227
+
228
+ ## Customizing Available Stored Filters
229
+
230
+ By default the list of available stored filters is scoped to the type of the current filter. You can add additional scoping by assigning a Proc to `Refine::Rails.configuration.stored_filter_scope` in an initializer.
231
+
232
+ ```ruby
233
+ # config/initializers/refine_rails.rb
234
+
235
+ Refine::Rails.configuration.stored_filter_scope = ->(scope) { scope.where(workspace_id: current_user.workspace.id) }
236
+ ```
237
+
238
+ Custom scoping Proc's should accept a single argument which is the default scope defined by the gem. It will be executed in the context of the Rails controller so methods like `current_user` and `params` are available.
239
+
240
+ ## Tweaking Date Comparison behavior
241
+ You may run into a situation where users can only pick whole days that are being compared to a date column. In this case, the default less than or equal behavior will compare to the current time on the day selected, which may exclude some records the user intended to include. To include the entire selected day in the range, you can set the following in an initializer:
242
+
243
+ ## Show timezones in human_readable output for DateConditions
244
+ To optionally add the filter's set timezone to the output of `human_readable`, use the hook `with_human_readable_timezone(true)` on your `DateCondition` or `DateWithTimeCondition`. This will append `(UTC)` or whatever the timezone is to the output.
245
+
246
+ # config/initializers/refine_rails.rb
247
+ ```ruby
248
+ Refine::Rails.date_lte_uses_eod = true
249
+ ```
250
+
251
+ ## Customizing OptionCondition ordering
252
+ You can customize sorting behavior for all OptionConditon options in an initializer:
253
+ ```ruby
254
+ # config/initializers/refine_rails.rb
255
+
256
+ # always alphabetize option condition lists
257
+ Refine::Rails.configuration.option_condition_ordering = ->(options) { options.sort_by { |o| o[:display] } }
258
+ ```
259
+
260
+ ## Default Condition
261
+ Filters can specify which of their conditions will be selected by default when adding new criteria
262
+ ```ruby
263
+ class UserFilter
264
+ self.default_condition_id = "email"
265
+ # ...
266
+ end
267
+ ```
268
+
269
+ ## Local JavaScript Development
270
+
271
+ There are a couple different methods developers have used. One is based on `yarn link` and the other based on `yalc`
272
+
273
+ ### Yarn link method
274
+
275
+ 1. In the gem's folder run:
276
+
277
+ ```sh
278
+ yarn link
279
+ yarn build --watch # leave this running to automatically rebuild when you change a file
280
+ ```
281
+
282
+ 2. From your application's folder run:
283
+
284
+ ```sh
285
+ yarn link "@hammerstone/refine-stimulus"
286
+ ```
287
+
288
+ 3. Restart your asset build server (webpacker/esbuild/etc)
289
+
290
+ When you're ready to switch back to the published npm package, run:
291
+ ```sh
292
+ yarn unlink "@hammerstone/refine-stimulus"
293
+ ```
294
+
295
+ #### Troubleshooting yarn link
296
+ Note that theoretically, any changes you make to the javascript and css assets should be automatically recompiled by `yarn build --watch` and then picked up by your application. In practice automatic recompilation can be unreliable. Here are some things to try if the app isn't picking up your changes:
297
+
298
+ 1. Confirm that the app is indeed not using your latest changes by adding a `console.log` to the connect method of a stimulus controller
299
+ 2. Try restarting `yarn build --watch` from the gem directory
300
+ 3. Restart your webpacker/esbuild/etc server
301
+ 4. Restart your web server
302
+ 5. Run `bin/rails assets:clean` from your app's directory and restart servers
303
+
304
+ If none of the above steps work, try tearing down the package link and setting it up again:
305
+ 1. Run `yarn link "@hammerstone-stimulus"` from your app's directory and shut down all servers.
306
+ 2. Run `yarn unlink` from the gem directory.
307
+ 3. Redo the steps listed in this section for setting up the linked package
308
+ 4. Start up your web and asset servers
309
+
310
+ ### Yalc method:
311
+
312
+ From this repo's directory:
313
+ We are using `yalc` for local package development.
314
+
315
+ ```bash
316
+ # Add yalc if you don't have it
317
+ # From this repo (refine-rails)
318
+ yarn global add yalc
319
+
320
+ # install dependencies
321
+ $ yarn
322
+
323
+ $ yalc publish
324
+
325
+ ```
326
+
327
+ From the directory of the project including this package:
328
+
329
+ ```bash
330
+
331
+ yalc link @hammerstone/refine-stimulus
332
+ ```
333
+
334
+ When you make local updates to the package:
335
+
336
+ ```bash
337
+ # From this repo (refine-rails)
338
+ yarn build
339
+ yalc push
340
+ ```
341
+
342
+ Running `yarn` again from your project's directory will revert back to the published version of the package on npm.
343
+
344
+ #### Notes if linking with `yarn link` isn't working:
345
+ 1. Ran `bin/webpack-dev-server`
346
+ 2. In `berry-refine-demo-clean` delete node modules and re-yarn (just for fun probably not necessary)
347
+ 3. in `refine-rails` repo follow all yalc steps below -> you should see this message if successful
348
+
349
+ ```
350
+ @hammerstone/refine-stimulus@2.4.2 published in store.
351
+ Pushing @hammerstone/refine-stimulus@2.4.2 in /Users/colleenschnettler/Documents/Documents/Developer/Hammerstone/berry-refine-demo-clean
352
+ Package @hammerstone/refine-stimulus@2.4.2 linked ==> /Users/colleenschnettler/Documents/Documents/Developer/Hammerstone/berry-refine-demo-clean/node_modules/@hammerstone/refine-stimulus
353
+ ```
354
+ 4. Restart server
355
+
356
+ ## Bullet Train Installation
357
+ Add ruby gem
358
+ ```
359
+ source "https://yourAPIKey@gem.fury.io/hammerstonedev" do
360
+ gem "refine-rails"
361
+ end
362
+ ```
363
+
364
+ Installing the JavaScript package:
365
+
366
+ ```bash
367
+ $ yarn add @hammerstone/refine-stimulus
368
+ ```
369
+
370
+ In `app/javascript/controllers/index.js` add
371
+
372
+ ```js
373
+ import { controllerDefinitions as refineControllers } from "@hammerstone/refine-stimulus"
374
+ application.load(refineControllers)
375
+ ```
376
+
377
+ ## Readme Installation Goals (what we're working towards - does not work yet)
378
+
379
+ 1. Run the generator
380
+ `rails generate refine:install`
381
+
382
+ 2. Define your filters, subclassing from `Hammerstone::Refine::Filter`
383
+
384
+ 3. Call `apply_filter` in your controller (or even better, instantiate the filter in your controller `@contacts = ContactFilter.new(blueprint, initial_query` -> might not be possible, how can we do this with validations?)
385
+
386
+ 4. If you want to customize the views you can override our stylesheet with you own.
387
+ If you need even more customization you can override the views with `rails generate refine:views` will extract the views
388
+
389
+ 5. Add custom datepicker if desired and scope stored filters.
390
+
391
+ ## Releasing New Versions
392
+
393
+ - Every release should update the gem and NPM package so version numbers stay in sync.
394
+ - Make sure to update the CHANGELOG with a note explaining what the new version does
395
+ - Make sure you have the [bump](https://rubygems.org/gems/bump) and [gemfury](https://rubygems.org/gems/gemfury) gems installed locally
396
+
397
+ ### Releasing the Ruby Gem
398
+
399
+ ```sh
400
+ bump patch #(or bump minor, major, etc)
401
+ gem build
402
+ fury push *.gem --as=hammerstonedev
403
+ rm *.gem
404
+ ```
405
+
406
+ ### Releasing the NPM Package
407
+
408
+ 1. Publish the gem with a new version number
409
+ 2. Copy the version number in package.json
410
+ 3. run `yarn build`. This will prepare the different javascript outputs
411
+ 4. run `yarn pack`. This will create a new`.tgz`file for the new version
412
+ 5. run `yarn publish <tgz filename> --new-version <version number in package.json>`
413
+ 6. remove the`*.tgz`file
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require "bundler/setup"
2
+
3
+ APP_RAKEFILE = File.expand_path("test/dummy/Rakefile", __dir__)
4
+ load "rails/tasks/engine.rake"
5
+
6
+ load "rails/tasks/statistics.rake"
7
+
8
+ require "bundler/gem_tasks"
File without changes
@@ -0,0 +1,2 @@
1
+ import{Controller as e}from"@hotwired/stimulus";import{FetchRequest as t}from"@rails/request.js";import{useClickOutside as r}from"stimulus-use";import{delegate as i,abnegate as n}from"jquery-events-to-dom-events";import{isEqual as s,debounce as o}from"lodash";import l from"moment";import a from"jquery";import"daterangepicker";function d(e){const t=(e.match(/^(?:\.\/)?(.+)(?:[_-]controller\..+?)$/)||[])[1];if(t)return t.replace(/_/g,"-").replace(/\//g,"--")}class u extends e{connect(){this.state.finishUpdate()}get state(){let e=this.element;for(;e!==document.body;){if(e.matches('[data-controller~="refine--state"]'))return this.application.getControllerForElementAndIdentifier(e,"refine--state");e=e.parentNode}return null}refreshFromServer(e){void 0===e&&(e={});try{const r=this,{includeErrors:i}=e;r.state.startUpdate();const n=new t("GET",r.state.refreshUrlValue,{responseKind:"turbo-stream",query:{"refine_filters_builder[filter_class]":r.state.filterName,"refine_filters_builder[blueprint_json]":JSON.stringify(r.state.blueprint),"refine_filters_builder[client_id]":r.state.clientIdValue,include_errors:!!i}});return Promise.resolve(n.perform()).then(function(){})}catch(e){return Promise.reject(e)}}}class c extends u{criterion(){try{const e=this;return Promise.resolve(e.validateBlueprint()).then(function(t){t&&e.state.addCriterion(e.previousCriterionIdValue),e.refreshFromServer({includeErrors:!t})})}catch(e){return Promise.reject(e)}}group(){try{const e=this;return Promise.resolve(e.validateBlueprint()).then(function(t){t&&e.state.addGroup(),e.refreshFromServer({includeErrors:!t})})}catch(e){return Promise.reject(e)}}validateBlueprint(e){try{const e=this,r=new t("GET",e.state.validateBlueprintUrlValue,{query:{"refine_filters_builder[filter_class]":e.state.filterName,"refine_filters_builder[blueprint_json]":JSON.stringify(e.state.blueprint),"refine_filters_builder[client_id]":e.state.clientIdValue}});return Promise.resolve(r.perform()).then(function(e){return e.ok})}catch(e){return Promise.reject(e)}}}c.values={previousCriterionId:Number};class h extends e{filterConditions(e){const t=e.currentTarget.value.toLowerCase(),r=new Set;this.conditionTargets.forEach(e=>{e.innerHTML.toLowerCase().includes(t)?(e.hidden=!1,r.add(e.dataset.category)):e.hidden=!0}),this.categoryTargets.forEach(e=>{e.hidden=!r.has(e.innerHTML)})}}h.targets=["condition","category"];class p extends e{refresh(e){const t=new FormData(this.element),r=new URL(this.urlValue);for(const[e,i]of t.entries())console.log(e,i),r.searchParams.set(e,i);window.Turbo.visit(r.toString(),{frame:this.turboFrameValue})}}p.values={url:String,turboFrame:String,method:{type:String,default:"POST"}};class m extends e{connect(){this.state=this.getStateController(),this.state.updateInput(this.criterionIdValue,this.inputValue)}getStateController(){let e=this.element;for(;e!==document.body;){const t=this.application.getControllerForElementAndIdentifier(e,"refine--state");if(t)return t;e=e.parentNode}return null}}m.values={criterionId:Number,input:Object};class f extends u{criterion(){const{state:e,criterionIdValue:t}=this;e.deleteCriterion(t),this.refreshFromServer()}}f.values={criterionId:Number};class g extends e{connect(){const e=new URLSearchParams(window.location.search);this.existingParams=e,this.existingParams.delete("stable_id")}delete(e){const{criterionId:t}=e.currentTarget.dataset;var r=parseInt(t);this.stateController.deleteCriterion(r),this.reloadPage()}reloadPage(){try{const e=this,{blueprint:r}=e.stateController,i=new t("POST",e.submitUrlValue,{responseKind:"turbo-stream",body:JSON.stringify({refine_filters_builder:{filter_class:e.stateController.filterName,blueprint_json:JSON.stringify(r),client_id:e.stateController.clientIdValue}})});return Promise.resolve(i.perform()).then(function(){})}catch(e){return Promise.reject(e)}}redirectToStableId(e){const t=new URLSearchParams;e&&t.append("stable_id",e);const r=new URLSearchParams({...Object.fromEntries(this.existingParams),...Object.fromEntries(t)}).toString(),i=window.location.pathname+"?"+r;history.pushState({},document.title,i),window.location.reload()}get stateController(){return this.element.refineStateController}get stabilizeFilterController(){return this.element.stabilizeFilterController}}g.values={submitUrl:String};class b extends e{connect(){r(this),this.boundHandleKeyUp=this.handleKeyUp.bind(this),document.addEventListener("keyup",this.boundHandleKeyUp)}disconnect(){document.removeEventListener("keyup",this.boundHandleKeyUp)}show(e){e.preventDefault(),this.frameTarget.src=this.srcValue,this.isOpenValue=!0}hide(e){this.isOpenValue&&(null==e||e.preventDefault(),this.frameTarget.innerHTML="",this.isOpenValue=!1)}clickOutside(e){this.hide(e)}handleKeyUp(e){"Escape"!==e.key&&"Esc"!==e.key||this.hide(e)}}b.targets=["frame"],b.values={src:String,isOpen:{type:Boolean,default:!1}};class v extends e{search(e){e.preventDefault(),this.submitFilter(),document.activeElement.blur()}submitFilter(){try{const e=this,{blueprint:r}=e.stateController,i=new t("POST",e.submitUrlValue,{responseKind:"turbo-stream",body:JSON.stringify({refine_filters_builder:{filter_class:e.stateController.filterName,blueprint_json:JSON.stringify(r),client_id:e.stateController.clientIdValue}})});return Promise.resolve(i.perform()).then(function(){})}catch(e){return Promise.reject(e)}}get stateController(){return this.element.querySelector('[data-controller~="refine--state"]').refineStateController}loadResults(e){let{detail:{url:t}}=e;console.log("filter submit success"),window.Turbo?window.Turbo.visit(t):window.location.href=t}}v.values={submitUrl:String},function(){if("function"==typeof window.CustomEvent)return!1;function e(e,t){t=t||{bubbles:!1,cancelable:!1,detail:void 0};var r=document.createEvent("CustomEvent");return r.initCustomEvent(e,t.bubbles,t.cancelable,t.detail),r}e.prototype=window.Event.prototype,window.CustomEvent=e}();const w=(e,t)=>{let{blueprint:r,formId:i}=t;const n=new CustomEvent("blueprint-updated",{bubbles:!0,cancelable:!0,detail:{blueprint:r,formId:i}});e.dispatchEvent(n)},y=(e,t,r)=>{var i;const n=null==r?void 0:r.component,s=(null==r?void 0:r.meta)||{clauses:[],options:{}},o=(null==r?void 0:r.refinements)||[],{clauses:l,options:a}=s;let d;d="option-condition"===n?a[0]?[a[0].id]:[]:void 0;let u={clause:null==(i=l[0])?void 0:i.id,selected:d};return o.forEach(e=>{const{meta:t,component:r}=e,{clauses:i,options:n}=t;let s;s="option-condition"===r?n[0]?[n[0].id]:[]:void 0,u[e.id]={clause:i[0].id,selected:s}}),{depth:t,type:"criterion",condition_id:e,input:u}};class C extends e{connect(){this.element.refineStateController=this,this.changeDelegate=i("change",["event","picker"]),this.blueprint=this.blueprintValue,this.conditions=this.conditionsValue,this.filterName=this.classNameValue,this.conditionsLookup=this.conditions.reduce((e,t)=>(e[t.id]=t,e),{}),this.loadingTimeout=null,w(this.element,{blueprint:this.blueprint,formId:this.formIdValue})}disconnect(){n("change",this.changeDelegate)}startUpdate(){this.loadingTimeout&&window.clearTimeout(this.loadingTimeout),this.loadingTimeout=window.setTimeout(()=>{this.loadingTarget.classList.remove("hidden")},1e3)}finishUpdate(){this.loadingTimeout&&window.clearTimeout(this.loadingTimeout),this.loadingTarget.classList.add("hidden")}conditionConfigFor(e){return this.conditionsLookup[e]}addGroup(){const{conditions:e}=this,t=e.find(e=>e.id==this.defaultConditionIdValue)||e[0];var r;this.blueprint.length>0&&this.blueprint.push({depth:r=void 0===r?0:r,type:"conjunction",word:"or"}),this.blueprint.push(y(t.id,1,t)),w(this.element,{blueprint:this.blueprint,formId:this.formIdValue})}addCriterion(e){const{blueprint:t,conditions:r}=this,i=r.find(e=>e.id==this.defaultConditionIdValue)||r[0];var n;t.splice(e+1,0,{depth:n=void 0===n?1:n,type:"conjunction",word:"and"},y(i.id,1,i)),w(this.element,{blueprint:this.blueprint,formId:this.formIdValue})}deleteCriterion(e){const{blueprint:t}=this,r=t[e-1],i=t[e+1],n=r&&"or"===r.word,s=i&&"or"===i.word||!i,o=n||!r,l=o&&s;r||i?t.splice(l&&n?e-1:l&&!r||o&&!s?e:e-1,2):this.blueprint=[],w(this.element,{blueprint:this.blueprint,formId:this.formIdValue})}replaceCriterion(e,t,r){const i=this.blueprint[e];if("criterion"!==i.type)throw new Error("You can't call updateConditionId on a non-criterion type. Trying to update "+JSON.stringify(y));const n=this.blueprint[e],o=y(t,i.depth,r);return!s(n,o)&&(this.blueprint[e]=o,w(this.element,{blueprint:this.blueprint,formId:this.formIdValue}),!0)}updateInput(e,t,r){const{blueprint:i}=this,n=i[e],s=(r=r||"input").split(", ");s.length>1?n[s[0]][s[1]]={...n[s[0]][s[1]],...t}:n[r]={...n[r],...t},w(this.element,{blueprint:this.blueprint,formId:this.formIdValue})}}C.values={blueprint:Array,conditions:Array,className:String,refreshUrl:String,clientId:String,validateBlueprintUrl:String,defaultConditionId:String},C.targets=["loading"];class I extends e{connect(){const e=document.getElementById(this.stateDomIdValue).refineStateController;this.blueprintFieldTarget.value=JSON.stringify(e.blueprint),console.log("connect",this.blueprintFieldTarget.value)}updateBlueprintField(e){if(e.detail.formId!=this.formIdValue)return null;const{detail:t}=e,{blueprint:r}=t;this.blueprintFieldTarget.value=JSON.stringify(r),console.log("update blueprint",this.blueprintFieldTarget.value)}}I.targets=["blueprintField"],I.values={formId:String,stateDomId:String};class S extends e{submit(e){e.preventDefault(),this.element.submit()}}class T extends e{toggle(e){this.contentTargets.forEach(e=>{e.toggleAttribute("hidden")})}}T.targets=["content"];class V extends e{submit(e){try{const r=this;e.preventDefault();const i=new t(r.element.method||"POST",r.element.action,{responseKind:"turbo-stream",body:new FormData(r.element)});return Promise.resolve(i.perform()).then(function(){})}catch(e){return Promise.reject(e)}}}class F extends e{visit(e){try{const r=this;e.preventDefault();const i=new t(r.element.dataset.turboMethod||"GET",r.element.href,{responseKind:"turbo-stream"});return Promise.resolve(i.perform()).then(function(){})}catch(e){return Promise.reject(e)}}}class P extends u{initialize(){this.updateBlueprint=o((e,t,r)=>{this.value(e,t,r)},500)}refinedFilter(e){const{criterionIdValue:t,state:r}=this;r.updateInput(t,{id:e.target.value},e.target.dataset.inputId),this.refreshFromServer()}clause(e){const{criterionIdValue:t,state:r}=this;r.updateInput(t,{clause:e.target.value},e.target.dataset.inputId),this.refreshFromServer()}selected(e){const{target:t}=e,r=Array.prototype.slice.call(t.options).filter(e=>e.selected).map(e=>e.value);this.value(e,r,"selected")}value(e,t,r){const{criterionIdValue:i,state:n}=this,s=e.target.dataset;n.updateInput(i,{[r=r||s.inputKey||"value"]:t=t||e.target.value},s.inputId)}condition(e){const{criterionIdValue:t,state:r}=this,i=e.target;let n=i.value;n||(n=i.querySelector("select").value);const s=this.state.conditionConfigFor(n);r.replaceCriterion(t,n,s)&&this.refreshFromServer()}cancelEnter(e){"Enter"===e.code&&(e.preventDefault(),e.stopPropagation())}}P.values={criterionId:Number},require("daterangepicker/daterangepicker.css");class E extends e{connect(){this.initPluginInstance()}disconnect(){this.teardownPluginInstance()}clearDate(e){e.preventDefault(),window.$(this.fieldTarget).val(""),this.dispatch("value-cleared")}applyDateToField(e,t){const r=this.includeTimeValue?this.timeFormatValue:this.dateFormatValue,i=t?l(t.startDate.toISOString()):l(this.fieldTarget.value,"YYYY-MM-DDTHH:mm").format("YYYY-MM-DDTHH:mm"),n=i.format(r),s=this.includeTimeValue?i.toISOString(!0):i.format("YYYY-MM-DD");this.fieldTarget.value=n,this.hiddenFieldTarget.value=s,window.$(this.fieldTarget).trigger("change",t),this.hiddenFieldTarget.dispatchEvent(new Event("change",{detail:t,bubbles:!0}))}initPluginInstance(){const e=this.pickerLocaleValue,t=this.isAmPmValue;e.format=this.includeTimeValue?this.timeFormatValue:this.dateFormatValue,window.$(this.fieldTarget).daterangepicker({singleDatePicker:!0,timePicker:this.includeTimeValue,timePickerIncrement:5,autoUpdateInput:!1,autoApply:!0,minDate:!!this.futureOnlyValue&&new Date,locale:e,parentEl:a(this.element),drops:this.dropsValue?this.dropsValue:"down",timePicker24Hour:!t}),window.$(this.fieldTarget).on("apply.daterangepicker",this.applyDateToField.bind(this)),window.$(this.fieldTarget).on("cancel.daterangepicker",this.clearDate.bind(this)),window.$(this.fieldTarget).on("showCalendar.daterangepicker",this.showCalendar.bind(this)),this.pluginMainEl=this.fieldTarget,this.plugin=a(this.pluginMainEl).data("daterangepicker"),this.inlineValue&&this.element.classList.add("date-input--inline")}teardownPluginInstance(){void 0!==this.plugin&&(a(this.pluginMainEl).off("apply.daterangepicker"),a(this.pluginMainEl).off("cancel.daterangepicker"),a(this.pluginMainEl).off("showCalendar.daterangepicker"),this.plugin.remove())}showCalendar(){this.dispatch("show-calendar")}}E.targets=["field","hiddenField","clearButton"],E.values={includeTime:Boolean,futureOnly:Boolean,drops:String,inline:Boolean,dateFormat:String,timeFormat:String,isAmPm:Boolean,locale:{type:String,default:"en"},datetimeFormat:{type:String,default:"MM/DD/YYYY h:mm A"},pickerLocale:{type:Object,default:{}}};const j=[[c,"refine/add-controller.js"],[h,"./refine/inline-conditions-controller.js"],[p,"refine/criterion-form-controller.js"],[m,"refine/defaults-controller.js"],[f,"refine/delete-controller.js"],[g,"refine/filter-pills-controller.js"],[b,"refine/popup-controller.js"],[v,"refine/search-filter-controller.js"],[u,"refine/server-refresh-controller.js"],[C,"refine/state-controller.js"],[I,"refine/stored-filter-controller.js"],[S,"refine/submit-form-controller.js"],[T,"refine/toggle-controller.js"],[V,"refine/turbo-stream-form-controller.js"],[F,"refine/turbo-stream-link-controller.js"],[P,"refine/update-controller.js"],[E,"refine/date-controller.js"]].map(function(e){const t=e[0];return{identifier:d(e[1]),controllerConstructor:t}});export{c as AddController,p as CriterionFormController,E as DateController,m as DefaultsController,f as DeleteController,g as FilterPillsController,h as InlineConditionsController,b as PopupController,v as SearchFilterController,u as ServerRefreshController,C as StateController,I as StoredFilterController,S as SubmitForm,T as ToggleController,V as TurboStreamFormController,F as TurboStreamLinkController,P as UpdateController,j as controllerDefinitions};
2
+ //# sourceMappingURL=refine-stimulus.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refine-stimulus.esm.js","sources":["../../../node_modules/@hotwired/stimulus-webpack-helpers/dist/stimulus-webpack-helpers.js","../../javascript/controllers/refine/server-refresh-controller.js","../../javascript/controllers/refine/add-controller.js","../../javascript/controllers/refine/inline-conditions-controller.js","../../javascript/controllers/refine/criterion-form-controller.js","../../javascript/controllers/refine/defaults-controller.js","../../javascript/controllers/refine/delete-controller.js","../../javascript/controllers/refine/filter-pills-controller.js","../../javascript/controllers/refine/popup-controller.js","../../javascript/controllers/refine/search-filter-controller.js","../../javascript/refine/helpers/index.js","../../javascript/controllers/refine/state-controller.js","../../javascript/controllers/refine/stored-filter-controller.js","../../javascript/controllers/refine/submit-form-controller.js","../../javascript/controllers/refine/toggle-controller.js","../../javascript/controllers/refine/turbo-stream-form-controller.js","../../javascript/controllers/refine/turbo-stream-link-controller.js","../../javascript/controllers/refine/update-controller.js","../../javascript/controllers/refine/date-controller.js","../../javascript/controllers/index.js"],"sourcesContent":["/*\nStimulus Webpack Helpers 1.0.0\nCopyright © 2021 Basecamp, LLC\n */\nfunction definitionsFromContext(context) {\n return context.keys()\n .map((key) => definitionForModuleWithContextAndKey(context, key))\n .filter((value) => value);\n}\nfunction definitionForModuleWithContextAndKey(context, key) {\n const identifier = identifierForContextKey(key);\n if (identifier) {\n return definitionForModuleAndIdentifier(context(key), identifier);\n }\n}\nfunction definitionForModuleAndIdentifier(module, identifier) {\n const controllerConstructor = module.default;\n if (typeof controllerConstructor == \"function\") {\n return { identifier, controllerConstructor };\n }\n}\nfunction identifierForContextKey(key) {\n const logicalName = (key.match(/^(?:\\.\\/)?(.+)(?:[_-]controller\\..+?)$/) || [])[1];\n if (logicalName) {\n return logicalName.replace(/_/g, \"-\").replace(/\\//g, \"--\");\n }\n}\n\nexport { definitionForModuleAndIdentifier, definitionForModuleWithContextAndKey, definitionsFromContext, identifierForContextKey };\n","import { Controller } from \"@hotwired/stimulus\"\nimport { FetchRequest } from '@rails/request.js'\n\n\n// Base class for controllers that reload form content from the server\nexport default class extends Controller {\n connect() {\n this.state.finishUpdate()\n }\n\n get state() {\n let currentElement = this.element\n\n while(currentElement !== document.body) {\n if (currentElement.matches('[data-controller~=\"refine--state\"]'))\n return this.application.getControllerForElementAndIdentifier(currentElement, 'refine--state')\n else {\n currentElement = currentElement.parentNode\n }\n }\n\n return null\n }\n\n async refreshFromServer(options = {}) {\n const { includeErrors } = options\n this.state.startUpdate()\n const request = new FetchRequest(\n \"GET\",\n this.state.refreshUrlValue,\n {\n responseKind: \"turbo-stream\",\n query: {\n \"refine_filters_builder[filter_class]\": this.state.filterName,\n \"refine_filters_builder[blueprint_json]\": JSON.stringify(this.state.blueprint),\n \"refine_filters_builder[client_id]\": this.state.clientIdValue,\n include_errors: !!includeErrors\n }\n }\n )\n await request.perform()\n }\n}\n","import ServerRefreshController from './server-refresh-controller'\nimport { FetchRequest } from '@rails/request.js'\n\nexport default class extends ServerRefreshController {\n static values = {\n previousCriterionId: Number,\n }\n\n async criterion() {\n const isValid = await this.validateBlueprint()\n if (isValid) {\n this.state.addCriterion(this.previousCriterionIdValue)\n }\n this.refreshFromServer({includeErrors: !isValid})\n }\n\n async group() {\n const isValid = await this.validateBlueprint()\n if (isValid) {\n this.state.addGroup()\n }\n this.refreshFromServer({includeErrors: !isValid})\n }\n\n async validateBlueprint(blueprint) {\n const { state } = this\n\n const request = new FetchRequest(\n \"GET\",\n this.state.validateBlueprintUrlValue,\n {\n query: {\n \"refine_filters_builder[filter_class]\": this.state.filterName,\n \"refine_filters_builder[blueprint_json]\": JSON.stringify(this.state.blueprint),\n \"refine_filters_builder[client_id]\": this.state.clientIdValue\n }\n }\n )\n const response = await request.perform()\n return response.ok\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n\n static targets = ['condition', 'category']\n\n filterConditions(event) {\n const query = event.currentTarget.value.toLowerCase()\n const visibleCategories = new Set()\n\n // hide / show condition links that match the query and note which\n // categories should be visible\n this.conditionTargets.forEach(conditionNode => {\n const conditionName = conditionNode.innerHTML.toLowerCase()\n if (conditionName.includes(query)) {\n conditionNode.hidden = false\n visibleCategories.add(conditionNode.dataset.category)\n } else {\n conditionNode.hidden = true\n }\n })\n\n // hide / show category headers that have\n this.categoryTargets.forEach(categoryNode => {\n const categoryName = categoryNode.innerHTML\n if (visibleCategories.has(categoryName)) {\n categoryNode.hidden = false\n } else {\n categoryNode.hidden = true\n }\n })\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport { FetchRequest } from '@rails/request.js'\n\n/*\n This controller handles criteria forms\n (refine/inline/criteria/new|edit)\n*/\nexport default class extends Controller {\n static values = {\n url: String,\n turboFrame: String,\n method: { type: String, default: \"POST\" }\n }\n\n refresh(_event) {\n // update the url with params from the form\n const formData = new FormData(this.element)\n const url = new URL(this.urlValue)\n\n for (const [name, value] of formData.entries()) {\n console.log(name, value)\n url.searchParams.set(name, value)\n }\n\n // navigate the modal to refresh the form\n window.Turbo.visit(url.toString(), {frame: this.turboFrameValue})\n }\n\n\n\n}\n","import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n static values = {\n criterionId: Number,\n input: Object,\n };\n\n connect() {\n this.state = this.getStateController()\n\n this.state.updateInput(\n this.criterionIdValue,\n this.inputValue,\n );\n }\n\n getStateController() {\n let currentElement = this.element\n\n while(currentElement !== document.body) {\n const controller = this.application.getControllerForElementAndIdentifier(currentElement, 'refine--state')\n if (controller) {\n return controller\n } else {\n currentElement = currentElement.parentNode\n }\n }\n\n return null\n }\n}\n","import ServerRefreshController from './server-refresh-controller';\n\nexport default class extends ServerRefreshController {\n static values = {\n criterionId: Number,\n }\n\n criterion() {\n const { state, criterionIdValue } = this;\n state.deleteCriterion(criterionIdValue);\n this.refreshFromServer()\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport { FetchRequest } from '@rails/request.js'\n\nexport default class extends Controller {\n static values = {\n submitUrl: String\n }\n\n connect() {\n const urlParams = new URLSearchParams(window.location.search)\n this.existingParams = urlParams\n this.existingParams.delete('stable_id')\n }\n\n delete(event) {\n const { criterionId } = event.currentTarget.dataset\n var index = parseInt(criterionId)\n this.stateController.deleteCriterion(index)\n this.reloadPage()\n }\n\n async reloadPage() {\n const {blueprint} = this.stateController\n const request = new FetchRequest(\n \"POST\",\n this.submitUrlValue,\n {\n responseKind: \"turbo-stream\",\n body: JSON.stringify({\n refine_filters_builder: {\n filter_class: this.stateController.filterName,\n blueprint_json: JSON.stringify(blueprint),\n client_id: this.stateController.clientIdValue\n }\n })\n }\n )\n await request.perform()\n }\n\n redirectToStableId(stableId) {\n const params = new URLSearchParams()\n if (stableId) {\n params.append('stable_id', stableId)\n }\n const allParams = new URLSearchParams({\n ...Object.fromEntries(this.existingParams),\n ...Object.fromEntries(params),\n }).toString()\n const url = `${window.location.pathname}?${allParams}`\n\n history.pushState({}, document.title, url)\n window.location.reload()\n }\n\n get stateController() {\n return this.element.refineStateController\n }\n\n get stabilizeFilterController() {\n return this.element.stabilizeFilterController\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport { useClickOutside } from 'stimulus-use'\n\n// simple controller to hide/show the filter modal\nexport default class extends Controller {\n static targets = [\"frame\"]\n\n static values = {\n src: String,\n isOpen: {type: Boolean, default: false}\n }\n\n connect() {\n useClickOutside(this)\n this.boundHandleKeyUp = this.handleKeyUp.bind(this)\n document.addEventListener(\"keyup\", this.boundHandleKeyUp)\n }\n\n disconnect() {\n document.removeEventListener(\"keyup\", this.boundHandleKeyUp)\n }\n\n show(event) {\n event.preventDefault()\n this.frameTarget.src = this.srcValue;\n this.isOpenValue = true\n }\n\n hide(event) {\n if (this.isOpenValue) {\n event?.preventDefault()\n this.frameTarget.innerHTML = \"\";\n this.isOpenValue = false\n }\n }\n\n clickOutside(event) {\n this.hide(event)\n }\n\n handleKeyUp(event) {\n if (event.key === \"Escape\" || event.key === \"Esc\") {\n this.hide(event)\n }\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport { FetchRequest } from '@rails/request.js'\n\nexport default class extends Controller {\n static values = {\n submitUrl: String\n }\n\n\n search(event) {\n event.preventDefault()\n this.submitFilter()\n document.activeElement.blur()\n }\n\n async submitFilter() {\n const {blueprint} = this.stateController\n const request = new FetchRequest(\n \"POST\",\n this.submitUrlValue,\n {\n responseKind: \"turbo-stream\",\n body: JSON.stringify({\n refine_filters_builder: {\n filter_class: this.stateController.filterName,\n blueprint_json: JSON.stringify(blueprint),\n client_id: this.stateController.clientIdValue\n }\n })\n }\n )\n await request.perform()\n }\n\n get stateController() {\n return this\n .element\n .querySelector('[data-controller~=\"refine--state\"]')\n .refineStateController\n }\n\n loadResults({detail: {url}}) {\n console.log(\"filter submit success\")\n if (window.Turbo) {\n window.Turbo.visit(url)\n } else {\n window.location.href = url\n }\n }\n}\n","// Polyfill for custom events in IE9-11\n// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent#polyfill\n;(function () {\n if (typeof window.CustomEvent === 'function') return false\n\n function CustomEvent(event, params) {\n params = params || { bubbles: false, cancelable: false, detail: undefined }\n var evt = document.createEvent('CustomEvent')\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail)\n return evt\n }\n\n CustomEvent.prototype = window.Event.prototype\n\n window.CustomEvent = CustomEvent\n\n // eslint expects a return here\n return true\n})()\n\nexport const filterStabilizedEvent = (element, stableId, filterName) => {\n const event = new CustomEvent('filter-stabilized', {\n bubbles: true,\n cancelable: true,\n detail: {\n stableId,\n filterName,\n },\n })\n element.dispatchEvent(event)\n}\n\nexport const filterUnstableEvent = (blueprint) => {\n const event = new CustomEvent('filter-unstable', {\n bubbles: true,\n cancelable: true,\n detail: {\n blueprint,\n },\n })\n window.dispatchEvent(event)\n}\n\nexport const filterInvalidEvent = ({blueprint, errors}) => {\n const event = new CustomEvent('filter-invalid', {\n bubbles: true,\n cancelable: true,\n detail: {\n blueprint,\n errors,\n },\n })\n window.dispatchEvent(event)\n}\n\nexport const filterStoredEvent = (storedFilterId) => {\n const event = new CustomEvent('filter-stored', {\n bubbles: true,\n cancelable: true,\n detail: {\n storedFilterId,\n },\n })\n window.dispatchEvent(event)\n}\n\nexport const blueprintUpdatedEvent = (element, {blueprint, formId}) => {\n const event = new CustomEvent('blueprint-updated', {\n bubbles: true,\n cancelable: true,\n detail: {\n blueprint,\n formId\n },\n })\n element.dispatchEvent(event)\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport { delegate, abnegate } from 'jquery-events-to-dom-events'\nimport { blueprintUpdatedEvent } from '../../refine/helpers'\nimport { isEqual } from 'lodash'\n\nconst criterion = (id, depth, condition) => {\n const component = condition?.component\n const meta = condition?.meta || { clauses: [], options: {}}\n const refinements = condition?.refinements || []\n const { clauses, options } = meta\n let selected\n if (component === 'option-condition') {\n selected = options[0] ? [options[0].id] : []\n } else {\n selected = undefined\n }\n // Set newInput based on component\n\n let newInput = {\n clause: clauses[0]?.id,\n selected: selected,\n }\n\n // If refinements are present, add to input array\n refinements.forEach((refinement) => {\n const { meta, component } = refinement\n const { clauses, options } = meta\n let selected\n if (component === 'option-condition') {\n selected = options[0] ? [options[0].id] : []\n } else {\n selected = undefined\n }\n newInput[refinement.id] = {\n clause: clauses[0].id,\n selected: selected,\n }\n })\n\n return {\n depth,\n type: 'criterion',\n condition_id: id,\n input: newInput,\n }\n}\n\nconst or = function (depth) {\n depth = depth === undefined ? 0 : depth\n return {\n depth,\n type: 'conjunction',\n word: 'or',\n }\n}\n\nconst and = function (depth) {\n depth = depth === undefined ? 1 : depth\n return {\n depth,\n type: 'conjunction',\n word: 'and',\n }\n}\nexport default class extends Controller {\n static values = {\n blueprint: Array,\n conditions: Array,\n className: String,\n refreshUrl: String,\n clientId: String,\n validateBlueprintUrl: String,\n defaultConditionId: String\n }\n static targets = ['loading']\n\n\n connect() {\n // for select2 jquery events and datepicker\n this.element.refineStateController = this\n this.changeDelegate = delegate('change', ['event', 'picker'])\n this.blueprint = this.blueprintValue\n this.conditions = this.conditionsValue\n this.filterName = this.classNameValue\n this.conditionsLookup = this.conditions.reduce((lookup, condition) => {\n lookup[condition.id] = condition\n return lookup\n }, {})\n this.loadingTimeout = null\n blueprintUpdatedEvent(this.element, {blueprint: this.blueprint, formId: this.formIdValue})\n }\n\n disconnect() {\n abnegate('change', this.changeDelegate)\n }\n\n startUpdate() {\n if (this.loadingTimeout) {\n window.clearTimeout(this.loadingTimeout)\n }\n // only show the loading overlay if it's taking a long time\n // to render the updates\n this.loadingTimeout = window.setTimeout(() => {\n this.loadingTarget.classList.remove('hidden')\n }, 1000)\n }\n\n finishUpdate() {\n if (this.loadingTimeout) {\n window.clearTimeout(this.loadingTimeout)\n }\n this.loadingTarget.classList.add('hidden')\n }\n\n conditionConfigFor(conditionId) {\n return this.conditionsLookup[conditionId]\n }\n\n addGroup() {\n const { blueprint, conditions } = this\n const condition = ( conditions.find(c => c.id == this.defaultConditionIdValue) || conditions[0] )\n const { meta } = condition\n\n if (this.blueprint.length > 0) {\n this.blueprint.push(or())\n }\n this.blueprint.push(criterion(condition.id, 1, condition))\n blueprintUpdatedEvent(this.element, {blueprint: this.blueprint, formId: this.formIdValue})\n }\n\n addCriterion(previousCriterionId) {\n const { blueprint, conditions } = this\n const condition = ( conditions.find(c => c.id == this.defaultConditionIdValue) || conditions[0] )\n const { meta } = condition\n blueprint.splice(previousCriterionId + 1, 0, and(), criterion(condition.id, 1, condition))\n blueprintUpdatedEvent(this.element, {blueprint: this.blueprint, formId: this.formIdValue})\n }\n\n deleteCriterion(criterionId) {\n /**\n To support 'groups' there is some complicated logic for deleting criterion.\n\n Imagine this simplified blueprint: [eq, and, sw, or, eq]\n\n User clicks to delete the last eq. We also have to delete the preceding or\n otherwise we're left with a hanging empty group\n\n What if the user deletes the sw? We have to clean up the preceding and.\n\n Imagine another scenario: [eq or sw and ew]\n Now we delete the first eq but this time we need to clean up the or.\n\n These conditionals cover these cases.\n **/\n const { blueprint } = this\n const previous = blueprint[criterionId - 1]\n const next = blueprint[criterionId + 1]\n\n const nextIsOr = next && next.word === 'or'\n const previousIsOr = previous && previous.word === 'or'\n\n const nextIsRightParen = nextIsOr || !next\n const previousIsLeftParen = previousIsOr || !previous\n\n const isFirstInGroup = previousIsLeftParen && !nextIsRightParen\n const isLastInGroup = previousIsLeftParen && nextIsRightParen\n const isLastCriterion = !previous && !next\n\n if (isLastCriterion) {\n this.blueprint = []\n } else if (isLastInGroup && previousIsOr) {\n blueprint.splice(criterionId - 1, 2)\n } else if (isLastInGroup && !previous) {\n blueprint.splice(criterionId, 2)\n } else if (isFirstInGroup) {\n blueprint.splice(criterionId, 2)\n } else {\n blueprint.splice(criterionId - 1, 2)\n }\n\n blueprintUpdatedEvent(this.element, {blueprint: this.blueprint, formId: this.formIdValue})\n }\n\n /*\n Updates a criterion in the blueprint\n Returns true if an update was actually performed, or false if no-op\n */\n replaceCriterion(criterionId, conditionId, condition) {\n const criterionRow = this.blueprint[criterionId]\n if (criterionRow.type !== 'criterion') {\n throw new Error(\n `You can't call updateConditionId on a non-criterion type. Trying to update ${JSON.stringify(criterion)}`\n )\n }\n const existingCriterion = this.blueprint[criterionId]\n const newCriterion = criterion(conditionId, criterionRow.depth, condition)\n if (isEqual(existingCriterion, newCriterion)) {\n return false\n } else {\n this.blueprint[criterionId] = newCriterion\n blueprintUpdatedEvent(this.element, {blueprint: this.blueprint, formId: this.formIdValue})\n return true\n }\n }\n\n updateInput(criterionId, input, inputId) {\n // Input id is an array of hash keys that define the path for this input such as [\"input\", \"date_refinement\"]\n const { blueprint } = this\n const criterion = blueprint[criterionId]\n inputId = inputId || 'input'\n const blueprintPath = inputId.split(', ')\n // If the inputId contains more than one element, add input at appropriate depth\n if (blueprintPath.length > 1) {\n criterion[blueprintPath[0]][blueprintPath[1]] = { ...criterion[blueprintPath[0]][blueprintPath[1]], ...input }\n } else {\n criterion[inputId] = { ...criterion[inputId], ...input }\n }\n blueprintUpdatedEvent(this.element, {blueprint: this.blueprint, formId: this.formIdValue})\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport { filterStoredEvent } from '../../refine/helpers'\n\nexport default class extends Controller {\n static targets = ['blueprintField']\n static values = { formId: String, stateDomId: String }\n\n connect() {\n const stateController = document\n .getElementById(this.stateDomIdValue)\n .refineStateController\n this.blueprintFieldTarget.value = JSON.stringify(stateController.blueprint)\n console.log(\"connect\", this.blueprintFieldTarget.value)\n }\n\n updateBlueprintField(event) {\n if (event.detail.formId != this.formIdValue) { return null }\n const { detail } = event\n const { blueprint } = detail\n this.blueprintFieldTarget.value = JSON.stringify(blueprint)\n console.log(\"update blueprint\", this.blueprintFieldTarget.value)\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\n\nexport default class extends Controller {\n submit(event) {\n event.preventDefault()\n this.element.submit()\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\n\n// simple controller to hide/show the filter modal\nexport default class extends Controller {\n static targets = [\"content\"]\n\n toggle(_event) {\n this.contentTargets.forEach(node => {\n node.toggleAttribute(\"hidden\")\n })\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport { FetchRequest } from '@rails/request.js'\n\n/*\n attach to a form element to have it submit to a turbo-stream endpoint\n\n <form action=\"/contacts\" data-controller=\"refine--turbo-stream-form\" data-action=\"submit->refine--turbo-stream-form#submit\">\n\n Turbo is supposed to handle this natively but we're seeing issues when the form is inside an iframe\n*/\nexport default class extends Controller {\n async submit(event) {\n event.preventDefault()\n const request = new FetchRequest(\n (this.element.method || \"POST\"),\n this.element.action,\n {\n responseKind: \"turbo-stream\",\n body: new FormData(this.element)\n }\n )\n await request.perform()\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport { FetchRequest } from '@rails/request.js'\n\n/*\n attach to a link element to have it request turbo stream responses\n\n <a href=\"/contacts\" data-controller=\"refine--turbo-stream-link\" data-action=\"refine--turbo-stream-link#get\">Click me</a>\n\n Turbo is supposed to handle this natively with data-turbo-stream but we're\n seeing issues using that attribute inside iframes\n*/\nexport default class extends Controller {\n async visit(event) {\n event.preventDefault()\n const request = new FetchRequest(\n (this.element.dataset.turboMethod || \"GET\"),\n this.element.href,\n {\n responseKind: \"turbo-stream\",\n }\n )\n await request.perform()\n }\n}\n","import ServerRefreshController from './server-refresh-controller'\nimport { debounce } from 'lodash'\n\nexport default class extends ServerRefreshController {\n static values = {\n criterionId: Number,\n }\n\n initialize() {\n this.updateBlueprint = debounce((event, value, inputKey) => {\n this.value(event, value, inputKey)\n }, 500)\n }\n\n refinedFilter(event) {\n const { criterionIdValue, state } = this\n const dataset = event.target.dataset\n const inputId = dataset.inputId\n\n state.updateInput(\n criterionIdValue,\n {\n id: event.target.value,\n },\n inputId\n )\n this.refreshFromServer()\n }\n\n clause(event) {\n const { criterionIdValue, state } = this\n const dataset = event.target.dataset\n const inputId = dataset.inputId\n state.updateInput(\n criterionIdValue,\n {\n clause: event.target.value,\n },\n inputId\n )\n this.refreshFromServer()\n }\n\n selected(event) {\n const { target: select } = event\n const options = Array.prototype.slice.call(select.options)\n const selectedOptions = options.filter((option) => option.selected)\n const selected = selectedOptions.map((option) => option.value)\n this.value(event, selected, 'selected')\n }\n\n value(event, value, inputKey) {\n const { criterionIdValue, state } = this\n const dataset = event.target.dataset\n const inputId = dataset.inputId\n inputKey = inputKey || dataset.inputKey || 'value'\n value = value || event.target.value\n state.updateInput(\n criterionIdValue,\n {\n [inputKey]: value,\n },\n inputId\n )\n }\n\n condition(event) {\n const { criterionIdValue, state } = this\n const element = event.target\n let newConditionId = element.value\n if (!newConditionId) newConditionId = element.querySelector('select').value \n const config = this.state.conditionConfigFor(newConditionId)\n const updatePerformed = state.replaceCriterion(criterionIdValue, newConditionId, config)\n if (updatePerformed) {\n this.refreshFromServer()\n }\n }\n\n // Prevent form submission when hitting enter in a text box\n cancelEnter(event) {\n if (event.code === \"Enter\") {\n event.preventDefault()\n event.stopPropagation()\n }\n }\n}\n","import { Controller } from \"@hotwired/stimulus\"\nimport moment from 'moment'\nrequire('daterangepicker/daterangepicker.css')\n\n// requires jQuery, moment, might want to consider a vanilla JS alternative\nimport $ from 'jquery' // ensure jquery is loaded before daterangepicker\nimport 'daterangepicker'\n\nexport default class extends Controller {\n static targets = [\n 'field',\n 'hiddenField',\n 'clearButton',\n ]\n\n static values = {\n includeTime: Boolean,\n futureOnly: Boolean,\n drops: String,\n inline: Boolean,\n dateFormat: String,\n timeFormat: String,\n isAmPm: Boolean,\n locale: { type: String, default: 'en' },\n datetimeFormat: { type: String, default: 'MM/DD/YYYY h:mm A' },\n pickerLocale: { type: Object, default: {} },\n }\n\n connect() {\n this.initPluginInstance()\n }\n\n disconnect() {\n this.teardownPluginInstance()\n }\n\n clearDate(event) {\n // don't submit the form, unless it originated from the cancel/clear button\n event.preventDefault()\n\n window.$(this.fieldTarget).val('')\n\n this.dispatch('value-cleared')\n }\n\n applyDateToField(event, picker) {\n const format = this.includeTimeValue ? this.timeFormatValue : this.dateFormatValue\n\n const momentVal = picker\n ? moment(picker.startDate.toISOString())\n : moment(this.fieldTarget.value, 'YYYY-MM-DDTHH:mm').format('YYYY-MM-DDTHH:mm')\n const displayVal = momentVal.format(format)\n const dataVal = this.includeTimeValue ? momentVal.toISOString(true) : momentVal.format('YYYY-MM-DD')\n\n this.fieldTarget.value = displayVal\n this.hiddenFieldTarget.value = dataVal\n // bubble up a change event when the input is updated for other listeners\n window.$(this.fieldTarget).trigger('change', picker)\n\n // emit native change event\n this.hiddenFieldTarget.dispatchEvent(new Event('change', { detail: picker, bubbles: true }))\n }\n\n initPluginInstance() {\n const localeValues = this.pickerLocaleValue\n const isAmPm = this.isAmPmValue\n localeValues['format'] = this.includeTimeValue ? this.timeFormatValue : this.dateFormatValue\n\n window.$(this.fieldTarget).daterangepicker({\n singleDatePicker: true,\n timePicker: this.includeTimeValue,\n timePickerIncrement: 5,\n autoUpdateInput: false,\n autoApply: true,\n minDate: this.futureOnlyValue ? new Date() : false,\n locale: localeValues,\n parentEl: $(this.element),\n drops: this.dropsValue ? this.dropsValue : 'down',\n timePicker24Hour: !isAmPm,\n })\n\n window.$(this.fieldTarget).on('apply.daterangepicker', this.applyDateToField.bind(this))\n window.$(this.fieldTarget).on('cancel.daterangepicker', this.clearDate.bind(this))\n window.$(this.fieldTarget).on('showCalendar.daterangepicker', this.showCalendar.bind(this))\n\n this.pluginMainEl = this.fieldTarget\n this.plugin = $(this.pluginMainEl).data('daterangepicker') // weird\n\n if (this.inlineValue) {\n this.element.classList.add('date-input--inline')\n }\n\n }\n \n teardownPluginInstance() {\n if (this.plugin === undefined) {\n return\n }\n\n $(this.pluginMainEl).off('apply.daterangepicker')\n $(this.pluginMainEl).off('cancel.daterangepicker')\n $(this.pluginMainEl).off('showCalendar.daterangepicker')\n\n // revert to original markup, remove any event listeners\n this.plugin.remove()\n\n }\n\n showCalendar() {\n this.dispatch('show-calendar')\n }\n\n}\n","import { identifierForContextKey } from \"@hotwired/stimulus-webpack-helpers\"\n\nimport AddController from './refine/add-controller'\nimport InlineConditionsController from './refine/inline-conditions-controller'\nimport CriterionFormController from './refine/criterion-form-controller'\nimport DefaultsController from './refine/defaults-controller'\nimport DeleteController from './refine/delete-controller'\nimport FilterPillsController from './refine/filter-pills-controller'\nimport PopupController from './refine/popup-controller'\nimport SearchFilterController from './refine/search-filter-controller'\nimport ServerRefreshController from './refine/server-refresh-controller'\nimport StateController from './refine/state-controller'\nimport StoredFilterController from './refine/stored-filter-controller'\nimport SubmitForm from './refine/submit-form-controller'\nimport ToggleController from './refine/toggle-controller'\nimport TurboStreamFormController from './refine/turbo-stream-form-controller'\nimport TurboStreamLinkController from './refine/turbo-stream-link-controller'\nimport UpdateController from './refine/update-controller'\nimport DateController from './refine/date-controller'\n\nexport const controllerDefinitions = [\n [AddController, 'refine/add-controller.js'],\n [InlineConditionsController, './refine/inline-conditions-controller.js'],\n [CriterionFormController, 'refine/criterion-form-controller.js'],\n [DefaultsController, 'refine/defaults-controller.js'],\n [DeleteController, 'refine/delete-controller.js'],\n [FilterPillsController, 'refine/filter-pills-controller.js'],\n [PopupController, 'refine/popup-controller.js'],\n [SearchFilterController, 'refine/search-filter-controller.js'],\n [ServerRefreshController, 'refine/server-refresh-controller.js'],\n [StateController, 'refine/state-controller.js'],\n [StoredFilterController, 'refine/stored-filter-controller.js'],\n [SubmitForm, 'refine/submit-form-controller.js'],\n [ToggleController, 'refine/toggle-controller.js'],\n [TurboStreamFormController, 'refine/turbo-stream-form-controller.js'],\n [TurboStreamLinkController, 'refine/turbo-stream-link-controller.js'],\n [UpdateController, 'refine/update-controller.js'],\n [DateController, 'refine/date-controller.js']\n].map(function(d) {\n const key = d[1]\n const controller = d[0]\n return {\n identifier: identifierForContextKey(key),\n controllerConstructor: controller\n }\n})\n\nexport {\n AddController,\n InlineConditionsController,\n CriterionFormController,\n DefaultsController,\n DeleteController,\n FilterPillsController,\n PopupController,\n SearchFilterController,\n ServerRefreshController,\n StateController,\n StoredFilterController,\n SubmitForm,\n ToggleController,\n TurboStreamFormController,\n TurboStreamLinkController,\n UpdateController,\n DateController\n}\n"],"names":["identifierForContextKey","key","logicalName","match","replace","Controller","connect","this","state","finishUpdate","currentElement","element","document","body","matches","application","getControllerForElementAndIdentifier","parentNode","refreshFromServer","options","_this","includeErrors","startUpdate","request","FetchRequest","refreshUrlValue","responseKind","query","filterName","JSON","stringify","blueprint","clientIdValue","include_errors","perform","then","e","Promise","reject","ServerRefreshController","criterion","resolve","validateBlueprint","isValid","addCriterion","previousCriterionIdValue","group","_this2","addGroup","_this3","validateBlueprintUrlValue","response","ok","values","previousCriterionId","Number","filterConditions","event","currentTarget","value","toLowerCase","visibleCategories","Set","conditionTargets","forEach","conditionNode","innerHTML","includes","hidden","add","dataset","category","categoryTargets","categoryNode","has","targets","_class","refresh","_event","formData","FormData","url","URL","urlValue","name","entries","console","log","searchParams","set","window","Turbo","visit","toString","frame","turboFrameValue","String","turboFrame","method","type","default","getStateController","updateInput","criterionIdValue","inputValue","controller","criterionId","input","Object","deleteCriterion","urlParams","URLSearchParams","location","search","existingParams","delete","index","parseInt","stateController","reloadPage","submitUrlValue","refine_filters_builder","filter_class","blueprint_json","client_id","redirectToStableId","stableId","params","append","allParams","fromEntries","pathname","history","pushState","title","reload","refineStateController","stabilizeFilterController","submitUrl","useClickOutside","boundHandleKeyUp","handleKeyUp","bind","addEventListener","disconnect","removeEventListener","show","preventDefault","frameTarget","src","srcValue","isOpenValue","hide","clickOutside","isOpen","Boolean","submitFilter","activeElement","blur","querySelector","loadResults","_ref","detail","href","CustomEvent","bubbles","cancelable","undefined","evt","createEvent","initCustomEvent","prototype","Event","blueprintUpdatedEvent","formId","_ref2","dispatchEvent","id","depth","condition","_clauses$","component","meta","clauses","refinements","selected","newInput","clause","refinement","condition_id","changeDelegate","delegate","blueprintValue","conditions","conditionsValue","classNameValue","conditionsLookup","reduce","lookup","loadingTimeout","formIdValue","abnegate","clearTimeout","setTimeout","loadingTarget","classList","remove","conditionConfigFor","conditionId","find","c","defaultConditionIdValue","length","push","word","splice","previous","next","previousIsOr","nextIsRightParen","previousIsLeftParen","isLastInGroup","replaceCriterion","criterionRow","Error","existingCriterion","newCriterion","isEqual","inputId","blueprintPath","split","Array","className","refreshUrl","clientId","validateBlueprintUrl","defaultConditionId","getElementById","stateDomIdValue","blueprintFieldTarget","updateBlueprintField","stateDomId","submit","toggle","contentTargets","node","toggleAttribute","TurboStreamFormController","action","turboMethod","initialize","updateBlueprint","debounce","inputKey","refinedFilter","target","select","slice","call","filter","option","map","newConditionId","config","cancelEnter","code","stopPropagation","require","initPluginInstance","teardownPluginInstance","clearDate","$","fieldTarget","val","dispatch","applyDateToField","picker","format","includeTimeValue","timeFormatValue","dateFormatValue","momentVal","moment","startDate","toISOString","displayVal","dataVal","hiddenFieldTarget","trigger","localeValues","pickerLocaleValue","isAmPm","isAmPmValue","daterangepicker","singleDatePicker","timePicker","timePickerIncrement","autoUpdateInput","autoApply","minDate","futureOnlyValue","Date","locale","parentEl","drops","dropsValue","timePicker24Hour","on","showCalendar","pluginMainEl","plugin","data","inlineValue","off","includeTime","futureOnly","inline","dateFormat","timeFormat","datetimeFormat","pickerLocale","controllerDefinitions","AddController","InlineConditionsController","CriterionFormController","DefaultsController","DeleteController","FilterPillsController","PopupController","SearchFilterController","StateController","StoredFilterController","SubmitForm","ToggleController","TurboStreamLinkController","UpdateController","DateController","d","identifier","controllerConstructor"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ var e=require("@hotwired/stimulus"),t=require("@rails/request.js"),r=require("stimulus-use"),i=require("jquery-events-to-dom-events"),n=require("lodash"),o=require("moment"),l=require("jquery");function s(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}require("daterangepicker");var a=s(o),u=s(l);function d(e){const t=(e.match(/^(?:\.\/)?(.+)(?:[_-]controller\..+?)$/)||[])[1];if(t)return t.replace(/_/g,"-").replace(/\//g,"--")}class c extends e.Controller{connect(){this.state.finishUpdate()}get state(){let e=this.element;for(;e!==document.body;){if(e.matches('[data-controller~="refine--state"]'))return this.application.getControllerForElementAndIdentifier(e,"refine--state");e=e.parentNode}return null}refreshFromServer(e){void 0===e&&(e={});try{const r=this,{includeErrors:i}=e;r.state.startUpdate();const n=new t.FetchRequest("GET",r.state.refreshUrlValue,{responseKind:"turbo-stream",query:{"refine_filters_builder[filter_class]":r.state.filterName,"refine_filters_builder[blueprint_json]":JSON.stringify(r.state.blueprint),"refine_filters_builder[client_id]":r.state.clientIdValue,include_errors:!!i}});return Promise.resolve(n.perform()).then(function(){})}catch(e){return Promise.reject(e)}}}class h extends c{criterion(){try{const e=this;return Promise.resolve(e.validateBlueprint()).then(function(t){t&&e.state.addCriterion(e.previousCriterionIdValue),e.refreshFromServer({includeErrors:!t})})}catch(e){return Promise.reject(e)}}group(){try{const e=this;return Promise.resolve(e.validateBlueprint()).then(function(t){t&&e.state.addGroup(),e.refreshFromServer({includeErrors:!t})})}catch(e){return Promise.reject(e)}}validateBlueprint(e){try{const e=this,r=new t.FetchRequest("GET",e.state.validateBlueprintUrlValue,{query:{"refine_filters_builder[filter_class]":e.state.filterName,"refine_filters_builder[blueprint_json]":JSON.stringify(e.state.blueprint),"refine_filters_builder[client_id]":e.state.clientIdValue}});return Promise.resolve(r.perform()).then(function(e){return e.ok})}catch(e){return Promise.reject(e)}}}h.values={previousCriterionId:Number};class p extends e.Controller{filterConditions(e){const t=e.currentTarget.value.toLowerCase(),r=new Set;this.conditionTargets.forEach(e=>{e.innerHTML.toLowerCase().includes(t)?(e.hidden=!1,r.add(e.dataset.category)):e.hidden=!0}),this.categoryTargets.forEach(e=>{e.hidden=!r.has(e.innerHTML)})}}p.targets=["condition","category"];class m extends e.Controller{refresh(e){const t=new FormData(this.element),r=new URL(this.urlValue);for(const[e,i]of t.entries())console.log(e,i),r.searchParams.set(e,i);window.Turbo.visit(r.toString(),{frame:this.turboFrameValue})}}m.values={url:String,turboFrame:String,method:{type:String,default:"POST"}};class f extends e.Controller{connect(){this.state=this.getStateController(),this.state.updateInput(this.criterionIdValue,this.inputValue)}getStateController(){let e=this.element;for(;e!==document.body;){const t=this.application.getControllerForElementAndIdentifier(e,"refine--state");if(t)return t;e=e.parentNode}return null}}f.values={criterionId:Number,input:Object};class g extends c{criterion(){const{state:e,criterionIdValue:t}=this;e.deleteCriterion(t),this.refreshFromServer()}}g.values={criterionId:Number};class b extends e.Controller{connect(){const e=new URLSearchParams(window.location.search);this.existingParams=e,this.existingParams.delete("stable_id")}delete(e){const{criterionId:t}=e.currentTarget.dataset;var r=parseInt(t);this.stateController.deleteCriterion(r),this.reloadPage()}reloadPage(){try{const e=this,{blueprint:r}=e.stateController,i=new t.FetchRequest("POST",e.submitUrlValue,{responseKind:"turbo-stream",body:JSON.stringify({refine_filters_builder:{filter_class:e.stateController.filterName,blueprint_json:JSON.stringify(r),client_id:e.stateController.clientIdValue}})});return Promise.resolve(i.perform()).then(function(){})}catch(e){return Promise.reject(e)}}redirectToStableId(e){const t=new URLSearchParams;e&&t.append("stable_id",e);const r=new URLSearchParams({...Object.fromEntries(this.existingParams),...Object.fromEntries(t)}).toString(),i=window.location.pathname+"?"+r;history.pushState({},document.title,i),window.location.reload()}get stateController(){return this.element.refineStateController}get stabilizeFilterController(){return this.element.stabilizeFilterController}}b.values={submitUrl:String};class v extends e.Controller{connect(){r.useClickOutside(this),this.boundHandleKeyUp=this.handleKeyUp.bind(this),document.addEventListener("keyup",this.boundHandleKeyUp)}disconnect(){document.removeEventListener("keyup",this.boundHandleKeyUp)}show(e){e.preventDefault(),this.frameTarget.src=this.srcValue,this.isOpenValue=!0}hide(e){this.isOpenValue&&(null==e||e.preventDefault(),this.frameTarget.innerHTML="",this.isOpenValue=!1)}clickOutside(e){this.hide(e)}handleKeyUp(e){"Escape"!==e.key&&"Esc"!==e.key||this.hide(e)}}v.targets=["frame"],v.values={src:String,isOpen:{type:Boolean,default:!1}};class C extends e.Controller{search(e){e.preventDefault(),this.submitFilter(),document.activeElement.blur()}submitFilter(){try{const e=this,{blueprint:r}=e.stateController,i=new t.FetchRequest("POST",e.submitUrlValue,{responseKind:"turbo-stream",body:JSON.stringify({refine_filters_builder:{filter_class:e.stateController.filterName,blueprint_json:JSON.stringify(r),client_id:e.stateController.clientIdValue}})});return Promise.resolve(i.perform()).then(function(){})}catch(e){return Promise.reject(e)}}get stateController(){return this.element.querySelector('[data-controller~="refine--state"]').refineStateController}loadResults(e){let{detail:{url:t}}=e;console.log("filter submit success"),window.Turbo?window.Turbo.visit(t):window.location.href=t}}C.values={submitUrl:String},function(){if("function"==typeof window.CustomEvent)return!1;function e(e,t){t=t||{bubbles:!1,cancelable:!1,detail:void 0};var r=document.createEvent("CustomEvent");return r.initCustomEvent(e,t.bubbles,t.cancelable,t.detail),r}e.prototype=window.Event.prototype,window.CustomEvent=e}();const w=(e,t)=>{let{blueprint:r,formId:i}=t;const n=new CustomEvent("blueprint-updated",{bubbles:!0,cancelable:!0,detail:{blueprint:r,formId:i}});e.dispatchEvent(n)},y=(e,t,r)=>{var i;const n=null==r?void 0:r.component,o=(null==r?void 0:r.meta)||{clauses:[],options:{}},l=(null==r?void 0:r.refinements)||[],{clauses:s,options:a}=o;let u;u="option-condition"===n?a[0]?[a[0].id]:[]:void 0;let d={clause:null==(i=s[0])?void 0:i.id,selected:u};return l.forEach(e=>{const{meta:t,component:r}=e,{clauses:i,options:n}=t;let o;o="option-condition"===r?n[0]?[n[0].id]:[]:void 0,d[e.id]={clause:i[0].id,selected:o}}),{depth:t,type:"criterion",condition_id:e,input:d}};class S extends e.Controller{connect(){this.element.refineStateController=this,this.changeDelegate=i.delegate("change",["event","picker"]),this.blueprint=this.blueprintValue,this.conditions=this.conditionsValue,this.filterName=this.classNameValue,this.conditionsLookup=this.conditions.reduce((e,t)=>(e[t.id]=t,e),{}),this.loadingTimeout=null,w(this.element,{blueprint:this.blueprint,formId:this.formIdValue})}disconnect(){i.abnegate("change",this.changeDelegate)}startUpdate(){this.loadingTimeout&&window.clearTimeout(this.loadingTimeout),this.loadingTimeout=window.setTimeout(()=>{this.loadingTarget.classList.remove("hidden")},1e3)}finishUpdate(){this.loadingTimeout&&window.clearTimeout(this.loadingTimeout),this.loadingTarget.classList.add("hidden")}conditionConfigFor(e){return this.conditionsLookup[e]}addGroup(){const{conditions:e}=this,t=e.find(e=>e.id==this.defaultConditionIdValue)||e[0];var r;this.blueprint.length>0&&this.blueprint.push({depth:r=void 0===r?0:r,type:"conjunction",word:"or"}),this.blueprint.push(y(t.id,1,t)),w(this.element,{blueprint:this.blueprint,formId:this.formIdValue})}addCriterion(e){const{blueprint:t,conditions:r}=this,i=r.find(e=>e.id==this.defaultConditionIdValue)||r[0];var n;t.splice(e+1,0,{depth:n=void 0===n?1:n,type:"conjunction",word:"and"},y(i.id,1,i)),w(this.element,{blueprint:this.blueprint,formId:this.formIdValue})}deleteCriterion(e){const{blueprint:t}=this,r=t[e-1],i=t[e+1],n=r&&"or"===r.word,o=i&&"or"===i.word||!i,l=n||!r,s=l&&o;r||i?t.splice(s&&n?e-1:s&&!r||l&&!o?e:e-1,2):this.blueprint=[],w(this.element,{blueprint:this.blueprint,formId:this.formIdValue})}replaceCriterion(e,t,r){const i=this.blueprint[e];if("criterion"!==i.type)throw new Error("You can't call updateConditionId on a non-criterion type. Trying to update "+JSON.stringify(y));const o=this.blueprint[e],l=y(t,i.depth,r);return!n.isEqual(o,l)&&(this.blueprint[e]=l,w(this.element,{blueprint:this.blueprint,formId:this.formIdValue}),!0)}updateInput(e,t,r){const{blueprint:i}=this,n=i[e],o=(r=r||"input").split(", ");o.length>1?n[o[0]][o[1]]={...n[o[0]][o[1]],...t}:n[r]={...n[r],...t},w(this.element,{blueprint:this.blueprint,formId:this.formIdValue})}}S.values={blueprint:Array,conditions:Array,className:String,refreshUrl:String,clientId:String,validateBlueprintUrl:String,defaultConditionId:String},S.targets=["loading"];class I extends e.Controller{connect(){const e=document.getElementById(this.stateDomIdValue).refineStateController;this.blueprintFieldTarget.value=JSON.stringify(e.blueprint),console.log("connect",this.blueprintFieldTarget.value)}updateBlueprintField(e){if(e.detail.formId!=this.formIdValue)return null;const{detail:t}=e,{blueprint:r}=t;this.blueprintFieldTarget.value=JSON.stringify(r),console.log("update blueprint",this.blueprintFieldTarget.value)}}I.targets=["blueprintField"],I.values={formId:String,stateDomId:String};class T extends e.Controller{submit(e){e.preventDefault(),this.element.submit()}}class F extends e.Controller{toggle(e){this.contentTargets.forEach(e=>{e.toggleAttribute("hidden")})}}F.targets=["content"];class V extends e.Controller{submit(e){try{const r=this;e.preventDefault();const i=new t.FetchRequest(r.element.method||"POST",r.element.action,{responseKind:"turbo-stream",body:new FormData(r.element)});return Promise.resolve(i.perform()).then(function(){})}catch(e){return Promise.reject(e)}}}class P extends e.Controller{visit(e){try{const r=this;e.preventDefault();const i=new t.FetchRequest(r.element.dataset.turboMethod||"GET",r.element.href,{responseKind:"turbo-stream"});return Promise.resolve(i.perform()).then(function(){})}catch(e){return Promise.reject(e)}}}class E extends c{initialize(){this.updateBlueprint=n.debounce((e,t,r)=>{this.value(e,t,r)},500)}refinedFilter(e){const{criterionIdValue:t,state:r}=this;r.updateInput(t,{id:e.target.value},e.target.dataset.inputId),this.refreshFromServer()}clause(e){const{criterionIdValue:t,state:r}=this;r.updateInput(t,{clause:e.target.value},e.target.dataset.inputId),this.refreshFromServer()}selected(e){const{target:t}=e,r=Array.prototype.slice.call(t.options).filter(e=>e.selected).map(e=>e.value);this.value(e,r,"selected")}value(e,t,r){const{criterionIdValue:i,state:n}=this,o=e.target.dataset;n.updateInput(i,{[r=r||o.inputKey||"value"]:t=t||e.target.value},o.inputId)}condition(e){const{criterionIdValue:t,state:r}=this,i=e.target;let n=i.value;n||(n=i.querySelector("select").value);const o=this.state.conditionConfigFor(n);r.replaceCriterion(t,n,o)&&this.refreshFromServer()}cancelEnter(e){"Enter"===e.code&&(e.preventDefault(),e.stopPropagation())}}E.values={criterionId:Number},require("daterangepicker/daterangepicker.css");class j extends e.Controller{connect(){this.initPluginInstance()}disconnect(){this.teardownPluginInstance()}clearDate(e){e.preventDefault(),window.$(this.fieldTarget).val(""),this.dispatch("value-cleared")}applyDateToField(e,t){const r=this.includeTimeValue?this.timeFormatValue:this.dateFormatValue,i=t?a.default(t.startDate.toISOString()):a.default(this.fieldTarget.value,"YYYY-MM-DDTHH:mm").format("YYYY-MM-DDTHH:mm"),n=i.format(r),o=this.includeTimeValue?i.toISOString(!0):i.format("YYYY-MM-DD");this.fieldTarget.value=n,this.hiddenFieldTarget.value=o,window.$(this.fieldTarget).trigger("change",t),this.hiddenFieldTarget.dispatchEvent(new Event("change",{detail:t,bubbles:!0}))}initPluginInstance(){const e=this.pickerLocaleValue,t=this.isAmPmValue;e.format=this.includeTimeValue?this.timeFormatValue:this.dateFormatValue,window.$(this.fieldTarget).daterangepicker({singleDatePicker:!0,timePicker:this.includeTimeValue,timePickerIncrement:5,autoUpdateInput:!1,autoApply:!0,minDate:!!this.futureOnlyValue&&new Date,locale:e,parentEl:u.default(this.element),drops:this.dropsValue?this.dropsValue:"down",timePicker24Hour:!t}),window.$(this.fieldTarget).on("apply.daterangepicker",this.applyDateToField.bind(this)),window.$(this.fieldTarget).on("cancel.daterangepicker",this.clearDate.bind(this)),window.$(this.fieldTarget).on("showCalendar.daterangepicker",this.showCalendar.bind(this)),this.pluginMainEl=this.fieldTarget,this.plugin=u.default(this.pluginMainEl).data("daterangepicker"),this.inlineValue&&this.element.classList.add("date-input--inline")}teardownPluginInstance(){void 0!==this.plugin&&(u.default(this.pluginMainEl).off("apply.daterangepicker"),u.default(this.pluginMainEl).off("cancel.daterangepicker"),u.default(this.pluginMainEl).off("showCalendar.daterangepicker"),this.plugin.remove())}showCalendar(){this.dispatch("show-calendar")}}j.targets=["field","hiddenField","clearButton"],j.values={includeTime:Boolean,futureOnly:Boolean,drops:String,inline:Boolean,dateFormat:String,timeFormat:String,isAmPm:Boolean,locale:{type:String,default:"en"},datetimeFormat:{type:String,default:"MM/DD/YYYY h:mm A"},pickerLocale:{type:Object,default:{}}};const x=[[h,"refine/add-controller.js"],[p,"./refine/inline-conditions-controller.js"],[m,"refine/criterion-form-controller.js"],[f,"refine/defaults-controller.js"],[g,"refine/delete-controller.js"],[b,"refine/filter-pills-controller.js"],[v,"refine/popup-controller.js"],[C,"refine/search-filter-controller.js"],[c,"refine/server-refresh-controller.js"],[S,"refine/state-controller.js"],[I,"refine/stored-filter-controller.js"],[T,"refine/submit-form-controller.js"],[F,"refine/toggle-controller.js"],[V,"refine/turbo-stream-form-controller.js"],[P,"refine/turbo-stream-link-controller.js"],[E,"refine/update-controller.js"],[j,"refine/date-controller.js"]].map(function(e){const t=e[0];return{identifier:d(e[1]),controllerConstructor:t}});exports.AddController=h,exports.CriterionFormController=m,exports.DateController=j,exports.DefaultsController=f,exports.DeleteController=g,exports.FilterPillsController=b,exports.InlineConditionsController=p,exports.PopupController=v,exports.SearchFilterController=C,exports.ServerRefreshController=c,exports.StateController=S,exports.StoredFilterController=I,exports.SubmitForm=T,exports.ToggleController=F,exports.TurboStreamFormController=V,exports.TurboStreamLinkController=P,exports.UpdateController=E,exports.controllerDefinitions=x;
2
+ //# sourceMappingURL=refine-stimulus.js.map