admin_it 1.0.11 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Gemfile +8 -1
- data/README.md +4 -2
- data/admin_it.gemspec +1 -0
- data/lib/admin_it.rb +7 -5
- data/lib/admin_it/actions/action.rb +5 -2
- data/lib/admin_it/config.rb +1 -0
- data/lib/admin_it/context/collection_context.rb +10 -4
- data/lib/admin_it/context/context.rb +12 -13
- data/lib/admin_it/context/show_context.rb +6 -5
- data/lib/admin_it/context/single_context.rb +19 -8
- data/lib/admin_it/context/table_context.rb +9 -7
- data/lib/admin_it/context/tiles_context.rb +1 -0
- data/lib/admin_it/controller.rb +3 -1
- data/lib/admin_it/data.rb +4 -2
- data/lib/admin_it/data/active_record.rb +10 -301
- data/lib/admin_it/data/active_record/collection_context.rb +47 -0
- data/lib/admin_it/data/active_record/field.rb +64 -0
- data/lib/admin_it/data/active_record/filter.rb +36 -0
- data/lib/admin_it/data/active_record/resource.rb +66 -0
- data/lib/admin_it/data/active_record/single_context.rb +102 -0
- data/lib/admin_it/data/data_behavior.rb +2 -0
- data/lib/admin_it/data/hash.rb +3 -0
- data/lib/admin_it/data/mongoid.rb +14 -0
- data/lib/admin_it/data/mongoid/field.rb +58 -0
- data/lib/admin_it/data/mongoid/resource.rb +67 -0
- data/lib/admin_it/data/object.rb +3 -0
- data/lib/admin_it/engine.rb +4 -1
- data/lib/admin_it/env.rb +21 -2
- data/lib/admin_it/field/field.rb +15 -26
- data/lib/admin_it/filters/field_filter.rb +1 -0
- data/lib/admin_it/filters/filter.rb +8 -13
- data/lib/admin_it/filters/value_filter.rb +1 -0
- data/lib/admin_it/helpers.rb +2 -0
- data/lib/admin_it/helpers/field.rb +3 -3
- data/lib/admin_it/helpers/input.rb +1 -0
- data/lib/admin_it/helpers/page.rb +2 -0
- data/lib/admin_it/helpers/table.rb +12 -8
- data/lib/admin_it/helpers/tiles.rb +2 -0
- data/lib/admin_it/helpers/toolbar.rb +4 -0
- data/lib/admin_it/helpers/top_menu.rb +3 -0
- data/lib/admin_it/resource.rb +16 -21
- data/lib/admin_it/version.rb +1 -1
- data/lib/extend_it.rb +8 -4
- data/lib/extend_it/array_of.rb +12 -10
- data/lib/extend_it/base.rb +9 -8
- data/lib/extend_it/callbacks.rb +11 -12
- data/lib/extend_it/dsl.rb +33 -44
- data/spec/extend_it/dsl_spec.rb +21 -32
- data/spec/lib/data/mongoid/field_spec.rb +28 -0
- data/spec/lib/data/mongoid/resource_spec.rb +50 -0
- data/spec/spec_helper.rb +8 -3
- data/spec/support/module_helpers.rb +20 -0
- metadata +30 -13
- data/.ruby-version +0 -1
- data/lib/admin_it/definitions.rb +0 -89
- data/lib/admin_it/utils.rb +0 -21
- data/lib/extend_it/asserts.rb +0 -40
- data/lib/extend_it/caller.rb +0 -35
- data/lib/extend_it/config.rb +0 -30
- data/lib/extend_it/ensures.rb +0 -193
- data/spec/extend_it/config_spec.rb +0 -52
- data/spec/extend_it/ensures_spec.rb +0 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 65d9841e47dc5873e0e1b358138f1736ff6dbbe0
|
4
|
+
data.tar.gz: a517d4d77720694fccb35cd9742b4d9812516f07
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a2ae93d3c5dfdbc6bb519dcb3945e2306136a62d43982e099bf8c181d99fa3254e63a21b2cc570065c36d84d3c71bfbefdcd54c7abae3ea3c629f700aa8ff5f7
|
7
|
+
data.tar.gz: c598b3285ab2dfefdf9a92bc50fb7f3207178c3936f506c25d364a1113b35189aa23c5b8d420d18b1fd0970ceee82748b1102f2b9187fe199a146baf8460fb47
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
@@ -2,4 +2,11 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
gemspec
|
4
4
|
|
5
|
-
#
|
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
|
-
|
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
|
data/lib/admin_it/config.rb
CHANGED
@@ -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.
|
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
|
-
|
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
|
-
|
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
|
-
|
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 =
|
162
|
-
|
163
|
-
|
164
|
-
|
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
|
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.
|
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.
|
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
|
23
|
-
dsl_set(:fields, fields
|
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,
|
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
|
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 =
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
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
|
data/lib/admin_it/controller.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
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
|