avo 0.5.0.beta4 → 0.5.0.beta5

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.

Files changed (133) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +4 -2
  3. data/Gemfile.lock +1 -1
  4. data/app/components/avo/index/grid_item_component.html.erb +8 -8
  5. data/app/components/avo/index/grid_item_component.rb +6 -12
  6. data/app/components/avo/index/resource_table_component.html.erb +1 -1
  7. data/app/components/avo/index/table_row_component.html.erb +1 -1
  8. data/app/controllers/avo/actions_controller.rb +2 -4
  9. data/app/controllers/avo/application_controller.rb +6 -3
  10. data/app/controllers/avo/base_controller.rb +0 -3
  11. data/app/controllers/avo/relations_controller.rb +1 -1
  12. data/app/controllers/avo/search_controller.rb +1 -1
  13. data/app/frontend/packs/application.js +1 -1
  14. data/app/views/avo/base/_actions.html.erb +0 -6
  15. data/app/views/avo/base/_boolean_filter.html.erb +1 -1
  16. data/app/views/avo/base/_filters.html.erb +3 -11
  17. data/app/views/avo/base/_select_filter.html.erb +1 -1
  18. data/app/views/avo/home/_resources.html.erb +0 -1
  19. data/app/views/layouts/avo/_filter_wrapper.html.erb +1 -1
  20. data/app/views/layouts/avo/application.html.erb +5 -0
  21. data/config/webpacker.yml +10 -23
  22. data/lib/avo.rb +5 -16
  23. data/lib/avo/app.rb +190 -0
  24. data/lib/avo/base_action.rb +115 -0
  25. data/lib/avo/base_resource.rb +321 -0
  26. data/lib/avo/configuration.rb +6 -0
  27. data/lib/avo/engine.rb +12 -31
  28. data/lib/avo/{app/fields → fields}/badge_field.rb +1 -1
  29. data/lib/avo/{app/fields/field.rb → fields/base_field.rb} +3 -7
  30. data/lib/avo/{app/fields/belongs_to.rb → fields/belongs_to_field.rb} +3 -3
  31. data/lib/avo/{app/fields → fields}/boolean_field.rb +1 -1
  32. data/lib/avo/{app/fields → fields}/boolean_group_field.rb +1 -1
  33. data/lib/avo/{app/fields → fields}/code_field.rb +1 -1
  34. data/lib/avo/{app/fields → fields}/country_field.rb +1 -1
  35. data/lib/avo/{app/fields → fields}/currency_field.rb +1 -1
  36. data/lib/avo/{app/fields → fields}/date_field.rb +0 -2
  37. data/lib/avo/{app/fields → fields}/date_time_field.rb +0 -2
  38. data/lib/avo/{app/fields → fields}/external_image_field.rb +1 -1
  39. data/lib/avo/{app/fields → fields}/field_extensions/has_field_name.rb +0 -0
  40. data/lib/avo/{app/fields → fields}/field_extensions/visible_in_different_views.rb +1 -1
  41. data/lib/avo/{app/fields → fields}/file_field.rb +1 -2
  42. data/lib/avo/{app/fields → fields}/files_field.rb +1 -2
  43. data/lib/avo/{app/fields → fields}/gravatar_field.rb +1 -1
  44. data/lib/avo/{app/fields/has_and_belongs_to_many.rb → fields/has_and_belongs_to_many_field.rb} +1 -1
  45. data/lib/avo/{app/fields/has_many.rb → fields/has_many_field.rb} +1 -1
  46. data/lib/avo/{app/fields/has_one.rb → fields/has_one_field.rb} +1 -1
  47. data/lib/avo/{app/fields → fields}/heading_field.rb +1 -1
  48. data/lib/avo/{app/fields → fields}/hidden_field.rb +0 -2
  49. data/lib/avo/{app/fields → fields}/id_field.rb +1 -1
  50. data/lib/avo/{app/fields → fields}/key_value_field.rb +1 -1
  51. data/lib/avo/{app/fields → fields}/markdown_field.rb +1 -3
  52. data/lib/avo/{app/fields → fields}/number_field.rb +0 -2
  53. data/lib/avo/{app/fields → fields}/password_field.rb +0 -2
  54. data/lib/avo/{app/fields → fields}/select_field.rb +1 -1
  55. data/lib/avo/{app/fields → fields}/status_field.rb +1 -1
  56. data/lib/avo/{app/fields → fields}/text_field.rb +1 -1
  57. data/lib/avo/{app/fields → fields}/textarea_field.rb +0 -2
  58. data/lib/avo/{app/fields → fields}/trix_field.rb +1 -3
  59. data/lib/avo/filters/base_filter.rb +20 -0
  60. data/lib/avo/filters/boolean_filter.rb +7 -0
  61. data/lib/avo/filters/select_filter.rb +7 -0
  62. data/lib/avo/{app/grid_fields → grid_fields}/body_field.rb +0 -2
  63. data/lib/avo/{app/grid_fields → grid_fields}/grid_field.rb +0 -0
  64. data/lib/avo/{app/grid_fields → grid_fields}/preview_field.rb +0 -2
  65. data/lib/avo/{app/grid_fields → grid_fields}/title_field.rb +0 -2
  66. data/lib/avo/licensing/community_license.rb +6 -0
  67. data/lib/avo/licensing/h_q.rb +88 -0
  68. data/lib/avo/licensing/license.rb +50 -0
  69. data/lib/avo/licensing/license_manager.rb +22 -0
  70. data/lib/avo/licensing/null_license.rb +14 -0
  71. data/lib/avo/licensing/pro_license.rb +11 -0
  72. data/lib/avo/loaders/actions_loader.rb +6 -0
  73. data/lib/avo/loaders/fields_loader.rb +27 -0
  74. data/lib/avo/loaders/filters_loader.rb +6 -0
  75. data/lib/avo/loaders/loader.rb +15 -0
  76. data/lib/avo/services/authorization_service.rb +93 -0
  77. data/lib/avo/services/panel_service.rb +27 -0
  78. data/lib/avo/{app/tools_manager.rb → tools_manager.rb} +0 -0
  79. data/lib/avo/version.rb +1 -1
  80. data/lib/generators/avo/action_generator.rb +11 -5
  81. data/lib/generators/avo/controller_generator.rb +14 -8
  82. data/lib/generators/avo/filter_generator.rb +14 -8
  83. data/lib/generators/avo/install_generator.rb +14 -10
  84. data/lib/generators/avo/locales_generator.rb +11 -7
  85. data/lib/generators/avo/partials_generator.rb +11 -5
  86. data/lib/generators/avo/resource_generator.rb +33 -15
  87. data/lib/generators/avo/templates/{action.rb → action.tt} +2 -4
  88. data/lib/generators/avo/templates/filters/boolean_filter.tt +11 -0
  89. data/lib/generators/avo/templates/filters/select_filter.tt +11 -0
  90. data/lib/generators/avo/templates/initializer/{avo.rb → avo.tt} +6 -0
  91. data/lib/generators/avo/templates/resource/controller.tt +2 -0
  92. data/lib/generators/avo/templates/resource/resource.tt +17 -0
  93. data/public/avo-packs/css/{application-3598cfbb.css → application-c75ac28c.css} +1 -1
  94. data/public/avo-packs/css/application-c75ac28c.css.br +0 -0
  95. data/public/avo-packs/css/{application-3598cfbb.css.gz → application-c75ac28c.css.gz} +0 -0
  96. data/public/avo-packs/js/{application-6ba2bd1bca05d69b96e0.js → application-8849c6e2c8f75d55c666.js} +3 -3
  97. data/public/avo-packs/js/{application-6ba2bd1bca05d69b96e0.js.LICENSE.txt → application-8849c6e2c8f75d55c666.js.LICENSE.txt} +0 -0
  98. data/public/avo-packs/js/application-8849c6e2c8f75d55c666.js.br +0 -0
  99. data/public/avo-packs/js/application-8849c6e2c8f75d55c666.js.gz +0 -0
  100. data/public/avo-packs/js/{application-6ba2bd1bca05d69b96e0.js.map → application-8849c6e2c8f75d55c666.js.map} +1 -1
  101. data/public/avo-packs/js/application-8849c6e2c8f75d55c666.js.map.br +0 -0
  102. data/public/avo-packs/js/{application-6ba2bd1bca05d69b96e0.js.map.gz → application-8849c6e2c8f75d55c666.js.map.gz} +0 -0
  103. data/public/avo-packs/manifest.json +6 -6
  104. data/public/avo-packs/manifest.json.br +0 -0
  105. data/public/avo-packs/manifest.json.gz +0 -0
  106. metadata +72 -73
  107. data/config/webpacker_packed.yml +0 -86
  108. data/lib/avo/app/action.rb +0 -145
  109. data/lib/avo/app/actions_loader.rb +0 -11
  110. data/lib/avo/app/app.rb +0 -183
  111. data/lib/avo/app/fields_loader.rb +0 -29
  112. data/lib/avo/app/filter.rb +0 -23
  113. data/lib/avo/app/filters/boolean_filter.rb +0 -13
  114. data/lib/avo/app/filters/select_filter.rb +0 -13
  115. data/lib/avo/app/licensing/community_license.rb +0 -4
  116. data/lib/avo/app/licensing/hq.rb +0 -86
  117. data/lib/avo/app/licensing/license.rb +0 -48
  118. data/lib/avo/app/licensing/license_manager.rb +0 -25
  119. data/lib/avo/app/licensing/null_license.rb +0 -12
  120. data/lib/avo/app/licensing/pro_license.rb +0 -9
  121. data/lib/avo/app/resource.rb +0 -299
  122. data/lib/avo/app/resource_grid_fields.rb +0 -30
  123. data/lib/avo/app/services/authorization_service.rb +0 -110
  124. data/lib/avo/app/services/panel_service.rb +0 -25
  125. data/lib/avo/app/tool.rb +0 -5
  126. data/lib/generators/avo/templates/filters/boolean_filter.rb +0 -17
  127. data/lib/generators/avo/templates/filters/select_filter.rb +0 -17
  128. data/lib/generators/avo/templates/resource/%plural_name%_controller.tt +0 -2
  129. data/lib/generators/avo/templates/resource/%singular_name%.tt +0 -20
  130. data/public/avo-packs/css/application-3598cfbb.css.br +0 -0
  131. data/public/avo-packs/js/application-6ba2bd1bca05d69b96e0.js.br +0 -0
  132. data/public/avo-packs/js/application-6ba2bd1bca05d69b96e0.js.gz +0 -0
  133. data/public/avo-packs/js/application-6ba2bd1bca05d69b96e0.js.map.br +0 -0
@@ -1,86 +0,0 @@
1
- # Note: You must restart bin/webpack-dev-server for changes to take effect
2
-
3
- default: &default
4
- source_path: app/frontend
5
- source_entry_path: packs
6
- public_root_path: public
7
- cache_path: tmp/cache/webpacker
8
- check_yarn_integrity: false
9
- # use a different sub-folder name
10
- public_output_path: avo-packs
11
- webpack_compile_output: true
12
-
13
- # Additional paths webpack should lookup modules
14
- # ['app/assets', 'engine/foo/app/assets']
15
- resolved_paths: []
16
-
17
- # Reload manifest.json on all requests so we reload latest compiled packs
18
- cache_manifest: false
19
-
20
- # Extract and emit a css file
21
- extract_css: true
22
-
23
- static_assets_extensions:
24
- - .jpg
25
- - .jpeg
26
- - .png
27
- - .gif
28
- - .tiff
29
- - .ico
30
- - .svg
31
- - .eot
32
- - .otf
33
- - .ttf
34
- - .woff
35
- - .woff2
36
-
37
- extensions:
38
- - .ts
39
- - .vue
40
- - .mjs
41
- - .js
42
- - .sass
43
- - .scss
44
- - .css
45
- - .module.sass
46
- - .module.scss
47
- - .module.css
48
- - .png
49
- - .svg
50
- - .gif
51
- - .jpeg
52
- - .jpg
53
-
54
- # We override the development env. when packed.
55
- # Avo needs to be packed and compiled for when the dev uses it in his development env.
56
- development:
57
- <<: *default
58
-
59
- # Production depends on precompilation of packs prior to booting for performance.
60
- compile: false
61
-
62
- # Extract and emit a css file
63
- extract_css: true
64
-
65
- # Cache manifest.json for performance
66
- cache_manifest: true
67
-
68
- test:
69
- <<: *default
70
- compile: true
71
-
72
- # Compile test packs to a separate directory
73
- public_output_path: packs-test
74
- public_root_path: spec/dummy/public
75
-
76
- production:
77
- <<: *default
78
-
79
- # Production depends on precompilation of packs prior to booting for performance.
80
- compile: false
81
-
82
- # Extract and emit a css file
83
- extract_css: true
84
-
85
- # Cache manifest.json for performance
86
- cache_manifest: true
@@ -1,145 +0,0 @@
1
- require_relative 'fields_loader'
2
-
3
-
4
- module Avo
5
- module Actions
6
- class Action
7
- attr_accessor :name
8
- attr_accessor :message
9
- attr_accessor :default
10
- attr_accessor :theme
11
- attr_accessor :confirm_text
12
- attr_accessor :cancel_text
13
- # response: {
14
- # message: String
15
- # message_type: success | error
16
- # type: reload | reload_resources | redirect | http_redirect | open_in_new_tab | download
17
- # path: String
18
- # filename: String
19
- # }
20
- attr_accessor :response
21
- attr_accessor :no_confirmation
22
- attr_accessor :model
23
- attr_accessor :resource
24
- attr_accessor :user
25
-
26
- attr_accessor :field_loader
27
-
28
- alias :field :field_loader
29
- alias :f :field
30
-
31
- @@default = nil
32
-
33
- def initialize
34
- @name ||= name
35
- @message ||= I18n.t('avo.are_you_sure_you_want_to_run_this_option')
36
- @default ||= ''
37
- @fields ||= []
38
- @confirm_text ||= I18n.t('avo.run')
39
- @cancel_text ||= I18n.t('avo.cancel')
40
- @response ||= {}
41
- @response[:message_type] ||= :notice
42
- @response[:message] ||= I18n.t('avo.action_ran_successfully')
43
- @theme ||= 'success'
44
- @no_confirmation ||= false
45
- end
46
-
47
- def boot_fields(request)
48
- @field_loader = Avo::FieldsLoader.new
49
- fields request if self.respond_to? :fields
50
- end
51
-
52
- def get_fields(view_type: :table)
53
- get_field_definitions.map do |field|
54
- field.hydrate(action: self, model: @model)
55
- end
56
- .select do |field|
57
- field.can_see.present? ? field.can_see.call : true
58
- end
59
- end
60
-
61
- def get_field_definitions
62
- @field_loader.bag.map do |field|
63
- field.hydrate(action: self)
64
- end
65
- end
66
-
67
- def hydrate(model: nil, resource: nil, user: nil)
68
- @model = model if model.present?
69
- @resource = resource if resource.present?
70
- @user = user if user.present?
71
-
72
- self
73
- end
74
-
75
- def handle_action(request, models, raw_fields)
76
- avo_fields = get_fields.map { |field| [field.id, field] }.to_h
77
-
78
- if raw_fields.present?
79
- fields = raw_fields.to_unsafe_h.map do |name, value|
80
- [name, avo_fields[name.to_sym].resolve_attribute(value)]
81
- end
82
-
83
- fields = fields.to_h
84
- else
85
- fields = {}
86
- end
87
-
88
- result = self.handle request, models, fields
89
-
90
- self
91
- end
92
-
93
- def param_id
94
- self.class.name.underscore.gsub '/', '_'
95
- end
96
-
97
- def name
98
- self.class.name.demodulize.underscore.humanize(keep_id_suffix: true)
99
- end
100
-
101
- def succeed(text)
102
- self.response[:message_type] = :notice
103
- self.response[:message] = text
104
-
105
- self
106
- end
107
-
108
- def fail(text)
109
- self.response[:message_type] = :alert
110
- self.response[:message] = text
111
-
112
- self
113
- end
114
-
115
- def redirect_to(path = nil, &block)
116
- self.response[:type] = :redirect
117
- if block.present?
118
- self.response[:path] = block
119
- else
120
- self.response[:path] = path
121
- end
122
-
123
- self
124
- end
125
-
126
- def reload
127
- self.response[:type] = :reload
128
-
129
- self
130
- end
131
-
132
- def download(path, filename)
133
- self.response[:type] = :download
134
- self.response[:path] = path
135
- self.response[:filename] = filename
136
-
137
- self
138
- end
139
-
140
- def self.param_id
141
- self.name.underscore.gsub '/', '_'
142
- end
143
- end
144
- end
145
- end
@@ -1,11 +0,0 @@
1
- class Avo::ActionsLoader
2
- attr_accessor :bag
3
-
4
- def initialize
5
- @bag = []
6
- end
7
-
8
- def use(klass)
9
- @bag.push klass
10
- end
11
- end
data/lib/avo/app/app.rb DELETED
@@ -1,183 +0,0 @@
1
- require_relative 'tools_manager'
2
- require_relative 'filter'
3
- require_relative 'filters/select_filter'
4
- require_relative 'filters/boolean_filter'
5
- require_relative 'resource'
6
- require_relative 'tool'
7
- require_relative 'services/authorization_service'
8
-
9
- module Avo
10
- class App
11
- @@app = {
12
- root_path: '',
13
- resources: [],
14
- cache_store: nil
15
- }
16
- @@license = nil
17
- @@fields = []
18
-
19
- class << self
20
- def boot
21
- # init_controllers
22
- @@app[:root_path] = Pathname.new(File.join(__dir__, '..', '..'))
23
- init_fields
24
- I18n.locale = Avo.configuration.language_code
25
-
26
- if Rails.cache.class == ActiveSupport::Cache::NullStore
27
- @@app[:cache_store] ||= ActiveSupport::Cache::MemoryStore.new
28
- else
29
- @@app[:cache_store] = Rails.cache
30
- end
31
- end
32
-
33
- def init(current_request = nil)
34
- # Set the current host for ActiveStorage
35
- ActiveStorage::Current.host = current_request.base_url
36
-
37
- init_resources current_request
38
- @@license = LicenseManager.new(HQ.new(current_request).response).license
39
- end
40
-
41
- def app
42
- @@app
43
- end
44
-
45
- def fields
46
- @@fields
47
- end
48
-
49
- def license
50
- @@license
51
- end
52
-
53
- def cache_store
54
- @@app[:cache_store]
55
- end
56
-
57
- # This method will find all fields available in the Avo::Fields namespace and add them to a @@fields array
58
- # so later we can instantiate them on our resources.
59
- #
60
- # If the field has their `def_method` set up it will follow that convention, if not it will snake_case the name:
61
- #
62
- # Avo::Fields::TextField -> text
63
- # Avo::Fields::DateTimeField -> date_time
64
- def init_fields
65
- Avo::Fields.constants.each do |class_name|
66
- next if class_name.to_s == 'Field'
67
-
68
- field_class = method_name = nil
69
-
70
- if class_name.to_s.end_with? 'Field'
71
- field_class = "Avo::Fields::#{class_name.to_s}".safe_constantize
72
- method_name = field_class.get_field_name
73
- else
74
- # Try one level deeper for custom fields
75
- namespace = class_name
76
- tool_provider = "Avo::Fields::#{namespace}::ToolProvider".safe_constantize
77
-
78
- next unless tool_provider.present?
79
-
80
- tool_provider.boot
81
-
82
- "Avo::Fields::#{namespace}".safe_constantize.constants.each do |custom_field_class|
83
- next unless custom_field_class.to_s.end_with? 'Field' or custom_field_class.to_s == 'Field'
84
-
85
- field_class = "Avo::Fields::#{namespace}::#{custom_field_class}".safe_constantize
86
- method_name = field_class.get_field_name
87
- end
88
- end
89
-
90
- if field_class.present? and method_name.present?
91
- load_field method_name, field_class
92
- end
93
- end
94
- end
95
-
96
- def load_field(method_name, klass)
97
- @@fields.push(
98
- name: method_name,
99
- class: klass,
100
- )
101
- end
102
-
103
- def init_resources(request)
104
- @@app[:resources] = Avo::Resources.constants
105
- .select do |r|
106
- r != :Resource
107
- end
108
- .map do |c|
109
- if Avo::Resources.const_get(c).is_a? Class
110
- "Avo::Resources::#{c}".safe_constantize.new request
111
- end
112
- end
113
- end
114
-
115
- def get_resources
116
- @@app[:resources]
117
- end
118
-
119
- # Returns the Avo resource by camelized name
120
- #
121
- # get_resource_by_name('User') => Avo::Resources::User
122
- def get_resource(resource)
123
- @@app[:resources].find do |available_resource|
124
- "Avo::Resources::#{resource}".safe_constantize == available_resource.class
125
- end
126
- end
127
-
128
- # Returns the Avo resource by singular snake_cased name
129
- #
130
- # get_resource_by_name('user') => Avo::Resources::User
131
- def get_resource_by_name(name)
132
- self.get_resource name.singularize.camelize
133
- end
134
-
135
- # Returns the Avo resource by singular snake_cased name
136
- #
137
- # get_resource_by_name('User') => Avo::Resources::User
138
- # get_resource_by_name(User) => Avo::Resources::User
139
- def get_resource_by_model_name(name)
140
- get_resources.find do |resource|
141
- resource.model_class.model_name.name == name.to_s
142
- end
143
- end
144
-
145
- # Returns the Rails model class by singular snake_cased name
146
- #
147
- # get_model_class_by_name('user') => User
148
- def get_model_class_by_name(name)
149
- name.to_s.camelize.singularize
150
- end
151
-
152
- def get_available_resources(user = nil)
153
- App.get_resources
154
- .select do |resource|
155
- AuthorizationService::authorize user, resource.model, Avo.configuration.authorization_methods.stringify_keys['index'], raise_exception: false
156
- end
157
- .sort_by { |r| r.name }
158
- end
159
-
160
- def get_navigation_items(user = nil)
161
- get_available_resources(user).select do |resource|
162
- resource.model_class.present?
163
- end
164
- end
165
-
166
- def draw_routes
167
- Proc.new do
168
- Avo::Resources.constants
169
- .select do |resource|
170
- resource != :Resource
171
- end
172
- .map do |resource|
173
- if Avo::Resources.const_get(resource).is_a? Class
174
- route_key = resource.to_s.underscore.downcase.pluralize.to_sym
175
-
176
- resources route_key
177
- end
178
- end
179
- end
180
- end
181
- end
182
- end
183
- end
@@ -1,29 +0,0 @@
1
- class Avo::FieldsLoader
2
- attr_accessor :bag
3
-
4
- def initialize
5
- @bag = []
6
- end
7
-
8
- def add_field(field)
9
- @bag.push field
10
- end
11
-
12
- def method_missing(method, *args, &block)
13
- matched_field = Avo::App.fields.find do |field|
14
- field[:name].to_s == method.to_s
15
- end
16
-
17
- if matched_field.present? and matched_field[:class].present?
18
- klass = matched_field[:class]
19
-
20
- if block.present?
21
- field = klass::new(args[0], **args[1] || {}, &block)
22
- else
23
- field = klass::new(args[0], **args[1] || {})
24
- end
25
-
26
- add_field field
27
- end
28
- end
29
- end