rademade_admin 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
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