admin_it 1.0.5 → 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d370fe1c01e8e574315d4d5988d8b6bae33d5b39
4
- data.tar.gz: fdfa047dee1d91755c46e7cda5159c52a59f9ef9
3
+ metadata.gz: d3a63565c2793d51ed2992d7d4e01deeecc68543
4
+ data.tar.gz: 2fe03cded06fe4a4fedc76b2244f727a9dfaa876
5
5
  SHA512:
6
- metadata.gz: efcfb8cce0d3a3d5c273cecba04587d71f2a942685b29df42a0c4337078167487f27c77c4eca241759de54436d1653af8d7bf007da86a97ff1e1870f633a5bef
7
- data.tar.gz: 05b34351cab3a244be6e070b81f1992fb63665b9cb7546509f1651e0ed8ba5510375fd30e76b7ba25fc9c2cbb51b2dfe4757d57a8ed56cffcd254055ccce00e2
6
+ metadata.gz: 1cc3714caf30a63432ca69c6bed8ab1e6b01947918b6f7024daeb9a8951fbd026c1ec7ede09037b61386f0622e2971f0d1b2ae25a9c5532125bebb5169bc647b
7
+ data.tar.gz: ed25582af138eca0e80f23b1e2205880b4a74bc6ad830c74adf027ebfcf6eed05407e0180b14e2f15b074df284ba1362bf16b75f9c5f79d3f33ce8516431f4b9
data/README.md CHANGED
@@ -28,6 +28,7 @@ bundle install
28
28
  # Todo
29
29
 
30
30
  * use_fields not working in root resource context
31
+ * human-readable date and time fields
31
32
  * Test coverage
32
33
  * Entities editing/creating
33
34
 
@@ -37,6 +38,10 @@ bundle install
37
38
 
38
39
  # Changes
39
40
 
41
+ `1.0.6`
42
+
43
+ * fixed: [#1](/../../issues/1)
44
+
40
45
  `1.0.5`
41
46
 
42
47
  * font-awesome asset path fix
@@ -24,13 +24,13 @@
24
24
  - if filter.values.include?(v[:value])
25
25
  - a_class = 'label-success'
26
26
  - href = url_for(for_context.url_params( \
27
- filters: "#{filter.name}(-#{filter.value(v[:value])})", \
27
+ filters: "!#{filter.name}(-#{filter.value(v[:value])})", \
28
28
  active_filter: filter.name \
29
29
  ))
30
30
  - else
31
31
  - a_class = 'label-info'
32
32
  - href = url_for(for_context.url_params( \
33
- filters: "#{filter.name}(+#{filter.value(v[:value])})", \
33
+ filters: "!#{filter.name}(+#{filter.value(v[:value])})", \
34
34
  active_filter: filter.name \
35
35
  ))
36
36
  a class="label #{a_class}" href==href
@@ -1,4 +1,5 @@
1
1
  require 'json'
2
+ require 'csv'
2
3
  require File.join %w(extend_it symbolize)
3
4
 
4
5
  using ExtendIt::Symbolize
@@ -128,23 +129,7 @@ module AdminIt
128
129
  @filters ||= {}
129
130
  value.strip!
130
131
  @filters = {} if value.empty?
131
- value.split(/[;|]/).each do |str|
132
- str.strip!
133
- remove = str[0] == '-'
134
- str = str[1..-1] if remove
135
- m = Filter::REGEXP.match(str)
136
- next if m.nil?
137
- if remove
138
- @filters.delete(m[:name].to_sym)
139
- else
140
- name = m[:name].to_sym
141
- if @filters.key?(name)
142
- @filters[name].change(m[:params])
143
- else
144
- @filters[name] = Filter.load(str, self.class.filters)
145
- end
146
- end
147
- end
132
+ Filter.apply(value, @filters, self.class.filters)
148
133
  else
149
134
  @filters = {}
150
135
  end
@@ -15,9 +15,30 @@ module AdminIt
15
15
  include ExtendIt::Callbacks
16
16
  extend ExtendIt::Asserts
17
17
 
18
- REGEXP = /\A(?<name>[a-zA-Z_][a-zA-Z0-9_]*)(?:\((?<params>[^)]*)\))?\z/
19
-
20
- define_callbacks :save
18
+ REGEXP = /
19
+ (?<=\A|[,;|])\s*
20
+ (?<full>
21
+ (?<action>[!+\-])?
22
+ (?<name>[a-zA-Z_][a-zA-Z0-9_]*)
23
+ (?:\((?<params>[^)]*)\))?
24
+ )
25
+ \s*(?=[,;|]|\z)
26
+ /x
27
+
28
+ ARGUMENT_REGEXP = /
29
+ (?<=\A|[,;|])\s*
30
+ (?:
31
+ (?:(?<action>[+\-])|(?:(?<option>[a-zA-Z_][a-zA-Z0-9_]*)\s*:\s*))?
32
+ (?<token>
33
+ (?:'(?:[^\\']|\\.)*')|
34
+ (?:"(?:[^\\"]|\\.)*")|
35
+ (?:[^,;|\s]+)
36
+ )
37
+ )
38
+ \s*(?=[,;|]|\z)
39
+ /x
40
+
41
+ define_callbacks :initialize, :save, :load
21
42
 
22
43
  class << self
23
44
  extend ExtendIt::Dsl
@@ -49,29 +70,38 @@ module AdminIt
49
70
  create_class(name, _resource)
50
71
  end
51
72
 
52
- def self.load(str, filters)
73
+ def self.load(str, filter_classes)
53
74
  m = REGEXP.match(str)
54
- return nil if m.nil?
75
+ return nil if m.nil? || m[:action] == '-'
55
76
  name = m[:name].to_sym
56
- filter_class = filters.find { |f| f.filter_name == name }
77
+ filter_class = filter_classes.find { |f| f.filter_name == name }
57
78
  return nil if filter_class.nil?
58
- opts = {}
59
- args = m[:params].nil? ? [] : m[:params].split(',').map do |param|
60
- param.strip!
61
- arr = param.split(':')
62
- if arr.size > 1
63
- opts[arr[0].strip.to_sym] = arr[1].strip
64
- nil
79
+ filter = filter_class.new
80
+ filter.load(m[:params])
81
+ filter
82
+ end
83
+
84
+ def self.apply(str, filters, filter_classes)
85
+ list = str.scan(Filter::REGEXP)
86
+ filters.clear if list.all? { |_, act, _, _| act.nil? || act.empty? }
87
+ list.each do |full, action, name, params|
88
+ name = name.to_sym
89
+ if action == '-'
90
+ filters.delete(name)
91
+ elsif action == '!'
92
+ filters[name].load(params) if filters.key?(name)
65
93
  else
66
- arr[0]
94
+ filters[name] = Filter.load(full, filter_classes)
67
95
  end
68
96
  end
69
- args << opts unless opts.empty?
70
- filter_class.new(*args.compact)
71
97
  end
72
98
 
73
99
  class_attr_reader :display_name
74
100
 
101
+ def initialize
102
+ run_callbacks :initialize
103
+ end
104
+
75
105
  def name
76
106
  @name ||= self.class.filter_name
77
107
  end
@@ -90,7 +120,13 @@ module AdminIt
90
120
  result
91
121
  end
92
122
 
93
- def change(str)
123
+ def load(str)
124
+ return if str.nil?
125
+ args = parse_arguments(str)
126
+ unless args.empty?
127
+ opts = args.extract_options!
128
+ run_callbacks :load, arguments: { arguments: args, options: opts }
129
+ end
94
130
  end
95
131
 
96
132
  def apply(collection)
@@ -117,6 +153,34 @@ module AdminIt
117
153
  TIME_REGEXP = /\A#{TIME}\z/
118
154
  DATETIME_REGEXP = /\A#{DATE}(?:\s+|[\/.\-])#{TIME}\z/
119
155
 
156
+ def param_action(str)
157
+ case str
158
+ when '+' then :add
159
+ when '-' then :remove
160
+ else nil
161
+ end
162
+ end
163
+
164
+ def parse_arguments(str)
165
+ opts = {}
166
+ args = []
167
+ parent = self.class.parents.find do |p|
168
+ p.const_defined?(:ARGUMENT_REGEXP)
169
+ end
170
+ unless parent.nil?
171
+ str.scan(parent.const_get(:ARGUMENT_REGEXP)) do |a, o, v|
172
+ if o.nil? || o.empty?
173
+ action = param_action(a)
174
+ action.nil? ? args << v : (opts[action] ||= []) << v
175
+ else
176
+ opts[o.to_sym] = v
177
+ end
178
+ end
179
+ end
180
+ args << opts unless opts.empty?
181
+ args
182
+ end
183
+
120
184
  def parse_argument(arg)
121
185
  return arg unless arg.is_a?(String)
122
186
  arg.strip!
@@ -2,27 +2,25 @@ module AdminIt
2
2
  class ValueFilter < FieldFilter
3
3
  attr_reader :values
4
4
 
5
- def initialize(*values, **opts)
6
- @values = values.map { |v| parse_argument(v) }.uniq
5
+ def initialize
6
+ @values = []
7
7
  end
8
8
 
9
9
  before_save do |arguments: [], options: {}|
10
10
  arguments.concat(@values.map { |v| create_argument(v) })
11
11
  end
12
12
 
13
- def change(str)
14
- return if str.nil? || !str.is_a?(String) || str.empty?
15
- @values = [] unless /[+\-]/ =~ str
16
- str.split(',').each do |param|
17
- param.strip!
18
- if param[0] == '-'
19
- @values.delete_if { |v| v == parse_argument(param[1..-1]) }
20
- else
21
- param = param[1..-1] if param[0] == '+'
22
- @values << parse_argument(param)
13
+ after_load do |arguments: [], options: {}|
14
+ unless arguments.empty?
15
+ @values = arguments.map { |v| parse_argument(v) }.uniq
16
+ end
17
+ if options.key?(:add)
18
+ @values.concat(options[:add].map { |v| parse_argument(v) }).uniq!
19
+ elsif options.key?(:remove)
20
+ options[:remove].each do |remove|
21
+ @values.delete_if { |v| v == parse_argument(remove) }
23
22
  end
24
23
  end
25
- @values.uniq!
26
24
  end
27
25
 
28
26
  def all_values(collection = nil, &block)
@@ -1,5 +1,5 @@
1
1
  #
2
2
  module AdminIt
3
3
  # Current gem version
4
- VERSION = '1.0.5'
4
+ VERSION = '1.0.6'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: admin_it
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.5
4
+ version: 1.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexey Ovchinnikov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-13 00:00:00.000000000 Z
11
+ date: 2014-03-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails