effective_resources 0.2.4 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/concerns/effective/crud_controller.rb +1 -1
- data/app/helpers/effective_resources_helper.rb +55 -0
- data/app/models/effective/attribute.rb +37 -25
- data/app/models/effective/resources/associations.rb +1 -1
- data/app/models/effective/resources/forms.rb +8 -8
- data/app/models/effective/resources/init.rb +1 -2
- data/app/models/effective/resources/klass.rb +4 -0
- data/app/models/effective/resources/relation.rb +28 -5
- data/lib/effective_resources/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c8670335e749c4dfd51af3948b37cbdb7b4051ee
|
4
|
+
data.tar.gz: 82ee3513ad299bee24a8bf6e76893224f2fb85d9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e96e5c5b6b876e9389b44d6778958200b363d29d16a70a628c5c9ef1eb1eaad9f2349aa84cd92eb0757ce1fafc7e8c107352c9f1b6ea225d6a405c547121100e
|
7
|
+
data.tar.gz: 076396560c96b7c4d9951dc3ceff5a2864ac749703d604b6d1e9a09c5d41838a96eca592f832d1b5b2fb148c43a60c0857dfda64cfbae879df0973bf3a6ec83a
|
@@ -25,7 +25,7 @@ module Effective
|
|
25
25
|
self.resources ||= resource_class.all
|
26
26
|
|
27
27
|
if resource_datatable_class
|
28
|
-
@datatable ||= resource_datatable_class.new(
|
28
|
+
@datatable ||= resource_datatable_class.new(self, resource_datatable_attributes)
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -17,4 +17,59 @@ module EffectiveResourcesHelper
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
+
def number_to_duration(duration)
|
21
|
+
duration = duration.to_i
|
22
|
+
value = duration.abs
|
23
|
+
|
24
|
+
[
|
25
|
+
('-' if duration < 0),
|
26
|
+
("#{value / 60}h " if value >= 60),
|
27
|
+
("#{'%0.2d' % (value % 60)}m" if value > 0),
|
28
|
+
('0m' if value == 0),
|
29
|
+
].compact.join
|
30
|
+
end
|
31
|
+
|
32
|
+
### Icon Helpers for actions_column or elsewhere
|
33
|
+
def show_icon_to(path, options = {})
|
34
|
+
glyphicon_to('eye-open', path, {title: 'Show'}.merge(options))
|
35
|
+
end
|
36
|
+
|
37
|
+
def edit_icon_to(path, options = {})
|
38
|
+
glyphicon_to('edit', path, {title: 'Edit'}.merge(options))
|
39
|
+
end
|
40
|
+
|
41
|
+
def destroy_icon_to(path, options = {})
|
42
|
+
defaults = {title: 'Destroy', data: {method: :delete, confirm: 'Delete this item?'}}
|
43
|
+
glyphicon_to('trash', path, defaults.merge(options))
|
44
|
+
end
|
45
|
+
|
46
|
+
def settings_icon_to(path, options = {})
|
47
|
+
glyphicon_to('cog', path, {title: 'Settings'}.merge(options))
|
48
|
+
end
|
49
|
+
|
50
|
+
def ok_icon_to(path, options = {})
|
51
|
+
glyphicon_to('ok', path, {title: 'OK'}.merge(options))
|
52
|
+
end
|
53
|
+
|
54
|
+
def approve_icon_to(path, options = {})
|
55
|
+
glyphicon_to('ok', path, {title: 'Approve'}.merge(options))
|
56
|
+
end
|
57
|
+
|
58
|
+
def remove_icon_to(path, options = {})
|
59
|
+
glyphicon_to('remove', path, {title: 'Remove'}.merge(options))
|
60
|
+
end
|
61
|
+
|
62
|
+
def glyphicon_to(icon, path, options = {})
|
63
|
+
content_tag(:a, options.merge(href: path)) do
|
64
|
+
if icon.start_with?('glyphicon-')
|
65
|
+
content_tag(:span, '', class: "glyphicon #{icon}")
|
66
|
+
else
|
67
|
+
content_tag(:span, '', class: "glyphicon glyphicon-#{icon}")
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
alias_method :bootstrap_icon_to, :glyphicon_to
|
72
|
+
alias_method :glyph_icon_to, :glyphicon_to
|
73
|
+
|
74
|
+
|
20
75
|
end
|
@@ -26,21 +26,28 @@ module Effective
|
|
26
26
|
|
27
27
|
@type ||= (
|
28
28
|
case obj
|
29
|
-
when :boolean
|
30
|
-
when :
|
31
|
-
when :
|
32
|
-
when :
|
33
|
-
when :
|
34
|
-
when :
|
35
|
-
when :
|
36
|
-
when :
|
37
|
-
when
|
38
|
-
when
|
39
|
-
when
|
40
|
-
when
|
41
|
-
when
|
42
|
-
when
|
29
|
+
when :boolean ; :boolean
|
30
|
+
when :currency ; :currency
|
31
|
+
when :date ; :date
|
32
|
+
when :datetime ; :datetime
|
33
|
+
when :decimal ; :decimal
|
34
|
+
when :duration ; :duration
|
35
|
+
when :email ; :email
|
36
|
+
when :integer ; :integer
|
37
|
+
when :percentage ; :percentage
|
38
|
+
when :price ; :price
|
39
|
+
when :nil ; :nil
|
40
|
+
when :resource ; :resource
|
41
|
+
when :string ; :string
|
42
|
+
when :text ; :text
|
43
|
+
when FalseClass ; :boolean
|
44
|
+
when Fixnum ; :integer
|
45
|
+
when Float ; :decimal
|
46
|
+
when NilClass ; :nil
|
47
|
+
when String ; :string
|
48
|
+
when TrueClass ; :boolean
|
43
49
|
when ActiveSupport::TimeWithZone ; :datetime
|
50
|
+
when ActiveRecord::Base ; :resource
|
44
51
|
when :belongs_to ; :belongs_to
|
45
52
|
when :belongs_to_polymorphic ; :belongs_to_polymorphic
|
46
53
|
when :has_many ; :has_many
|
@@ -50,7 +57,7 @@ module Effective
|
|
50
57
|
when :effective_obfuscation ; :effective_obfuscation
|
51
58
|
when :effective_roles ; :effective_roles
|
52
59
|
else
|
53
|
-
raise
|
60
|
+
raise "unsupported type for #{obj}"
|
54
61
|
end
|
55
62
|
)
|
56
63
|
end
|
@@ -62,36 +69,41 @@ module Effective
|
|
62
69
|
when :date, :datetime
|
63
70
|
date = Time.zone.local(*value.to_s.scan(/(\d+)/).flatten)
|
64
71
|
name.to_s.start_with?('end_') ? date.end_of_day : date
|
65
|
-
when :decimal
|
66
|
-
(value.kind_of?(String) ? value.gsub(/[^0-9
|
72
|
+
when :decimal, :currency
|
73
|
+
(value.kind_of?(String) ? value.gsub(/[^0-9|\-|\.]/, '') : value).to_f
|
74
|
+
when :duration
|
75
|
+
if value.to_s.include?('h')
|
76
|
+
(hours, minutes) = (value.to_s.gsub(/[^0-9|\-|h]/, '').split('h'))
|
77
|
+
(hours.to_i * 60) + ((hours.to_i < 0) ? -(minutes.to_i) : minutes.to_i)
|
78
|
+
else
|
79
|
+
value.to_s.gsub(/[^0-9|\-|h]/, '').to_i
|
80
|
+
end
|
67
81
|
when :effective_obfuscation
|
68
82
|
klass.respond_to?(:deobfuscate) ? klass.deobfuscate(value) : value.to_s
|
69
83
|
when :effective_roles
|
70
|
-
EffectiveRoles.roles_for(value)
|
71
|
-
when :integer
|
84
|
+
EffectiveRoles.roles.include?(value.to_sym) ? value : EffectiveRoles.roles_for(value)
|
85
|
+
when :integer, :percentage
|
72
86
|
(value.kind_of?(String) ? value.gsub(/\D/, '') : value).to_i
|
73
87
|
when :nil
|
74
88
|
value.presence
|
75
89
|
when :price
|
76
|
-
(value.kind_of?(Integer) ? value : (value.to_s.gsub(/[^0-9
|
77
|
-
when :string
|
90
|
+
(value.kind_of?(Integer) ? value : (value.to_s.gsub(/[^0-9|\-|\.]/, '').to_f * 100.0)).to_i
|
91
|
+
when :string, :text, :email
|
78
92
|
value.to_s
|
79
93
|
when :belongs_to_polymorphic
|
80
94
|
value.to_s
|
81
|
-
when :belongs_to, :has_many, :has_and_belongs_to_many, :has_one # Returns an Array of ints, an Int or String
|
95
|
+
when :belongs_to, :has_many, :has_and_belongs_to_many, :has_one, :resource # Returns an Array of ints, an Int or String
|
82
96
|
if value.kind_of?(Integer) || value.kind_of?(Array)
|
83
97
|
value
|
84
98
|
else
|
85
99
|
digits = value.to_s.gsub(/[^0-9|,]/, '') # '87' or '87,254,300' or 'something'
|
86
100
|
|
87
|
-
if digits == value
|
101
|
+
if digits == value || digits.length == 10
|
88
102
|
if klass.respond_to?(:deobfuscate)
|
89
103
|
digits.split(',').map { |str| klass.deobfuscate(str).to_i }
|
90
104
|
else
|
91
105
|
digits.split(',').map { |str| str.to_i }
|
92
106
|
end
|
93
|
-
elsif digits == value
|
94
|
-
klass.respond_to?(:deobfuscate) ? klass.deobfuscate(digits).to_i : digits.to_i
|
95
107
|
else
|
96
108
|
value.to_s
|
97
109
|
end
|
@@ -6,15 +6,15 @@ module Effective
|
|
6
6
|
def search_form_field(name, type = nil)
|
7
7
|
case (type || sql_type(name))
|
8
8
|
when :belongs_to
|
9
|
-
{ as: :select }.merge(
|
9
|
+
{ as: :select }.merge(search_form_field_collection(belongs_to(name)))
|
10
10
|
when :belongs_to_polymorphic
|
11
11
|
{ as: :grouped_select, polymorphic: true, collection: nil}
|
12
12
|
when :has_and_belongs_to_many
|
13
|
-
{ as: :select }.merge(
|
13
|
+
{ as: :select }.merge(search_form_field_collection(has_and_belongs_to_many(name)))
|
14
14
|
when :has_many
|
15
|
-
{ as: :select, multiple: true }.merge(
|
15
|
+
{ as: :select, multiple: true }.merge(search_form_field_collection(has_many(name)))
|
16
16
|
when :has_one
|
17
|
-
{ as: :select, multiple: true }.merge(
|
17
|
+
{ as: :select, multiple: true }.merge(search_form_field_collection(has_one(name)))
|
18
18
|
when :effective_addresses
|
19
19
|
{ as: :string }
|
20
20
|
when :effective_roles
|
@@ -31,15 +31,15 @@ module Effective
|
|
31
31
|
{ as: :number }
|
32
32
|
when :text
|
33
33
|
{ as: :text }
|
34
|
+
when ActiveRecord::Base
|
35
|
+
{ as: :select }.merge(Effective::Resource.new(type).search_form_field_collection)
|
34
36
|
else
|
35
37
|
{ as: :string }
|
36
38
|
end
|
37
39
|
end
|
38
40
|
|
39
|
-
|
40
|
-
|
41
|
-
def associated_search_collection(association, max_id = 1000)
|
42
|
-
res = Effective::Resource.new(association)
|
41
|
+
def search_form_field_collection(association = nil, max_id = 1000)
|
42
|
+
res = (association.nil? ? self : Effective::Resource.new(association))
|
43
43
|
|
44
44
|
if res.max_id > max_id
|
45
45
|
{ as: :string }
|
@@ -12,7 +12,7 @@ module Effective
|
|
12
12
|
|
13
13
|
def _initialize_input_name(input)
|
14
14
|
case input
|
15
|
-
when String ; input
|
15
|
+
when String ; input.start_with?('/') ? input[1..-1] : input
|
16
16
|
when Symbol ; input
|
17
17
|
when Class ; input.name
|
18
18
|
when ActiveRecord::Relation
|
@@ -52,7 +52,6 @@ module Effective
|
|
52
52
|
|
53
53
|
if first && last
|
54
54
|
@written_attributes = reader.select(from: first+1, to: last-1).map do |line|
|
55
|
-
|
56
55
|
Effective::Attribute.parse_written(line).presence
|
57
56
|
end.compact
|
58
57
|
end
|
@@ -33,9 +33,12 @@ module Effective
|
|
33
33
|
.order("#{sql_column(klass.primary_key)} #{sql_direction}")
|
34
34
|
when :effective_roles
|
35
35
|
relation.order("#{sql_column(:roles_mask)} #{sql_direction}")
|
36
|
+
when :string, :text
|
37
|
+
relation
|
38
|
+
.order((("ISNULL(#{sql_column}}), ") if mysql?).to_s + "#{sql_column}='' ASC, #{sql_column} #{sql_direction}" + (" NULLS LAST" if postgres?))
|
36
39
|
else
|
37
40
|
relation
|
38
|
-
.order("#{sql_column} #{sql_direction}")
|
41
|
+
.order((("ISNULL(#{sql_column}}), ") if mysql?).to_s + "#{sql_column} #{sql_direction}" + (" NULLS LAST" if postgres?))
|
39
42
|
end
|
40
43
|
end
|
41
44
|
|
@@ -81,13 +84,33 @@ module Effective
|
|
81
84
|
end
|
82
85
|
)
|
83
86
|
relation.where("#{sql_column} >= ? AND #{sql_column} <= ?", term, end_at)
|
84
|
-
when :decimal
|
85
|
-
|
87
|
+
when :decimal, :currency
|
88
|
+
if fuzzy && (term.round(0) == term) && value.to_s.include?('.') == false
|
89
|
+
if term < 0
|
90
|
+
relation.where("#{sql_column} <= ? AND #{sql_column} > ?", term, term-1.0)
|
91
|
+
else
|
92
|
+
relation.where("#{sql_column} >= ? AND #{sql_column} < ?", term, term+1.0)
|
93
|
+
end
|
94
|
+
else
|
95
|
+
relation.where("#{sql_column} = ?", term)
|
96
|
+
end
|
97
|
+
when :duration
|
98
|
+
if fuzzy && (term % 60) == 0 && value.to_s.include?('m') == false
|
99
|
+
if term < 0
|
100
|
+
relation.where("#{sql_column} <= ? AND #{sql_column} > ?", term, term-60)
|
101
|
+
else
|
102
|
+
relation.where("#{sql_column} >= ? AND #{sql_column} < ?", term, term+60)
|
103
|
+
end
|
104
|
+
else
|
105
|
+
relation.where("#{sql_column} = ?", term)
|
106
|
+
end
|
86
107
|
when :integer
|
87
108
|
relation.where("#{sql_column} = ?", term)
|
109
|
+
when :percentage
|
110
|
+
relation.where("#{sql_column} = ?", term)
|
88
111
|
when :price
|
89
112
|
relation.where("#{sql_column} = ?", term)
|
90
|
-
when :string, :text
|
113
|
+
when :string, :text, :email
|
91
114
|
if fuzzy
|
92
115
|
relation.where("#{sql_column} #{ilike} ?", "%#{term}%")
|
93
116
|
else
|
@@ -102,7 +125,7 @@ module Effective
|
|
102
125
|
raise 'expected relation to be present' unless relation
|
103
126
|
|
104
127
|
# Assume this is a set of IDs
|
105
|
-
if value.kind_of?(Integer) || value.kind_of?(Array)
|
128
|
+
if value.kind_of?(Integer) || value.kind_of?(Array) || (value.to_i.to_s == value)
|
106
129
|
return relation.where(klass.primary_key => value)
|
107
130
|
end
|
108
131
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: effective_resources
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Code and Effect
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-03-
|
11
|
+
date: 2017-03-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|