coalla-cms 0.4.4.3 → 0.5.1.8

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