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.
Files changed (121) hide show
  1. checksums.yaml +5 -13
  2. data/Gemfile.lock +91 -84
  3. data/Rakefile +2 -2
  4. data/app/assets/javascripts/admin/admin.js +45 -117
  5. data/app/assets/javascripts/admin/photo_uploader.js +1 -10
  6. data/app/assets/javascripts/admin/vendor/jquery-ui-timepicker-addon-ru.js +39 -37
  7. data/app/assets/stylesheets/admin/admin.scss +5 -1
  8. data/app/controllers/admin/image_upload_controller.rb +1 -1
  9. data/app/controllers/admin/lookups_controller.rb +9 -4
  10. data/app/controllers/admin/notifier_controller.rb +7 -0
  11. data/app/controllers/admin/site_meta_tags_controller.rb +43 -0
  12. data/app/controllers/concerns/page_meta_tags.rb +71 -0
  13. data/app/helpers/admin/lookup_helper.rb +23 -0
  14. data/app/helpers/common_helper.rb +6 -0
  15. data/app/helpers/lookup_helper.rb +41 -14
  16. data/app/helpers/twitter_builder_helper.rb +7 -7
  17. data/app/helpers/twitter_form_builder.rb +9 -3
  18. data/app/models/lookup.rb +22 -0
  19. data/app/models/site_meta_tags.rb +16 -0
  20. data/app/uploaders/meta_tags_image_uploader.rb +5 -0
  21. data/app/utils/admin_structure.rb +17 -2
  22. data/app/views/admin/base/_sort.haml +3 -3
  23. data/app/views/admin/common/_file_upload_template.haml +8 -4
  24. data/app/views/admin/common/_header.html.haml +5 -4
  25. data/app/views/admin/common/_image_upload_template.html.haml +1 -1
  26. data/app/views/admin/common/_slides.html.haml +1 -1
  27. data/app/views/admin/home/dashboard.html.haml +1 -1
  28. data/app/views/admin/lookups/_form.html.haml +2 -8
  29. data/app/views/admin/lookups/edit.html.haml +1 -1
  30. data/app/views/admin/lookups/index.html.haml +2 -2
  31. data/app/views/admin/lookups/types/_boolean.haml +1 -0
  32. data/app/views/admin/lookups/types/_enum.haml +1 -0
  33. data/app/views/admin/lookups/types/_file.haml +3 -0
  34. data/app/views/admin/lookups/types/_float.haml +1 -0
  35. data/app/views/admin/lookups/types/_integer.haml +1 -0
  36. data/app/views/admin/lookups/types/_memo.haml +1 -0
  37. data/app/views/admin/lookups/types/_string.haml +1 -0
  38. data/app/views/admin/lookups/types/_wysiwyg.haml +1 -0
  39. data/app/views/admin/site_meta_tags/_form.html.haml +22 -0
  40. data/app/views/admin/site_meta_tags/edit.html.haml +5 -0
  41. data/app/views/admin/site_meta_tags/index.html.haml +5 -0
  42. data/app/views/layouts/admin.html.haml +10 -4
  43. data/app/views/structure/_section.haml +2 -1
  44. data/coalla-cms.gemspec +2 -0
  45. data/lib/coalla/cms/version.rb +1 -1
  46. data/lib/coalla/orm/page_slider.rb +3 -1
  47. data/lib/coalla/orm/relation.rb +7 -4
  48. data/lib/generators/coalla/cms/create_admin_administrators_generator.rb +29 -0
  49. data/lib/generators/coalla/cms/create_markup_generator.rb +30 -0
  50. data/lib/generators/coalla/cms/init_generator.rb +33 -37
  51. data/lib/generators/coalla/cms/lookups/install_generator.rb +17 -6
  52. data/lib/generators/coalla/cms/lookups/templates/migration.rb +4 -0
  53. data/lib/generators/coalla/cms/market/templates/controllers/products_controller.rb +1 -1
  54. data/lib/generators/coalla/cms/market/templates/controllers/properties_controller.rb +1 -1
  55. data/lib/generators/coalla/cms/meta_tags/install_generator.rb +58 -0
  56. data/lib/generators/coalla/cms/meta_tags/templates/migration.rb +23 -0
  57. data/lib/generators/coalla/cms/news/templates/views/new.haml.erb +1 -1
  58. data/lib/generators/coalla/cms/setup_admin_generator.rb +10 -7
  59. data/lib/generators/coalla/cms/setup_routes_generator.rb +1 -0
  60. data/lib/generators/coalla/cms/templates/assets.rb +2 -4
  61. data/lib/generators/coalla/cms/templates/controllers/admin/administrators_controller.rb +55 -0
  62. data/lib/generators/coalla/cms/templates/controllers/admin/base_controller.rb.erb +2 -2
  63. data/lib/generators/coalla/cms/templates/controllers/markup_controller.rb.erb +2 -0
  64. data/lib/generators/coalla/cms/templates/initializers/carrierwave.rb +47 -0
  65. data/lib/generators/coalla/cms/templates/locales/activerecord.en.yml +16 -0
  66. data/lib/generators/coalla/cms/templates/locales/activerecord.ru.yml +29 -0
  67. data/lib/generators/coalla/cms/templates/locales/admin.en.yml +27 -0
  68. data/lib/generators/coalla/cms/templates/locales/admin.ru.yml +27 -0
  69. data/lib/generators/coalla/cms/templates/views/admin/administrators/_form.html.haml +9 -0
  70. data/lib/generators/coalla/cms/templates/views/admin/administrators/edit.html.haml +5 -0
  71. data/lib/generators/coalla/cms/templates/views/admin/administrators/index.html.haml +15 -0
  72. data/lib/generators/coalla/cms/templates/views/admin/administrators/new.html.haml +4 -0
  73. data/lib/generators/coalla/cms/templates/views/admin/scaffold_template/edit.html.haml.erb +1 -1
  74. data/lib/generators/coalla/cms/templates/views/admin/scaffold_template/new.html.haml.erb +1 -1
  75. data/lib/generators/coalla/cms/templates/views/administrators/sessions/new.html.haml +3 -3
  76. metadata +102 -87
  77. data/lib/generators/coalla/cms/templates/activerecord.ru.yml +0 -13
  78. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-blockquote.png +0 -0
  79. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-h1.png +0 -0
  80. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-h2.png +0 -0
  81. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-h3.png +0 -0
  82. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-h4.png +0 -0
  83. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-h5.png +0 -0
  84. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-h6.png +0 -0
  85. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-p.png +0 -0
  86. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/lbl-pre.png +0 -0
  87. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/wymiframe.css +0 -276
  88. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/iframe/default/wymiframe.html +0 -26
  89. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/jquery.wymeditor.js +0 -4819
  90. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/lang/en.js +0 -45
  91. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/lang/ru.js +0 -55
  92. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/plugins/imageupload/icons.png +0 -0
  93. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/plugins/imageupload/jquery.wymeditor.imageupload.js +0 -150
  94. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/plugins/resizable/jquery.wymeditor.resizable.js +0 -91
  95. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/plugins/resizable/readme.txt +0 -124
  96. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/compact/icons.png +0 -0
  97. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/compact/skin.css +0 -134
  98. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/compact/skin.js +0 -35
  99. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/default/icons.png +0 -0
  100. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/default/skin.css +0 -341
  101. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/default/skin.js +0 -40
  102. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/minimal/images/bg.header.gif +0 -0
  103. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/minimal/images/bg.selector.silver.gif +0 -0
  104. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/minimal/images/bg.wymeditor.png +0 -0
  105. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/minimal/images/icons.silver.gif +0 -0
  106. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/minimal/skin.css +0 -131
  107. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/minimal/skin.js +0 -30
  108. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/COPYING +0 -674
  109. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/README +0 -27
  110. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/images/bg.header.gif +0 -0
  111. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/images/bg.selector.silver.gif +0 -0
  112. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/images/bg.wymeditor.png +0 -0
  113. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/images/icons.silver.gif +0 -0
  114. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/skin.css +0 -297
  115. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/silver/skin.js +0 -61
  116. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/twopanels/icons.png +0 -0
  117. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/twopanels/skin.css +0 -134
  118. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/twopanels/skin.js +0 -39
  119. data/lib/generators/coalla/cms/wysiwyg/templates/wymeditor/skins/wymeditor_icon.png +0 -0
  120. data/lib/generators/coalla/cms/wysiwyg/wymeditor_generator.rb +0 -17
  121. /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
- @lookups = Lookup.order(:code, :created_at)
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 admin_lookups_path
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 admin_lookups_path
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 admin_lookups_path
47
+ redirect_to admin_lookups_index_path(category: @lookup.category)
43
48
  end
44
49
 
45
50
  end
@@ -0,0 +1,7 @@
1
+ module Admin
2
+ class NotifierController < BaseController
3
+ def test_sending
4
+ raise('Test notifier.')
5
+ end
6
+ end
7
+ 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 code, default = nil, &block
4
- _lookup code, 'string', default, &block
3
+ def lookup(code, default = nil, &block)
4
+ _lookup(code, 'string', default, &block)
5
5
  end
6
6
 
7
- def memo_lookup code, default = nil, &block
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 code, default = nil, &block
12
- _lookup code, 'memo', default, &block
38
+ def unsafe_memo_lookup(code, default = nil, &block)
39
+ _lookup(code, 'memo', default, &block)
13
40
  end
14
41
 
15
- def wysiwyg_lookup code, default = nil, &block
16
- raw(_lookup code, 'wysiwyg', default, &block)
42
+ def wysiwyg_lookup(code, default = nil, &block)
43
+ raw(_lookup(code, 'wysiwyg', default, &block))
17
44
  end
18
45
 
19
- def lookup_name code
46
+ def lookup_name(code)
20
47
  t("lookups.#{code}")
21
48
  end
22
49
 
23
- def sf text
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 code, type, default, &block
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
- capture(self, &block)
35
- else
36
- default
37
- end
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>&nbsp;&nbsp;Добавить".html_safe
204
+ content = "<i class='glyphicon glyphicon-plus'></i>&nbsp;&nbsp;#{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>&nbsp;&nbsp;Сортировать".html_safe
209
+ content = "<i class='glyphicon glyphicon-random'></i>&nbsp;&nbsp;#{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: 'Вы уверены?'}, method: :delete, class: 'btn btn-danger btn-xs', title: 'Удалить'
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 = 'Вернуться', path = back_uri
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 save text = 'Сохранить'
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: self.object.class.reflections[relation_name].klass.model_name.singular}.merge!(options)
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
@@ -0,0 +1,5 @@
1
+ class MetaTagsImageUploader < GenericImageUploader
2
+ version :main do
3
+ resize_to_limit 1024, 1024
4
+ end
5
+ 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('Сводка', admin_dashboard_path, 'glyphicon glyphicon-align-left')
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
- Сортировка&nbsp;
4
+ #{t('admin.common.sort')}&nbsp;
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 'Сохранить', class: 'btn btn-success'
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: "margin-bottom: 10px;", data: {file_upload_title: true}}
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
- = I18n.t("activerecord.attributes.#{f.object.class.model_name.singular}.#{field}_name")
11
+ = file_label
11
12
 
12
- .custom-file{style: 'cursor: pointer; height: 31px; overflow: hidden; position: relative; width: 140px;'}
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: "font-size: 100px; opacity: 0; position: absolute;", data: {file_upload: true}
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 'Главная', root_path, class: 'navbar-brand'
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
  &nbsp;
19
19
  = link_to '#', class: 'navbar-link' do
20
20
  %i.glyphicon.glyphicon-user
21
21
  &nbsp;
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
  &nbsp;
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}}
@@ -1,5 +1,5 @@
1
1
  .page-header
2
- %h1 Сводка
2
+ %h1= t('admin.common.dashboard')
3
3
  .row
4
4
  = render collection: @structure.sections, partial: 'structure/section'
5
5
 
@@ -2,15 +2,9 @@
2
2
  = f.errors
3
3
  = flash_messages
4
4
 
5
- = field_set lookup_name(@lookup.code) do
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 admin_lookups_path
9
+ = cancel_action admin_lookups_index_path(category: @lookup.category)
16
10
 
@@ -1,4 +1,4 @@
1
- %h1 Текст
1
+ %h1= lookup_name(@lookup.code)
2
2
  .page-header
3
3
  %h3 Редактирование
4
4
 
@@ -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 :value, cols: 7, format: lambda {|e| raw(truncate(strip_tags(e), length: 200)) }
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,3 @@
1
+ %p
2
+ = f.object.try(:tooltip)
3
+ = f.file_upload :file
@@ -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
+
@@ -0,0 +1,5 @@
1
+ %h Мета-тэги
2
+ .page-header
3
+ %h3 Редактирование
4
+
5
+ = render 'form'
@@ -0,0 +1,5 @@
1
+ %h1 Мета-тэги
2
+
3
+ = table_for(SiteMetaTags).content(@meta_tags) do |t|
4
+ - t.column :identifier_text
5
+ - t.action ->(item){ edit_link(url_for(action: :edit, id: item.id))}