coalla-cms 0.4.4.3 → 0.5.1.8
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.
- checksums.yaml +5 -13
- data/Gemfile.lock +91 -84
- data/Rakefile +2 -2
- data/app/assets/javascripts/admin/admin.js +45 -117
- data/app/assets/javascripts/admin/photo_uploader.js +1 -10
- data/app/assets/javascripts/admin/vendor/jquery-ui-timepicker-addon-ru.js +39 -37
- data/app/assets/stylesheets/admin/admin.scss +5 -1
- data/app/controllers/admin/image_upload_controller.rb +1 -1
- data/app/controllers/admin/lookups_controller.rb +9 -4
- data/app/controllers/admin/notifier_controller.rb +7 -0
- data/app/controllers/admin/site_meta_tags_controller.rb +43 -0
- data/app/controllers/concerns/page_meta_tags.rb +71 -0
- data/app/helpers/admin/lookup_helper.rb +23 -0
- data/app/helpers/common_helper.rb +6 -0
- data/app/helpers/lookup_helper.rb +41 -14
- data/app/helpers/twitter_builder_helper.rb +7 -7
- data/app/helpers/twitter_form_builder.rb +9 -3
- data/app/models/lookup.rb +22 -0
- data/app/models/site_meta_tags.rb +16 -0
- data/app/uploaders/meta_tags_image_uploader.rb +5 -0
- data/app/utils/admin_structure.rb +17 -2
- data/app/views/admin/base/_sort.haml +3 -3
- data/app/views/admin/common/_file_upload_template.haml +8 -4
- data/app/views/admin/common/_header.html.haml +5 -4
- data/app/views/admin/common/_image_upload_template.html.haml +1 -1
- data/app/views/admin/common/_slides.html.haml +1 -1
- data/app/views/admin/home/dashboard.html.haml +1 -1
- data/app/views/admin/lookups/_form.html.haml +2 -8
- data/app/views/admin/lookups/edit.html.haml +1 -1
- data/app/views/admin/lookups/index.html.haml +2 -2
- data/app/views/admin/lookups/types/_boolean.haml +1 -0
- data/app/views/admin/lookups/types/_enum.haml +1 -0
- data/app/views/admin/lookups/types/_file.haml +3 -0
- data/app/views/admin/lookups/types/_float.haml +1 -0
- data/app/views/admin/lookups/types/_integer.haml +1 -0
- data/app/views/admin/lookups/types/_memo.haml +1 -0
- data/app/views/admin/lookups/types/_string.haml +1 -0
- data/app/views/admin/lookups/types/_wysiwyg.haml +1 -0
- data/app/views/admin/site_meta_tags/_form.html.haml +22 -0
- data/app/views/admin/site_meta_tags/edit.html.haml +5 -0
- data/app/views/admin/site_meta_tags/index.html.haml +5 -0
- data/app/views/layouts/admin.html.haml +10 -4
- data/app/views/structure/_section.haml +2 -1
- data/coalla-cms.gemspec +2 -0
- data/lib/coalla/cms/version.rb +1 -1
- data/lib/coalla/orm/page_slider.rb +3 -1
- data/lib/coalla/orm/relation.rb +7 -4
- data/lib/generators/coalla/cms/create_admin_administrators_generator.rb +29 -0
- data/lib/generators/coalla/cms/create_markup_generator.rb +30 -0
- data/lib/generators/coalla/cms/init_generator.rb +33 -37
- data/lib/generators/coalla/cms/lookups/install_generator.rb +17 -6
- data/lib/generators/coalla/cms/lookups/templates/migration.rb +4 -0
- data/lib/generators/coalla/cms/market/templates/controllers/products_controller.rb +1 -1
- data/lib/generators/coalla/cms/market/templates/controllers/properties_controller.rb +1 -1
- data/lib/generators/coalla/cms/meta_tags/install_generator.rb +58 -0
- data/lib/generators/coalla/cms/meta_tags/templates/migration.rb +23 -0
- data/lib/generators/coalla/cms/news/templates/views/new.haml.erb +1 -1
- data/lib/generators/coalla/cms/setup_admin_generator.rb +10 -7
- data/lib/generators/coalla/cms/setup_routes_generator.rb +1 -0
- data/lib/generators/coalla/cms/templates/assets.rb +2 -4
- data/lib/generators/coalla/cms/templates/controllers/admin/administrators_controller.rb +55 -0
- data/lib/generators/coalla/cms/templates/controllers/admin/base_controller.rb.erb +2 -2
- data/lib/generators/coalla/cms/templates/controllers/markup_controller.rb.erb +2 -0
- data/lib/generators/coalla/cms/templates/initializers/carrierwave.rb +47 -0
- data/lib/generators/coalla/cms/templates/locales/activerecord.en.yml +16 -0
- data/lib/generators/coalla/cms/templates/locales/activerecord.ru.yml +29 -0
- data/lib/generators/coalla/cms/templates/locales/admin.en.yml +27 -0
- data/lib/generators/coalla/cms/templates/locales/admin.ru.yml +27 -0
- data/lib/generators/coalla/cms/templates/views/admin/administrators/_form.html.haml +9 -0
- data/lib/generators/coalla/cms/templates/views/admin/administrators/edit.html.haml +5 -0
- data/lib/generators/coalla/cms/templates/views/admin/administrators/index.html.haml +15 -0
- data/lib/generators/coalla/cms/templates/views/admin/administrators/new.html.haml +4 -0
- 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/new.html.haml.erb +1 -1
- data/lib/generators/coalla/cms/templates/views/administrators/sessions/new.html.haml +3 -3
- metadata +102 -87
- data/lib/generators/coalla/cms/templates/activerecord.ru.yml +0 -13
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-blockquote.png +0 -0
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-h1.png +0 -0
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-h2.png +0 -0
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-h3.png +0 -0
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-h4.png +0 -0
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-h5.png +0 -0
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-h6.png +0 -0
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-p.png +0 -0
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-pre.png +0 -0
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/wymiframe.css +0 -276
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/wymiframe.html +0 -26
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/jquery.wymeditor.js +0 -4819
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/lang/en.js +0 -45
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/lang/ru.js +0 -55
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/plugins/imageupload/icons.png +0 -0
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/plugins/imageupload/jquery.wymeditor.imageupload.js +0 -150
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/plugins/resizable/jquery.wymeditor.resizable.js +0 -91
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/plugins/resizable/readme.txt +0 -124
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/compact/icons.png +0 -0
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/compact/skin.css +0 -134
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/compact/skin.js +0 -35
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/default/icons.png +0 -0
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/default/skin.css +0 -341
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/default/skin.js +0 -40
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/minimal/images/bg.header.gif +0 -0
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/minimal/images/bg.selector.silver.gif +0 -0
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/minimal/images/bg.wymeditor.png +0 -0
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/minimal/images/icons.silver.gif +0 -0
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/minimal/skin.css +0 -131
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/minimal/skin.js +0 -30
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/COPYING +0 -674
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/README +0 -27
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/images/bg.header.gif +0 -0
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/images/bg.selector.silver.gif +0 -0
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/images/bg.wymeditor.png +0 -0
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/images/icons.silver.gif +0 -0
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/skin.css +0 -297
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/skin.js +0 -61
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/twopanels/icons.png +0 -0
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/twopanels/skin.css +0 -134
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/twopanels/skin.js +0 -39
- data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/wymeditor_icon.png +0 -0
- data/lib/generators/coalla/cms/wysiwyg/wymeditor_generator.rb +0 -17
- /data/lib/generators/coalla/cms/templates/{devise.ru.yml → locales/devise.ru.yml} +0 -0
|
@@ -3,7 +3,12 @@ module Admin
|
|
|
3
3
|
class LookupsController < BaseController
|
|
4
4
|
|
|
5
5
|
def index
|
|
6
|
-
@
|
|
6
|
+
@category = params[:category]
|
|
7
|
+
@lookups = Lookup.where(category: @category).order(:code, :created_at)
|
|
8
|
+
if @lookups.blank? && @category.present?
|
|
9
|
+
redirect_to admin_lookups_index_path
|
|
10
|
+
return
|
|
11
|
+
end
|
|
7
12
|
end
|
|
8
13
|
|
|
9
14
|
def new
|
|
@@ -13,7 +18,7 @@ module Admin
|
|
|
13
18
|
def create
|
|
14
19
|
@lookup = Lookup.new(params[:lookup])
|
|
15
20
|
if @lookup.save
|
|
16
|
-
redirect_to
|
|
21
|
+
redirect_to admin_lookups_index_path(category: @lookup.category)
|
|
17
22
|
else
|
|
18
23
|
render :new
|
|
19
24
|
end
|
|
@@ -30,7 +35,7 @@ module Admin
|
|
|
30
35
|
def update
|
|
31
36
|
@lookup = Lookup.find(params[:id])
|
|
32
37
|
if @lookup.update_attributes(params[:lookup].permit!)
|
|
33
|
-
redirect_to
|
|
38
|
+
redirect_to admin_lookups_index_path(category: @lookup.category)
|
|
34
39
|
else
|
|
35
40
|
render :edit
|
|
36
41
|
end
|
|
@@ -39,7 +44,7 @@ module Admin
|
|
|
39
44
|
def destroy
|
|
40
45
|
@lookup = Lookup.find(params[:id])
|
|
41
46
|
@lookup.destroy
|
|
42
|
-
redirect_to
|
|
47
|
+
redirect_to admin_lookups_index_path(category: @lookup.category)
|
|
43
48
|
end
|
|
44
49
|
|
|
45
50
|
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
module Admin
|
|
2
|
+
|
|
3
|
+
class SiteMetaTagsController < BaseController
|
|
4
|
+
|
|
5
|
+
def index
|
|
6
|
+
@meta_tags = SiteMetaTags.order(:created_at)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def new
|
|
10
|
+
@meta_tags = SiteMetaTags.new
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def create
|
|
14
|
+
@meta_tags = SiteMetaTags.new(params[:site_meta_tags].permit!)
|
|
15
|
+
if @meta_tags.save
|
|
16
|
+
redirect_to admin_meta_tags_path
|
|
17
|
+
else
|
|
18
|
+
render :new
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def edit
|
|
23
|
+
@meta_tags = SiteMetaTags.find(params[:id])
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def update
|
|
27
|
+
@meta_tags = SiteMetaTags.find(params[:id])
|
|
28
|
+
if @meta_tags.update_attributes(params[:site_meta_tags].permit!)
|
|
29
|
+
redirect_to admin_meta_tags_path
|
|
30
|
+
else
|
|
31
|
+
render :edit
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def destroy
|
|
36
|
+
@meta_tags = SiteMetaTags.find(params[:id])
|
|
37
|
+
@meta_tags.destroy
|
|
38
|
+
redirect_to admin_meta_tags_path
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
module PageMetaTags
|
|
2
|
+
extend ActiveSupport::Concern
|
|
3
|
+
|
|
4
|
+
included do
|
|
5
|
+
helper_method :current_url
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def set_page_meta_tags(options={})
|
|
9
|
+
id = options.delete(:identifier)
|
|
10
|
+
|
|
11
|
+
tags = {
|
|
12
|
+
site: tag_value(:site, id),
|
|
13
|
+
title: title_for(tag_value(:title, id)),
|
|
14
|
+
description: tag_value(:description, id),
|
|
15
|
+
image: tag_value(:image, id),
|
|
16
|
+
url: tag_value(:url, id) || current_url,
|
|
17
|
+
|
|
18
|
+
og: {
|
|
19
|
+
title: title_for(tag_value(:title, id, true)).last || defaults.site,
|
|
20
|
+
description: tag_value(:description, id, true),
|
|
21
|
+
image: tag_value(:image, id, true),
|
|
22
|
+
url: tag_value(:url, id, true) || current_url,
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
tags.deep_merge!(options)
|
|
27
|
+
|
|
28
|
+
set_meta_tags(tags)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
def tag_value(tag_name, identifier, og = false)
|
|
34
|
+
variants = []
|
|
35
|
+
|
|
36
|
+
og_tag_name = "og_#{tag_name}".to_sym if og
|
|
37
|
+
|
|
38
|
+
variants << page_tags(identifier).send(:try, og_tag_name) if og
|
|
39
|
+
variants << page_tags(identifier).send(:try, tag_name)
|
|
40
|
+
variants << defaults.send(:try, og_tag_name) if og
|
|
41
|
+
variants << defaults.send(:try, tag_name)
|
|
42
|
+
|
|
43
|
+
if tag_name == :image
|
|
44
|
+
variants = variants.map { |v| URI.join(view_context.root_url, v.try(:url, :main)).to_s if v.try(:url, :main).present? }
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
result = variants.detect(&:present?)
|
|
48
|
+
return if result.blank?
|
|
49
|
+
result.html_safe
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def title_for(title)
|
|
53
|
+
[title].flatten
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def current_url
|
|
57
|
+
request.original_url
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def defaults
|
|
61
|
+
@default_tags ||= SiteMetaTags.default_tags
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def page_tags(identifier)
|
|
65
|
+
return if identifier.blank?
|
|
66
|
+
|
|
67
|
+
@page_tags ||= {}
|
|
68
|
+
@page_tags[identifier] ||= SiteMetaTags.find_by(identifier: identifier)
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Admin
|
|
2
|
+
module LookupHelper
|
|
3
|
+
def tooltip_lookup_data(lookup)
|
|
4
|
+
if lookup.try(:tooltip).present?
|
|
5
|
+
{toggle: 'tooltip', placement: 'top', title: lookup.tooltip}
|
|
6
|
+
else
|
|
7
|
+
{}
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def format_lookup(lookup)
|
|
12
|
+
if %w(string memo wysiwyg integer float).include?(lookup.type_code)
|
|
13
|
+
raw(truncate(strip_tags(lookup.value), length: 200))
|
|
14
|
+
elsif lookup.type_code == 'boolean'
|
|
15
|
+
lookup.value == '1' ? '<i class="glyphicon glyphicon-check"></i>'.html_safe : ''
|
|
16
|
+
elsif lookup.type_code == 'file'
|
|
17
|
+
lookup.file.try(:file).try(:filename) || ''
|
|
18
|
+
elsif lookup.type_code == 'enum'
|
|
19
|
+
enum_lookup_text(lookup.code)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require 'standalone_typograf'
|
|
2
|
+
|
|
1
3
|
module CommonHelper
|
|
2
4
|
|
|
3
5
|
def copyright(start_year)
|
|
@@ -13,4 +15,8 @@ module CommonHelper
|
|
|
13
15
|
'display: none;' + style
|
|
14
16
|
end
|
|
15
17
|
|
|
18
|
+
def ty(text)
|
|
19
|
+
::StandaloneTypograf::Typograf.new(text, mode: :html).prepare.html_safe
|
|
20
|
+
end
|
|
21
|
+
|
|
16
22
|
end
|
|
@@ -1,40 +1,67 @@
|
|
|
1
1
|
module LookupHelper
|
|
2
2
|
|
|
3
|
-
def lookup
|
|
4
|
-
_lookup
|
|
3
|
+
def lookup(code, default = nil, &block)
|
|
4
|
+
_lookup(code, 'string', default, &block)
|
|
5
5
|
end
|
|
6
6
|
|
|
7
|
-
def
|
|
7
|
+
def integer_lookup(code, default = nil, &block)
|
|
8
|
+
_lookup(code, 'integer', default, &block).to_i
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def float_lookup(code, default = nil, &block)
|
|
12
|
+
_lookup(code, 'float', default, &block).to_f
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def boolean_lookup(code, default = nil, &block)
|
|
16
|
+
_lookup(code, 'boolean', default, &block) == '1'
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def enum_lookup_value(code, default = nil, &block)
|
|
20
|
+
_lookup(code, 'enum', default, &block).to_sym
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def file_lookup(code)
|
|
24
|
+
Lookup.find_by(code: code, type_code: 'file')
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def enum_lookup_text(code)
|
|
28
|
+
value = enum_lookup_value(code)
|
|
29
|
+
return if value.blank?
|
|
30
|
+
l = Lookup.where(code: code, type_code: 'enum').first
|
|
31
|
+
l.value_options[value]
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def memo_lookup(code, default = nil, &block)
|
|
8
35
|
sf(unsafe_memo_lookup(code, default, &block))
|
|
9
36
|
end
|
|
10
37
|
|
|
11
|
-
def unsafe_memo_lookup
|
|
12
|
-
_lookup
|
|
38
|
+
def unsafe_memo_lookup(code, default = nil, &block)
|
|
39
|
+
_lookup(code, 'memo', default, &block)
|
|
13
40
|
end
|
|
14
41
|
|
|
15
|
-
def wysiwyg_lookup
|
|
16
|
-
raw(_lookup
|
|
42
|
+
def wysiwyg_lookup(code, default = nil, &block)
|
|
43
|
+
raw(_lookup(code, 'wysiwyg', default, &block))
|
|
17
44
|
end
|
|
18
45
|
|
|
19
|
-
def lookup_name
|
|
46
|
+
def lookup_name(code)
|
|
20
47
|
t("lookups.#{code}")
|
|
21
48
|
end
|
|
22
49
|
|
|
23
|
-
def sf
|
|
50
|
+
def sf(text)
|
|
24
51
|
h(text).gsub("\n", "<br/>").html_safe
|
|
25
52
|
end
|
|
26
53
|
|
|
27
54
|
private
|
|
28
55
|
|
|
29
|
-
def _lookup
|
|
56
|
+
def _lookup(code, type, default, &block)
|
|
30
57
|
l = Lookup.where(code: code, type_code: type).first
|
|
31
58
|
return l.value if l
|
|
32
59
|
|
|
33
60
|
value = if block.present?
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
61
|
+
capture(self, &block)
|
|
62
|
+
else
|
|
63
|
+
default
|
|
64
|
+
end
|
|
38
65
|
value = value.strip if value
|
|
39
66
|
|
|
40
67
|
l = Lookup.create!(code: code, value: value, type_code: type)
|
|
@@ -15,7 +15,7 @@ module TwitterBuilderHelper
|
|
|
15
15
|
class ActionsColumnDefinition < ColumnDefinition
|
|
16
16
|
|
|
17
17
|
def initialize
|
|
18
|
-
self.title = '
|
|
18
|
+
self.title = I18n.t('admin.common.actions')
|
|
19
19
|
@actions = []
|
|
20
20
|
end
|
|
21
21
|
|
|
@@ -201,30 +201,30 @@ module TwitterBuilderHelper
|
|
|
201
201
|
end
|
|
202
202
|
|
|
203
203
|
def create_link path
|
|
204
|
-
content = "<i class='glyphicon glyphicon-plus'></i>  
|
|
204
|
+
content = "<i class='glyphicon glyphicon-plus'></i> #{I18n.t('admin.common.new')}".html_safe
|
|
205
205
|
link_to content, path, class: 'btn btn-success'
|
|
206
206
|
end
|
|
207
207
|
|
|
208
208
|
def sort_link path
|
|
209
|
-
content = "<i class='glyphicon glyphicon-random'></i>  
|
|
209
|
+
content = "<i class='glyphicon glyphicon-random'></i> #{I18n.t('admin.common.sort')}".html_safe
|
|
210
210
|
link_to content, path, class: 'btn btn-primary'
|
|
211
211
|
end
|
|
212
212
|
|
|
213
213
|
def edit_link path
|
|
214
214
|
content = "<i class='glyphicon glyphicon-pencil'></i>".html_safe
|
|
215
|
-
link_to content, path, class: 'btn btn-default btn-xs', title: '
|
|
215
|
+
link_to content, path, class: 'btn btn-default btn-xs', title: I18n.t('admin.common.edit')
|
|
216
216
|
end
|
|
217
217
|
|
|
218
218
|
def delete_link path
|
|
219
219
|
content = "<i class='glyphicon glyphicon-trash'></i>".html_safe
|
|
220
|
-
link_to content, path, data: {confirm: '
|
|
220
|
+
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')
|
|
221
221
|
end
|
|
222
222
|
|
|
223
|
-
def cancel_action path, name = '
|
|
223
|
+
def cancel_action path, name = I18n.t('admin.common.cancel')
|
|
224
224
|
link_to name, path, class: 'btn btn-default'
|
|
225
225
|
end
|
|
226
226
|
|
|
227
|
-
def back_action name = '
|
|
227
|
+
def back_action name = I18n.t('admin.common.return'), path = back_uri
|
|
228
228
|
link_to name, path, class: 'btn btn-default'
|
|
229
229
|
end
|
|
230
230
|
|
|
@@ -79,11 +79,16 @@ class TwitterFormBuilder < ActionView::Helpers::FormBuilder
|
|
|
79
79
|
string(method, merge_options({data: {'calendar-datetime' => true}, div_class: 'col-md-3', value: value}, options))
|
|
80
80
|
end
|
|
81
81
|
|
|
82
|
-
def
|
|
82
|
+
def time(method, options = {})
|
|
83
|
+
value = object.try(method).try(:strftime, '%H:%M')
|
|
84
|
+
string(method, merge_options({data: {'calendar-time' => true}, div_class: 'col-md-2', value: value}, options))
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def save text = I18n.t('admin.common.save')
|
|
83
88
|
submit text, name: :save, class: 'btn btn-success wymupdate'
|
|
84
89
|
end
|
|
85
90
|
|
|
86
|
-
def apply text = '
|
|
91
|
+
def apply text = I18n.t('admin.common.apply')
|
|
87
92
|
submit text, name: :apply, class: 'btn btn-default wymupdate'
|
|
88
93
|
end
|
|
89
94
|
|
|
@@ -138,10 +143,11 @@ class TwitterFormBuilder < ActionView::Helpers::FormBuilder
|
|
|
138
143
|
end
|
|
139
144
|
|
|
140
145
|
def multi_field(relation_name, options = {})
|
|
146
|
+
reflection = self.object.class.reflections[relation_name] || self.object.class.reflections[relation_name.to_s]
|
|
141
147
|
options = {search_field_name: :name,
|
|
142
148
|
show_all_on_focus: false,
|
|
143
149
|
use_cache: true,
|
|
144
|
-
relation_model_name:
|
|
150
|
+
relation_model_name: reflection.klass.model_name.singular}.merge!(options)
|
|
145
151
|
options[:source] ||= @template.admin_autocomplete_path(options[:relation_model_name], options[:search_field_name])
|
|
146
152
|
string "#{relation_name}_tokens", title: self.object.class.human_attribute_name(relation_name),
|
|
147
153
|
data: {
|
data/app/models/lookup.rb
CHANGED
|
@@ -2,5 +2,27 @@ class Lookup < ActiveRecord::Base
|
|
|
2
2
|
|
|
3
3
|
validates_presence_of :code
|
|
4
4
|
validates_uniqueness_of :code
|
|
5
|
+
validates_numericality_of :value, only_integer: true, if: ->(lookup) { lookup.type_code == 'integer' }
|
|
6
|
+
validates_numericality_of :value, if: ->(lookup) { lookup.type_code == 'float' }
|
|
7
|
+
|
|
8
|
+
mount_uploader :file, FileUploader
|
|
9
|
+
|
|
10
|
+
def value_options
|
|
11
|
+
attr_value = read_attribute(:value_options)
|
|
12
|
+
|
|
13
|
+
if attr_value.present?
|
|
14
|
+
ActiveSupport::JSON.decode(attr_value).with_indifferent_access
|
|
15
|
+
else
|
|
16
|
+
{}
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def value_options=(value)
|
|
21
|
+
write_attribute(:value_options, ActiveSupport::JSON.encode(value).to_s) if value.present?
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def select_options
|
|
25
|
+
value_options.map { |key, value| [value, key] }
|
|
26
|
+
end
|
|
5
27
|
|
|
6
28
|
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
class SiteMetaTags < ActiveRecord::Base
|
|
2
|
+
self.table_name = 'meta_tags'
|
|
3
|
+
|
|
4
|
+
mount_uploader :image, MetaTagsImageUploader
|
|
5
|
+
mount_uploader :og_image, MetaTagsImageUploader
|
|
6
|
+
|
|
7
|
+
validates_uniqueness_of :identifier
|
|
8
|
+
|
|
9
|
+
def self.default_tags
|
|
10
|
+
where(identifier: :default).first
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def identifier_text
|
|
14
|
+
identifier == 'default' ? 'Тэги по умолчанию' : identifier
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -17,13 +17,14 @@ class AdminStructure
|
|
|
17
17
|
|
|
18
18
|
attr_accessor :sections
|
|
19
19
|
|
|
20
|
-
def initialize
|
|
20
|
+
def initialize(controller)
|
|
21
|
+
@controller = controller
|
|
21
22
|
@sections = []
|
|
22
23
|
load_sections_from_config
|
|
23
24
|
end
|
|
24
25
|
|
|
25
26
|
def menu_items
|
|
26
|
-
dashboard_item = Section.new('
|
|
27
|
+
dashboard_item = Section.new(I18n.t('admin.common.dashboard'), admin_dashboard_path, 'glyphicon glyphicon-align-left')
|
|
27
28
|
[dashboard_item] + @sections
|
|
28
29
|
end
|
|
29
30
|
|
|
@@ -60,6 +61,20 @@ class AdminStructure
|
|
|
60
61
|
@sections << Section.new(section_name, path, icon, description, counter, show_menu_counter, creation_path)
|
|
61
62
|
end
|
|
62
63
|
|
|
64
|
+
def lookup_section(section_references = 'Настройки', category = nil, options = {})
|
|
65
|
+
default_options = options.merge(path: send('admin_lookups_index_path', category: category),
|
|
66
|
+
icon: 'glyphicon glyphicon-wrench',
|
|
67
|
+
description: 'Раздел содержит различные настройки и тексты')
|
|
68
|
+
section(section_references, default_options)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def meta_tags_section(section_references = 'Мета-тэги', options = {})
|
|
72
|
+
default_options = options.merge(path: send('admin_meta_tags_path'),
|
|
73
|
+
icon: 'glyphicon glyphicon-tag',
|
|
74
|
+
description: 'Раздел содержит мета-тэги')
|
|
75
|
+
section(section_references, default_options)
|
|
76
|
+
end
|
|
77
|
+
|
|
63
78
|
def separator(title)
|
|
64
79
|
@sections << Separator.new(title)
|
|
65
80
|
end
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
- model_name = controller_name.classify.constantize
|
|
2
2
|
.page-header
|
|
3
3
|
%h1
|
|
4
|
-
|
|
4
|
+
#{t('admin.common.sort')}
|
|
5
5
|
%small
|
|
6
|
-
|
|
6
|
+
#{t('admin.common.sort_title')}
|
|
7
7
|
|
|
8
8
|
= form_tag action: :sort, method: :post do
|
|
9
9
|
%table.table.table-striped
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
= hidden_field_tag "#{controller_name}[#{sortable.id}]", sortable.id
|
|
17
17
|
%td= sortable.send(attribute_name)
|
|
18
18
|
= actions do
|
|
19
|
-
= submit_tag '
|
|
19
|
+
= submit_tag t('admin.common.save'), class: 'btn btn-success'
|
|
20
20
|
= cancel_action action: :index
|
|
21
21
|
|
|
22
22
|
:javascript
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
- file = f.object.send field
|
|
2
|
+
- file_label = I18n.t("activerecord.attributes.#{f.object.class.model_name.singular}.#{field}_name")
|
|
2
3
|
.control-group{data: {file_upload_container: true}}
|
|
3
4
|
.controls.alert.alert-info.span3
|
|
4
|
-
%p{id: "#{field}-name-label", style:
|
|
5
|
+
%p{id: "#{field}-name-label", style: 'margin-bottom: 10px;', data: {file_upload_title: true, label: file_label}}
|
|
5
6
|
- if file.file
|
|
6
7
|
= file.file.filename
|
|
7
8
|
= surround '(', ')' do
|
|
8
9
|
= number_to_human_size(file.file.size)
|
|
9
10
|
- else
|
|
10
|
-
=
|
|
11
|
+
= file_label
|
|
11
12
|
|
|
12
|
-
.custom-file{style: 'cursor: pointer; height:
|
|
13
|
+
.custom-file{style: 'cursor: pointer; height: 34px; overflow: hidden; position: relative; width: 140px;'}
|
|
13
14
|
.btn.btn-primary{style: 'position: absolute; left: 0; right: 0;'} Загрузить
|
|
14
|
-
= f.file_field field, class: 'span5', style:
|
|
15
|
+
= f.file_field field, class: 'span5', style: 'font-size: 100px; opacity: 0; position: absolute;', data: {file_upload: true}
|
|
16
|
+
= link_to '#', class: 'btn btn-danger', style:'position: absolute; top: 20px; right: 30px;', data: {file_remove_btn: true} do
|
|
17
|
+
%i.glyphicon.glyphicon-trash
|
|
18
|
+
= f.hidden_field "remove_#{field}", data: {file_remove_flag: true}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
%span.icon-bar
|
|
6
6
|
%span.icon-bar
|
|
7
7
|
%span.icon-bar
|
|
8
|
-
= link_to '
|
|
8
|
+
= link_to t('admin.common.main_page'), root_path, class: 'navbar-brand'
|
|
9
9
|
|
|
10
10
|
#navbar-collapse.navbar-collapse.collapse
|
|
11
11
|
%nav.nav.navbar-nav.side-nav{role: "navigation"}
|
|
@@ -14,14 +14,15 @@
|
|
|
14
14
|
%ul.nav.navbar-nav.navbar-right
|
|
15
15
|
%li
|
|
16
16
|
%p.navbar-text
|
|
17
|
-
|
|
17
|
+
= t('admin.common.logged_in_as')
|
|
18
18
|
|
|
19
19
|
= link_to '#', class: 'navbar-link' do
|
|
20
20
|
%i.glyphicon.glyphicon-user
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
= current_administrator.email
|
|
23
23
|
%li
|
|
24
24
|
= link_to destroy_administrator_session_path, method: Devise.sign_out_via, class: 'navbar-link' do
|
|
25
25
|
%i.glyphicon.glyphicon-log-out
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
= t('admin.auth.sign_out')
|
|
28
|
+
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
.col-md-4.col-lg-2
|
|
33
33
|
.col-md-8.col-lg-10
|
|
34
34
|
.custom-file{style: 'position: relative; display: inline-block; width: 140px; height: 34px; overflow: hidden;'}
|
|
35
|
-
.btn.btn-primary{style: 'position: absolute; left: 0; right: 0;'}
|
|
35
|
+
.btn.btn-primary{style: 'position: absolute; left: 0; right: 0;'}= t('admin.common.upload')
|
|
36
36
|
= file_field_tag :image, id: nil, data: {file: true, path: upload_uri,
|
|
37
37
|
container: container, version: version, free_size: free_size},
|
|
38
38
|
style: 'position: absolute; font-size: 100px; opacity: 0; cursor: pointer;'
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
= title if defined? title
|
|
10
10
|
.custom-file{style: "position: relative; display: inline-block; margin: 0 0 -9px 15px; width: 140px; height: 34px; overflow: hidden;"}
|
|
11
11
|
.btn.btn-primary{style: "position: absolute; left: 0; right: 0;"}
|
|
12
|
-
|
|
12
|
+
= t('admin.common.upload')
|
|
13
13
|
= file_field_tag "#{slider_type_prefix}_image[]", id: nil, multiple: multiple, data: {file: true, path: send("admin_upload_#{slider_class.to_s.underscore}_path", {slider_type: slider_type, master_object_id: object_id})},
|
|
14
14
|
style:" position: absolute; font-size: 100px; opacity: 0; cursor: pointer;"
|
|
15
15
|
.pictograms.row.sortable{data:{object:object_id, slider: slider_type}}
|
|
@@ -2,15 +2,9 @@
|
|
|
2
2
|
= f.errors
|
|
3
3
|
= flash_messages
|
|
4
4
|
|
|
5
|
-
=
|
|
6
|
-
- if @lookup.type_code == 'string'
|
|
7
|
-
= f.string :value
|
|
8
|
-
- elsif @lookup.type_code == 'memo'
|
|
9
|
-
= f.textarea :value, rows: 5
|
|
10
|
-
- elsif @lookup.type_code == 'wysiwyg'
|
|
11
|
-
= f.ckeditor :value
|
|
5
|
+
= render "admin/lookups/types/#{@lookup.type_code}", f: f
|
|
12
6
|
|
|
13
7
|
= fixed_actions do
|
|
14
8
|
= f.save
|
|
15
|
-
= cancel_action
|
|
9
|
+
= cancel_action admin_lookups_index_path(category: @lookup.category)
|
|
16
10
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
%h1 Тексты
|
|
1
|
+
%h1= @category.present? ? t("lookups.category.#{@category}") : 'Тексты'
|
|
2
2
|
|
|
3
3
|
= table_for(Lookup).content(@lookups) do |t|
|
|
4
4
|
- t.column :code, cols: 4, format: lambda {|e| lookup_name(e)}
|
|
5
|
-
- t.column :
|
|
5
|
+
- t.column :self, cols: 7, format: ->(lookup){ format_lookup(lookup) }, title: 'Значение'
|
|
6
6
|
- t.action :edit
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
= f.checkbox :value, checked: @lookup.value == '1', data: tooltip_lookup_data(@lookup)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
= f.combobox :value, @lookup.select_options, data: tooltip_lookup_data(@lookup)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
= f.string :value, div_class: 'col-md-2', data: tooltip_lookup_data(@lookup)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
= f.string :value, div_class: 'col-md-2', data: tooltip_lookup_data(@lookup)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
= f.textarea :value, rows: 5, data: tooltip_lookup_data(@lookup)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
= f.string :value, data: tooltip_lookup_data(@lookup)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
= f.ckeditor :value, data: tooltip_lookup_data(@lookup)
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
= twitter_form_for [:admin, @meta_tags], as: :site_meta_tags, url: url_for(action: :update, id: @meta_tags.id) do |f|
|
|
2
|
+
= f.errors
|
|
3
|
+
= flash_messages
|
|
4
|
+
|
|
5
|
+
= f.static_text :identifier_text
|
|
6
|
+
|
|
7
|
+
= f.string :site
|
|
8
|
+
= f.string :title
|
|
9
|
+
= f.textarea :description, rows: 4
|
|
10
|
+
= f.image_upload :image, version: :main, size: '500x500', upload_path: admin_upload_image_path(image_class: :site_meta_tags, field: :image)
|
|
11
|
+
= f.string :url
|
|
12
|
+
|
|
13
|
+
= field_set 'Open Graph' do
|
|
14
|
+
= f.string :og_title
|
|
15
|
+
= f.textarea :og_description, rows: 4
|
|
16
|
+
= f.image_upload :og_image, version: :main, size: '500x500', upload_path: admin_upload_image_path(image_class: :site_meta_tags, field: :og_image)
|
|
17
|
+
= f.string :og_url
|
|
18
|
+
|
|
19
|
+
= fixed_actions do
|
|
20
|
+
= f.save
|
|
21
|
+
= cancel_action admin_meta_tags_path
|
|
22
|
+
|