rademade_admin 0.1.3 → 0.1.4

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 (91) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/rademade_admin/app/common/location.coffee.erb +5 -1
  3. data/app/assets/javascripts/rademade_admin/app/common/status-toggler.coffee +25 -0
  4. data/app/assets/javascripts/rademade_admin/app/common/turboform.coffee +8 -0
  5. data/app/assets/javascripts/rademade_admin/app/form-popup/view.coffee +3 -3
  6. data/app/assets/javascripts/rademade_admin/app/gallery/image/collection-view.coffee +35 -0
  7. data/app/assets/javascripts/rademade_admin/app/gallery/image/collection.coffee +19 -0
  8. data/app/assets/javascripts/rademade_admin/app/gallery/image/model.coffee +25 -0
  9. data/app/assets/javascripts/rademade_admin/app/gallery/image/view.coffee +58 -0
  10. data/app/assets/javascripts/rademade_admin/app/gallery/view.coffee +40 -0
  11. data/app/assets/javascripts/rademade_admin/app/select2/related/view.coffee +1 -1
  12. data/app/assets/javascripts/rademade_admin/app/select2/view.coffee +11 -2
  13. data/app/assets/javascripts/rademade_admin/app/templates/crop.jst.ejs +2 -2
  14. data/app/assets/javascripts/rademade_admin/app/templates/related-item.jst.ejs +2 -2
  15. data/app/assets/javascripts/rademade_admin/form/form.coffee +4 -1
  16. data/app/assets/stylesheets/rademade_admin.sass.erb +2 -1
  17. data/app/assets/stylesheets/rademade_admin/blocks/form/input.sass +56 -27
  18. data/app/assets/stylesheets/rademade_admin/blocks/gallery/_main.sass +67 -0
  19. data/app/assets/stylesheets/rademade_admin/modules/pagination/main.sass +19 -2
  20. data/app/cells/menu/item.slim +2 -0
  21. data/app/cells/menu_cell.rb +8 -2
  22. data/app/controllers/rademade_admin/abstract_controller.rb +6 -2
  23. data/app/controllers/rademade_admin/dashboard_controller.rb +1 -1
  24. data/app/controllers/rademade_admin/file_controller.rb +14 -5
  25. data/app/controllers/rademade_admin/gallery_controller.rb +48 -0
  26. data/app/controllers/rademade_admin/model_controller.rb +37 -29
  27. data/app/controllers/rademade_admin/sessions_controller.rb +7 -6
  28. data/app/controllers/rademade_admin/status_controller.rb +16 -0
  29. data/app/helpers/rademade_admin/field_helper.rb +3 -4
  30. data/app/helpers/rademade_admin/form_helper.rb +35 -25
  31. data/app/helpers/rademade_admin/uri_helper.rb +6 -14
  32. data/app/inputs/rademade_admin/file_input.rb +24 -8
  33. data/app/inputs/rademade_admin/gallery_input.rb +77 -0
  34. data/app/inputs/rademade_admin/related_select_input.rb +13 -4
  35. data/app/serializers/autocomplete/base_serializer.rb +1 -1
  36. data/app/services/gallery/manager.rb +81 -0
  37. data/app/services/login.rb +3 -3
  38. data/app/services/menu_service.rb +1 -1
  39. data/app/services/menu_service/menu_item.rb +4 -0
  40. data/app/services/model_controller/model_options.rb +1 -0
  41. data/app/services/model_controller/notifier.rb +24 -10
  42. data/app/services/search/conditions/autocomplete.rb +4 -11
  43. data/app/services/search/conditions/list.rb +22 -10
  44. data/app/services/search/conditions/related_list.rb +8 -4
  45. data/app/services/search/where.rb +20 -0
  46. data/app/services/sortable_service.rb +1 -4
  47. data/app/services/status/toggler.rb +27 -0
  48. data/app/services/template_service.rb +33 -1
  49. data/app/services/upload/gallery_preview_service.rb +64 -0
  50. data/app/views/layouts/rademade_admin.html.erb +1 -22
  51. data/app/views/rademade_admin/_blocks/_form.html.erb +10 -0
  52. data/app/views/rademade_admin/_blocks/_header.html.erb +0 -12
  53. data/app/views/rademade_admin/_blocks/_search.html.erb +11 -0
  54. data/app/views/rademade_admin/_blocks/_sort_reset.html.erb +5 -0
  55. data/app/views/rademade_admin/_blocks/button/_cancel.html.erb +7 -0
  56. data/app/views/rademade_admin/_blocks/button/_destroy.html.erb +12 -0
  57. data/app/views/rademade_admin/_blocks/button/_edit.html.erb +4 -2
  58. data/app/views/rademade_admin/_blocks/button/_hide.html.erb +13 -0
  59. data/app/views/rademade_admin/_blocks/button/_preview.html.erb +3 -0
  60. data/app/views/rademade_admin/_blocks/form/_control.html.erb +9 -3
  61. data/app/views/rademade_admin/_blocks/form/_separator.html.erb +1 -0
  62. data/app/views/rademade_admin/_blocks/table/_head.html.erb +8 -2
  63. data/app/views/rademade_admin/_layouts/inner/index_table.html.erb +1 -3
  64. data/app/views/rademade_admin/_layouts/main.html.erb +26 -0
  65. data/app/views/rademade_admin/abstract/_form.html.erb +1 -7
  66. data/app/views/rademade_admin/abstract/index.html.erb +7 -13
  67. data/config/locales/rademade_admin.en.yml +16 -1
  68. data/config/locales/rademade_admin.ru.yml +22 -2
  69. data/config/routes.rb +9 -1
  70. data/lib/rademade_admin.rb +5 -0
  71. data/lib/rademade_admin/configuration.rb +6 -1
  72. data/lib/rademade_admin/engine.rb +4 -0
  73. data/lib/rademade_admin/gallery.rb +13 -0
  74. data/lib/rademade_admin/hideable.rb +37 -0
  75. data/lib/rademade_admin/input/related_select_input/related_list.rb +2 -2
  76. data/lib/rademade_admin/model/adapter/data.rb +8 -0
  77. data/lib/rademade_admin/model/adapter/data/active_record.rb +12 -2
  78. data/lib/rademade_admin/model/adapter/data/mongoid.rb +10 -8
  79. data/lib/rademade_admin/model/adapter/query/active_record.rb +8 -3
  80. data/lib/rademade_admin/model/configuration.rb +10 -8
  81. data/lib/rademade_admin/model/info.rb +13 -2
  82. data/lib/rademade_admin/model/info/data_item.rb +8 -3
  83. data/lib/rademade_admin/model/info/fields.rb +12 -2
  84. data/lib/rademade_admin/model/info/relation.rb +5 -0
  85. data/lib/rademade_admin/model/info/relation/gallery.rb +12 -0
  86. data/lib/rademade_admin/model/reflection.rb +4 -0
  87. data/lib/rademade_admin/routing/mapper.rb +1 -1
  88. data/lib/rademade_admin/routing/resource.rb +4 -0
  89. data/lib/rademade_admin/uploader/crop_photo.rb +3 -2
  90. data/lib/rademade_admin/version.rb +1 -1
  91. metadata +83 -8
@@ -0,0 +1,67 @@
1
+ .gallery
2
+ +clear
3
+ .gallery-images-container
4
+ overflow: auto
5
+ .gallery-image
6
+ display: inline-block
7
+ position: relative
8
+ padding: 5px
9
+ .gallery-image-upload
10
+ float: left
11
+ position: relative
12
+ width: 100%
13
+ height: 98px
14
+ padding: 96px 0 0
15
+ margin: 0 5px 5px 0
16
+ border: 1px dashed #BDC3C7
17
+ font-size: 300px
18
+ overflow: hidden
19
+ cursor: pointer
20
+ background-color: #ffffff
21
+ outline: none
22
+ +border-radius(3px)
23
+ +box-sizing(border-box)
24
+ &:hover
25
+ opacity: 0.6
26
+ &:after
27
+ position: absolute
28
+ top: 0
29
+ left: 0
30
+ padding-top: 45px
31
+ content: "Click or drop files here"
32
+ text-align: center
33
+ width: 100%
34
+ height: 100%
35
+ font-size: 15px
36
+ color: #555
37
+ +box-sizing(border-box)
38
+
39
+
40
+ .remove-ico
41
+ position: absolute
42
+ top: 2px
43
+ right: 5px
44
+ font-size: 13px
45
+ cursor: pointer
46
+ padding: 1px 5px
47
+ border-radius: 3px
48
+ background-color: #FFF
49
+ font-weight: bold
50
+
51
+ .crop-btn
52
+ position: absolute
53
+ bottom: 5px
54
+
55
+ .gallery-images-container
56
+ float: left
57
+ margin: 0 -2px
58
+ .gallery-image
59
+ float: left
60
+ margin: 0 2px 4px 2px
61
+ width: 135px
62
+ height: 98px
63
+ border: 1px solid #BDC3C7
64
+ +border-radius(3px)
65
+ img
66
+ max-width: 100% !important
67
+ max-height: 100% !important
@@ -9,8 +9,11 @@
9
9
  padding: 0 15px
10
10
  .last
11
11
  padding: 0 15px
12
-
13
- span
12
+ .page,
13
+ .next,
14
+ .last,
15
+ .first,
16
+ .prev
14
17
  float: left
15
18
  margin: 0 -1px 0 0
16
19
  padding: 0
@@ -25,6 +28,20 @@
25
28
  border-bottom: 1px solid #34495e
26
29
  a
27
30
  color: #34495e
31
+
32
+ &.gap
33
+ display: inline-block
34
+ padding: 0 5px
35
+ min-width: 35px
36
+ height: 37px
37
+ line-height: 35px
38
+ font-size: 14px
39
+ color: #34495e
40
+ text-align: center
41
+ cursor: default
42
+ +box-sizing(border-box)
43
+ &:hover
44
+ border: 1px solid #dddddd
28
45
  a
29
46
  display: inline-block
30
47
  padding: 0 5px
@@ -8,6 +8,8 @@
8
8
  a href="#{@uri}" class=('menu-link' + (@has_sub_items ? ' dropdown-toggle' : ''))
9
9
  i(class="#{@ico_class}")
10
10
  span #{@name}
11
+ - if @count && @count > 0
12
+ span() (#{@count})
11
13
 
12
14
  - if @has_sub_items
13
15
  span.caret
@@ -2,12 +2,13 @@ class MenuCell < Cell::Rails
2
2
  include ::RademadeAdmin::UriHelper
3
3
 
4
4
  class << self
5
- attr_accessor :current_model
5
+ attr_accessor :current_model, :current_ability
6
6
  end
7
7
 
8
8
  def root_item
9
9
  @uri = root_uri
10
10
  @name = t('rademade_admin.home')
11
+ @count = nil
11
12
  @ico_class = 'glyphicon glyphicon-home'
12
13
  @has_sub_items = false
13
14
  @is_active = self.class.current_model.nil?
@@ -33,8 +34,9 @@ class MenuCell < Cell::Rails
33
34
 
34
35
  def item_data(item)
35
36
  @is_active = current?(item) || children_current?(item) #todo extract service for current
36
- @uri = admin_list_uri(item.model)
37
+ @uri = can_read?(item) ? admin_list_uri(item.model) : nil
37
38
  @name = item.name
39
+ @count = item.count
38
40
  @has_sub_items = item.has_sub_items?
39
41
  @sub_items = item.sub_items
40
42
  end
@@ -43,6 +45,10 @@ class MenuCell < Cell::Rails
43
45
  self.class.current_model == item.model
44
46
  end
45
47
 
48
+ def can_read?(item) # todo move authorize check to uri helper
49
+ self.class.current_ability.can?(:read, item.model)
50
+ end
51
+
46
52
  def children_current?(item, status = false)
47
53
  if item.has_sub_items?
48
54
  item.sub_items.each do |sub_item|
@@ -7,7 +7,7 @@ module RademadeAdmin
7
7
 
8
8
  layout 'rademade_admin'
9
9
 
10
- before_action :init_user, :init_template_service, :require_login, :root_breadcrumbs
10
+ before_action :init_user, :init_template_service, :require_login, :root_breadcrumbs, :menu
11
11
 
12
12
  attr_reader :current_user
13
13
 
@@ -41,7 +41,11 @@ module RademadeAdmin
41
41
  end
42
42
 
43
43
  def current_ability
44
- @current_ability ||= ::RademadeAdmin::Ability.new(@current_user)
44
+ @current_ability ||= (RademadeAdmin.ability_class || ::RademadeAdmin::Ability).new(@current_user)
45
+ end
46
+
47
+ def menu
48
+ MenuCell.current_ability = current_ability
45
49
  end
46
50
 
47
51
  end
@@ -5,7 +5,7 @@ module RademadeAdmin
5
5
  skip_before_action :require_login, :only => [:login]
6
6
 
7
7
  def index
8
-
8
+ MenuCell.current_model = nil
9
9
  end
10
10
 
11
11
  def login
@@ -9,11 +9,16 @@ class RademadeAdmin::FileController < RademadeAdmin::AbstractController
9
9
  :file => uploader
10
10
  }
11
11
  rescue CarrierWave::UploadError => e
12
- render :json => { :error => e.to_s }, :status => :unprocessable_entity
12
+ show_error(e)
13
+ end
14
+
15
+ def download
16
+ # todo filename
17
+ send_file(uploader.model.send(uploader.mounted_as).file.file)
13
18
  end
14
19
 
15
20
  def crop
16
- image = uploader.crop_image(params[:path], params[:crop])
21
+ image = uploader.crop_image(params[:crop], params[:path])
17
22
  uploader.store!(image)
18
23
  upload_preview_service = RademadeAdmin::Upload::PreviewService.new(uploader)
19
24
  render :json => {
@@ -21,18 +26,22 @@ class RademadeAdmin::FileController < RademadeAdmin::AbstractController
21
26
  :file => uploader
22
27
  }
23
28
  rescue CarrierWave::UploadError => e
24
- render :json => { :error => e.to_s }, :status => :unprocessable_entity
29
+ show_error(e)
25
30
  end
26
31
 
27
32
  private
28
33
 
34
+ def show_error(error)
35
+ render :json => { :error => error.to_s }, :status => :unprocessable_entity
36
+ end
37
+
29
38
  def uploader
30
39
  @uploader ||= RademadeAdmin::LoaderService.const_get(params[:uploader]).new(model, params[:column])
31
40
  end
32
41
 
33
42
  def model
34
43
  model_class = RademadeAdmin::LoaderService.const_get(params[:model])
35
- params[:saved].to_i.zero? ? model_class.new : model_class.find(params[:id])
44
+ params[:id].present? ? model_class.find(params[:id]) : model_class.new
36
45
  end
37
46
 
38
- end
47
+ end
@@ -0,0 +1,48 @@
1
+ # -*- encoding : utf-8 -*-
2
+ class RademadeAdmin::GalleryController < RademadeAdmin::AbstractController
3
+
4
+ def upload
5
+ gallery_service.upload_images(params[:gallery_id], params[:files])
6
+ render :json => {
7
+ :gallery_images_html => gallery_service.gallery_images_html
8
+ }
9
+ rescue Exception => e
10
+ show_error(e)
11
+ end
12
+
13
+ def crop
14
+ uploader = gallery_service.crop_image(params[:id], params[:crop])
15
+ preview_service = RademadeAdmin::Upload::GalleryPreviewService.new
16
+ render :json => {
17
+ :crop_button_html => preview_service.crop_button_html(uploader),
18
+ :gallery_image_url => preview_service.gallery_image_preview(uploader)
19
+ }
20
+ rescue Exception => e
21
+ show_error(e)
22
+ end
23
+
24
+ def remove
25
+ gallery_service.remove_image(params[:id])
26
+ render :json => { }
27
+ rescue Exception => e
28
+ show_error(e)
29
+ end
30
+
31
+ def sort
32
+ gallery_service.sort_images(params[:images])
33
+ render :json => { }
34
+ rescue Exception => e
35
+ show_error(e)
36
+ end
37
+
38
+ private
39
+
40
+ def show_error(error)
41
+ render :json => { :error => error.to_s }, :status => :unprocessable_entity
42
+ end
43
+
44
+ def gallery_service
45
+ @gallery_service ||= RademadeAdmin::Gallery::Manager.new(params[:class_name])
46
+ end
47
+
48
+ end
@@ -26,9 +26,9 @@ module RademadeAdmin
26
26
  end
27
27
 
28
28
  def update
29
- authorize! :update, model_class
30
29
  saver = RademadeAdmin::Saver.new(model_info, params)
31
30
  saver.find_model
31
+ authorize! :update, saver.item
32
32
  saver.save_data
33
33
  success_update saver.item
34
34
  rescue Exception => e
@@ -36,37 +36,28 @@ module RademadeAdmin
36
36
  end
37
37
 
38
38
  def destroy
39
- authorize! :destroy, model_class
40
39
  @item = model.find(params[:id])
40
+ authorize! :destroy, @item
41
41
  @item.delete if @item
42
42
  success_delete @item
43
43
  end
44
44
 
45
45
  def autocomplete
46
46
  authorize! :read, model_class
47
- conditions = Search::Conditions::Autocomplete.new(params, model_info.data_items)
48
- @items = Search::Searcher.new(model_info).search(conditions)
49
- render :json => Autocomplete::BaseSerializer.new(@items)
47
+ render :json => Autocomplete::BaseSerializer.new(autocomplete_items)
50
48
  end
51
49
 
52
50
  def link_autocomplete
53
51
  authorize! :read, model_class
54
-
55
52
  relation_service = RademadeAdmin::RelationService.new
56
53
  @related_model_info = relation_service.related_model_info(model_info, params[:relation])
57
-
58
- conditions = Search::Conditions::Autocomplete.new(params, @related_model_info.data_items)
59
- @items = Search::Searcher.new(@related_model_info).search(conditions)
60
- render :json => Autocomplete::LinkSerializer.new(@items, model.find(params[:id]), params[:relation])
54
+ render :json => Autocomplete::LinkSerializer.new(link_autocomplete_items, model.find(params[:id]), params[:relation])
61
55
  end
62
56
 
63
57
  def index
64
58
  authorize! :read, model_class
65
59
  list_breadcrumbs
66
-
67
- conditions = Search::Conditions::List.new(params, model_info.data_items)
68
- @items = Search::Searcher.new(model_info).search(conditions)
69
-
60
+ @items = index_items
70
61
  respond_to do |format|
71
62
  format.html { render_template }
72
63
  format.json { render :json => @items }
@@ -75,34 +66,27 @@ module RademadeAdmin
75
66
 
76
67
  def new
77
68
  authorize! :create, model_class
69
+ @with_create_and_return_button = true
70
+ @item = new_model
78
71
  new_breadcrumbs
79
-
80
- @item = model.new
81
72
  render_template
82
73
  end
83
74
 
84
75
  def edit
85
- authorize! :update, model_class
86
76
  @item = model.find(params[:id])
87
-
77
+ authorize! :update, @item
78
+ @with_create_and_return_button = true
88
79
  edit_breadcrumbs
89
80
  render_template
90
81
  end
91
82
 
92
83
  def related
93
84
  authorize! :read, model_class
94
-
95
- #rm_todo extract relation service
96
- relation_service = RademadeAdmin::RelationService.new
97
- @related_model_info = relation_service.related_model_info(model_info, params[:relation])
98
-
85
+ @related_model_info = RademadeAdmin::RelationService.new.related_model_info(model_info, params[:relation])
99
86
  @item = model.find(params[:id])
100
87
  search_params = params.except(:id)
101
- conditions = Search::Conditions::RelatedList.new(@item, search_params, @related_model_info.data_items)
102
- @items = Search::Searcher.new(@related_model_info).search(conditions)
103
-
88
+ @items = related_items(search_params)
104
89
  @sortable_service = RademadeAdmin::SortableService.new(@related_model_info, search_params)
105
-
106
90
  respond_to do |format|
107
91
  format.html {
108
92
  related_breadcrumbs
@@ -127,8 +111,8 @@ module RademadeAdmin
127
111
  end
128
112
 
129
113
  def show
130
- authorize! :read, model_class
131
114
  @item = model.find(params[:id])
115
+ authorize! :read, @item
132
116
  respond_to do |format|
133
117
  format.html { redirect_to :action => 'index' }
134
118
  format.json { render :json => @item }
@@ -137,7 +121,7 @@ module RademadeAdmin
137
121
 
138
122
  def form
139
123
  authorize! :read, model_class
140
- @item = params[:id].blank? ? model.new : model.find(params[:id])
124
+ @item = params[:id].blank? ? new_model : model.find(params[:id])
141
125
  render form_template_path(true), :layout => false
142
126
  end
143
127
 
@@ -148,6 +132,30 @@ module RademadeAdmin
148
132
 
149
133
  protected
150
134
 
135
+ def index_items
136
+ conditions = Search::Conditions::List.new(params, model_info.data_items)
137
+ Search::Searcher.new(model_info).search(conditions)
138
+ end
139
+
140
+ def autocomplete_items
141
+ conditions = Search::Conditions::Autocomplete.new(params, model_info.data_items)
142
+ Search::Searcher.new(model_info).search(conditions)
143
+ end
144
+
145
+ def link_autocomplete_items
146
+ conditions = Search::Conditions::Autocomplete.new(params, @related_model_info.data_items)
147
+ Search::Searcher.new(@related_model_info).search(conditions)
148
+ end
149
+
150
+ def related_items(search_params)
151
+ conditions = Search::Conditions::RelatedList.new(@item, search_params, @related_model_info.data_items)
152
+ Search::Searcher.new(@related_model_info).search(conditions)
153
+ end
154
+
155
+ def new_model
156
+ model.new
157
+ end
158
+
151
159
  def model
152
160
  @model ||= model_info.model
153
161
  end
@@ -5,13 +5,14 @@ module RademadeAdmin
5
5
  skip_before_action :require_login
6
6
 
7
7
  def login
8
- begin
9
- user = RademadeAdmin::Login.admin(params)
10
- session[:user_id] = user.id.to_s
11
- render :json => user, :status => :ok
12
- rescue RademadeAdmin::Login::Error => e
13
- render :json => {:errors => e.field_messages}, :status => :precondition_failed
8
+ user = RademadeAdmin::Login.admin(params)
9
+ session[:user_id] = user.id.to_s
10
+ respond_to do |format|
11
+ format.html { redirect_to :controller => 'dashboard', :action => 'index' }
12
+ format.json { render :json => user }
14
13
  end
14
+ rescue RademadeAdmin::Login::Error => e
15
+ render :json => { :errors => e.field_messages }, :status => :precondition_failed
15
16
  end
16
17
 
17
18
  def logout
@@ -0,0 +1,16 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module RademadeAdmin
3
+ class StatusController < RademadeAdmin::AbstractController
4
+
5
+ include RademadeAdmin::Notifier
6
+
7
+ def toggle
8
+ authorize! :update, params[:model]
9
+ status_changer = RademadeAdmin::Status::Toggler.new(params[:model], params[:id])
10
+ status_changer.init_item
11
+ status_changer.toggle
12
+ success_status_change(status_changer.item)
13
+ end
14
+
15
+ end
16
+ end