coalla-cms 0.5.1.9 → 0.6.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (157) hide show
  1. checksums.yaml +15 -0
  2. data/Gemfile +1 -1
  3. data/Rakefile +24 -24
  4. data/app/assets/javascripts/admin/admin.js +236 -33
  5. data/app/assets/stylesheets/admin/admin.scss +1 -2
  6. data/app/assets/stylesheets/admin/vendor/bootstrap.min.css +6242 -4
  7. data/app/assets/stylesheets/admin/vendor/token-input-bootstrap.scss +144 -0
  8. data/app/controllers/admin/autocomplete_controller.rb +3 -1
  9. data/app/controllers/admin/base_controller.rb +35 -0
  10. data/{lib/generators/coalla/cms/templates/controllers/admin/home_controller.rb.erb → app/controllers/admin/home_controller.rb} +0 -0
  11. data/app/controllers/concerns/admin/editable_columns.rb +55 -0
  12. data/app/controllers/concerns/admin/sortable_columns.rb +16 -0
  13. data/app/controllers/{admin/sortable_controller.rb → concerns/admin/sortable_models.rb} +1 -5
  14. data/app/helpers/admin/alerts_helper.rb +31 -0
  15. data/app/helpers/admin/content_helper.rb +29 -0
  16. data/app/helpers/admin/form_helper.rb +50 -0
  17. data/app/helpers/admin/resource_helpers.rb +102 -0
  18. data/app/helpers/admin/search_helper.rb +44 -40
  19. data/app/helpers/admin/table_helper.rb +40 -0
  20. data/app/helpers/common_helper.rb +2 -2
  21. data/app/models/file_upload.rb +1 -1
  22. data/app/models/lookup.rb +1 -1
  23. data/app/models/site_meta_tags.rb +2 -2
  24. data/app/views/admin/common/_menu_section.haml +1 -1
  25. data/app/views/admin/common/_nested_fields_for.html.haml +10 -4
  26. data/app/views/admin/common/_nested_fields_for_element.html.haml +21 -5
  27. data/app/views/admin/common/_table_template.html.haml +26 -7
  28. data/app/views/admin/common/_upload_form.html.haml +2 -1
  29. data/app/views/admin/editable_columns/edit/_boolean.haml +2 -0
  30. data/app/views/admin/editable_columns/edit/_date.haml +2 -0
  31. data/app/views/admin/editable_columns/edit/_datetime.haml +3 -0
  32. data/app/views/admin/editable_columns/edit/_enumerize.haml +2 -0
  33. data/app/views/admin/editable_columns/edit/_string.haml +2 -0
  34. data/app/views/admin/editable_columns/edit/_text.haml +2 -0
  35. data/app/views/admin/editable_columns/edit/_time.haml +3 -0
  36. data/app/views/admin/editable_columns/edit_column.haml +8 -0
  37. data/app/views/admin/editable_columns/result/_boolean.haml +2 -0
  38. data/app/views/admin/editable_columns/result/_date.haml +1 -0
  39. data/app/views/admin/editable_columns/result/_datetime.haml +1 -0
  40. data/app/views/admin/editable_columns/result/_enumerize.haml +1 -0
  41. data/app/views/admin/editable_columns/result/_string.haml +1 -0
  42. data/app/views/admin/editable_columns/result/_text.haml +1 -0
  43. data/app/views/admin/editable_columns/result/_time.haml +1 -0
  44. data/app/views/admin/site_meta_tags/index.html.haml +2 -2
  45. data/app/views/layouts/admin.html.haml +12 -0
  46. data/app/views/structure/_section.haml +2 -9
  47. data/coalla-cms.gemspec +10 -11
  48. data/lib/coalla/builders/actions_column_definition.rb +44 -0
  49. data/lib/coalla/builders/admin_structure.rb +86 -0
  50. data/lib/coalla/builders/column_definition.rb +9 -0
  51. data/lib/coalla/builders/form_builder.rb +291 -0
  52. data/lib/coalla/builders/link_renderer.rb +43 -0
  53. data/lib/coalla/builders/policy.rb +30 -0
  54. data/lib/coalla/builders/table_builder.rb +99 -0
  55. data/lib/coalla/builders/table_formatter.rb +133 -0
  56. data/lib/coalla/builders/text_formatter.rb +22 -0
  57. data/lib/coalla/cms/engine.rb +3 -2
  58. data/lib/coalla/cms/version.rb +2 -2
  59. data/lib/coalla/ext/mapper.rb +7 -0
  60. data/lib/coalla/orm/{relation.rb → multi_field.rb} +7 -8
  61. data/lib/coalla/orm/page_slider.rb +2 -28
  62. data/lib/coalla/orm/sanitized.rb +1 -5
  63. data/lib/coalla/orm/sortable_association.rb +30 -0
  64. data/lib/coalla/uploaders/file_uploader.rb +9 -0
  65. data/lib/coalla/uploaders/image_uploader.rb +62 -0
  66. data/lib/coalla/uploaders/meta_image_uploader.rb +7 -0
  67. data/lib/coalla-cms.rb +10 -0
  68. data/lib/generators/coalla/cms/create_admin_administrators_generator.rb +5 -7
  69. data/lib/generators/coalla/cms/create_admin_generator.rb +9 -7
  70. data/lib/generators/coalla/cms/create_admin_login_view_generator.rb +4 -6
  71. data/lib/generators/coalla/cms/create_markup_generator.rb +2 -2
  72. data/lib/generators/coalla/cms/file_uploads/install_generator.rb +0 -17
  73. data/lib/generators/coalla/cms/file_uploads/mount_generator.rb +4 -7
  74. data/lib/generators/coalla/cms/image/install_generator.rb +0 -3
  75. data/lib/generators/coalla/cms/image/mount_generator.rb +0 -3
  76. data/lib/generators/coalla/cms/image/templates/mount/uploader.rb.erb +1 -1
  77. data/lib/generators/coalla/cms/image/templates/uploader.rb.erb +1 -1
  78. data/lib/generators/coalla/cms/init_generator.rb +42 -49
  79. data/lib/generators/coalla/cms/lookups/install_generator.rb +0 -3
  80. data/lib/generators/coalla/cms/meta_tags/install_generator.rb +0 -2
  81. data/lib/generators/coalla/cms/scaffold_generator.rb +7 -7
  82. data/lib/generators/coalla/cms/setup_admin_generator.rb +9 -9
  83. data/lib/generators/coalla/cms/setup_routes_generator.rb +3 -3
  84. data/lib/generators/coalla/cms/slider/init_generator.rb +1 -3
  85. data/lib/generators/coalla/cms/slider/templates/slider_image.rb.erb +0 -1
  86. data/lib/generators/coalla/cms/slider/templates/slider_image_uploader.rb.erb +1 -1
  87. data/lib/generators/coalla/cms/templates/.gitignore +3 -3
  88. data/lib/generators/coalla/cms/templates/controllers/admin/administrators_controller.rb +2 -40
  89. data/lib/generators/coalla/cms/templates/controllers/admin/scaffold_controller_template.rb.erb +0 -39
  90. data/lib/generators/coalla/cms/templates/initializers/carrierwave.rb +0 -90
  91. data/lib/generators/coalla/cms/templates/locales/activerecord.en.yml +14 -1
  92. data/lib/generators/coalla/cms/templates/views/admin/administrators/_form.html.haml +1 -1
  93. data/lib/generators/coalla/cms/templates/views/admin/administrators/edit.html.haml +1 -1
  94. data/lib/generators/coalla/cms/templates/views/admin/administrators/index.html.haml +5 -5
  95. data/lib/generators/coalla/cms/templates/views/admin/administrators/new.html.haml +1 -1
  96. data/lib/generators/coalla/cms/templates/views/admin/scaffold_template/_form.html.haml.erb +1 -1
  97. data/lib/generators/coalla/cms/templates/views/admin/scaffold_template/edit.html.haml.erb +1 -1
  98. data/lib/generators/coalla/cms/templates/views/admin/scaffold_template/index.html.haml.erb +5 -5
  99. data/lib/generators/coalla/cms/templates/views/admin/scaffold_template/new.html.haml.erb +1 -1
  100. data/lib/generators/coalla/cms/templates/views/administrators/sessions/new.html.haml +1 -1
  101. data/lib/generators/coalla/cms/utils/orm.rb +29 -0
  102. data/lib/generators/coalla/cms/utils/scaffold.rb +11 -0
  103. metadata +60 -145
  104. data/Gemfile.lock +0 -198
  105. data/app/assets/stylesheets/admin/vendor/token-input-facebook.patched.css +0 -126
  106. data/app/assets/stylesheets/admin/vendor/token-input.patched.css +0 -116
  107. data/app/controllers/admin/notifier_controller.rb +0 -7
  108. data/app/helpers/admin_helper.rb +0 -29
  109. data/app/helpers/nested_fields_helper.rb +0 -12
  110. data/app/helpers/static_text_formatter.rb +0 -25
  111. data/app/helpers/twitter_builder_helper.rb +0 -253
  112. data/app/helpers/twitter_form_builder.rb +0 -202
  113. data/app/uploaders/file_uploader.rb +0 -10
  114. data/app/uploaders/generic_image_uploader.rb +0 -74
  115. data/app/uploaders/meta_tags_image_uploader.rb +0 -5
  116. data/app/utils/admin_structure.rb +0 -82
  117. data/app/utils/bootstrap_link_renderer.rb +0 -40
  118. data/app/utils/table_helpers.rb +0 -196
  119. data/lib/generators/coalla/cms/market/install_generator.rb +0 -71
  120. data/lib/generators/coalla/cms/market/templates/controllers/categories_controller.rb +0 -47
  121. data/lib/generators/coalla/cms/market/templates/controllers/products_controller.rb +0 -50
  122. data/lib/generators/coalla/cms/market/templates/controllers/properties_controller.rb +0 -59
  123. data/lib/generators/coalla/cms/market/templates/market.rb +0 -5
  124. data/lib/generators/coalla/cms/market/templates/market.ru.yml +0 -53
  125. data/lib/generators/coalla/cms/market/templates/migrations/create_categories.rb +0 -15
  126. data/lib/generators/coalla/cms/market/templates/migrations/create_product_properties.rb +0 -18
  127. data/lib/generators/coalla/cms/market/templates/migrations/create_products.rb +0 -18
  128. data/lib/generators/coalla/cms/market/templates/migrations/create_properties.rb +0 -11
  129. data/lib/generators/coalla/cms/market/templates/models/category.rb +0 -36
  130. data/lib/generators/coalla/cms/market/templates/models/product.rb +0 -16
  131. data/lib/generators/coalla/cms/market/templates/models/product_property.rb +0 -14
  132. data/lib/generators/coalla/cms/market/templates/models/property.rb +0 -7
  133. data/lib/generators/coalla/cms/market/templates/views/categories/_form.html.haml +0 -10
  134. data/lib/generators/coalla/cms/market/templates/views/categories/edit.html.haml +0 -5
  135. data/lib/generators/coalla/cms/market/templates/views/categories/index.html.haml +0 -17
  136. data/lib/generators/coalla/cms/market/templates/views/categories/new.html.haml +0 -4
  137. data/lib/generators/coalla/cms/market/templates/views/products/_form.html.haml +0 -17
  138. data/lib/generators/coalla/cms/market/templates/views/products/_product_property_fields.html.haml +0 -13
  139. data/lib/generators/coalla/cms/market/templates/views/products/edit.html.haml +0 -5
  140. data/lib/generators/coalla/cms/market/templates/views/products/index.html.haml +0 -17
  141. data/lib/generators/coalla/cms/market/templates/views/products/new.html.haml +0 -4
  142. data/lib/generators/coalla/cms/market/templates/views/properties/_form.html.haml +0 -9
  143. data/lib/generators/coalla/cms/market/templates/views/properties/edit.html.haml +0 -5
  144. data/lib/generators/coalla/cms/market/templates/views/properties/index.html.haml +0 -15
  145. data/lib/generators/coalla/cms/market/templates/views/properties/new.html.haml +0 -4
  146. data/lib/generators/coalla/cms/news/scaffold_generator.rb +0 -50
  147. data/lib/generators/coalla/cms/news/templates/entity.rb.erb +0 -10
  148. data/lib/generators/coalla/cms/news/templates/entity_controller_template.rb.erb +0 -47
  149. data/lib/generators/coalla/cms/news/templates/entity_image_uploader.rb.erb +0 -7
  150. data/lib/generators/coalla/cms/news/templates/migration.rb.erb +0 -15
  151. data/lib/generators/coalla/cms/news/templates/views/_form.haml.erb +0 -16
  152. data/lib/generators/coalla/cms/news/templates/views/edit.haml.erb +0 -5
  153. data/lib/generators/coalla/cms/news/templates/views/index.haml.erb +0 -18
  154. data/lib/generators/coalla/cms/news/templates/views/new.haml.erb +0 -5
  155. data/lib/generators/coalla/cms/orm_helpers.rb +0 -31
  156. data/lib/generators/coalla/cms/scaffold_helper.rb +0 -11
  157. data/lib/generators/coalla/cms/templates/controllers/admin/base_controller.rb.erb +0 -35
@@ -0,0 +1,144 @@
1
+ $tag-bg-color: #fff;
2
+ $tag-font-color: #333;
3
+ $border-color: #ccc;
4
+ $dropdown-link-color: lighten(#000, 13.5%);
5
+ $dropdown-link-hover-color: darken(#000, 5%);
6
+ $dropdown-link-hover-bg: #f5f5f5;
7
+
8
+
9
+ ul.token-input-list-bootstrap {
10
+ display: block;
11
+ width: 100%;
12
+ font-size: 14px;
13
+ line-height: 1.42857143;
14
+ color: #555;
15
+ background-image: none;
16
+ border: 1px solid #ccc;
17
+ border-radius: 4px;
18
+ overflow: hidden;
19
+ height: auto !important;
20
+ border: 1px solid $border-color;
21
+ cursor: text;
22
+ margin: 0;
23
+ padding: 0;
24
+ background-color: #fff;
25
+ list-style-type: none;
26
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
27
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
28
+ -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
29
+ transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
30
+ }
31
+
32
+ ul.token-input-list-bootstrap li input {
33
+ border: 0;
34
+ width: 100px;
35
+ padding: 3px 8px;
36
+ background-color: white;
37
+ margin: 2px 0;
38
+ }
39
+
40
+ li.token-input-token-bootstrap {
41
+ overflow: hidden;
42
+ height: auto !important;
43
+ height: 15px;
44
+ margin: 3px;
45
+ padding: 1px 5px;
46
+ background-color: $tag-bg-color;
47
+ color: $tag-font-color;
48
+ cursor: default;
49
+ border: 1px solid $border-color;
50
+ font-size: 13px;
51
+ border-radius: 3px;
52
+ float: left;
53
+ white-space: nowrap;
54
+ .token-input-delete-token-bootstrap{
55
+ color: $tag-font-color;
56
+ }
57
+ }
58
+
59
+ li.token-input-token-bootstrap p {
60
+ display: inline;
61
+ padding: 0;
62
+ margin: 0;
63
+ }
64
+
65
+ li.token-input-token-bootstrap span {
66
+ color: #a6b3cf;
67
+ margin-left: 5px;
68
+ font-weight: bold;
69
+ cursor: pointer;
70
+ }
71
+
72
+ li.token-input-selected-token-bootstrap {
73
+ background-color: darken($tag-bg-color, 5%);
74
+ border: 1px solid darken($border-color, 5%);
75
+ }
76
+
77
+ li.token-input-input-token-bootstrap {
78
+ float: left;
79
+ margin: 0;
80
+ padding: 0;
81
+ list-style-type: none;
82
+ }
83
+
84
+ div.token-input-dropdown-bootstrap {
85
+ position: absolute;
86
+ top: 100%;
87
+ left: 0;
88
+ z-index: 1000;
89
+ display: none;
90
+ float: left;
91
+ min-width: 400px;
92
+ padding: 5px 0;
93
+ margin: 2px 0 0;
94
+ list-style: none;
95
+ font-size: 14px;
96
+ background-color: #fff;
97
+ border: 1px solid #ccc;
98
+ border: 1px solid rgba(0, 0, 0, .15);
99
+ border-radius: 4px;
100
+ -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
101
+ box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
102
+ background-clip: padding-box
103
+ }
104
+
105
+ div.token-input-dropdown-bootstrap p {
106
+ margin: 0;
107
+ padding: 5px;
108
+ color: lighten(#000, 46.7%);
109
+ }
110
+
111
+ div.token-input-dropdown-bootstrap ul {
112
+ margin: 0;
113
+ padding: 0;
114
+ }
115
+
116
+ div.token-input-dropdown-bootstrap ul li {
117
+ list-style-type: none;
118
+ display: block;
119
+ padding: 3px 15px;
120
+ clear: both;
121
+ font-weight: normal;
122
+ line-height: 34px;
123
+ color: $dropdown-link-color;
124
+ white-space: nowrap;
125
+ }
126
+
127
+ div.token-input-dropdown-bootstrap ul li.token-input-dropdown-item-bootstrap {
128
+ background-color: white;
129
+ }
130
+
131
+ div.token-input-dropdown-bootstrap ul li.token-input-dropdown-item2-bootstrap {
132
+ background-color: white;
133
+ }
134
+
135
+ div.token-input-dropdown-bootstrap ul li em {
136
+ font-weight: bold;
137
+ font-style: normal;
138
+ }
139
+
140
+ div.token-input-dropdown-bootstrap ul li.token-input-selected-dropdown-item-bootstrap {
141
+ color: $dropdown-link-hover-color;
142
+ background-color: $dropdown-link-hover-bg;
143
+ cursor: pointer;
144
+ }
@@ -2,10 +2,12 @@ module Admin
2
2
 
3
3
  class AutocompleteController < BaseController
4
4
 
5
+ LIMIT = 10
6
+
5
7
  def list
6
8
  model_class = params[:model].camelize.constantize
7
9
  field_name = params[:field].to_sym
8
- entities = model_class.where("#{field_name} ilike ?", "%#{params[:q]}%").order(field_name)
10
+ entities = model_class.where("#{field_name} ilike ?", "%#{params[:q]}%").order(field_name).limit(LIMIT)
9
11
  render :json => entities.map {|e| {:id => e.id, :name => e.send(field_name)}}
10
12
  end
11
13
 
@@ -0,0 +1,35 @@
1
+ module Admin
2
+
3
+ class BaseController < ApplicationController
4
+ layout 'admin'
5
+
6
+ include Admin::PathHistory
7
+ include Admin::ResourceHelpers
8
+ extend Admin::SortableColumns
9
+
10
+ helper_method :back_uri, :policy
11
+
12
+ before_action :no_cache!
13
+ before_action :authenticate_administrator!
14
+ before_action :load_structure
15
+ before_action :store_path_history
16
+ before_action :action_enabled?
17
+
18
+ def policy
19
+ @policy ||= Coalla.policy.new(self)
20
+ end
21
+
22
+ delegate :sanitize_params, to: :policy
23
+
24
+ protected
25
+
26
+ def load_structure
27
+ @structure = Coalla::AdminStructure.new(self, Rails.application.routes)
28
+ end
29
+
30
+ def action_enabled?
31
+ redirect_to request.referer.presence || '/admin' unless policy.action_enabled?(action_name)
32
+ end
33
+ end
34
+
35
+ end
@@ -0,0 +1,55 @@
1
+ module Admin
2
+ module EditableColumns
3
+ include Admin::AlertsHelper
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ helper_method :controller_model
8
+ end
9
+
10
+ def edit_column
11
+ item = controller_model.find(params[:id])
12
+ form = render_to_string('admin/editable_columns/edit_column', locals: {item: item, column_partial: column_partial(:edit), options: OpenStruct.new(params)}, layout: false)
13
+ render json: {form: form}
14
+ end
15
+
16
+ def update_column
17
+ item = controller_model.find(params[:id])
18
+
19
+ unless item.update(column_params)
20
+ messages = item.errors.full_messages.join("</br>")
21
+ alert = render_alert(messages, :danger)
22
+ render json: {alert: alert}
23
+ return
24
+ end
25
+
26
+ result = render_to_string(partial: column_partial(:result), locals: {item: item, options: OpenStruct.new(params)})
27
+ render json: {result: result}
28
+ end
29
+
30
+ def controller_model
31
+ controller_name.singularize.camelize.constantize
32
+ end
33
+
34
+ def column_partial(operation)
35
+ column = params[:column]
36
+
37
+ return "#{operation}_#{column}" if params[:custom].presence
38
+
39
+ # TODO (vl): refactor this
40
+ if controller_model.respond_to?(:enumerized_attributes) && controller_model.enumerized_attributes[column]
41
+ type = :enumerize
42
+ else
43
+ columns_info = controller_model.columns.index_by(&:name).with_indifferent_access
44
+ type = columns_info[column].type
45
+ type = :string if %i(integer float decimal).include?(type)
46
+ end
47
+
48
+ "admin/editable_columns/#{operation}/#{type}"
49
+ end
50
+
51
+ def column_params
52
+ sanitize_params(params.require(:item).permit!)
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,16 @@
1
+ module Admin
2
+ module SortableColumns
3
+ def sortable_columns(*args, **keyword_args)
4
+ sort_columns = args.map(&:to_s)
5
+ default_sort_order = keyword_args.fetch(:default, sort_columns.first)
6
+
7
+ define_method :sort_order do
8
+ sort_column = sort_columns.find { |column| column == params[:sort_by] }
9
+ sort_direction = %w(asc desc).find { |column| column == params[:sort_direction].to_s.downcase }
10
+ sort_column && sort_direction ? "#{sort_column} #{sort_direction}" : default_sort_order
11
+ end
12
+
13
+ helper_method :sort_order
14
+ end
15
+ end
16
+ end
@@ -1,7 +1,5 @@
1
1
  module Admin
2
-
3
- module SortableController
4
-
2
+ module SortableModels
5
3
  def sort
6
4
  self.instance_variable_set("@#{controller_name}", model_name.ordered)
7
5
  end
@@ -20,7 +18,5 @@ module Admin
20
18
  def model_name
21
19
  controller_name.classify.constantize
22
20
  end
23
-
24
21
  end
25
-
26
22
  end
@@ -0,0 +1,31 @@
1
+ module Admin
2
+ module AlertsHelper
3
+ def flash_warning_messages
4
+ render_alert(flash[:admin_warning], :warning)
5
+ end
6
+
7
+ def flash_danger_messages
8
+ render_alert(flash[:admin_danger], :danger)
9
+ end
10
+
11
+ def flash_success_messages
12
+ render_alert(flash[:admin_success], :success)
13
+ end
14
+
15
+ def flash_messages
16
+ [flash_danger_messages, flash_warning_messages, flash_success_messages].compact.join.html_safe
17
+ end
18
+
19
+ def render_alert(message, alert_class)
20
+ return unless message
21
+ "<div class='row'>
22
+ <div class='col-md-8 col-md-offset-2'>
23
+ <div class='alert alert-#{alert_class}'>
24
+ <button data-dismiss='alert' class='close' type='button'>&times;</button>
25
+ <p>#{message}</p>
26
+ </div>
27
+ </div>
28
+ </div>".html_safe
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,29 @@
1
+ module Admin
2
+ module ContentHelper
3
+ def admin_paginate(collection, options={})
4
+ will_paginate collection, {renderer: Coalla::LinkRenderer, inner_window: 2}.merge(options)
5
+ end
6
+
7
+ def render_slides(form, title, collection_name, options = {})
8
+ slider_class = options.delete(:slider_class_name) || SliderImage
9
+ multiple = options.has_key?(:multiple) ? options.delete(:multiple) : true
10
+ edit_allowed = options.has_key?(:edit_allowed) ? options.delete(:edit_allowed) : true
11
+ render 'admin/common/slides', form: form, title: title, slides: collection_name, slider_class: slider_class, multiple: multiple, edit_allowed: edit_allowed
12
+ end
13
+
14
+ def generate_slider_template(form_builder, options = {})
15
+ escape_javascript(generate_slider_html(form_builder, options))
16
+ end
17
+
18
+ def generate_slider_html(form_builder, options = {})
19
+ options[:object] ||= options[:class].new
20
+ options[:form_builder_local] ||= :lb
21
+ options[:locals] ||= {}
22
+
23
+ collection_name = options[:collection]
24
+ form_builder.fields_for(collection_name, options[:object], child_index: 'NEW_RECORD') do |f|
25
+ render(partial: options[:partial], locals: options[:locals].merge({options[:form_builder_local] => f}))
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,50 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+ module Admin
4
+ module FormHelper
5
+ def twitter_form_for(name, *args, &block)
6
+ options = args.extract_options!
7
+ form_for(name, *(args << {builder: Coalla::FormBuilder, html: {class: 'form-horizontal'}}.deep_merge(options)), &block)
8
+ end
9
+
10
+ def field_set(title = nil, options = {}, &block)
11
+ content = capture(self, &block)
12
+ content = content_tag(:legend, title) + content if title
13
+ content_tag :fieldset, content, options
14
+ end
15
+
16
+ def actions(&block)
17
+ content = capture(self, &block)
18
+ content_tag(:div, content, class: 'well') if content.present?
19
+ end
20
+
21
+ def standard_actions(form)
22
+ fixed_actions { form.save + form.apply + form.cancel }
23
+ end
24
+
25
+ def fixed_actions(&block)
26
+ panel_tag = actions(&block)
27
+ content_tag :div, panel_tag, class: 'action-bar'
28
+ end
29
+
30
+ def create_link(path = url_for(action: :new))
31
+ return unless policy.action_enabled?(:create)
32
+ content = "<i class='glyphicon glyphicon-plus'></i>&nbsp;&nbsp;#{I18n.t('admin.common.new')}".html_safe
33
+ link_to content, path, class: 'btn btn-success'
34
+ end
35
+
36
+ def sort_link(path = url_for(action: :sort))
37
+ return unless policy.action_enabled?(:sort)
38
+ content = "<i class='glyphicon glyphicon-random'></i>&nbsp;&nbsp;#{I18n.t('admin.common.sort')}".html_safe
39
+ link_to content, path, class: 'btn btn-primary'
40
+ end
41
+
42
+ def cancel_action(path, name = I18n.t('admin.common.cancel'))
43
+ link_to name, path, class: 'btn btn-default'
44
+ end
45
+
46
+ def back_action(name = I18n.t('admin.common.return'), path = back_uri)
47
+ link_to name, path, class: 'btn btn-default'
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,102 @@
1
+ module Admin
2
+ module ResourceHelpers
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ before_action :load_resource!, only: [:edit, :update, :destroy]
7
+ before_action :build_resource, only: [:new, :create]
8
+
9
+ helper_method :resource, :resources, :resource_name, :resource_model
10
+ end
11
+
12
+ def index
13
+ instance_variable_set("@#{resource_name.pluralize}", resource_model.order(created_at: :desc).paginate(page: params[:page], per_page: per_page))
14
+ end
15
+
16
+ def new; end
17
+
18
+ def create
19
+ apply(:new)
20
+ end
21
+
22
+ def edit; end
23
+
24
+ def update
25
+ apply
26
+ end
27
+
28
+ def destroy
29
+ resource.destroy!
30
+ redirect_to_last
31
+ end
32
+
33
+ def apply(partial = :edit)
34
+ resource.assign_attributes(resource_params)
35
+ if resource.save
36
+ redirect_after_save
37
+ else
38
+ render partial
39
+ end
40
+ end
41
+
42
+ def redirect_or_render(partial)
43
+ if params[:save].present?
44
+ redirect_to_back
45
+ else
46
+ add_success_msg
47
+ render partial
48
+ end
49
+ end
50
+
51
+ def redirect_after_save(options = {})
52
+ if params[:save].present?
53
+ redirect_to_back
54
+ else
55
+ add_success_msg(false)
56
+ path = options.fetch(:path, url_for(action: :edit, id: resource))
57
+ redirect_to path
58
+ end
59
+ end
60
+
61
+ def resource
62
+ instance_variable_get("@#{resource_name}")
63
+ end
64
+
65
+ def resources
66
+ instance_variable_get("@#{resource_name.pluralize}")
67
+ end
68
+
69
+ def load_resource!
70
+ instance_variable_set("@#{resource_name}", resource_model.find(params[:id]))
71
+ end
72
+
73
+ def build_resource(attributes = {})
74
+ instance_variable_set("@#{resource_name}", resource_model.new(attributes))
75
+ end
76
+
77
+ def resource_model
78
+ resource_name.classify.constantize
79
+ end
80
+
81
+ def resource_params
82
+ params[resource_name.to_sym].permit!
83
+ end
84
+
85
+ def resource_name
86
+ controller_name.singularize
87
+ end
88
+
89
+ def add_success_msg(now = true)
90
+ message = I18n.t('admin.common.save_success')
91
+ if now
92
+ flash.now[:admin_success] = message
93
+ else
94
+ flash[:admin_success] = message
95
+ end
96
+ end
97
+
98
+ def per_page
99
+ 20
100
+ end
101
+ end
102
+ end
@@ -1,59 +1,63 @@
1
- #encoding: utf-8
2
- module Admin::SearchHelper
3
-
4
- class FormBuilder < ActionView::Helpers::FormBuilder
5
-
6
- delegate :content_tag, to: :@template
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+ module Admin
4
+ module SearchHelper
5
+ class FormBuilder < ActionView::Helpers::FormBuilder
6
+ delegate :content_tag, to: :@template
7
+
8
+ %w(text_field text_area password_field).each do |method_name|
9
+ define_method(method_name) do |name, *args|
10
+ options = args.extract_options!
11
+ args << { class: 'form-control', style: 'margin-right: 5px;' }.merge(options)
12
+ content_tag :div, class: 'form-group col-md-2' do
13
+ super(name, *args)
14
+ end
15
+ end
16
+ end
7
17
 
8
- %w[text_field text_area password_field].each do |method_name|
9
- define_method(method_name) do |name, *args|
10
- options = args.extract_options!
11
- args << ({class: 'form-control', style: 'margin-right: 5px;'}.merge(options))
18
+ def select(method, choices = nil, options = {}, html_options = {}, &block)
12
19
  content_tag :div, class: 'form-group col-md-2' do
13
- super(name, *args)
20
+ super(method, choices, options, { class: 'form-control', style: 'margin-right: 5px;' }.merge(html_options), &block)
14
21
  end
15
22
  end
16
- end
17
23
 
18
- def select(method, choices = nil, options = {}, html_options = {}, &block)
19
- content_tag :div, class: 'form-group col-md-2' do
20
- super(method, choices, options, {class: 'form-control', style: 'margin-right: 5px;'}.merge(html_options), &block)
24
+ def collection_select(method, collection, value_method, text_method, options = {}, html_options = {})
25
+ content_tag :div, class: 'form-group col-md-2' do
26
+ super(method, collection, value_method, text_method, options, { class: 'form-control', style: 'margin-right: 5px;' }.merge(html_options))
27
+ end
21
28
  end
22
29
  end
23
30
 
24
- def collection_select(method, collection, value_method, text_method, options = {}, html_options = {})
25
- content_tag :div, class: 'form-group col-md-2' do
26
- super(method, collection, value_method, text_method, options, {class: 'form-control', style: 'margin-right: 5px;'}.merge(html_options))
31
+ def search_form(path = url_for(action: :index), &block)
32
+ content_tag(:div, class: 'well') do
33
+ form_for @q, url: path, method: :get, style: 'margin-top: 20px;', builder: Admin::SearchHelper::FormBuilder do |f|
34
+ [
35
+ hidden_field_tag(:sort_by, params[:sort_by]),
36
+ hidden_field_tag(:sort_direction, params[:sort_direction]),
37
+ search_form_content(f, &block),
38
+ search_form_submit_button,
39
+ search_form_cancel_button(path)
40
+ ].join.html_safe
41
+ end
27
42
  end
28
43
  end
29
44
 
30
- end
45
+ private
31
46
 
32
- def search_form(&block)
33
- index_action_path = url_for(controller: controller_name, action: :index)
34
- content_tag(:div, class: 'well') do
35
- form_for @q, url: index_action_path, method: :get, style: 'margin-top: 20px;', builder: Admin::SearchHelper::FormBuilder do |f|
36
- [search_form_content(f, &block), search_form_submit_button, search_form_cancel_button(index_action_path)].join.html_safe
47
+ def search_form_content(f, &block)
48
+ content_tag(:div, class: 'row') do
49
+ capture(f, &block)
37
50
  end
38
51
  end
39
- end
40
52
 
41
- private
42
-
43
- def search_form_content(f, &block)
44
- content_tag(:div, class: 'row') do
45
- capture(f, &block)
53
+ def search_form_submit_button
54
+ content_tag(:button, type: 'submit', class: 'btn btn-success') do
55
+ content_tag(:i, nil, class: 'glyphicon glyphicon-search') + '&nbsp;Применить'.html_safe
56
+ end
46
57
  end
47
- end
48
58
 
49
- def search_form_submit_button
50
- content_tag(:button, type: 'submit', class: 'btn btn-success') do
51
- content_tag(:i, nil, class: 'glyphicon glyphicon-search') + '&nbsp;Применить'.html_safe
59
+ def search_form_cancel_button(index_action_path)
60
+ link_to('Сбросить', index_action_path, class: 'btn btn-default')
52
61
  end
53
62
  end
54
-
55
- def search_form_cancel_button(index_action_path)
56
- link_to('Сбросить', index_action_path, class: 'btn btn-default')
57
- end
58
-
59
- end
63
+ end
@@ -0,0 +1,40 @@
1
+ module Admin
2
+ module TableHelper
3
+
4
+ ALIGN_CLASSES = {left: 't-left', center: 't-center', right: 't-right'}
5
+
6
+ def table_for(a_class)
7
+ Coalla::TableBuilder.new(self, a_class)
8
+ end
9
+
10
+ def edit_link(path)
11
+ return unless policy.action_enabled?(:edit)
12
+ content = "<i class='glyphicon glyphicon-pencil'></i>".html_safe
13
+ link_to content, path, class: 'btn btn-default btn-xs', title: I18n.t('admin.common.edit')
14
+ end
15
+
16
+ def delete_link(path)
17
+ return unless policy.action_enabled?(:destroy)
18
+ content = "<i class='glyphicon glyphicon-trash'></i>".html_safe
19
+ link_to content, path, data: {confirm: I18n.t('admin.common.sure')}, method: :delete, class: 'btn btn-danger btn-xs', title: I18n.t('admin.common.delete')
20
+ end
21
+
22
+ def th_class(column)
23
+ klass = []
24
+ klass << "col-xs-#{column.cols}" if column.cols
25
+ klass << ALIGN_CLASSES[column.align] if column.align
26
+ klass.join(' ')
27
+ end
28
+
29
+ def tr_class(row_class, item)
30
+ row_class && row_class.call(item)
31
+ end
32
+
33
+ def td_class(column)
34
+ klass = []
35
+ klass << column.col_class
36
+ klass << ALIGN_CLASSES[column.align] if column.align
37
+ klass.join(' ')
38
+ end
39
+ end
40
+ end
@@ -11,8 +11,8 @@ module CommonHelper
11
11
  end
12
12
  end
13
13
 
14
- def hide_style(style)
15
- 'display: none;' + style
14
+ def hide_style(style = nil)
15
+ 'display: none;' + style.to_s
16
16
  end
17
17
 
18
18
  def ty(text)
@@ -1,6 +1,6 @@
1
1
  class FileUpload < ActiveRecord::Base
2
2
 
3
- mount_uploader :file, FileUploader
3
+ mount_uploader :file, Coalla::FileUploader
4
4
 
5
5
  before_save :update_file_attributes
6
6
 
data/app/models/lookup.rb CHANGED
@@ -5,7 +5,7 @@ class Lookup < ActiveRecord::Base
5
5
  validates_numericality_of :value, only_integer: true, if: ->(lookup) { lookup.type_code == 'integer' }
6
6
  validates_numericality_of :value, if: ->(lookup) { lookup.type_code == 'float' }
7
7
 
8
- mount_uploader :file, FileUploader
8
+ mount_uploader :file, Coalla::FileUploader
9
9
 
10
10
  def value_options
11
11
  attr_value = read_attribute(:value_options)