avo 2.1.2.pre2 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of avo might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Gemfile +3 -1
- data/Gemfile.lock +7 -1
- data/app/components/avo/button_component.rb +6 -2
- data/app/components/avo/fields/belongs_to_field/autocomplete_component.html.erb +1 -0
- data/app/components/avo/fields/belongs_to_field/edit_component.rb +5 -2
- data/app/components/avo/index/grid_item_component.html.erb +3 -1
- data/app/components/avo/index/table_row_component.html.erb +7 -5
- data/app/components/avo/panel_component.html.erb +4 -4
- data/app/components/avo/views/resource_edit_component.html.erb +2 -2
- data/app/components/avo/views/resource_new_component.html.erb +2 -2
- data/app/components/avo/views/resource_show_component.html.erb +2 -2
- data/app/controllers/avo/base_controller.rb +1 -1
- data/app/javascript/js/controllers/loading_button_controller.js +47 -10
- data/app/javascript/js/controllers/search_controller.js +3 -0
- data/app/views/avo/partials/_table_header.html.erb +12 -13
- data/app/views/layouts/avo/application.html.erb +3 -0
- data/bin/helpers.rb +7 -1
- data/bin/init +2 -2
- data/lib/avo/base_resource.rb +1 -3
- data/lib/avo/dynamic_router.rb +1 -1
- data/lib/avo/engine.rb +0 -1
- data/lib/avo/fields/belongs_to_field.rb +2 -0
- data/lib/avo/reloader.rb +7 -7
- data/lib/avo/version.rb +1 -1
- data/public/avo-assets/avo.css +2 -2
- data/public/avo-assets/avo.js +2 -2
- data/public/avo-assets/avo.js.map +2 -2
- metadata +4 -7
- data/app/assets/builds/avo.css +0 -8810
- data/app/assets/builds/avo.js +0 -423
- data/app/assets/builds/avo.js.map +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6ddda419ee56fc6958c6014c1c87c4fc42d33564b4c3c6642b369729f2948b48
|
4
|
+
data.tar.gz: 8b76cd83e1c6fd3a4ea564ee09d4507b2de1034c390e3cf5d7ae4ec175a569e0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 52494cb524f70561a7ab099f44c1df29faf56897d7f487337a1d1831964e3732d31d69be7644b4adeb4a60b79e3199b2d931f5c2a726d8e2f136d6d40256b719
|
7
|
+
data.tar.gz: 2ce7d38f174655a677de092a486357fef13deca755839bd305eaf65ca81f5fd33eea543b69939ce396f65f752673b1131910044bb5ac923b71c0178ff7b8736c
|
data/Gemfile
CHANGED
@@ -34,7 +34,7 @@ gem "puma", "~> 5.6.4"
|
|
34
34
|
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
|
35
35
|
# gem "jbuilder", "~> 2.7"
|
36
36
|
# Use Redis adapter to run Action Cable in production
|
37
|
-
|
37
|
+
gem 'redis', '~> 4.0'
|
38
38
|
# Use Active Model has_secure_password
|
39
39
|
# gem 'bcrypt', '~> 3.1.7'
|
40
40
|
|
@@ -79,6 +79,8 @@ group :development do
|
|
79
79
|
# gem 'pry-rails'
|
80
80
|
|
81
81
|
gem 'htmlbeautifier'
|
82
|
+
|
83
|
+
gem "hotwire-livereload", "~> 1.1"
|
82
84
|
end
|
83
85
|
|
84
86
|
group :development, :test do
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
avo (2.
|
4
|
+
avo (2.2.0)
|
5
5
|
active_link_to
|
6
6
|
addressable
|
7
7
|
breadcrumbs_on_rails
|
@@ -183,6 +183,9 @@ GEM
|
|
183
183
|
hashdiff (1.0.1)
|
184
184
|
hightop (0.3.0)
|
185
185
|
activesupport (>= 5.2)
|
186
|
+
hotwire-livereload (1.1.0)
|
187
|
+
listen (>= 3.0.0)
|
188
|
+
rails (>= 6.0.0)
|
186
189
|
hotwire-rails (0.1.3)
|
187
190
|
rails (>= 6.0.0)
|
188
191
|
stimulus-rails
|
@@ -297,6 +300,7 @@ GEM
|
|
297
300
|
rb-fsevent (0.11.0)
|
298
301
|
rb-inotify (0.10.1)
|
299
302
|
ffi (~> 1.0)
|
303
|
+
redis (4.6.0)
|
300
304
|
regexp_parser (2.2.0)
|
301
305
|
responders (3.0.1)
|
302
306
|
actionpack (>= 5.0)
|
@@ -435,6 +439,7 @@ DEPENDENCIES
|
|
435
439
|
gem-release
|
436
440
|
groupdate
|
437
441
|
hightop
|
442
|
+
hotwire-livereload (~> 1.1)
|
438
443
|
hotwire-rails
|
439
444
|
htmlbeautifier
|
440
445
|
httparty
|
@@ -452,6 +457,7 @@ DEPENDENCIES
|
|
452
457
|
rails (~> 6.1.0)
|
453
458
|
rails-controller-testing
|
454
459
|
ransack
|
460
|
+
redis (~> 4.0)
|
455
461
|
rspec-rails (~> 4.0.0)
|
456
462
|
rubocop
|
457
463
|
rubocop-shopify
|
@@ -24,8 +24,12 @@ class Avo::ButtonComponent < ViewComponent::Base
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def args
|
27
|
-
if @args[:
|
27
|
+
if @args[:loading]
|
28
28
|
@args[:"data-controller"] = "loading-button"
|
29
|
+
|
30
|
+
if @args[:confirm]
|
31
|
+
@args[:"data-avo-confirm"] = @args.delete(:confirm)
|
32
|
+
end
|
29
33
|
end
|
30
34
|
|
31
35
|
@args[:class] = button_classes
|
@@ -34,7 +38,7 @@ class Avo::ButtonComponent < ViewComponent::Base
|
|
34
38
|
end
|
35
39
|
|
36
40
|
def button_classes
|
37
|
-
classes = "button-component inline-flex flex-grow-0 items-center text-sm font-semibold leading-6 fill-current whitespace-nowrap transition duration-100 transform transition duration-100 cursor-pointer disabled:cursor-not-allowed disabled:opacity-
|
41
|
+
classes = "button-component inline-flex flex-grow-0 items-center text-sm font-semibold leading-6 fill-current whitespace-nowrap transition duration-100 transform transition duration-100 cursor-pointer disabled:cursor-not-allowed disabled:opacity-70 border justify-center active:outline active:outline-1 #{@class}"
|
38
42
|
|
39
43
|
classes += " rounded" if @rounded.present?
|
40
44
|
|
@@ -7,6 +7,7 @@
|
|
7
7
|
></div>
|
8
8
|
<div class="relative w-full" autocomplete="off">
|
9
9
|
<%= @form.text_field @foreign_key,
|
10
|
+
type: :text,
|
10
11
|
value: field_label,
|
11
12
|
class: helpers.input_classes('w-full', has_error: @field.model_errors.include?(@field.id)),
|
12
13
|
placeholder: @field.placeholder,
|
@@ -9,8 +9,11 @@ class Avo::Fields::BelongsToField::EditComponent < Avo::Fields::EditComponent
|
|
9
9
|
|
10
10
|
def disabled
|
11
11
|
return true if @field.readonly
|
12
|
-
|
13
|
-
|
12
|
+
|
13
|
+
# When visiting the record through it's association we keep the field disabled by default
|
14
|
+
# We make an exception when the user deliberately instructs Avo to allow detaching in this scenario
|
15
|
+
return !@field.allow_via_detaching if @field.target_resource.present? && @field.target_resource.model_class.name == params[:via_resource_class]
|
16
|
+
return !@field.allow_via_detaching if @field.id.to_s == params[:via_relation].to_s
|
14
17
|
|
15
18
|
false
|
16
19
|
end
|
@@ -3,7 +3,9 @@
|
|
3
3
|
<%== item_selector_init @resource %>
|
4
4
|
>
|
5
5
|
<div class="relative w-full pb-3/4 rounded-t overflow-hidden">
|
6
|
-
|
6
|
+
<% if @resource.record_selector %>
|
7
|
+
<%== item_selector_input floating: true, size: :lg %>
|
8
|
+
<% end %>
|
7
9
|
<% if cover.blank? %>
|
8
10
|
<%= link_to cover.link_to_resource do %>
|
9
11
|
<%= render Avo::Index::GridCoverEmptyStateComponent.new %>
|
@@ -2,11 +2,13 @@
|
|
2
2
|
class="bg-white hover:bg-blue-50 hover:shadow-row hover:z-[21] relative z-20 border-b"
|
3
3
|
<%== item_selector_init @resource %>
|
4
4
|
>
|
5
|
-
|
6
|
-
<
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
<% if @resource.record_selector %>
|
6
|
+
<td class="w-10">
|
7
|
+
<div class="flex justify-center h-full">
|
8
|
+
<%== item_selector_input floating: false %>
|
9
|
+
</div>
|
10
|
+
</td>
|
11
|
+
<% end %>
|
10
12
|
<% @resource.get_fields(reflection: @reflection).each_with_index do |field, index| %>
|
11
13
|
<%= render field.component_for_view(:index).new(field: field, resource: @resource, index: index, parent_model: @parent_model) %>
|
12
14
|
<% end %>
|
@@ -1,19 +1,19 @@
|
|
1
1
|
<div <%== data_attributes %>>
|
2
2
|
<% if render_header? %>
|
3
3
|
<div class="<%= white_panel_classes %> p-4 flex-1 flex flex-col xl:flex-row justify-between mb-6">
|
4
|
-
<div class="overflow-hidden mr-4">
|
4
|
+
<div class="overflow-hidden mr-4 flex flex-col">
|
5
5
|
<% if display_breadcrumbs? %>
|
6
6
|
<div class="breadcrumbs truncate mb-2">
|
7
7
|
<%= helpers.render_breadcrumbs(separator: helpers.svg('chevron-right', class: 'inline-block h-3 stroke-current relative top-[-1px] ml-1' )) if Avo.configuration.display_breadcrumbs %>
|
8
8
|
</div>
|
9
9
|
<% end %>
|
10
10
|
|
11
|
-
<div class="text-2xl tracking-normal font-semibold text-gray-800 truncate" data-target="title">
|
12
|
-
|
11
|
+
<div class="text-2xl tracking-normal font-semibold text-gray-800 truncate items-center flex flex-1" data-target="title">
|
12
|
+
<span><%= @title %></span>
|
13
13
|
</div>
|
14
14
|
|
15
15
|
<% if description.present? %>
|
16
|
-
<div class="text-base tracking-normal font-medium text-gray-600
|
16
|
+
<div class="text-base tracking-normal font-medium text-gray-600" data-target="description">
|
17
17
|
<%== description %>
|
18
18
|
</div>
|
19
19
|
<% end %>
|
@@ -13,7 +13,7 @@
|
|
13
13
|
<%= t('avo.cancel').capitalize %>
|
14
14
|
<% end %>
|
15
15
|
<% if can_see_the_save_button? %>
|
16
|
-
<%= a_button color: :green,
|
16
|
+
<%= a_button color: :green, loading: true, type: :submit, icon: 'save' do %>
|
17
17
|
<%= t('avo.save').capitalize %>
|
18
18
|
<% end %>
|
19
19
|
<% end %>
|
@@ -24,7 +24,7 @@
|
|
24
24
|
<%= t('avo.cancel').capitalize %>
|
25
25
|
<% end %>
|
26
26
|
<% if can_see_the_save_button? %>
|
27
|
-
<%= a_button color: :green,
|
27
|
+
<%= a_button color: :green, loading: true, type: :submit, icon: 'save' do %>
|
28
28
|
<%= t('avo.save').capitalize %>
|
29
29
|
<% end %>
|
30
30
|
<% end %>
|
@@ -18,7 +18,7 @@
|
|
18
18
|
<%= t('avo.cancel').capitalize %>
|
19
19
|
<% end %>
|
20
20
|
<% if can_see_the_save_button? %>
|
21
|
-
<%= a_button color: 'green',
|
21
|
+
<%= a_button color: 'green', loading: true, type: :submit, icon: 'save' do %>
|
22
22
|
<%= t('avo.save').capitalize %>
|
23
23
|
<% end %>
|
24
24
|
<% end %>
|
@@ -30,7 +30,7 @@
|
|
30
30
|
<%= t('avo.cancel').capitalize %>
|
31
31
|
<% end %>
|
32
32
|
<% if can_see_the_save_button? %>
|
33
|
-
<%= a_button color: :green,
|
33
|
+
<%= a_button color: :green, loading: true, type: :submit, icon: 'save' do %>
|
34
34
|
<%= t('avo.save').capitalize %>
|
35
35
|
<% end %>
|
36
36
|
<% end %>
|
@@ -35,12 +35,12 @@
|
|
35
35
|
method: :delete,
|
36
36
|
local: true,
|
37
37
|
title: t('avo.delete_item', item: @resource.model.model_name.name.downcase).capitalize,
|
38
|
-
|
38
|
+
loading: true,
|
39
|
+
confirm: t('avo.are_you_sure', item: @resource.model.model_name.name.downcase),
|
39
40
|
color: :red,
|
40
41
|
icon: 'trash',
|
41
42
|
form_class: 'flex flex-col sm:flex-row sm:inline-flex',
|
42
43
|
data: {
|
43
|
-
confirm: t('avo.are_you_sure', item: @resource.model.model_name.name.downcase),
|
44
44
|
control: :destroy,
|
45
45
|
'resource-id': @resource.model.id,
|
46
46
|
'tippy': 'tooltip',
|
@@ -44,7 +44,7 @@ module Avo
|
|
44
44
|
unless @index_params[:sort_by].eql? :created_at
|
45
45
|
@query = @query.unscope(:order)
|
46
46
|
end
|
47
|
-
@query = @query.order(
|
47
|
+
@query = @query.order("#{@resource.model_class.table_name}.#{@index_params[:sort_by]} #{@index_params[:sort_direction]}")
|
48
48
|
end
|
49
49
|
|
50
50
|
# Apply filters
|
@@ -1,3 +1,4 @@
|
|
1
|
+
/* eslint-disable no-alert */
|
1
2
|
import { Controller } from '@hotwired/stimulus'
|
2
3
|
|
3
4
|
export default class extends Controller {
|
@@ -6,17 +7,53 @@ export default class extends Controller {
|
|
6
7
|
<div class="double-bounce2"></div>
|
7
8
|
</div>`;
|
8
9
|
|
10
|
+
confirmed = false
|
11
|
+
|
9
12
|
connect() {
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
13
|
+
this.context.scope.element.addEventListener('click', (e) => {
|
14
|
+
// If the user has to confirm the action
|
15
|
+
if (this.confirmationMessage) {
|
16
|
+
// Intervene only if not confirmed
|
17
|
+
if (!this.confirmed) {
|
18
|
+
e.preventDefault()
|
19
|
+
if (window.confirm(this.confirmationMessage)) {
|
20
|
+
this.applyLoader()
|
21
|
+
}
|
22
|
+
}
|
23
|
+
} else {
|
24
|
+
this.applyLoader()
|
25
|
+
}
|
20
26
|
})
|
21
27
|
}
|
28
|
+
|
29
|
+
get button() {
|
30
|
+
return this.context.scope.element
|
31
|
+
}
|
32
|
+
|
33
|
+
get confirmationMessage() {
|
34
|
+
return this.context.scope.element.getAttribute('data-avo-confirm')
|
35
|
+
}
|
36
|
+
|
37
|
+
applyLoader() {
|
38
|
+
const { button } = this
|
39
|
+
|
40
|
+
button.style.width = `${button.getBoundingClientRect().width}px`
|
41
|
+
button.style.height = `${button.getBoundingClientRect().height}px`
|
42
|
+
button.innerHTML = this.spinnerMarkup
|
43
|
+
button.classList.add('justify-center')
|
44
|
+
|
45
|
+
setTimeout(() => {
|
46
|
+
this.markConfirmed()
|
47
|
+
button.click()
|
48
|
+
button.setAttribute('disabled', 'disabled')
|
49
|
+
}, 1)
|
50
|
+
}
|
51
|
+
|
52
|
+
markConfirmed() {
|
53
|
+
this.confirmed = true
|
54
|
+
}
|
55
|
+
|
56
|
+
markUnconfirmed() {
|
57
|
+
this.confirmed = false
|
58
|
+
}
|
22
59
|
}
|
@@ -88,6 +88,9 @@ export default class extends Controller {
|
|
88
88
|
} else {
|
89
89
|
Turbo.visit(item._url, { action: 'advance' })
|
90
90
|
}
|
91
|
+
|
92
|
+
// On searchable belongs to the class `aa-Detached` remains on the body making it unscrollable
|
93
|
+
document.body.classList.remove('aa-Detached')
|
91
94
|
}
|
92
95
|
|
93
96
|
addSource(resourceName, data) {
|
@@ -1,10 +1,11 @@
|
|
1
|
-
|
2
1
|
<thead class="bg-white border-b border-gray-200 pb-1">
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
2
|
+
<% if @resource.record_selector %>
|
3
|
+
<th class="rounded-lg">
|
4
|
+
<%== item_select_all_input %>
|
5
|
+
</th>
|
6
|
+
<% end %>
|
7
|
+
<% fields.each_with_index do |field, index| %>
|
8
|
+
<%
|
8
9
|
if params[:sort_by] == field.id.to_s
|
9
10
|
if params[:sort_direction] == 'asc'
|
10
11
|
sort_by = nil
|
@@ -28,8 +29,7 @@
|
|
28
29
|
sort_by = field.id
|
29
30
|
sort_direction = 'desc'
|
30
31
|
end
|
31
|
-
classes = "text-gray-500 tracking-tight leading-tight text-sm font-semibold"
|
32
|
-
%>
|
32
|
+
classes = "text-gray-500 tracking-tight leading-tight text-sm font-semibold" %>
|
33
33
|
<th class="text-left uppercase px-3 py-4 whitespace-nowrap rounded-l">
|
34
34
|
<% if field.sortable %>
|
35
35
|
<%= link_to params.permit!.merge(sort_by: sort_by, sort_direction: sort_direction), class: "flex items-center #{classes} #{'cursor-pointer' if field.sortable}", 'data-turbo-frame': params[:turbo_frame] do %>
|
@@ -37,14 +37,13 @@
|
|
37
37
|
<%= render partial: 'avo/partials/sortable_component', locals: {field: field} %>
|
38
38
|
<% end %>
|
39
39
|
<% else %>
|
40
|
-
|
41
|
-
|
42
|
-
|
40
|
+
<div class="flex items-center <%= classes %>">
|
41
|
+
<%= field.name %>
|
42
|
+
</div>
|
43
43
|
<% end %>
|
44
44
|
</th>
|
45
45
|
<% end %>
|
46
|
-
|
47
46
|
<th class="w-24">
|
48
|
-
<!--
|
47
|
+
<!-- Item controls cell -->
|
49
48
|
</th>
|
50
49
|
</thead>
|
@@ -16,6 +16,9 @@
|
|
16
16
|
<% else %>
|
17
17
|
<%= javascript_include_tag "avo", "data-turbo-track": "reload", defer: true %>
|
18
18
|
<%= stylesheet_link_tag "avo", "data-turbo-track": "reload", defer: true %>
|
19
|
+
<% if Rails.env.development? %>
|
20
|
+
<%= javascript_include_tag "hotwire-livereload", defer: true %>
|
21
|
+
<% end %>
|
19
22
|
<% end %>
|
20
23
|
</head>
|
21
24
|
<body class="bg-application os-mac">
|
data/bin/helpers.rb
CHANGED
@@ -22,8 +22,14 @@ end
|
|
22
22
|
|
23
23
|
def ask(question:, valid_answers: [])
|
24
24
|
puts "\n#{question} (#{valid_answers.join('/')})"
|
25
|
+
# An uppercase option is treated as a default answer. Otherwise, we disregard case, and always
|
26
|
+
# return the answer in lowercase.
|
27
|
+
default_answer = valid_answers.select { |val| val == val.upcase }.first&.downcase
|
25
28
|
|
26
|
-
|
29
|
+
valid_answers.map!(&:downcase)
|
30
|
+
|
31
|
+
input = gets.downcase.chomp
|
32
|
+
input = default_answer if input == ''
|
27
33
|
|
28
34
|
while !valid_answers.include?(input)
|
29
35
|
puts 'Invalid input, please try again.'
|
data/bin/init
CHANGED
@@ -17,7 +17,7 @@ app_root do
|
|
17
17
|
header 'Installing Yarn packages'
|
18
18
|
run! 'yarn'
|
19
19
|
|
20
|
-
if use_docker
|
20
|
+
if use_docker == 'y'
|
21
21
|
header 'Creating the Docker volume'
|
22
22
|
run! 'docker volume create --name=avo-db-data'
|
23
23
|
|
@@ -28,7 +28,7 @@ app_root do
|
|
28
28
|
header 'Preparing the database'
|
29
29
|
run! 'bin/rails db:setup'
|
30
30
|
|
31
|
-
if use_docker
|
31
|
+
if use_docker == 'y'
|
32
32
|
header 'Stopping the Docker image'
|
33
33
|
run! 'docker-compose stop'
|
34
34
|
end
|
data/lib/avo/base_resource.rb
CHANGED
@@ -43,6 +43,7 @@ module Avo
|
|
43
43
|
class_attribute :after_create_path, default: :show
|
44
44
|
class_attribute :after_update_path, default: :show
|
45
45
|
class_attribute :invalid_fields
|
46
|
+
class_attribute :record_selector, default: true
|
46
47
|
|
47
48
|
class << self
|
48
49
|
delegate :t, to: ::I18n
|
@@ -285,9 +286,6 @@ module Avo
|
|
285
286
|
end
|
286
287
|
|
287
288
|
def name
|
288
|
-
# return 'hwhwhw'
|
289
|
-
|
290
|
-
|
291
289
|
default = class_name_without_resource.titlecase
|
292
290
|
|
293
291
|
return @name if @name.present?
|
data/lib/avo/dynamic_router.rb
CHANGED
data/lib/avo/engine.rb
CHANGED
@@ -19,7 +19,6 @@ module Avo
|
|
19
19
|
|
20
20
|
config.i18n.load_path += Dir[Avo::Engine.root.join('lib', 'generators', 'avo', 'templates', 'locales', '*.{rb,yml}')]
|
21
21
|
|
22
|
-
# initializer "avo.autoload", before: :set_autoload_paths do |app|
|
23
22
|
initializer "avo.autoload" do |app|
|
24
23
|
[
|
25
24
|
["app", "avo", "fields"],
|
@@ -61,6 +61,7 @@ module Avo
|
|
61
61
|
attr_reader :polymorphic_as
|
62
62
|
attr_reader :relation_method
|
63
63
|
attr_reader :types # for Polymorphic associations
|
64
|
+
attr_reader :allow_via_detaching
|
64
65
|
|
65
66
|
def initialize(id, **args, &block)
|
66
67
|
args[:placeholder] ||= I18n.t("avo.choose_an_option")
|
@@ -71,6 +72,7 @@ module Avo
|
|
71
72
|
@polymorphic_as = args[:polymorphic_as]
|
72
73
|
@types = args[:types]
|
73
74
|
@relation_method = id.to_s.parameterize.underscore
|
75
|
+
@allow_via_detaching = args[:allow_via_detaching] == true
|
74
76
|
end
|
75
77
|
|
76
78
|
def searchable
|
data/lib/avo/reloader.rb
CHANGED
@@ -3,31 +3,31 @@ class Avo::Reloader
|
|
3
3
|
|
4
4
|
def reload!
|
5
5
|
# reload all files declared in paths
|
6
|
-
|
6
|
+
files.each { |file| load file }
|
7
7
|
|
8
8
|
# reload all files declared in each directory
|
9
9
|
directories.keys.each do |dir|
|
10
|
-
Dir.glob("#{dir}/**/*.rb".to_s).each { |
|
10
|
+
Dir.glob("#{dir}/**/*.rb".to_s).each { |file| load file }
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
14
|
private
|
15
15
|
def updater
|
16
|
-
@updater ||= config.file_watcher.new(
|
16
|
+
@updater ||= config.file_watcher.new(files, directories) { reload! }
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
19
|
+
def files
|
20
20
|
# we want to watch some files no matter what
|
21
|
-
|
21
|
+
paths = [
|
22
22
|
Rails.root.join("config", "initializers", "avo.rb"),
|
23
23
|
]
|
24
24
|
|
25
25
|
# we want to watch some files only in Avo development
|
26
26
|
if reload_lib?
|
27
|
-
|
27
|
+
paths += []
|
28
28
|
end
|
29
29
|
|
30
|
-
|
30
|
+
paths
|
31
31
|
end
|
32
32
|
|
33
33
|
def directories
|
data/lib/avo/version.rb
CHANGED
data/public/avo-assets/avo.css
CHANGED