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.
- 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
|