admin_it 1.1.0 → 1.2.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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -0
  3. data/admin_it.gemspec +1 -0
  4. data/app/assets/fonts/admin_it/FontAwesome.otf +0 -0
  5. data/app/assets/fonts/admin_it/fontawesome-webfont.eot +0 -0
  6. data/app/assets/fonts/admin_it/fontawesome-webfont.svg +469 -379
  7. data/app/assets/fonts/admin_it/fontawesome-webfont.ttf +0 -0
  8. data/app/assets/fonts/admin_it/fontawesome-webfont.woff +0 -0
  9. data/app/assets/javascript/admin_it/admin_it.js +64 -7
  10. data/app/assets/stylesheets/admin_it/font-awesome-old.min.css.erb +4 -0
  11. data/app/assets/stylesheets/admin_it/font-awesome.min.css.erb +2 -2
  12. data/app/controllers/admin_it/signed_url_controller.rb +43 -0
  13. data/app/views/admin_it/context/_show.html.slim +17 -11
  14. data/app/views/admin_it/context/_table.html.slim +14 -16
  15. data/app/views/admin_it/context/_tiles.html.slim +42 -21
  16. data/app/views/admin_it/editors/_hidden.html.slim +6 -0
  17. data/app/views/admin_it/editors/_image.html.slim +50 -0
  18. data/app/views/admin_it/editors/_text.html.slim +6 -0
  19. data/app/views/admin_it/shared/_child.html.slim +21 -14
  20. data/app/views/admin_it/shared/_fields.html.slim +36 -15
  21. data/app/views/admin_it/shared/_filters.html.slim +11 -12
  22. data/app/views/admin_it/shared/_form.html.slim +40 -24
  23. data/app/views/admin_it/shared/_pagination.html.slim +10 -18
  24. data/app/views/admin_it/shared/_toolbar.html.slim +19 -11
  25. data/app/views/layouts/admin_it.html.slim +24 -16
  26. data/app/views/layouts/admin_it_dialog.html.slim +4 -4
  27. data/config/routes.rb +3 -0
  28. data/lib/admin_it.rb +1 -0
  29. data/lib/admin_it/config.rb +9 -0
  30. data/lib/admin_it/context/context.rb +65 -19
  31. data/lib/admin_it/context/single_context.rb +19 -9
  32. data/lib/admin_it/controller.rb +6 -1
  33. data/lib/admin_it/data/active_record/field.rb +7 -0
  34. data/lib/admin_it/data/active_record/single_context.rb +0 -1
  35. data/lib/admin_it/engine.rb +2 -0
  36. data/lib/admin_it/field/field.rb +51 -16
  37. data/lib/admin_it/helpers/toolbar.rb +8 -2
  38. data/lib/admin_it/locales/en.yml +4 -0
  39. data/lib/admin_it/locales/ru.yml +4 -0
  40. data/lib/admin_it/middleware.rb +54 -0
  41. data/lib/admin_it/shared.rb +8 -0
  42. data/lib/admin_it/version.rb +1 -1
  43. data/lib/extend_it/dsl.rb +1 -1
  44. metadata +22 -2
@@ -7,6 +7,7 @@ module AdminIt
7
7
  extend ExtendIt::Base
8
8
  include ExtendIt::Dsl
9
9
  include Renderable
10
+ include Iconed
10
11
 
11
12
  attr_reader :name, :display_name, :fields
12
13
 
@@ -53,12 +54,12 @@ module AdminIt
53
54
 
54
55
  def identity; end
55
56
 
56
- protected
57
-
58
- def context_param
57
+ def to_link
59
58
  identity.nil? ? super : "#{super}(#{identity})"
60
59
  end
61
60
 
61
+ protected
62
+
62
63
  #
63
64
  module ClassMethods
64
65
  end
@@ -127,12 +128,17 @@ module AdminIt
127
128
 
128
129
  def section=(value)
129
130
  value = value.ensure_symbol(downcase: true) || return
130
- if sections.empty?
131
- return if section != :none
132
- else
133
- return unless sections.map(&:name).include?(value)
134
- end
135
- @section = section
131
+ # if s.empty?
132
+ # return if section != :none
133
+ # else
134
+ # return unless s.map(&:name).include?(value.to_s)
135
+ # end
136
+ @section = value
137
+ end
138
+
139
+ def url_params(**params)
140
+ params[:section] = section unless params.key?(:section)
141
+ super(**params)
136
142
  end
137
143
 
138
144
  protected
@@ -219,6 +225,10 @@ module AdminIt
219
225
  AdminIt::Engine.routes.url_helpers.send("new_#{resource.name}_path")
220
226
  end
221
227
 
228
+ def path(_entity: nil)
229
+ self.class.path
230
+ end
231
+
222
232
  def self.save_action
223
233
  :create
224
234
  end
@@ -24,7 +24,11 @@ module AdminIt
24
24
  end
25
25
 
26
26
  def redirect_to_default
27
- redirect_to(resource[resource.default_context].path)
27
+ if context.child?
28
+ redirect_to(context.parent.class.url(context.parent, section: context.section))
29
+ else
30
+ redirect_to(resource[resource.default_context].url)
31
+ end
28
32
  end
29
33
 
30
34
  private
@@ -37,6 +41,7 @@ module AdminIt
37
41
  if layout == 'admin_it' && !request.query_parameters.empty?
38
42
  redirect_to request.path
39
43
  else
44
+ Request.get(request).process!
40
45
  render template: "admin_it/#{context.name}", layout: layout
41
46
  end
42
47
  end
@@ -57,6 +57,13 @@ module AdminIt
57
57
  end
58
58
 
59
59
  def write_value(entity, value)
60
+ if type == :relation
61
+ if assoc.collection?
62
+ value.map! { |x| assoc.klass.find(x) }
63
+ else
64
+ value = assoc.klass.find(value)
65
+ end
66
+ end
60
67
  entity.send("#{name}=", value)
61
68
  end
62
69
  end
@@ -36,7 +36,6 @@ module AdminIt
36
36
  fields(scope: :writable).each do |field|
37
37
  next unless params.key?(field.name)
38
38
  next unless field.writable?
39
- next if field.type == :relation
40
39
  field.write(entity, params[field.name])
41
40
  end
42
41
  controller.redirect_to_default if entity.save
@@ -19,6 +19,8 @@ module AdminIt
19
19
  prepend_view_path 'lib/views'
20
20
  end
21
21
  end
22
+
23
+ config.app_middleware.insert_after(Rack::ETag, Middleware)
22
24
  end
23
25
 
24
26
  def self.config
@@ -19,17 +19,17 @@ module AdminIt
19
19
  include ExtendIt::Callbacks
20
20
 
21
21
  TYPES = %i(unknown integer float string date datetime time relation enum
22
- array hash range regexp symbol binary)
22
+ array hash range regexp symbol binary image)
23
+ EDITORS = %i(text combo radio image hidden)
23
24
 
24
25
  define_callbacks :initialize
25
26
 
26
27
  dsl do
27
28
  dsl_accessor :type, default: TYPES[0]
28
-
29
29
  dsl_accessor :placeholder
30
-
31
- dsl_boolean :readable, :writable, :visible, :sortable
32
-
30
+ dsl_accessor :partial
31
+ dsl_accessor :editor, default: EDITORS[0]
32
+ dsl_boolean :readable, :writable, :visible, :sortable, :show_label
33
33
  dsl_block :read, :write, :render, :display
34
34
 
35
35
  def hide
@@ -42,7 +42,7 @@ module AdminIt
42
42
  end
43
43
 
44
44
  class << self
45
- attr_reader :read, :write, :render, :display, :type
45
+ attr_reader :read, :write, :render, :display, :type, :partial
46
46
 
47
47
  protected
48
48
 
@@ -67,6 +67,10 @@ module AdminIt
67
67
  @sortable.nil? ? @sortable = true : @sortable == true
68
68
  end
69
69
 
70
+ def self.show_label?
71
+ @show_label.nil? ? @show_label = true : @show_label == true
72
+ end
73
+
70
74
  inherited_class_reader :field_name, :entity_class
71
75
 
72
76
  def self.create(name, _entity_class, **opts)
@@ -78,7 +82,9 @@ module AdminIt
78
82
  @writable = opts[:writable].nil? ? true : opts[:writable] == true
79
83
  @visible = opts[:visible].nil? ? true : opts[:visible] == true
80
84
  @sortable = opts[:sortable].nil? ? true : opts[:sortable] == true
85
+ @show_label = opts[:show_label].nil? ? true : opts[:show_label] == true
81
86
  self.type = opts[:type]
87
+ self.editor = opts[:editor] unless opts[:editor].nil?
82
88
  end
83
89
  end
84
90
 
@@ -86,10 +92,18 @@ module AdminIt
86
92
  @type = value.ensure_symbol(values: TYPES, default: TYPES[0])
87
93
  end
88
94
 
95
+ def self.editor=(value)
96
+ @editor = value.ensure_symbol(values: EDITORS, default: EDITORS[0])
97
+ end
98
+
89
99
  def self.placeholder
90
100
  @placeholder ||= display_name
91
101
  end
92
102
 
103
+ def self.partial
104
+ @partial ||= nil
105
+ end
106
+
93
107
  def self.hide
94
108
  @visible = false
95
109
  end
@@ -98,15 +112,20 @@ module AdminIt
98
112
  @visible = true
99
113
  end
100
114
 
101
- class_attr_reader :entity_class, :display_name, :type
115
+ def self.editor
116
+ @editor ||= EDITORS[0]
117
+ end
118
+
119
+ class_attr_reader :entity_class, :display_name, :type, :partial, :editor
102
120
  attr_writer :visible, :readable, :writable
103
121
 
104
- def initialize(readable: nil, writable: nil, visible: nil, sortable: nil)
122
+ def initialize(readable: nil, writable: nil, visible: nil, sortable: nil, show_label: nil)
105
123
  run_callbacks :initialize do
106
124
  @readable = readable.nil? ? self.class.readable? : readable == true
107
125
  @writable = writable.nil? ? self.class.writable? : writable == true
108
126
  @visible = visible.nil? ? self.class.visible? : visible == true
109
127
  @sortable = sortable.nil? ? self.class.sortable? : sortable == true
128
+ @show_label = show_label.nil? ? self.class.show_label? : show_label == true
110
129
  end
111
130
  end
112
131
 
@@ -126,10 +145,18 @@ module AdminIt
126
145
  @visible == true
127
146
  end
128
147
 
148
+ def hidden?
149
+ @visible != true
150
+ end
151
+
129
152
  def sortable?
130
153
  @sortable == true
131
154
  end
132
155
 
156
+ def show_label?
157
+ @show_label == true
158
+ end
159
+
133
160
  def read(entity)
134
161
  unless readable?
135
162
  fail FieldReadError, "Attempt to read write-only field #{name}"
@@ -219,15 +246,23 @@ module AdminIt
219
246
  end
220
247
 
221
248
  def fields(scope: :visible)
249
+ values = @fields.values
250
+ if scope.is_a?(Hash)
251
+ if scope.key?(:editor)
252
+ return values.select { |f| f.editor == scope[:editor] }
253
+ end
254
+ end
222
255
  case scope
223
- when nil, :all then @fields.values
224
- when :visible then @fields.values.select { |f| f.visible? }
225
- when :hidden then @fields.values.select { |f| !f.visible? }
226
- when :readable then @fields.values.select { |f| f.readable? }
227
- when :writable then @fields.values.select { |f| f.writable? }
228
- when :sortable then @fields.values.select { |f| f.sortable? }
229
- when Field::TYPES then @fields.values.select { |f| f.type == scope }
230
- else @fields.values
256
+ when nil, :all then values
257
+ when :visible then values.select { |f| f.visible? }
258
+ when :hidden then values.select { |f| !f.visible? }
259
+ when :readable then values.select { |f| f.readable? }
260
+ when :writable then values.select { |f| f.writable? }
261
+ when :sortable then values.select { |f| f.sortable? }
262
+ when :with_labels then values.select { |f| f.show_label? }
263
+ when :without_labels then values.select { |f| !f.show_label? }
264
+ when Field::TYPES then values.select { |f| f.type == scope }
265
+ else values
231
266
  end
232
267
  end
233
268
 
@@ -3,10 +3,11 @@ module AdminIt
3
3
  module Helpers
4
4
  #
5
5
  class ToolbarItem < WrapIt::Link
6
- attr_accessor :icon, :add_class, :add_data
6
+ attr_accessor :icon, :dialog, :add_class, :add_data
7
7
  option :icon
8
8
  option :add_class
9
9
  option :add_data
10
+ option :dialog
10
11
  section :icon
11
12
  place :icon, before: :body
12
13
 
@@ -15,7 +16,12 @@ module AdminIt
15
16
  self[:icon] << html_safe("<i class=\"fa fa-#{icon}\"></i> ")
16
17
  end
17
18
  html_class << add_class
18
- html_data.merge!(add_data) if add_data.is_a?(Hash)
19
+ data = add_data.is_a?(Hash) ? add_data : {}
20
+ unless dialog.nil? || dialog.empty?
21
+ data[:toggle] = 'modal'
22
+ data[:target] = dialog
23
+ end
24
+ html_data.merge!(data)
19
25
  # options = { tag: 'li' }
20
26
  # options[:class] = 'active' if resource == @template.resource
21
27
  # wrap(options)
@@ -19,3 +19,7 @@ en:
19
19
  destroy:
20
20
  header: 'You are going to delete following record:'
21
21
  text: 'Please, confirm deletion'
22
+ image:
23
+ select: 'Select'
24
+ upload: 'Upload'
25
+ cancel: 'Cancel'
@@ -19,3 +19,7 @@ ru:
19
19
  destroy:
20
20
  header: 'Вы собираетесь удалить следующую запись:'
21
21
  text: 'Подтвердите удаление'
22
+ image:
23
+ select: 'Выбрать'
24
+ upload: 'Загрузить'
25
+ cancel: 'Отмена'
@@ -0,0 +1,54 @@
1
+ module AdminIt
2
+ # Middleware request
3
+ class Request < DelegateClass(Hash)
4
+ ENV_KEY = 'admin_it.request'
5
+
6
+ attr_reader :templates
7
+
8
+ def initialize(env)
9
+ @templates = {}
10
+ @collections = {}
11
+ @models = {}
12
+ @env = env
13
+ @process = false
14
+ super({})
15
+ end
16
+
17
+ def process?
18
+ @process == true
19
+ end
20
+
21
+ def process!
22
+ @process = true
23
+ end
24
+
25
+ def self.get(request)
26
+ return request if request.is_a?(self)
27
+ fail 'Wrong request' unless request.is_a?(Rack::Request)
28
+ request = request.env[ENV_KEY]
29
+ fail 'rails_script middleware is not mounted' if request.nil?
30
+ request
31
+ end
32
+ end
33
+
34
+ # AdminIt middleware
35
+ class Middleware
36
+ SUBST_REGEXP = /<!--\s*([a-zA-Z0-9_]+)\s*-->/
37
+
38
+ def initialize(app)
39
+ @app = app
40
+ end
41
+
42
+ def call(env)
43
+ request = env[Request::ENV_KEY] = Request.new(env)
44
+ status, headers, body = @app.call(env)
45
+ if request.process?
46
+ body.each do |str|
47
+ # $1 not working here ???
48
+ str.gsub!(SUBST_REGEXP) { |s| request[SUBST_REGEXP.match(s)[1]] }
49
+ end
50
+ end
51
+ [status, headers, body]
52
+ end
53
+ end
54
+ end
@@ -6,6 +6,10 @@ module AdminIt
6
6
 
7
7
  dsl { dsl_block :render }
8
8
 
9
+ def renderable?
10
+ !@render.nil?
11
+ end
12
+
9
13
  def render(entity, instance = nil, &block)
10
14
  return if @render.nil?
11
15
  # method used as event emmiter, call block in instance or caller
@@ -33,6 +37,10 @@ module AdminIt
33
37
  @icon ||= default_icon
34
38
  end
35
39
 
40
+ def icon?
41
+ !@icon.nil? && !icon.empty?
42
+ end
43
+
36
44
  protected
37
45
 
38
46
  def default_icon
@@ -1,5 +1,5 @@
1
1
  #
2
2
  module AdminIt
3
3
  # Current gem version
4
- VERSION = '1.1.0'
4
+ VERSION = '1.2.0'
5
5
  end
@@ -85,7 +85,7 @@ module ExtendIt
85
85
  define_method setter_name do |*args|
86
86
  obj =
87
87
  if setter.nil?
88
- default || args.first
88
+ args.first || default
89
89
  else
90
90
  dsl_receiver.instance_exec(*args, &setter)
91
91
  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.1.0
4
+ version: 1.2.0
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-04-22 00:00:00.000000000 Z
11
+ date: 2014-06-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: aws-sdk
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: bundler
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -222,11 +236,16 @@ files:
222
236
  - app/assets/stylesheets/admin_it/admin_it.css
223
237
  - app/assets/stylesheets/admin_it/bootstrap-theme.min.css
224
238
  - app/assets/stylesheets/admin_it/bootstrap.min.css
239
+ - app/assets/stylesheets/admin_it/font-awesome-old.min.css.erb
225
240
  - app/assets/stylesheets/admin_it/font-awesome.min.css.erb
241
+ - app/controllers/admin_it/signed_url_controller.rb
226
242
  - app/views/admin_it/context/_show.html.slim
227
243
  - app/views/admin_it/context/_table.html.slim
228
244
  - app/views/admin_it/context/_tiles.html.slim
229
245
  - app/views/admin_it/edit.html.slim
246
+ - app/views/admin_it/editors/_hidden.html.slim
247
+ - app/views/admin_it/editors/_image.html.slim
248
+ - app/views/admin_it/editors/_text.html.slim
230
249
  - app/views/admin_it/new.html.slim
231
250
  - app/views/admin_it/shared/_child.html.slim
232
251
  - app/views/admin_it/shared/_fields.html.slim
@@ -286,6 +305,7 @@ files:
286
305
  - lib/admin_it/helpers/top_menu.rb
287
306
  - lib/admin_it/locales/en.yml
288
307
  - lib/admin_it/locales/ru.yml
308
+ - lib/admin_it/middleware.rb
289
309
  - lib/admin_it/resource.rb
290
310
  - lib/admin_it/shared.rb
291
311
  - lib/admin_it/version.rb