ahoy_captain 0.10.1 → 0.11.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +23 -2
  3. data/app/assets/javascript/ahoy_captain/controllers/application_controller.js +12 -0
  4. data/app/assets/javascript/ahoy_captain/controllers/combobox_controller.js +50 -20
  5. data/app/assets/javascript/ahoy_captain/controllers/frame_link_controller.js +20 -0
  6. data/app/assets/javascript/ahoy_captain/controllers/line_chart_controller.js +67 -4
  7. data/app/assets/javascript/ahoy_captain/controllers/map_controller.js +47 -0
  8. data/app/assets/javascript/ahoy_captain/controllers/predicate_select_controller.js +1 -0
  9. data/app/assets/javascript/ahoy_captain/controllers/tile_controller.js +25 -1
  10. data/app/assets/javascript/ahoy_captain/helpers/countries.js +2261 -0
  11. data/app/components/ahoy_captain/combobox_component.html.erb +2 -2
  12. data/app/components/ahoy_captain/combobox_component.rb +1 -1
  13. data/app/components/ahoy_captain/comparison_link_component.html.erb +17 -0
  14. data/app/components/ahoy_captain/comparison_link_component.rb +10 -6
  15. data/app/components/ahoy_captain/dropdown_link_component.html.erb +2 -4
  16. data/app/components/ahoy_captain/dropdown_link_component.rb +4 -0
  17. data/app/components/ahoy_captain/previous_next_component.html.erb +8 -0
  18. data/app/components/ahoy_captain/previous_next_component.rb +11 -0
  19. data/app/components/ahoy_captain/stats/comparable_container_component.html.erb +1 -1
  20. data/app/components/ahoy_captain/stats/container_component.html.erb +1 -1
  21. data/app/components/ahoy_captain/sticky_nav_component.html.erb +26 -22
  22. data/app/components/ahoy_captain/sticky_nav_component.rb +8 -0
  23. data/app/components/ahoy_captain/tile_component.rb +7 -0
  24. data/app/controllers/ahoy_captain/locations/cities_controller.rb +22 -0
  25. data/app/controllers/ahoy_captain/locations/countries_controller.rb +22 -0
  26. data/app/controllers/ahoy_captain/locations/maps_controller.rb +24 -0
  27. data/app/controllers/ahoy_captain/locations/regions_controller.rb +22 -0
  28. data/app/helpers/ahoy_captain/application_helper.rb +0 -2
  29. data/app/models/ahoy_captain/range_from_params.rb +4 -1
  30. data/app/views/ahoy_captain/layouts/shared/_tile_loader.html.erb +12 -0
  31. data/app/views/ahoy_captain/locations/maps/show.html.erb +3 -0
  32. data/app/views/ahoy_captain/properties/_form.html.erb +1 -1
  33. data/app/views/ahoy_captain/roots/show.html.erb +89 -57
  34. data/app/views/ahoy_captain/stats/base/index.html.erb +1 -0
  35. data/app/views/ahoy_captain/stats/show.html.erb +13 -8
  36. data/config/routes.rb +7 -3
  37. data/lib/ahoy_captain/filters_configuration.rb +5 -5
  38. data/lib/ahoy_captain/version.rb +1 -1
  39. data/lib/ahoy_captain.rb +1 -0
  40. metadata +104 -12
  41. data/app/assets/javascript/ahoy_captain/controllers/active_links_controller.js +0 -30
  42. data/app/controllers/ahoy_captain/cities_controller.rb +0 -20
  43. data/app/controllers/ahoy_captain/countries_controller.rb +0 -20
  44. data/app/controllers/ahoy_captain/regions_controller.rb +0 -20
  45. /data/app/views/ahoy_captain/{cities → locations/cities}/index.html+details.erb +0 -0
  46. /data/app/views/ahoy_captain/{cities → locations/cities}/index.html.erb +0 -0
  47. /data/app/views/ahoy_captain/{countries → locations/countries}/index.html+details.erb +0 -0
  48. /data/app/views/ahoy_captain/{countries → locations/countries}/index.html.erb +0 -0
  49. /data/app/views/ahoy_captain/{regions → locations/regions}/index.html+details.erb +0 -0
  50. /data/app/views/ahoy_captain/{regions → locations/regions}/index.html.erb +0 -0
@@ -7,6 +7,7 @@
7
7
  <% end %>
8
8
  </div>
9
9
  <div>
10
+ <canvas id="overlay" width="600" height="400" style="position:absolute;pointer-events:none;"></canvas>
10
11
 
11
12
  <% if compare_mode? %>
12
13
  <canvas class="h-[300px] w-full"
@@ -1,10 +1,15 @@
1
1
  <%= turbo_frame_tag :stats, data: { controller: "active-frame-link" } do %>
2
- <dl class="grid grid-cols-1 divide-y divide-base-200 overflow-hidden rounded-lg grid-cols-2 md:grid-cols-6 md:divide-y-0" data-controller="active-links" data-active-links-classes-value='["text-primary"]'>
3
- <%= render stats_container(@presenter.unique_visitors, stats_unique_visitors_url(search_params), "Unique Visits", :number_with_delimiter, true) %>
4
- <%= render stats_container(@presenter.total_visits, stats_total_visits_path(search_params), "Total Visits", :number_with_delimiter) %>
5
- <%= render stats_container(@presenter.total_pageviews, stats_total_pageviews_path(search_params), "Total Pageviews", :number_with_delimiter) %>
6
- <%= render stats_container(@presenter.views_per_visit, stats_views_per_visits_path(search_params), "Views per Visit", :number_with_delimiter) %>
7
- <%= render stats_container(@presenter.bounce_rate, stats_bounce_rates_path(search_params), "Bounce Rate", :number_with_delimiter) %>
8
- <%= render stats_container(@presenter.visit_duration, stats_visit_durations_url(search_params), "Visit Duration", :number_to_duration) %>
9
- </dl>
2
+ <div class="grid grid-cols-1 divide-y divide-base-200 overflow-hidden rounded-lg grid-cols-2 md:grid-cols-6 md:divide-y-0" data-controller="active-links" data-active-links-classes-value='["text-primary"]'>
3
+ <% if @presenter.send(:range).realtime? %>
4
+ <%= render stats_container(@presenter.unique_visitors, stats_unique_visitors_url(search_params), "Unique Visits (30 min)", :number_with_delimiter, true) %>
5
+ <%= render stats_container(@presenter.total_pageviews, stats_total_pageviews_path(search_params), "Total Pageviews (30 min)", :number_with_delimiter) %>
6
+ <% else %>
7
+ <%= render stats_container(@presenter.unique_visitors, stats_unique_visitors_url(search_params), "Unique Visits", :number_with_delimiter, true) %>
8
+ <%= render stats_container(@presenter.total_visits, stats_total_visits_path(search_params), "Total Visits", :number_with_delimiter) %>
9
+ <%= render stats_container(@presenter.total_pageviews, stats_total_pageviews_path(search_params), "Total Pageviews", :number_with_delimiter) %>
10
+ <%= render stats_container(@presenter.views_per_visit, stats_views_per_visits_path(search_params), "Views per Visit", :number_with_delimiter) %>
11
+ <%= render stats_container(@presenter.bounce_rate, stats_bounce_rates_path(search_params), "Bounce Rate", :number_with_delimiter) %>
12
+ <%= render stats_container(@presenter.visit_duration, stats_visit_durations_url(search_params), "Visit Duration", :number_to_duration) %>
13
+ <% end %>
14
+ </div>
10
15
  <% end %>
data/config/routes.rb CHANGED
@@ -12,15 +12,19 @@ AhoyCaptain::Engine.routes.draw do
12
12
  get "/devices/#{k}" => 'devices#index', defaults: { devices_type: v }, as: "devices_#{k}"
13
13
  end
14
14
 
15
+ namespace :locations do
16
+ resource :map, only: [:show]
17
+ resources :countries, only: [:index]
18
+ resources :regions, only: [:index]
19
+ resources :cities, only: [:index]
20
+ end
21
+
15
22
  resources :properties, only: [:index, :show]
16
23
  resource :export, only: [:show]
17
24
  resource :realtime, only: [:show]
18
25
  resources :funnels, only: [:show]
19
26
  resources :goals, only: [:index]
20
27
  resource :stats, only: [:show]
21
- resources :countries, only: [:index]
22
- resources :regions, only: [:index]
23
- resources :cities, only: [:index]
24
28
  resources :campaigns, only: [:index]
25
29
  resources :sources, only: [:index]
26
30
  resources :exit_pages, only: [:index]
@@ -31,11 +31,11 @@ module AhoyCaptain
31
31
  end
32
32
 
33
33
  config.register("UTM Tags") do
34
- filter column: :utm_medium, label: "UTM Medium", url: :filters_utm_mediums_path, predicates: [:in, :not_in]
35
- filter column: :utm_source, label: "UTM Source", url: :filters_utm_sources_path, predicates: [:in, :not_in]
36
- filter column: :utm_campaign, label: "UTM Campaign", url: :filters_utm_campaigns_path, predicates: [:in, :not_in]
37
- filter column: :utm_term, label: "UTM Term", url: :filters_utm_terms_path, predicates: [:in, :not_in]
38
- filter column: :utm_content, label: "UTM Content", url: :filters_utm_contents_path, predicates: [:in, :not_in]
34
+ filter column: :utm_medium, label: "UTM Medium", url: :filters_utm_mediums_path, predicates: [:in, :not_in, :cont]
35
+ filter column: :utm_source, label: "UTM Source", url: :filters_utm_sources_path, predicates: [:in, :not_in, :cont]
36
+ filter column: :utm_campaign, label: "UTM Campaign", url: :filters_utm_campaigns_path, predicates: [:in, :not_in, :cont]
37
+ filter column: :utm_term, label: "UTM Term", url: :filters_utm_terms_path, predicates: [:in, :not_in, :cont]
38
+ filter column: :utm_content, label: "UTM Content", url: :filters_utm_contents_path, predicates: [:in, :not_in, :cont]
39
39
  end
40
40
 
41
41
  config.register("Goal") do
@@ -1,3 +1,3 @@
1
1
  module AhoyCaptain
2
- VERSION = "0.10.1"
2
+ VERSION = "0.11.1"
3
3
  end
data/lib/ahoy_captain.rb CHANGED
@@ -32,6 +32,7 @@ module AhoyCaptain
32
32
  pin "Chart.bundle", to: "Chart.bundle.js"
33
33
  pin "chartjs-plugin-datalabels", to: "https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@2", preload: true
34
34
  pin "classnames", to: "https://cdnjs.cloudflare.com/ajax/libs/classnames/2.3.2/index.min.js", preload: true
35
+ pin "chartjs-chart-geo", to: "https://unpkg.com/chartjs-chart-geo@4", preload: true
35
36
  pin_all_from AhoyCaptain::Engine.root.join("app/assets/javascript/ahoy_captain/controllers"), under: "controllers", to: "ahoy_captain/controllers"
36
37
  pin_all_from AhoyCaptain::Engine.root.join("app/assets/javascript/ahoy_captain/helpers"), under: "helpers", to: "ahoy_captain/helpers"
37
38
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ahoy_captain
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.1
4
+ version: 0.11.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - joshmn
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-08-17 00:00:00.000000000 Z
11
+ date: 2023-09-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -262,6 +262,90 @@ dependencies:
262
262
  - - ">="
263
263
  - !ruby/object:Gem::Version
264
264
  version: '0'
265
+ - !ruby/object:Gem::Dependency
266
+ name: factory_bot_rails
267
+ requirement: !ruby/object:Gem::Requirement
268
+ requirements:
269
+ - - ">="
270
+ - !ruby/object:Gem::Version
271
+ version: '0'
272
+ type: :development
273
+ prerelease: false
274
+ version_requirements: !ruby/object:Gem::Requirement
275
+ requirements:
276
+ - - ">="
277
+ - !ruby/object:Gem::Version
278
+ version: '0'
279
+ - !ruby/object:Gem::Dependency
280
+ name: pry
281
+ requirement: !ruby/object:Gem::Requirement
282
+ requirements:
283
+ - - ">="
284
+ - !ruby/object:Gem::Version
285
+ version: '0'
286
+ type: :development
287
+ prerelease: false
288
+ version_requirements: !ruby/object:Gem::Requirement
289
+ requirements:
290
+ - - ">="
291
+ - !ruby/object:Gem::Version
292
+ version: '0'
293
+ - !ruby/object:Gem::Dependency
294
+ name: pry-rails
295
+ requirement: !ruby/object:Gem::Requirement
296
+ requirements:
297
+ - - ">="
298
+ - !ruby/object:Gem::Version
299
+ version: '0'
300
+ type: :development
301
+ prerelease: false
302
+ version_requirements: !ruby/object:Gem::Requirement
303
+ requirements:
304
+ - - ">="
305
+ - !ruby/object:Gem::Version
306
+ version: '0'
307
+ - !ruby/object:Gem::Dependency
308
+ name: rspec-rails
309
+ requirement: !ruby/object:Gem::Requirement
310
+ requirements:
311
+ - - ">="
312
+ - !ruby/object:Gem::Version
313
+ version: '0'
314
+ type: :development
315
+ prerelease: false
316
+ version_requirements: !ruby/object:Gem::Requirement
317
+ requirements:
318
+ - - ">="
319
+ - !ruby/object:Gem::Version
320
+ version: '0'
321
+ - !ruby/object:Gem::Dependency
322
+ name: simplecov
323
+ requirement: !ruby/object:Gem::Requirement
324
+ requirements:
325
+ - - ">="
326
+ - !ruby/object:Gem::Version
327
+ version: '0'
328
+ type: :development
329
+ prerelease: false
330
+ version_requirements: !ruby/object:Gem::Requirement
331
+ requirements:
332
+ - - ">="
333
+ - !ruby/object:Gem::Version
334
+ version: '0'
335
+ - !ruby/object:Gem::Dependency
336
+ name: sqlite3
337
+ requirement: !ruby/object:Gem::Requirement
338
+ requirements:
339
+ - - ">="
340
+ - !ruby/object:Gem::Version
341
+ version: '0'
342
+ type: :development
343
+ prerelease: false
344
+ version_requirements: !ruby/object:Gem::Requirement
345
+ requirements:
346
+ - - ">="
347
+ - !ruby/object:Gem::Version
348
+ version: '0'
265
349
  description: A full-featured, mountable analytics dashboard for your Rails app, powered
266
350
  by Ahoy.
267
351
  email:
@@ -278,7 +362,6 @@ files:
278
362
  - app/assets/images/ahoy_captain/logo.png
279
363
  - app/assets/images/ahoy_captain/safari-pinned-tab.svg
280
364
  - app/assets/javascript/ahoy_captain/application.js
281
- - app/assets/javascript/ahoy_captain/controllers/active_links_controller.js
282
365
  - app/assets/javascript/ahoy_captain/controllers/application.js
283
366
  - app/assets/javascript/ahoy_captain/controllers/application_controller.js
284
367
  - app/assets/javascript/ahoy_captain/controllers/combobox_controller.js
@@ -287,10 +370,12 @@ files:
287
370
  - app/assets/javascript/ahoy_captain/controllers/filter/item_controller.js
288
371
  - app/assets/javascript/ahoy_captain/controllers/filter_form_controller.js
289
372
  - app/assets/javascript/ahoy_captain/controllers/filter_modal_controller.js
373
+ - app/assets/javascript/ahoy_captain/controllers/frame_link_controller.js
290
374
  - app/assets/javascript/ahoy_captain/controllers/funnel_chart_controller.js
291
375
  - app/assets/javascript/ahoy_captain/controllers/index.js
292
376
  - app/assets/javascript/ahoy_captain/controllers/interval_controller.js
293
377
  - app/assets/javascript/ahoy_captain/controllers/line_chart_controller.js
378
+ - app/assets/javascript/ahoy_captain/controllers/map_controller.js
294
379
  - app/assets/javascript/ahoy_captain/controllers/predicate_select_controller.js
295
380
  - app/assets/javascript/ahoy_captain/controllers/properties_controller.js
296
381
  - app/assets/javascript/ahoy_captain/controllers/property_filter_controller.js
@@ -298,10 +383,12 @@ files:
298
383
  - app/assets/javascript/ahoy_captain/controllers/tile_controller.js
299
384
  - app/assets/javascript/ahoy_captain/controllers/toggle_controller.js
300
385
  - app/assets/javascript/ahoy_captain/helpers/chart_utils.js
386
+ - app/assets/javascript/ahoy_captain/helpers/countries.js
301
387
  - app/assets/javascript/ahoy_captain/helpers/number_formatters.js
302
388
  - app/assets/manifest/ahoy_captain/manifest.js
303
389
  - app/components/ahoy_captain/combobox_component.html.erb
304
390
  - app/components/ahoy_captain/combobox_component.rb
391
+ - app/components/ahoy_captain/comparison_link_component.html.erb
305
392
  - app/components/ahoy_captain/comparison_link_component.rb
306
393
  - app/components/ahoy_captain/dropdown_button_component.html.erb
307
394
  - app/components/ahoy_captain/dropdown_button_component.rb
@@ -317,6 +404,8 @@ files:
317
404
  - app/components/ahoy_captain/filter/tag_component.rb
318
405
  - app/components/ahoy_captain/filter/tag_container_component.html.erb
319
406
  - app/components/ahoy_captain/filter/tag_container_component.rb
407
+ - app/components/ahoy_captain/previous_next_component.html.erb
408
+ - app/components/ahoy_captain/previous_next_component.rb
320
409
  - app/components/ahoy_captain/stats/comparable_container_component.html.erb
321
410
  - app/components/ahoy_captain/stats/comparable_container_component.rb
322
411
  - app/components/ahoy_captain/stats/container_component.html.erb
@@ -343,8 +432,6 @@ files:
343
432
  - app/components/ahoy_captain/tooltip_component.rb
344
433
  - app/controllers/ahoy_captain/application_controller.rb
345
434
  - app/controllers/ahoy_captain/campaigns_controller.rb
346
- - app/controllers/ahoy_captain/cities_controller.rb
347
- - app/controllers/ahoy_captain/countries_controller.rb
348
435
  - app/controllers/ahoy_captain/devices_controller.rb
349
436
  - app/controllers/ahoy_captain/entry_pages_controller.rb
350
437
  - app/controllers/ahoy_captain/exit_pages_controller.rb
@@ -364,9 +451,12 @@ files:
364
451
  - app/controllers/ahoy_captain/filters/utms_controller.rb
365
452
  - app/controllers/ahoy_captain/funnels_controller.rb
366
453
  - app/controllers/ahoy_captain/goals_controller.rb
454
+ - app/controllers/ahoy_captain/locations/cities_controller.rb
455
+ - app/controllers/ahoy_captain/locations/countries_controller.rb
456
+ - app/controllers/ahoy_captain/locations/maps_controller.rb
457
+ - app/controllers/ahoy_captain/locations/regions_controller.rb
367
458
  - app/controllers/ahoy_captain/properties_controller.rb
368
459
  - app/controllers/ahoy_captain/realtimes_controller.rb
369
- - app/controllers/ahoy_captain/regions_controller.rb
370
460
  - app/controllers/ahoy_captain/roots_controller.rb
371
461
  - app/controllers/ahoy_captain/sources_controller.rb
372
462
  - app/controllers/ahoy_captain/stats/base_controller.rb
@@ -428,10 +518,6 @@ files:
428
518
  - app/queries/concerns/ahoy_captain/lazy_comparable_query.rb
429
519
  - app/views/ahoy_captain/campaigns/index.html+details.erb
430
520
  - app/views/ahoy_captain/campaigns/index.html.erb
431
- - app/views/ahoy_captain/cities/index.html+details.erb
432
- - app/views/ahoy_captain/cities/index.html.erb
433
- - app/views/ahoy_captain/countries/index.html+details.erb
434
- - app/views/ahoy_captain/countries/index.html.erb
435
521
  - app/views/ahoy_captain/devices/_table.html.erb
436
522
  - app/views/ahoy_captain/devices/index.html+details.erb
437
523
  - app/views/ahoy_captain/devices/index.html.erb
@@ -443,12 +529,18 @@ files:
443
529
  - app/views/ahoy_captain/funnels/show.html.erb
444
530
  - app/views/ahoy_captain/goals/index.html.erb
445
531
  - app/views/ahoy_captain/layouts/application.html.erb
532
+ - app/views/ahoy_captain/layouts/shared/_tile_loader.html.erb
533
+ - app/views/ahoy_captain/locations/cities/index.html+details.erb
534
+ - app/views/ahoy_captain/locations/cities/index.html.erb
535
+ - app/views/ahoy_captain/locations/countries/index.html+details.erb
536
+ - app/views/ahoy_captain/locations/countries/index.html.erb
537
+ - app/views/ahoy_captain/locations/maps/show.html.erb
538
+ - app/views/ahoy_captain/locations/regions/index.html+details.erb
539
+ - app/views/ahoy_captain/locations/regions/index.html.erb
446
540
  - app/views/ahoy_captain/properties/_form.html.erb
447
541
  - app/views/ahoy_captain/properties/index.html.erb
448
542
  - app/views/ahoy_captain/properties/show.html.erb
449
543
  - app/views/ahoy_captain/realtimes/show.html.erb
450
- - app/views/ahoy_captain/regions/index.html+details.erb
451
- - app/views/ahoy_captain/regions/index.html.erb
452
544
  - app/views/ahoy_captain/roots/_filters.html.erb
453
545
  - app/views/ahoy_captain/roots/show.html.erb
454
546
  - app/views/ahoy_captain/sources/index.html+details.erb
@@ -1,30 +0,0 @@
1
- import { Controller } from '@hotwired/stimulus';
2
-
3
- export default class extends Controller {
4
- static targets = ["link", "alt"]
5
- static values = {
6
- classes: { type: Array, default: ["text-primary", "font-semibold"] }
7
- }
8
-
9
- // sometimes the target is not the link itself but a child element, and we want to highlight something other than the
10
- // link itself.
11
- // this can be bettered
12
- connect() {
13
- this.handleLinkClick = (event) => {
14
- let link = null;
15
- if(event.target.tagName === "A") {
16
- link = event.target;
17
- } else {
18
- link = (event.target.closest('a').querySelector('[data-active-links-target="link"]'))
19
- }
20
- this.linkTargets.forEach(link => this.classesValue.forEach(klass => link.classList.remove(klass)))
21
- this.classesValue.forEach(klass => link.classList.add(klass))
22
- }
23
- this.linkTargets.forEach(link => {
24
- link.addEventListener('click', this.handleLinkClick)
25
- })
26
- this.altTargets.forEach(target => {
27
- target.addEventListener('click', this.handleLinkClick)
28
- })
29
- }
30
- }
@@ -1,20 +0,0 @@
1
- module AhoyCaptain
2
- class CitiesController < ApplicationController
3
- include AhoyCaptain::Limitable
4
-
5
- before_action do
6
- if Widget.disabled?(:locations, :cities)
7
- raise Widget::WidgetDisabled.new("Widget disabled", :geography)
8
- end
9
- end
10
-
11
- def index
12
- results = cached(:cities) do
13
- CityQuery.call(params)
14
- .limit(limit)
15
- end
16
-
17
- @cities = paginate(results).map { |city| CityDecorator.new(city, self) }
18
- end
19
- end
20
- end
@@ -1,20 +0,0 @@
1
- module AhoyCaptain
2
- class CountriesController < ApplicationController
3
- include Limitable
4
-
5
- before_action do
6
- if Widget.disabled?(:locations, :countries)
7
- raise Widget::WidgetDisabled.new("Widget disabled", :geography)
8
- end
9
- end
10
-
11
- def index
12
- results = cached(:countries) do
13
- CountryQuery.call(params)
14
- .limit(limit)
15
- end
16
-
17
- @countries = paginate(results).map { |country| CountryDecorator.new(country, self) }
18
- end
19
- end
20
- end
@@ -1,20 +0,0 @@
1
- module AhoyCaptain
2
- class RegionsController < ApplicationController
3
- include Limitable
4
-
5
- before_action do
6
- if Widget.disabled?(:locations, :regions)
7
- raise Widget::WidgetDisabled.new("Widget disabled", :geography)
8
- end
9
- end
10
-
11
- def index
12
- results = cached(:regions) do
13
- RegionQuery.call(params)
14
- .limit(limit)
15
- end
16
-
17
- @regions = paginate(results).map { |region| RegionDecorator.new(region, self) }
18
- end
19
- end
20
- end