admin_it 1.0.11 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Gemfile +8 -1
  4. data/README.md +4 -2
  5. data/admin_it.gemspec +1 -0
  6. data/lib/admin_it.rb +7 -5
  7. data/lib/admin_it/actions/action.rb +5 -2
  8. data/lib/admin_it/config.rb +1 -0
  9. data/lib/admin_it/context/collection_context.rb +10 -4
  10. data/lib/admin_it/context/context.rb +12 -13
  11. data/lib/admin_it/context/show_context.rb +6 -5
  12. data/lib/admin_it/context/single_context.rb +19 -8
  13. data/lib/admin_it/context/table_context.rb +9 -7
  14. data/lib/admin_it/context/tiles_context.rb +1 -0
  15. data/lib/admin_it/controller.rb +3 -1
  16. data/lib/admin_it/data.rb +4 -2
  17. data/lib/admin_it/data/active_record.rb +10 -301
  18. data/lib/admin_it/data/active_record/collection_context.rb +47 -0
  19. data/lib/admin_it/data/active_record/field.rb +64 -0
  20. data/lib/admin_it/data/active_record/filter.rb +36 -0
  21. data/lib/admin_it/data/active_record/resource.rb +66 -0
  22. data/lib/admin_it/data/active_record/single_context.rb +102 -0
  23. data/lib/admin_it/data/data_behavior.rb +2 -0
  24. data/lib/admin_it/data/hash.rb +3 -0
  25. data/lib/admin_it/data/mongoid.rb +14 -0
  26. data/lib/admin_it/data/mongoid/field.rb +58 -0
  27. data/lib/admin_it/data/mongoid/resource.rb +67 -0
  28. data/lib/admin_it/data/object.rb +3 -0
  29. data/lib/admin_it/engine.rb +4 -1
  30. data/lib/admin_it/env.rb +21 -2
  31. data/lib/admin_it/field/field.rb +15 -26
  32. data/lib/admin_it/filters/field_filter.rb +1 -0
  33. data/lib/admin_it/filters/filter.rb +8 -13
  34. data/lib/admin_it/filters/value_filter.rb +1 -0
  35. data/lib/admin_it/helpers.rb +2 -0
  36. data/lib/admin_it/helpers/field.rb +3 -3
  37. data/lib/admin_it/helpers/input.rb +1 -0
  38. data/lib/admin_it/helpers/page.rb +2 -0
  39. data/lib/admin_it/helpers/table.rb +12 -8
  40. data/lib/admin_it/helpers/tiles.rb +2 -0
  41. data/lib/admin_it/helpers/toolbar.rb +4 -0
  42. data/lib/admin_it/helpers/top_menu.rb +3 -0
  43. data/lib/admin_it/resource.rb +16 -21
  44. data/lib/admin_it/version.rb +1 -1
  45. data/lib/extend_it.rb +8 -4
  46. data/lib/extend_it/array_of.rb +12 -10
  47. data/lib/extend_it/base.rb +9 -8
  48. data/lib/extend_it/callbacks.rb +11 -12
  49. data/lib/extend_it/dsl.rb +33 -44
  50. data/spec/extend_it/dsl_spec.rb +21 -32
  51. data/spec/lib/data/mongoid/field_spec.rb +28 -0
  52. data/spec/lib/data/mongoid/resource_spec.rb +50 -0
  53. data/spec/spec_helper.rb +8 -3
  54. data/spec/support/module_helpers.rb +20 -0
  55. metadata +30 -13
  56. data/.ruby-version +0 -1
  57. data/lib/admin_it/definitions.rb +0 -89
  58. data/lib/admin_it/utils.rb +0 -21
  59. data/lib/extend_it/asserts.rb +0 -40
  60. data/lib/extend_it/caller.rb +0 -35
  61. data/lib/extend_it/config.rb +0 -30
  62. data/lib/extend_it/ensures.rb +0 -193
  63. data/spec/extend_it/config_spec.rb +0 -52
  64. data/spec/extend_it/ensures_spec.rb +0 -39
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 29a6d776198ded9d1cf8d3bf12731a86219e2d71
4
- data.tar.gz: 675c20d9e4f38cca59e19e690f99ed6d565bfcad
3
+ metadata.gz: 65d9841e47dc5873e0e1b358138f1736ff6dbbe0
4
+ data.tar.gz: a517d4d77720694fccb35cd9742b4d9812516f07
5
5
  SHA512:
6
- metadata.gz: 72e6c716d4821a967a2bd4639733aca51e8a12833771199fc901d305e0347af72a1ec4cdb5bb1904ae3543180cc9b127519e428e6692c7611db84625cfdaf6e8
7
- data.tar.gz: e2d9330e064c19f681c2d1e48e6a1a4d39cc9e74a54cd14b75f8e56841c662860beb09bca479514e4e441ce5b7d1267b595a8f5c5a9257d1f214a5e8b6a6af7e
6
+ metadata.gz: a2ae93d3c5dfdbc6bb519dcb3945e2306136a62d43982e099bf8c181d99fa3254e63a21b2cc570065c36d84d3c71bfbefdcd54c7abae3ea3c629f700aa8ff5f7
7
+ data.tar.gz: c598b3285ab2dfefdf9a92bc50fb7f3207178c3936f506c25d364a1113b35189aa23c5b8d420d18b1fd0970ceee82748b1102f2b9187fe199a146baf8460fb47
data/.gitignore CHANGED
@@ -3,6 +3,7 @@
3
3
  .bundle
4
4
  .config
5
5
  .yardoc
6
+ .ruby-version
6
7
  Gemfile.lock
7
8
  Gemfile.*.lock
8
9
  InstalledFiles
data/Gemfile CHANGED
@@ -2,4 +2,11 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
- # gem 'wrap_it', path: '../wrap_it'
5
+ # integration includes
6
+ gem 'activerecord' if ENV['USE_ACTIVERECORD']
7
+ if ENV['USE_MONGOID']
8
+ gem 'mongoid', github: 'mongoid/mongoid'
9
+ gem 'bson_ext'
10
+ gem 'bson'
11
+ gem 'moped', github: 'mongoid/moped'
12
+ end
data/README.md CHANGED
@@ -27,10 +27,8 @@ bundle install
27
27
 
28
28
  # Todo
29
29
 
30
- * use_fields not working in root resource context
31
30
  * human-readable date and time fields
32
31
  * Test coverage
33
- * Entities editing/creating
34
32
 
35
33
  ## Longtime plans
36
34
 
@@ -38,6 +36,10 @@ bundle install
38
36
 
39
37
  # Changes
40
38
 
39
+ `1.1.0`
40
+ * ensure_it integration
41
+ * mongoid integration
42
+
41
43
  `1.0.10`
42
44
 
43
45
  * added: sorting indicator in table column header
data/admin_it.gemspec CHANGED
@@ -25,6 +25,7 @@ Gem::Specification.new do |spec|
25
25
  spec.add_dependency 'rails', '~> 4.0'
26
26
  spec.add_dependency 'devise'
27
27
  spec.add_dependency 'wrap_it'
28
+ spec.add_dependency 'ensure_it'
28
29
 
29
30
  spec.add_development_dependency 'bundler', '~> 1.3'
30
31
  spec.add_development_dependency 'sqlite3'
data/lib/admin_it.rb CHANGED
@@ -1,15 +1,18 @@
1
+ if !defined?(EnsureIt) && RUBY_VERSION >= '2.1.0'
2
+ require 'ensure_it_refined'
3
+ else
4
+ require 'ensure_it'
5
+ end
6
+
1
7
  require 'extend_it'
2
- require File.join %w(extend_it ensures)
3
8
 
9
+ #
4
10
  module AdminIt
5
- using ExtendIt::Ensures if ExtendIt.config.use_refines?
6
-
7
11
  LAYOUTS = %i(dialog)
8
12
  end
9
13
 
10
14
  require File.join %w(admin_it env)
11
15
  require File.join %w(admin_it errors)
12
- require File.join %w(admin_it utils)
13
16
  require File.join %w(admin_it config)
14
17
  require File.join %w(admin_it shared)
15
18
  require File.join %w(admin_it data)
@@ -19,6 +22,5 @@ require File.join %w(admin_it filters)
19
22
  require File.join %w(admin_it resource)
20
23
  require File.join %w(admin_it context)
21
24
  require File.join %w(admin_it controller)
22
- require File.join %w(admin_it definitions)
23
25
  require File.join %w(admin_it engine)
24
26
  require File.join %w(admin_it helpers)
@@ -1,4 +1,8 @@
1
+ #
1
2
  module AdminIt
3
+ using EnsureIt if EnsureIt.refined?
4
+
5
+ #
2
6
  class Action
3
7
  extend ExtendIt::Base
4
8
  include ExtendIt::Dsl
@@ -12,8 +16,7 @@ module AdminIt
12
16
  attr_reader :layout
13
17
 
14
18
  def layout=(value)
15
- value = value.ensure_symbol
16
- @layout = value.nil? || LAYOUTS.include?(value) ? value : nil
19
+ @layout = value.ensure_symbol(values: LAYOUTS)
17
20
  end
18
21
  end
19
22
  end
@@ -1,4 +1,5 @@
1
1
  module AdminIt
2
+ #
2
3
  module Config
3
4
  def self.root
4
5
  @root ||= Rails.root.join('app', 'admin_it')
@@ -1,7 +1,11 @@
1
1
  require 'json'
2
2
  require 'csv'
3
3
 
4
+ #
4
5
  module AdminIt
6
+ using EnsureIt if EnsureIt.refined?
7
+
8
+ #
5
9
  class CollectionContext < Context
6
10
  extend FiltersHolder
7
11
 
@@ -39,13 +43,14 @@ module AdminIt
39
43
  end
40
44
 
41
45
  def self.sortable_fields(*names)
42
- names = names.ensure_symbols
46
+ names = names.ensure_array(:flatten, :ensure_symbol, :compact, :uniq)
43
47
  fields.each do |_field|
44
48
  _field.sortable = names.include?(_field.field_name)
45
49
  end
46
50
  end
47
51
 
48
52
  attr_accessor :entity
53
+ attr_writer :entities
49
54
  class_attr_reader :entities_getter, :path, :show_in_dialog?
50
55
 
51
56
  before_load do |store: {}, params: {}|
@@ -165,9 +170,9 @@ module AdminIt
165
170
  self.entities = collection
166
171
  end
167
172
 
168
- def entities=(value)
169
- @entities = value
170
- end
173
+ # def entities=(value)
174
+ # @entities = value
175
+ # end
171
176
 
172
177
  def entities
173
178
  self.entity = nil
@@ -196,6 +201,7 @@ module AdminIt
196
201
  end
197
202
  end
198
203
 
204
+ #
199
205
  class ListContext < CollectionContext
200
206
  def self.path
201
207
  AdminIt::Engine.routes.url_helpers.send("list_#{resource.plural}_path")
@@ -3,9 +3,11 @@ require File.join %w(extend_it dsl)
3
3
  require File.join %w(extend_it base)
4
4
  require File.join %w(extend_it callbacks)
5
5
 
6
- using ExtendIt::Ensures
7
-
6
+ #
8
7
  module AdminIt
8
+ using EnsureIt if EnsureIt.refined?
9
+
10
+ #
9
11
  class Context
10
12
  extend ExtendIt::Base
11
13
  extend ExtendIt::Dsl
@@ -27,7 +29,7 @@ module AdminIt
27
29
  define_callbacks :initialize, :load, :save
28
30
 
29
31
  def self.create(context_name, _resource)
30
- fail ArgumentError, 'Wrong resource' unless _resource.is_a?(Resource)
32
+ _resource.ensure_instance_of!(Resource)
31
33
  base = self
32
34
  Class.new(base) do
33
35
  @resource = _resource
@@ -101,9 +103,7 @@ module AdminIt
101
103
  store = store[name] ||= {}
102
104
  end
103
105
 
104
- if params.nil?
105
- params = controller.request.query_parameters
106
- end
106
+ params = controller.request.query_parameters if params.nil?
107
107
  params = Hash[params.map { |k, v| [k.to_sym, v] }]
108
108
 
109
109
  run_callbacks :load, arguments: { params: params, store: store } do
@@ -158,10 +158,11 @@ module AdminIt
158
158
  def layout=(value)
159
159
  value = value.to_sym if value.is_a?(String)
160
160
  return unless value.is_a?(Symbol)
161
- @layout = case value
162
- when :dialog then 'dialog'
163
- else ''
164
- end
161
+ @layout =
162
+ case value
163
+ when :dialog then 'dialog'
164
+ else ''
165
+ end
165
166
  end
166
167
 
167
168
  def parent=(value)
@@ -196,9 +197,7 @@ module AdminIt
196
197
  end
197
198
 
198
199
  def url_params(**params)
199
- unless @parent.nil?
200
- params.merge!(parent: @parent.send(:context_param))
201
- end
200
+ params.merge!(parent: @parent.send(:context_param)) unless @parent.nil?
202
201
  params
203
202
  end
204
203
 
@@ -1,4 +1,8 @@
1
+ #
1
2
  module AdminIt
3
+ using EnsureIt if EnsureIt.refined?
4
+
5
+ #
2
6
  class ShowContext < SingleContext
3
7
  extend Renderable
4
8
  include Identifiable
@@ -22,9 +26,7 @@ module AdminIt
22
26
  end
23
27
 
24
28
  def self.read(entity)
25
- unless @read.nil?
26
- @read.call(entity)
27
- end
29
+ @read.call(entity) unless @read.nil?
28
30
  end
29
31
 
30
32
  attr_reader :confirm
@@ -34,8 +36,7 @@ module AdminIt
34
36
  end
35
37
 
36
38
  def confirm=(value)
37
- value = value.downcase.to_sym if value.is_a?(String)
38
- return unless value.is_a?(Symbol) && CONFIRMS.include?(value)
39
+ value = value.ensure_symbol(downcase: true, values: CONFIRMS) || return
39
40
  @confirm = value
40
41
  end
41
42
 
@@ -1,4 +1,8 @@
1
+ #
1
2
  module AdminIt
3
+ using EnsureIt if EnsureIt.refined?
4
+
5
+ #
2
6
  class Section
3
7
  extend ExtendIt::Base
4
8
  include ExtendIt::Dsl
@@ -11,16 +15,17 @@ module AdminIt
11
15
  dsl_boolean :visible
12
16
 
13
17
  def use_fields(*names, except: nil)
14
- names = names.ensure_symbols
18
+ names = names.ensure_array(:flatten, :ensure_symbol, :compact, :uniq)
19
+ except = except.ensure_array(:flatten, :ensure_symbol, :compact, :uniq)
15
20
  fields =
16
- if names.nil? || names.empty?
21
+ if names.empty?
17
22
  dsl_get(:fields, default: [])
18
23
  else
19
24
  context = dsl_get(:context, default: nil)
20
25
  names & context.fields.map(&:field_name)
21
26
  end
22
- fields -= except.ensure_symbols unless except.nil?
23
- dsl_set(:fields, fields.uniq)
27
+ fields -= except
28
+ dsl_set(:fields, fields)
24
29
  end
25
30
  end
26
31
 
@@ -40,6 +45,7 @@ module AdminIt
40
45
  end
41
46
  end
42
47
 
48
+ #
43
49
  module Identifiable
44
50
  def self.included(base)
45
51
  base.extend(ClassMethods)
@@ -53,10 +59,12 @@ module AdminIt
53
59
  identity.nil? ? super : "#{super}(#{identity})"
54
60
  end
55
61
 
62
+ #
56
63
  module ClassMethods
57
64
  end
58
65
  end
59
66
 
67
+ #
60
68
  class SingleContext < Context
61
69
  dsl do
62
70
  dsl_block :entity_getter, :entity_saver, :entity_destroyer
@@ -64,7 +72,7 @@ module AdminIt
64
72
  dsl_hash_of_objects :sections, single: :section do |name, **opts|
65
73
  if @sections.empty?
66
74
  # TODO: require this and other files after I18n config in engine.rb
67
- #general.display_name(I18n.t('admin_it.collection.no_data'))
75
+ # general.display_name(I18n.t('admin_it.collection.no_data'))
68
76
  general = Section.new(
69
77
  :general,
70
78
  self,
@@ -91,7 +99,8 @@ module AdminIt
91
99
  )
92
100
  end
93
101
 
94
- class_attr_reader :entity_getter, :entity_saver, :entity_destroyer, :sections
102
+ class_attr_reader :entity_getter, :entity_saver, :entity_destroyer,
103
+ :sections
95
104
  attr_accessor :entity
96
105
 
97
106
  after_load do |store: {}, params: {}|
@@ -117,8 +126,7 @@ module AdminIt
117
126
  end
118
127
 
119
128
  def section=(value)
120
- value = value.downcase.to_sym if value.is_a?(String)
121
- return unless value.is_a?(Symbol)
129
+ value = value.ensure_symbol(downcase: true) || return
122
130
  if sections.empty?
123
131
  return if section != :none
124
132
  else
@@ -153,6 +161,7 @@ module AdminIt
153
161
  end
154
162
  end
155
163
 
164
+ #
156
165
  class SavableSingleContext < SingleContext
157
166
  def self.save_action; end
158
167
 
@@ -177,6 +186,7 @@ module AdminIt
177
186
  def do_save_entity; end
178
187
  end
179
188
 
189
+ #
180
190
  class EditContext < SavableSingleContext
181
191
  include Identifiable
182
192
 
@@ -203,6 +213,7 @@ module AdminIt
203
213
  end
204
214
  end
205
215
 
216
+ #
206
217
  class NewContext < SavableSingleContext
207
218
  def self.path
208
219
  AdminIt::Engine.routes.url_helpers.send("new_#{resource.name}_path")
@@ -1,4 +1,5 @@
1
1
  module AdminIt
2
+ #
2
3
  class TableContext < CollectionContext
3
4
  dsl do
4
5
  dsl_accessor :page_size, default: 10
@@ -50,13 +51,14 @@ module AdminIt
50
51
 
51
52
  def page=(value)
52
53
  if value.is_a?(String)
53
- value = case value.downcase
54
- when 'next' then page + 1
55
- when 'prev', 'previous' then page - 1
56
- when 'first' then 1
57
- when 'last' then pages
58
- else value.to_i
59
- end
54
+ value =
55
+ case value.downcase
56
+ when 'next' then page + 1
57
+ when 'prev', 'previous' then page - 1
58
+ when 'first' then 1
59
+ when 'last' then pages
60
+ else value.to_i
61
+ end
60
62
  end
61
63
  if value.is_a?(Fixnum) && value > 0 && value <= pages
62
64
  # reset entities enumerator if page changed
@@ -1,4 +1,5 @@
1
1
  module AdminIt
2
+ #
2
3
  class TilesContext < CollectionContext
3
4
  dsl do
4
5
  dsl_accessor :header do |value|
@@ -1,8 +1,10 @@
1
1
  module AdminIt
2
+ #
2
3
  module Controller
3
4
  def self.included(base)
4
5
  base.class_eval do
5
6
  include Pundit if AdminIt::Env.pundit?
7
+ before_filter :authenticate_user!
6
8
 
7
9
  attr_reader :context
8
10
  helper_method :context, :resource
@@ -31,7 +33,7 @@ module AdminIt
31
33
  @context = context_class.new(self)
32
34
  yield if block_given?
33
35
  layout = ['admin_it', params[:layout]].compact.join('_')
34
- if !performed?
36
+ unless performed?
35
37
  if layout == 'admin_it' && !request.query_parameters.empty?
36
38
  redirect_to request.path
37
39
  else
data/lib/admin_it/data.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  require File.join %w(admin_it data data_behavior)
2
2
  require File.join %w(admin_it data object)
3
3
  require File.join %w(admin_it data hash)
4
- require File.join %w(admin_it data active_record)
5
4
 
5
+ #
6
6
  module AdminIt
7
7
  def self.register_data(entity_class, mod)
8
8
  return if entity_class.nil?
@@ -20,5 +20,7 @@ module AdminIt
20
20
 
21
21
  register_data Object, AdminIt::ObjectData
22
22
  register_data Hash, AdminIt::HashData
23
- register_data ActiveRecord::Base, AdminIt::ActiveRecordData
24
23
  end
24
+
25
+ require File.join %w(admin_it data active_record)
26
+ require File.join %w(admin_it data mongoid)
@@ -1,303 +1,12 @@
1
- module AdminIt
2
- module ActiveRecordData
3
- module Resource
4
- protected
5
-
6
- TYPE_MAPPING = {
7
- primary_key: :integer,
8
- string: :string,
9
- text: :string,
10
- integer: :integer,
11
- float: :float,
12
- decimal: :float,
13
- datetime: :datetime,
14
- timestamp: :datetime,
15
- time: :time,
16
- date: :date,
17
- binary: :binary,
18
- boolean: :boolean
19
- }
20
-
21
- def default_display_name
22
- entity_class
23
- .model_name
24
- .human#(count: 0)
25
- .split(' ')
26
- .map { |s| s.mb_chars.capitalize }
27
- .join(' ')
28
- end
29
-
30
- def default_fields(&block)
31
- enum = Enumerator.new do |yielder|
32
- exclude = []
33
- entity_class.reflections.each do |name, a|
34
- f = AdminIt::Field.create(name, entity_class, type: :relation)
35
- f.assoc = a
36
- yielder << f
37
- exclude << "#{name}_id" if a.belongs_to?
38
- end
39
- entity_class.columns_hash.each do |name, c|
40
- next if exclude.include?(name)
41
- name = name.to_sym
42
- opts = { type: TYPE_MAPPING[c.type] }
43
- if name == :id
44
- opts[:visible] = false
45
- opts[:writable] = false
46
- end
47
- yielder << AdminIt::Field.create(name, entity_class, opts)
48
- end
49
- end
50
- block_given? ? enum.each(&block) : enum
51
- end
52
-
53
- def default_filters
54
- enum = Enumerator.new do |yielder|
55
- fields.each do |field|
56
- next if field.type == :relation
57
- name = "#{field.field_name}_value"
58
- yielder << AdminIt::ValueFilter.create(name, self, field)
59
- end
60
- end
61
- block_given? ? enum.each(&block) : enum
62
- end
63
- end
64
-
65
- module CollectionContext
66
- def entities=(value)
67
- super(value)
68
- @count = @entities.nil? ? 0 : @entities.count
69
- end
70
-
71
- protected
72
-
73
- def load_entities
74
- collection =
75
- if AdminIt::Env.pundit?
76
- controller.policy_scope(entity_class)
77
- else
78
- entity_class.all
79
- end
80
- if child?
81
- collection = collection.where(parent.resource.name => parent.entity)
82
- end
83
- sort = {}
84
- sorting.each do |_sort|
85
- name, order = _sort.split(':')
86
- sort[name.to_sym] = order.to_sym
87
- end
88
- unless collection.nil? || sort.empty?
89
- collection = collection.order(sort)
90
- end
91
- collection
92
- end
93
- end
94
-
95
- module SingleContext
96
- protected
97
-
98
- def load_entity(identity: nil)
99
- identity ||= controller.params[:id]
100
- entity = entity_class.find(identity)
101
- if AdminIt::Env.pundit?
102
- controller.authorize(entity, "#{name}?")
103
- end
104
- if child?
105
- fields
106
- .select { |f| f.type == :relation &&
107
- f.assoc.klass == parent.entity_class }
108
- .each do |f|
109
- if f.assoc.collection?
110
- entity.send(f.name) << parent.entity
111
- else
112
- entity.send("#{f.name}=", parent.entity)
113
- end
114
- end
115
- end
116
- entity
117
- end
118
- end
119
-
120
- module SavableSingleContext
121
- protected
122
-
123
- def do_save_entity
124
- if AdminIt::Env.pundit?
125
- controller.authorize(entity, "#{self.class.save_action}?")
126
- end
127
- params = controller.params[resource.name]
128
- fields(scope: :writable).each do |field|
129
- next unless params.key?(field.name)
130
- next unless field.writable?
131
- next if field.type == :relation
132
- field.write(entity, params[field.name])
133
- end
134
- if entity.save
135
- controller.redirect_to_default
136
- end
137
- end
138
-
139
- def add_child_context(for_resource, context_class: :table)
140
- child_resource = AdminIt.resources[for_resource]
141
- return nil if child_resource.nil?
142
- child_resource[context_class].new(self)
143
- end
144
- end
145
-
146
- module NewContext
147
- def self.included(base)
148
- base.after_initialize do
149
- if child?
150
- fields
151
- .select { |f| f.type == :relation &&
152
- f.assoc.klass == parent.entity_class }
153
- .each do |f|
154
- if f.assoc.collection?
155
- entity.send(f.name) << parent.entity
156
- else
157
- entity.send("#{f.name}=", parent.entity)
158
- end
159
- f.visible = false
160
- end
161
- end
162
- end
163
- end
164
-
165
- protected
166
-
167
- def load_entity(identity: nil)
168
- entity = entity_class.new
169
- if AdminIt::Env.pundit?
170
- controller.authorize(entity, "#{name}?")
171
- end
172
- entity
173
- end
174
- end
175
-
176
- module ShowContext
177
- def identity
178
- entity.id
179
- end
180
-
181
- protected
182
-
183
- def do_destroy_entity
184
- if AdminIt::Env.pundit?
185
- controller.authorize(entity, :destroy?)
186
- end
187
- if entity.destroy
188
- controller.redirect_to_default
189
- end
190
- end
191
- end
192
-
193
- module EditContext
194
- def identity
195
- entity.id
196
- end
197
- end
198
-
199
- module TableContext
200
- def entities
201
- if @entities.count > page_size
202
- # limit collection to current page
203
- @entities = @entities
204
- .offset(page_size * (page - 1))
205
- .limit(page_size)
206
- end
207
- super
208
- end
209
- end
210
-
211
- module Field
212
- def self.included(base)
213
- base.class_eval do
214
- class << self
215
- attr_accessor :assoc
216
-
217
- protected
218
-
219
- def default_display_name
220
- entity_class.human_attribute_name(field_name)
221
- end
222
- end
223
- class_attr_reader :assoc
224
- end
225
- end
226
-
227
- protected
228
-
229
- def read_value(entity)
230
- value = entity.send(name)
231
- if type == :relation
232
- if assoc.collection?
233
- value.nil? || value.empty? ? [] : value.map(&:id).to_json
234
- else
235
- value.nil? ? nil : value.id
236
- end
237
- else
238
- value
239
- end
240
- end
241
-
242
- def show_value(entity)
243
- value = entity.send(name)
244
- if type == :relation
245
- resource = AdminIt.resources.values.find do |r|
246
- r.entity_class == assoc.klass
247
- end
248
- return I18n.t('admin_it.relation.no_resource') if resource.nil?
249
- context = resource.contexts.find { |c| c <= ShowContext }
250
- return I18n.t('admin_it.relation.no_context') if context.nil?
251
- if assoc.collection?
252
- if value.count == 0
253
- I18n.t('admin_it.collection.no_data')
254
- else
255
- v = context.read(value.first)
256
- v.nil? ? '' : context.read(value.first) + ' ...'
257
- end
258
- else
259
- context.read(value)
260
- end
261
- else
262
- value
263
- end
264
- end
265
-
266
- def write_value(entity, value)
267
- entity.send("#{name}=", value)
268
- end
269
- end
270
-
271
- module ValueFilter
272
- def all_values(collection = nil, &block)
273
- enum = Enumerator.new do |yielder|
274
- field
275
- .entity_class
276
- .select(self.class.field.field_name)
277
- .group(self.class.field.field_name)
278
- .count
279
- .each do |v, c|
280
- yielder << { value: v, count: c }
281
- end
282
- end
283
- block_given? ? enum.each(&block) : enum
284
- end
285
-
286
- def apply(collection)
287
- return collection if @values.empty?
288
- binding = []
289
- conditions = ''
290
- if @values.size == 1 && @values[0].nil?
291
- conditions = "#{field.field_name} IS NULL"
292
- else
293
- conditions = "#{field.field_name} IN (?)"
294
- binding << @values.select { |v| !v.nil? }
295
- if @values.any? { |v| v.nil? }
296
- conditions += " OR #{field.field_name} IS NULL"
297
- end
298
- end
299
- collection = collection.where(conditions, *binding)
300
- end
301
- end
1
+ if AdminIt::Env.active_record?
2
+ require File.join %w(admin_it data active_record resource)
3
+ require File.join %w(admin_it data active_record collection_context)
4
+ require File.join %w(admin_it data active_record single_context)
5
+ require File.join %w(admin_it data active_record field)
6
+ require File.join %w(admin_it data active_record filter)
7
+
8
+ #
9
+ module AdminIt
10
+ register_data ActiveRecord::Base, AdminIt::ActiveRecordData
302
11
  end
303
12
  end