avo 0.5.0.beta1 → 0.5.0.beta6

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 (148) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +4 -4
  3. data/Gemfile.lock +1 -5
  4. data/README.md +4 -0
  5. data/app/components/avo/index/grid_item_component.html.erb +8 -8
  6. data/app/components/avo/index/grid_item_component.rb +6 -12
  7. data/app/components/avo/index/resource_controls_component.html.erb +1 -1
  8. data/app/components/avo/index/resource_grid_component.html.erb +1 -1
  9. data/app/components/avo/index/resource_table_component.html.erb +2 -2
  10. data/app/components/avo/index/table_row_component.html.erb +1 -1
  11. data/app/controllers/avo/actions_controller.rb +2 -4
  12. data/app/controllers/avo/application_controller.rb +6 -3
  13. data/app/controllers/avo/base_controller.rb +10 -7
  14. data/app/controllers/avo/relations_controller.rb +1 -1
  15. data/app/controllers/avo/search_controller.rb +1 -1
  16. data/app/frontend/packs/application.js +1 -1
  17. data/app/views/avo/base/_actions.html.erb +1 -7
  18. data/app/views/avo/base/_boolean_filter.html.erb +1 -1
  19. data/app/views/avo/base/_filters.html.erb +3 -11
  20. data/app/views/avo/base/_select_filter.html.erb +1 -1
  21. data/app/views/avo/home/_resources.html.erb +0 -1
  22. data/app/views/avo/partials/_table_header.html.erb +1 -1
  23. data/app/views/avo/sidebar/_sidebar.html.erb +1 -1
  24. data/app/views/layouts/avo/_filter_wrapper.html.erb +1 -1
  25. data/app/views/layouts/avo/application.html.erb +5 -0
  26. data/avo.gemspec +0 -1
  27. data/config/webpacker.yml +10 -23
  28. data/lib/avo.rb +5 -16
  29. data/lib/avo/app.rb +190 -0
  30. data/lib/avo/base_action.rb +123 -0
  31. data/lib/avo/base_resource.rb +323 -0
  32. data/lib/avo/configuration.rb +8 -0
  33. data/lib/avo/engine.rb +12 -31
  34. data/lib/avo/{app/fields → fields}/badge_field.rb +1 -1
  35. data/lib/avo/{app/fields/field.rb → fields/base_field.rb} +3 -7
  36. data/lib/avo/{app/fields/belongs_to.rb → fields/belongs_to_field.rb} +3 -3
  37. data/lib/avo/{app/fields → fields}/boolean_field.rb +1 -1
  38. data/lib/avo/{app/fields → fields}/boolean_group_field.rb +1 -1
  39. data/lib/avo/{app/fields → fields}/code_field.rb +1 -1
  40. data/lib/avo/{app/fields → fields}/country_field.rb +1 -1
  41. data/lib/avo/{app/fields → fields}/currency_field.rb +1 -1
  42. data/lib/avo/{app/fields → fields}/date_field.rb +0 -2
  43. data/lib/avo/{app/fields → fields}/date_time_field.rb +0 -2
  44. data/lib/avo/{app/fields → fields}/external_image_field.rb +5 -4
  45. data/lib/avo/{app/fields → fields}/field_extensions/has_field_name.rb +0 -0
  46. data/lib/avo/{app/fields → fields}/field_extensions/visible_in_different_views.rb +1 -1
  47. data/lib/avo/{app/fields → fields}/file_field.rb +1 -2
  48. data/lib/avo/{app/fields → fields}/files_field.rb +1 -2
  49. data/lib/avo/{app/fields → fields}/gravatar_field.rb +1 -1
  50. data/lib/avo/{app/fields/has_and_belongs_to_many.rb → fields/has_and_belongs_to_many_field.rb} +1 -1
  51. data/lib/avo/{app/fields/has_many.rb → fields/has_many_field.rb} +1 -1
  52. data/lib/avo/{app/fields/has_one.rb → fields/has_one_field.rb} +1 -1
  53. data/lib/avo/{app/fields → fields}/heading_field.rb +1 -1
  54. data/lib/avo/{app/fields → fields}/hidden_field.rb +0 -2
  55. data/lib/avo/{app/fields → fields}/id_field.rb +1 -1
  56. data/lib/avo/{app/fields → fields}/key_value_field.rb +1 -1
  57. data/lib/avo/{app/fields → fields}/markdown_field.rb +1 -3
  58. data/lib/avo/{app/fields → fields}/number_field.rb +0 -2
  59. data/lib/avo/{app/fields → fields}/password_field.rb +0 -2
  60. data/lib/avo/{app/fields → fields}/select_field.rb +1 -1
  61. data/lib/avo/{app/fields → fields}/status_field.rb +1 -1
  62. data/lib/avo/{app/fields → fields}/text_field.rb +1 -1
  63. data/lib/avo/{app/fields → fields}/textarea_field.rb +0 -2
  64. data/lib/avo/{app/fields → fields}/trix_field.rb +1 -3
  65. data/lib/avo/filters/base_filter.rb +20 -0
  66. data/lib/avo/filters/boolean_filter.rb +7 -0
  67. data/lib/avo/filters/select_filter.rb +7 -0
  68. data/lib/avo/{app/grid_fields → grid_fields}/body_field.rb +0 -2
  69. data/lib/avo/{app/grid_fields → grid_fields}/grid_field.rb +0 -0
  70. data/lib/avo/{app/grid_fields → grid_fields}/preview_field.rb +0 -2
  71. data/lib/avo/{app/grid_fields → grid_fields}/title_field.rb +0 -2
  72. data/lib/avo/licensing/community_license.rb +6 -0
  73. data/lib/avo/licensing/h_q.rb +88 -0
  74. data/lib/avo/licensing/license.rb +50 -0
  75. data/lib/avo/licensing/license_manager.rb +22 -0
  76. data/lib/avo/licensing/null_license.rb +14 -0
  77. data/lib/avo/licensing/pro_license.rb +11 -0
  78. data/lib/avo/loaders/actions_loader.rb +6 -0
  79. data/lib/avo/loaders/fields_loader.rb +27 -0
  80. data/lib/avo/loaders/filters_loader.rb +6 -0
  81. data/lib/avo/loaders/loader.rb +15 -0
  82. data/lib/avo/services/authorization_service.rb +93 -0
  83. data/lib/avo/services/panel_service.rb +27 -0
  84. data/lib/avo/{app/tools_manager.rb → tools_manager.rb} +0 -0
  85. data/lib/avo/version.rb +1 -1
  86. data/lib/generators/avo/action_generator.rb +11 -5
  87. data/lib/generators/avo/controller_generator.rb +14 -8
  88. data/lib/generators/avo/filter_generator.rb +14 -8
  89. data/lib/generators/avo/install_generator.rb +14 -10
  90. data/lib/generators/avo/locales_generator.rb +16 -0
  91. data/lib/generators/avo/partials_generator.rb +14 -0
  92. data/lib/generators/avo/resource_generator.rb +33 -15
  93. data/lib/generators/avo/templates/{action.rb → action.tt} +2 -4
  94. data/lib/generators/avo/templates/filters/boolean_filter.tt +11 -0
  95. data/lib/generators/avo/templates/filters/select_filter.tt +11 -0
  96. data/lib/generators/avo/templates/initializer/{avo.rb → avo.tt} +6 -4
  97. data/lib/generators/avo/templates/locales/avo.en.yml +17 -0
  98. data/lib/generators/avo/templates/partials/_footer.html.erb +3 -0
  99. data/lib/generators/avo/templates/partials/_header.html.erb +1 -0
  100. data/lib/generators/avo/templates/{views → partials}/_logo.html.erb +0 -0
  101. data/lib/generators/avo/templates/{views → partials}/_scripts.html.erb +0 -0
  102. data/lib/generators/avo/templates/resource/controller.tt +2 -0
  103. data/lib/generators/avo/templates/resource/resource.tt +17 -0
  104. data/public/avo-packs/css/{application-3598cfbb.css → application-c75ac28c.css} +1 -1
  105. data/public/avo-packs/css/application-c75ac28c.css.br +0 -0
  106. data/public/avo-packs/css/{application-3598cfbb.css.gz → application-c75ac28c.css.gz} +0 -0
  107. data/public/avo-packs/js/{application-6ba2bd1bca05d69b96e0.js → application-8849c6e2c8f75d55c666.js} +3 -3
  108. data/public/avo-packs/js/{application-6ba2bd1bca05d69b96e0.js.LICENSE.txt → application-8849c6e2c8f75d55c666.js.LICENSE.txt} +0 -0
  109. data/public/avo-packs/js/application-8849c6e2c8f75d55c666.js.br +0 -0
  110. data/public/avo-packs/js/application-8849c6e2c8f75d55c666.js.gz +0 -0
  111. data/public/avo-packs/js/{application-6ba2bd1bca05d69b96e0.js.map → application-8849c6e2c8f75d55c666.js.map} +1 -1
  112. data/public/avo-packs/js/application-8849c6e2c8f75d55c666.js.map.br +0 -0
  113. data/public/avo-packs/js/{application-6ba2bd1bca05d69b96e0.js.map.gz → application-8849c6e2c8f75d55c666.js.map.gz} +0 -0
  114. data/public/avo-packs/manifest.json +6 -6
  115. data/public/avo-packs/manifest.json.br +0 -0
  116. data/public/avo-packs/manifest.json.gz +0 -0
  117. metadata +78 -93
  118. data/app/controllers/avo/resource_overview_controller.rb +0 -26
  119. data/config/webpacker_packed.yml +0 -86
  120. data/lib/avo/app/action.rb +0 -162
  121. data/lib/avo/app/actions_loader.rb +0 -11
  122. data/lib/avo/app/app.rb +0 -181
  123. data/lib/avo/app/fields_loader.rb +0 -29
  124. data/lib/avo/app/filter.rb +0 -34
  125. data/lib/avo/app/filters/boolean_filter.rb +0 -13
  126. data/lib/avo/app/filters/select_filter.rb +0 -13
  127. data/lib/avo/app/licensing/community_license.rb +0 -4
  128. data/lib/avo/app/licensing/hq.rb +0 -86
  129. data/lib/avo/app/licensing/license.rb +0 -48
  130. data/lib/avo/app/licensing/license_manager.rb +0 -25
  131. data/lib/avo/app/licensing/null_license.rb +0 -12
  132. data/lib/avo/app/licensing/pro_license.rb +0 -9
  133. data/lib/avo/app/resource.rb +0 -291
  134. data/lib/avo/app/resource_grid_fields.rb +0 -30
  135. data/lib/avo/app/services/authorization_service.rb +0 -110
  136. data/lib/avo/app/services/panel_service.rb +0 -25
  137. data/lib/avo/app/tool.rb +0 -5
  138. data/lib/generators/avo/templates/filters/boolean_filter.rb +0 -17
  139. data/lib/generators/avo/templates/filters/select_filter.rb +0 -17
  140. data/lib/generators/avo/templates/resource/%plural_name%_controller.tt +0 -2
  141. data/lib/generators/avo/templates/resource/%singular_name%.tt +0 -20
  142. data/lib/generators/avo/templates/views/_footer.html.erb +0 -3
  143. data/lib/generators/avo/templates/views/_header.html.erb +0 -1
  144. data/lib/generators/avo/views_generator.rb +0 -8
  145. data/public/avo-packs/css/application-3598cfbb.css.br +0 -0
  146. data/public/avo-packs/js/application-6ba2bd1bca05d69b96e0.js.br +0 -0
  147. data/public/avo-packs/js/application-6ba2bd1bca05d69b96e0.js.gz +0 -0
  148. data/public/avo-packs/js/application-6ba2bd1bca05d69b96e0.js.map.br +0 -0
@@ -1,26 +0,0 @@
1
- require_dependency 'avo/application_controller'
2
-
3
- module Avo
4
- class ResourceOverviewController < ApplicationController
5
- def index
6
- resources = App.get_resources
7
- .select do |resource|
8
- AuthorizationService::authorize _current_user, resource.model, Avo.configuration.authorization_methods.stringify_keys['index']
9
- end
10
- .sort_by(&:name)
11
- .map do |resource|
12
- {
13
- name: resource.name,
14
- url: resource.url,
15
- count: resource.model.count,
16
- }
17
- end
18
-
19
- render json: {
20
- resources: resources,
21
- hidden: Avo.configuration.hide_resource_overview_component,
22
- hide_docs: Avo.configuration.hide_documentation_link,
23
- }
24
- end
25
- end
26
- end
@@ -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,162 +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 render_response
68
- fields = get_fields.map { |field| field.fetch_for_action(model, resource) }
69
-
70
- {
71
- id: id,
72
- name: name,
73
- fields: fields,
74
- message: message,
75
- theme: theme,
76
- confirm_text: confirm_text,
77
- cancel_text: cancel_text,
78
- default: default,
79
- action_class: self.class.to_s,
80
- no_confirmation: no_confirmation,
81
- }
82
- end
83
-
84
- def hydrate(model: nil, resource: nil, user: nil)
85
- @model = model if model.present?
86
- @resource = resource if resource.present?
87
- @user = user if user.present?
88
-
89
- self
90
- end
91
-
92
- def handle_action(request, models, raw_fields)
93
- avo_fields = get_fields.map { |field| [field.id, field] }.to_h
94
-
95
- if raw_fields.present?
96
- fields = raw_fields.to_unsafe_h.map do |name, value|
97
- [name, avo_fields[name.to_sym].resolve_attribute(value)]
98
- end
99
-
100
- fields = fields.to_h
101
- else
102
- fields = {}
103
- end
104
-
105
- result = self.handle request, models, fields
106
-
107
- self
108
- end
109
-
110
- def param_id
111
- self.class.name.underscore.gsub '/', '_'
112
- end
113
-
114
- def name
115
- self.class.name.demodulize.underscore.humanize(keep_id_suffix: true)
116
- end
117
-
118
- def succeed(text)
119
- self.response[:message_type] = :notice
120
- self.response[:message] = text
121
-
122
- self
123
- end
124
-
125
- def fail(text)
126
- self.response[:message_type] = :alert
127
- self.response[:message] = text
128
-
129
- self
130
- end
131
-
132
- def redirect_to(path = nil, &block)
133
- self.response[:type] = :redirect
134
- if block.present?
135
- self.response[:path] = block
136
- else
137
- self.response[:path] = path
138
- end
139
-
140
- self
141
- end
142
-
143
- def reload
144
- self.response[:type] = :reload
145
-
146
- self
147
- end
148
-
149
- def download(path, filename)
150
- self.response[:type] = :download
151
- self.response[:path] = path
152
- self.response[:filename] = filename
153
-
154
- self
155
- end
156
-
157
- def self.param_id
158
- self.name.underscore.gsub '/', '_'
159
- end
160
- end
161
- end
162
- 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,181 +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 |r|
170
- r != :Resource
171
- end
172
- .map do |r|
173
- if Avo::Resources.const_get(r).is_a? Class
174
- resources r.to_s.underscore.downcase.pluralize.to_sym
175
- end
176
- end
177
- end
178
- end
179
- end
180
- end
181
- end