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.
- checksums.yaml +15 -0
- data/Gemfile +1 -1
- data/Rakefile +24 -24
- data/app/assets/javascripts/admin/admin.js +236 -33
- data/app/assets/stylesheets/admin/admin.scss +1 -2
- data/app/assets/stylesheets/admin/vendor/bootstrap.min.css +6242 -4
- data/app/assets/stylesheets/admin/vendor/token-input-bootstrap.scss +144 -0
- data/app/controllers/admin/autocomplete_controller.rb +3 -1
- data/app/controllers/admin/base_controller.rb +35 -0
- data/{lib/generators/coalla/cms/templates/controllers/admin/home_controller.rb.erb → app/controllers/admin/home_controller.rb} +0 -0
- data/app/controllers/concerns/admin/editable_columns.rb +55 -0
- data/app/controllers/concerns/admin/sortable_columns.rb +16 -0
- data/app/controllers/{admin/sortable_controller.rb → concerns/admin/sortable_models.rb} +1 -5
- data/app/helpers/admin/alerts_helper.rb +31 -0
- data/app/helpers/admin/content_helper.rb +29 -0
- data/app/helpers/admin/form_helper.rb +50 -0
- data/app/helpers/admin/resource_helpers.rb +102 -0
- data/app/helpers/admin/search_helper.rb +44 -40
- data/app/helpers/admin/table_helper.rb +40 -0
- data/app/helpers/common_helper.rb +2 -2
- data/app/models/file_upload.rb +1 -1
- data/app/models/lookup.rb +1 -1
- data/app/models/site_meta_tags.rb +2 -2
- data/app/views/admin/common/_menu_section.haml +1 -1
- data/app/views/admin/common/_nested_fields_for.html.haml +10 -4
- data/app/views/admin/common/_nested_fields_for_element.html.haml +21 -5
- data/app/views/admin/common/_table_template.html.haml +26 -7
- data/app/views/admin/common/_upload_form.html.haml +2 -1
- data/app/views/admin/editable_columns/edit/_boolean.haml +2 -0
- data/app/views/admin/editable_columns/edit/_date.haml +2 -0
- data/app/views/admin/editable_columns/edit/_datetime.haml +3 -0
- data/app/views/admin/editable_columns/edit/_enumerize.haml +2 -0
- data/app/views/admin/editable_columns/edit/_string.haml +2 -0
- data/app/views/admin/editable_columns/edit/_text.haml +2 -0
- data/app/views/admin/editable_columns/edit/_time.haml +3 -0
- data/app/views/admin/editable_columns/edit_column.haml +8 -0
- data/app/views/admin/editable_columns/result/_boolean.haml +2 -0
- data/app/views/admin/editable_columns/result/_date.haml +1 -0
- data/app/views/admin/editable_columns/result/_datetime.haml +1 -0
- data/app/views/admin/editable_columns/result/_enumerize.haml +1 -0
- data/app/views/admin/editable_columns/result/_string.haml +1 -0
- data/app/views/admin/editable_columns/result/_text.haml +1 -0
- data/app/views/admin/editable_columns/result/_time.haml +1 -0
- data/app/views/admin/site_meta_tags/index.html.haml +2 -2
- data/app/views/layouts/admin.html.haml +12 -0
- data/app/views/structure/_section.haml +2 -9
- data/coalla-cms.gemspec +10 -11
- data/lib/coalla/builders/actions_column_definition.rb +44 -0
- data/lib/coalla/builders/admin_structure.rb +86 -0
- data/lib/coalla/builders/column_definition.rb +9 -0
- data/lib/coalla/builders/form_builder.rb +291 -0
- data/lib/coalla/builders/link_renderer.rb +43 -0
- data/lib/coalla/builders/policy.rb +30 -0
- data/lib/coalla/builders/table_builder.rb +99 -0
- data/lib/coalla/builders/table_formatter.rb +133 -0
- data/lib/coalla/builders/text_formatter.rb +22 -0
- data/lib/coalla/cms/engine.rb +3 -2
- data/lib/coalla/cms/version.rb +2 -2
- data/lib/coalla/ext/mapper.rb +7 -0
- data/lib/coalla/orm/{relation.rb → multi_field.rb} +7 -8
- data/lib/coalla/orm/page_slider.rb +2 -28
- data/lib/coalla/orm/sanitized.rb +1 -5
- data/lib/coalla/orm/sortable_association.rb +30 -0
- data/lib/coalla/uploaders/file_uploader.rb +9 -0
- data/lib/coalla/uploaders/image_uploader.rb +62 -0
- data/lib/coalla/uploaders/meta_image_uploader.rb +7 -0
- data/lib/coalla-cms.rb +10 -0
- data/lib/generators/coalla/cms/create_admin_administrators_generator.rb +5 -7
- data/lib/generators/coalla/cms/create_admin_generator.rb +9 -7
- data/lib/generators/coalla/cms/create_admin_login_view_generator.rb +4 -6
- data/lib/generators/coalla/cms/create_markup_generator.rb +2 -2
- data/lib/generators/coalla/cms/file_uploads/install_generator.rb +0 -17
- data/lib/generators/coalla/cms/file_uploads/mount_generator.rb +4 -7
- data/lib/generators/coalla/cms/image/install_generator.rb +0 -3
- data/lib/generators/coalla/cms/image/mount_generator.rb +0 -3
- data/lib/generators/coalla/cms/image/templates/mount/uploader.rb.erb +1 -1
- data/lib/generators/coalla/cms/image/templates/uploader.rb.erb +1 -1
- data/lib/generators/coalla/cms/init_generator.rb +42 -49
- data/lib/generators/coalla/cms/lookups/install_generator.rb +0 -3
- data/lib/generators/coalla/cms/meta_tags/install_generator.rb +0 -2
- data/lib/generators/coalla/cms/scaffold_generator.rb +7 -7
- data/lib/generators/coalla/cms/setup_admin_generator.rb +9 -9
- data/lib/generators/coalla/cms/setup_routes_generator.rb +3 -3
- data/lib/generators/coalla/cms/slider/init_generator.rb +1 -3
- data/lib/generators/coalla/cms/slider/templates/slider_image.rb.erb +0 -1
- data/lib/generators/coalla/cms/slider/templates/slider_image_uploader.rb.erb +1 -1
- data/lib/generators/coalla/cms/templates/.gitignore +3 -3
- data/lib/generators/coalla/cms/templates/controllers/admin/administrators_controller.rb +2 -40
- data/lib/generators/coalla/cms/templates/controllers/admin/scaffold_controller_template.rb.erb +0 -39
- data/lib/generators/coalla/cms/templates/initializers/carrierwave.rb +0 -90
- data/lib/generators/coalla/cms/templates/locales/activerecord.en.yml +14 -1
- data/lib/generators/coalla/cms/templates/views/admin/administrators/_form.html.haml +1 -1
- data/lib/generators/coalla/cms/templates/views/admin/administrators/edit.html.haml +1 -1
- data/lib/generators/coalla/cms/templates/views/admin/administrators/index.html.haml +5 -5
- data/lib/generators/coalla/cms/templates/views/admin/administrators/new.html.haml +1 -1
- data/lib/generators/coalla/cms/templates/views/admin/scaffold_template/_form.html.haml.erb +1 -1
- data/lib/generators/coalla/cms/templates/views/admin/scaffold_template/edit.html.haml.erb +1 -1
- data/lib/generators/coalla/cms/templates/views/admin/scaffold_template/index.html.haml.erb +5 -5
- data/lib/generators/coalla/cms/templates/views/admin/scaffold_template/new.html.haml.erb +1 -1
- data/lib/generators/coalla/cms/templates/views/administrators/sessions/new.html.haml +1 -1
- data/lib/generators/coalla/cms/utils/orm.rb +29 -0
- data/lib/generators/coalla/cms/utils/scaffold.rb +11 -0
- metadata +60 -145
- data/Gemfile.lock +0 -198
- data/app/assets/stylesheets/admin/vendor/token-input-facebook.patched.css +0 -126
- data/app/assets/stylesheets/admin/vendor/token-input.patched.css +0 -116
- data/app/controllers/admin/notifier_controller.rb +0 -7
- data/app/helpers/admin_helper.rb +0 -29
- data/app/helpers/nested_fields_helper.rb +0 -12
- data/app/helpers/static_text_formatter.rb +0 -25
- data/app/helpers/twitter_builder_helper.rb +0 -253
- data/app/helpers/twitter_form_builder.rb +0 -202
- data/app/uploaders/file_uploader.rb +0 -10
- data/app/uploaders/generic_image_uploader.rb +0 -74
- data/app/uploaders/meta_tags_image_uploader.rb +0 -5
- data/app/utils/admin_structure.rb +0 -82
- data/app/utils/bootstrap_link_renderer.rb +0 -40
- data/app/utils/table_helpers.rb +0 -196
- data/lib/generators/coalla/cms/market/install_generator.rb +0 -71
- data/lib/generators/coalla/cms/market/templates/controllers/categories_controller.rb +0 -47
- data/lib/generators/coalla/cms/market/templates/controllers/products_controller.rb +0 -50
- data/lib/generators/coalla/cms/market/templates/controllers/properties_controller.rb +0 -59
- data/lib/generators/coalla/cms/market/templates/market.rb +0 -5
- data/lib/generators/coalla/cms/market/templates/market.ru.yml +0 -53
- data/lib/generators/coalla/cms/market/templates/migrations/create_categories.rb +0 -15
- data/lib/generators/coalla/cms/market/templates/migrations/create_product_properties.rb +0 -18
- data/lib/generators/coalla/cms/market/templates/migrations/create_products.rb +0 -18
- data/lib/generators/coalla/cms/market/templates/migrations/create_properties.rb +0 -11
- data/lib/generators/coalla/cms/market/templates/models/category.rb +0 -36
- data/lib/generators/coalla/cms/market/templates/models/product.rb +0 -16
- data/lib/generators/coalla/cms/market/templates/models/product_property.rb +0 -14
- data/lib/generators/coalla/cms/market/templates/models/property.rb +0 -7
- data/lib/generators/coalla/cms/market/templates/views/categories/_form.html.haml +0 -10
- data/lib/generators/coalla/cms/market/templates/views/categories/edit.html.haml +0 -5
- data/lib/generators/coalla/cms/market/templates/views/categories/index.html.haml +0 -17
- data/lib/generators/coalla/cms/market/templates/views/categories/new.html.haml +0 -4
- data/lib/generators/coalla/cms/market/templates/views/products/_form.html.haml +0 -17
- data/lib/generators/coalla/cms/market/templates/views/products/_product_property_fields.html.haml +0 -13
- data/lib/generators/coalla/cms/market/templates/views/products/edit.html.haml +0 -5
- data/lib/generators/coalla/cms/market/templates/views/products/index.html.haml +0 -17
- data/lib/generators/coalla/cms/market/templates/views/products/new.html.haml +0 -4
- data/lib/generators/coalla/cms/market/templates/views/properties/_form.html.haml +0 -9
- data/lib/generators/coalla/cms/market/templates/views/properties/edit.html.haml +0 -5
- data/lib/generators/coalla/cms/market/templates/views/properties/index.html.haml +0 -15
- data/lib/generators/coalla/cms/market/templates/views/properties/new.html.haml +0 -4
- data/lib/generators/coalla/cms/news/scaffold_generator.rb +0 -50
- data/lib/generators/coalla/cms/news/templates/entity.rb.erb +0 -10
- data/lib/generators/coalla/cms/news/templates/entity_controller_template.rb.erb +0 -47
- data/lib/generators/coalla/cms/news/templates/entity_image_uploader.rb.erb +0 -7
- data/lib/generators/coalla/cms/news/templates/migration.rb.erb +0 -15
- data/lib/generators/coalla/cms/news/templates/views/_form.haml.erb +0 -16
- data/lib/generators/coalla/cms/news/templates/views/edit.haml.erb +0 -5
- data/lib/generators/coalla/cms/news/templates/views/index.haml.erb +0 -18
- data/lib/generators/coalla/cms/news/templates/views/new.haml.erb +0 -5
- data/lib/generators/coalla/cms/orm_helpers.rb +0 -31
- data/lib/generators/coalla/cms/scaffold_helper.rb +0 -11
- 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
|
File without changes
|
@@ -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'>×</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> #{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> #{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
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
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
|
-
|
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(
|
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
|
-
|
19
|
-
|
20
|
-
|
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
|
25
|
-
content_tag
|
26
|
-
|
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
|
-
|
45
|
+
private
|
31
46
|
|
32
|
-
|
33
|
-
|
34
|
-
|
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
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
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') + ' Применить'.html_safe
|
56
|
+
end
|
46
57
|
end
|
47
|
-
end
|
48
58
|
|
49
|
-
|
50
|
-
|
51
|
-
content_tag(:i, nil, class: 'glyphicon glyphicon-search') + ' Применить'.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
|
data/app/models/file_upload.rb
CHANGED
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)
|