alchemy_cms 3.5.0 → 3.6.0

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 (118) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +82 -26
  3. data/.travis.yml +1 -1
  4. data/CHANGELOG.md +23 -1
  5. data/README.md +14 -5
  6. data/Rakefile +0 -1
  7. data/alchemy_cms.gemspec +2 -5
  8. data/app/assets/images/alchemy/alchemy-logo.png +0 -0
  9. data/app/assets/javascripts/alchemy/admin.js +1 -1
  10. data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +4 -8
  11. data/app/assets/javascripts/alchemy/alchemy.buttons.js.coffee +2 -2
  12. data/app/assets/javascripts/alchemy/alchemy.datepicker.js.coffee +18 -27
  13. data/app/assets/javascripts/alchemy/alchemy.dialog.js.coffee +1 -1
  14. data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +3 -8
  15. data/app/assets/javascripts/alchemy/alchemy.elements_window.js.coffee +1 -1
  16. data/app/assets/javascripts/alchemy/alchemy.gui.js.coffee +0 -1
  17. data/app/assets/javascripts/alchemy/alchemy.page_sorter.js +22 -46
  18. data/app/assets/javascripts/alchemy/alchemy.preview_window.js.coffee +1 -1
  19. data/app/assets/javascripts/alchemy/alchemy.sitemap.js.coffee +2 -2
  20. data/app/assets/javascripts/alchemy/alchemy.spinner.js +32 -0
  21. data/app/assets/javascripts/alchemy/alchemy.tinymce.js.coffee +1 -1
  22. data/app/assets/javascripts/alchemy/templates/index.js +1 -0
  23. data/app/assets/javascripts/alchemy/templates/spinner.hbs +7 -0
  24. data/app/assets/stylesheets/alchemy/_extends.scss +1 -0
  25. data/app/assets/stylesheets/alchemy/admin.scss +1 -0
  26. data/app/assets/stylesheets/alchemy/base.scss +1 -7
  27. data/app/assets/stylesheets/alchemy/buttons.scss +1 -5
  28. data/app/assets/stylesheets/alchemy/dialogs.scss +0 -4
  29. data/app/assets/stylesheets/alchemy/elements.scss +2 -6
  30. data/app/assets/stylesheets/alchemy/frame.scss +0 -5
  31. data/app/assets/stylesheets/alchemy/image_library.scss +0 -13
  32. data/app/assets/stylesheets/alchemy/sitemap.scss +5 -34
  33. data/app/assets/stylesheets/alchemy/spinner.scss +52 -0
  34. data/app/controllers/alchemy/admin/attachments_controller.rb +12 -11
  35. data/app/controllers/alchemy/admin/base_controller.rb +3 -7
  36. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +2 -1
  37. data/app/controllers/alchemy/admin/languages_controller.rb +3 -8
  38. data/app/controllers/alchemy/admin/pictures_controller.rb +11 -7
  39. data/app/controllers/alchemy/admin/resources_controller.rb +1 -1
  40. data/app/controllers/alchemy/attachments_controller.rb +2 -0
  41. data/app/controllers/alchemy/base_controller.rb +4 -5
  42. data/app/controllers/concerns/alchemy/admin/uploader_responses.rb +1 -1
  43. data/app/helpers/alchemy/admin/base_helper.rb +17 -8
  44. data/app/helpers/alchemy/admin/tags_helper.rb +31 -18
  45. data/app/helpers/alchemy/base_helper.rb +1 -1
  46. data/app/helpers/alchemy/pages_helper.rb +4 -7
  47. data/app/models/alchemy/attachment.rb +4 -0
  48. data/app/models/alchemy/cell.rb +1 -1
  49. data/app/models/alchemy/element.rb +6 -12
  50. data/app/models/alchemy/element/definitions.rb +2 -2
  51. data/app/models/alchemy/element/element_contents.rb +1 -1
  52. data/app/models/alchemy/essence_picture_view.rb +14 -2
  53. data/app/models/alchemy/language.rb +4 -4
  54. data/app/models/alchemy/page.rb +25 -28
  55. data/app/models/alchemy/page/page_elements.rb +1 -1
  56. data/app/models/alchemy/page/page_natures.rb +1 -1
  57. data/app/models/alchemy/picture.rb +5 -1
  58. data/app/models/alchemy/site.rb +27 -12
  59. data/app/views/alchemy/admin/attachments/_tag_list.html.erb +14 -13
  60. data/app/views/alchemy/admin/dashboard/info.html.erb +1 -1
  61. data/app/views/alchemy/admin/layoutpages/edit.html.erb +1 -1
  62. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +1 -1
  63. data/app/views/alchemy/admin/pages/_form.html.erb +1 -1
  64. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +1 -1
  65. data/app/views/alchemy/admin/pages/_page.html.erb +1 -1
  66. data/app/views/alchemy/admin/pages/_sitemap.html.erb +2 -2
  67. data/app/views/alchemy/admin/pages/configure_external.html.erb +1 -1
  68. data/app/views/alchemy/admin/pages/index.html.erb +5 -7
  69. data/app/views/alchemy/admin/pages/sort.html.erb +19 -0
  70. data/app/views/alchemy/admin/pages/update.js.erb +1 -1
  71. data/app/views/alchemy/admin/pictures/_archive.html.erb +19 -19
  72. data/app/views/alchemy/admin/pictures/_tag_list.html.erb +3 -4
  73. data/app/views/alchemy/admin/resources/_tag_list.html.erb +3 -4
  74. data/app/views/alchemy/admin/resources/edit.html.erb +1 -1
  75. data/app/views/alchemy/admin/resources/new.html.erb +1 -1
  76. data/app/views/alchemy/pages/_meta_data.html.erb +1 -1
  77. data/app/views/alchemy/pages/show.rss.builder +0 -2
  78. data/app/views/alchemy/welcome.html.erb +1 -1
  79. data/app/views/layouts/alchemy/admin.html.erb +1 -1
  80. data/config/locales/alchemy.de.yml +4 -4
  81. data/config/locales/alchemy.en.yml +4 -4
  82. data/config/locales/alchemy.es.yml +3 -3
  83. data/config/locales/alchemy.fr.yml +4 -4
  84. data/config/locales/alchemy.it.yml +3 -3
  85. data/config/locales/alchemy.nl.yml +4 -4
  86. data/config/locales/alchemy.ru.yml +3 -3
  87. data/lib/alchemy/auth_accessors.rb +6 -6
  88. data/lib/alchemy/cache_digests/template_tracker.rb +5 -5
  89. data/lib/alchemy/controller_actions.rb +1 -6
  90. data/lib/alchemy/engine.rb +0 -53
  91. data/lib/alchemy/errors.rb +12 -3
  92. data/lib/alchemy/i18n.rb +1 -1
  93. data/lib/alchemy/logger.rb +1 -1
  94. data/lib/alchemy/page_layout.rb +5 -5
  95. data/lib/alchemy/seeder.rb +16 -49
  96. data/lib/alchemy/tasks/helpers.rb +1 -1
  97. data/lib/alchemy/test_support/config_stubbing.rb +28 -0
  98. data/lib/alchemy/test_support/essence_shared_examples.rb +6 -6
  99. data/lib/alchemy/test_support/factories/language_factory.rb +1 -1
  100. data/lib/alchemy/test_support/factories/page_factory.rb +7 -0
  101. data/lib/alchemy/test_support/factories/site_factory.rb +6 -0
  102. data/lib/alchemy/test_support/shared_contexts.rb +14 -0
  103. data/lib/alchemy/test_support/shared_uploader_examples.rb +10 -0
  104. data/lib/alchemy/touching.rb +1 -1
  105. data/lib/alchemy/version.rb +1 -1
  106. data/lib/alchemy_cms.rb +56 -1
  107. data/lib/{alchemy/kaminari → kaminari}/scoped_pagination_url_helper.rb +0 -0
  108. data/lib/rails/generators/alchemy/base.rb +1 -1
  109. data/lib/rails/generators/alchemy/elements/elements_generator.rb +2 -1
  110. data/lib/rails/generators/alchemy/page_layouts/page_layouts_generator.rb +2 -1
  111. data/lib/rails/generators/alchemy/site_layouts/site_layouts_generator.rb +2 -1
  112. data/lib/tasks/alchemy/tidy.rake +91 -89
  113. data/lib/tasks/alchemy/upgrade.rake +15 -15
  114. metadata +29 -14
  115. data/app/assets/javascripts/alchemy/alchemy.spinner.js.coffee +0 -49
  116. data/app/views/alchemy/admin/pages/sort.js.erb +0 -4
  117. data/vendor/assets/javascripts/handlebars.js +0 -4608
  118. data/vendor/assets/javascripts/spin.min.js +0 -1
@@ -95,7 +95,7 @@ module Alchemy
95
95
  def content_definition_for(content_name)
96
96
  if content_definitions.blank?
97
97
  log_warning "Element #{name} is missing the content definition for #{content_name}"
98
- return nil
98
+ nil
99
99
  else
100
100
  content_definitions.detect { |d| d['name'] == content_name }
101
101
  end
@@ -9,7 +9,9 @@ module Alchemy
9
9
 
10
10
  DEFAULT_OPTIONS = {
11
11
  show_caption: true,
12
- disable_link: false
12
+ disable_link: false,
13
+ srcset: [],
14
+ sizes: []
13
15
  }
14
16
 
15
17
  def initialize(content, options = {}, html_options = {})
@@ -59,7 +61,9 @@ module Alchemy
59
61
  essence.picture_url(options.except(*DEFAULT_OPTIONS.keys)), {
60
62
  alt: essence.alt_tag.presence,
61
63
  title: essence.title.presence,
62
- class: caption ? nil : essence.css_class.presence
64
+ class: caption ? nil : essence.css_class.presence,
65
+ srcset: srcset.join(', ').presence,
66
+ sizes: options[:sizes].join(', ').presence
63
67
  }.merge(caption ? {} : html_options)
64
68
  )
65
69
  end
@@ -71,5 +75,13 @@ module Alchemy
71
75
  def is_linked?
72
76
  !options[:disable_link] && essence.link.present?
73
77
  end
78
+
79
+ def srcset
80
+ options[:srcset].map do |size|
81
+ url = essence.picture_url(size: size)
82
+ width, height = size.split('x')
83
+ width.present? ? "#{url} #{width}w" : "#{url} #{height}h"
84
+ end
85
+ end
74
86
  end
75
87
  end
@@ -128,18 +128,18 @@ module Alchemy
128
128
  def publicity_of_default_language
129
129
  if default? && !public?
130
130
  errors.add(:public, Alchemy.t("Default language has to be public"))
131
- return false
131
+ false
132
132
  else
133
- return true
133
+ true
134
134
  end
135
135
  end
136
136
 
137
137
  def presence_of_default_language
138
138
  if Language.default == self && default_changed?
139
139
  errors.add(:default, Alchemy.t("We need at least one default."))
140
- return false
140
+ false
141
141
  else
142
- return true
142
+ true
143
143
  end
144
144
  end
145
145
 
@@ -43,7 +43,6 @@ module Alchemy
43
43
 
44
44
  DEFAULT_ATTRIBUTES_FOR_COPY = {
45
45
  do_not_autogenerate: true,
46
- do_not_sweep: true,
47
46
  visible: false,
48
47
  public_on: nil,
49
48
  public_until: nil,
@@ -99,9 +98,6 @@ module Alchemy
99
98
  validates_format_of :page_layout, with: /\A[a-z0-9_-]+\z/, unless: -> { systempage? || page_layout.blank? }
100
99
  validates_presence_of :parent_id, if: proc { Page.count > 1 }
101
100
 
102
- attr_accessor :do_not_sweep
103
- attr_accessor :do_not_validate_language
104
-
105
101
  before_save :set_language_code,
106
102
  if: -> { language.present? },
107
103
  unless: :systempage?
@@ -143,6 +139,15 @@ module Alchemy
143
139
  # Class methods
144
140
  #
145
141
  class << self
142
+ # The root page of the page tree
143
+ #
144
+ # Internal use only. You wouldn't use this page ever.
145
+ #
146
+ # Automatically created when accessed the first time.
147
+ #
148
+ def root
149
+ super || create!(name: 'Root')
150
+ end
146
151
  alias_method :rootpage, :root
147
152
 
148
153
  # Used to store the current page previewed in the edit page template.
@@ -306,19 +311,27 @@ module Alchemy
306
311
 
307
312
  # Returns the previous page on the same level or nil.
308
313
  #
309
- # For options @see #next_or_previous
314
+ # @option options [Boolean] :restricted (false)
315
+ # only restricted pages (true), skip restricted pages (false)
316
+ # @option options [Boolean] :public (true)
317
+ # only public pages (true), skip public pages (false)
310
318
  #
311
319
  def previous(options = {})
312
- next_or_previous('<', options)
320
+ pages = self_and_siblings.where('lft < ?', lft)
321
+ select_page(pages, options.merge(order: :desc))
313
322
  end
314
323
  alias_method :previous_page, :previous
315
324
 
316
325
  # Returns the next page on the same level or nil.
317
326
  #
318
- # For options @see #next_or_previous
327
+ # @option options [Boolean] :restricted (false)
328
+ # only restricted pages (true), skip restricted pages (false)
329
+ # @option options [Boolean] :public (true)
330
+ # only public pages (true), skip public pages (false)
319
331
  #
320
332
  def next(options = {})
321
- next_or_previous('>', options)
333
+ pages = self_and_siblings.where('lft > ?', lft)
334
+ select_page(pages, options.merge(order: :asc))
322
335
  end
323
336
  alias_method :next_page, :next
324
337
 
@@ -453,26 +466,10 @@ module Alchemy
453
466
  end
454
467
  end
455
468
 
456
- # Returns the next or previous page on the same level or nil.
457
- #
458
- # @param [String]
459
- # Pass '>' for next and '<' for previous page.
460
- #
461
- # @option options [Boolean] :restricted (nil)
462
- # only restricted pages (true), skip restricted pages (false)
463
- # @option options [Boolean] :public (true)
464
- # only public pages (true), skip public pages (false)
465
- #
466
- def next_or_previous(dir = '>', options = {})
467
- options = {
468
- restricted: false,
469
- public: true
470
- }.update(options)
471
-
472
- pages = self_and_siblings.where(["#{Page.table_name}.lft #{dir} ?", lft])
473
- pages = options[:public] ? pages.published : pages.not_public
474
- pages.where(restricted: options[:restricted])
475
- .reorder(dir == '>' ? 'lft' : 'lft DESC')
469
+ def select_page(pages, options = {})
470
+ pages = options.fetch(:public, true) ? pages.published : pages.not_public
471
+ pages.where(restricted: options.fetch(:restricted, false))
472
+ .reorder(lft: options.fetch(:order))
476
473
  .limit(1).first
477
474
  end
478
475
 
@@ -310,7 +310,7 @@ module Alchemy
310
310
  if cell = cells.find_by_name(name)
311
311
  cell.elements
312
312
  else
313
- Alchemy::Logger.warn("Cell with name `#{name}` could not be found!", caller.first)
313
+ Alchemy::Logger.warn("Cell with name `#{name}` could not be found!", caller(0..0))
314
314
  Element.none
315
315
  end
316
316
  end
@@ -20,7 +20,7 @@ module Alchemy
20
20
  end
21
21
 
22
22
  def systempage?
23
- return true if Page.root.nil?
23
+ return true if Page.count.zero?
24
24
  rootpage? || (parent_id == Page.root.id && !language_root?)
25
25
  end
26
26
 
@@ -92,6 +92,10 @@ module Alchemy
92
92
  # Class methods
93
93
 
94
94
  class << self
95
+ def searchable_alchemy_resource_attributes
96
+ %w(name image_file_name)
97
+ end
98
+
95
99
  def last_upload
96
100
  last_picture = Picture.last
97
101
  return Picture.all unless last_picture
@@ -231,7 +235,7 @@ module Alchemy
231
235
  # Returns true if picture is not assigned to any EssencePicture.
232
236
  #
233
237
  def deletable?
234
- !essence_pictures.any?
238
+ essence_pictures.empty?
235
239
  end
236
240
 
237
241
  # A size String from original image file values.
@@ -24,7 +24,7 @@ module Alchemy
24
24
  scope :published, -> { where(public: true) }
25
25
 
26
26
  # Callbacks
27
- before_create :create_default_language, unless: -> { languages.any? }
27
+ before_create :create_default_language!, unless: -> { languages.any? }
28
28
 
29
29
  # concerns
30
30
  include Alchemy::Site::Layout
@@ -62,7 +62,7 @@ module Alchemy
62
62
  end
63
63
 
64
64
  def default
65
- Site.first
65
+ Site.first || create_default_site!
66
66
  end
67
67
 
68
68
  def find_for_host(host)
@@ -79,23 +79,38 @@ module Alchemy
79
79
  site.aliases.split.include?(host) if site.aliases.present?
80
80
  end
81
81
  end
82
+
83
+ private
84
+
85
+ def create_default_site!
86
+ default_site = Alchemy::Config.get(:default_site)
87
+ if default_site
88
+ create!(name: default_site['name'], host: default_site['host'])
89
+ else
90
+ raise DefaultSiteNotFoundError
91
+ end
92
+ end
82
93
  end
83
94
 
84
95
  private
85
96
 
86
97
  # If no languages are present, create a default language based
87
98
  # on the host app's Alchemy configuration.
88
- def create_default_language
99
+ def create_default_language!
89
100
  default_language = Alchemy::Config.get(:default_language)
90
- languages.build(
91
- name: default_language['name'],
92
- language_code: default_language['code'],
93
- locale: default_language['code'],
94
- frontpage_name: default_language['frontpage_name'],
95
- page_layout: default_language['page_layout'],
96
- public: true,
97
- default: true
98
- )
101
+ if default_language
102
+ languages.build(
103
+ name: default_language['name'],
104
+ language_code: default_language['code'],
105
+ locale: default_language['code'],
106
+ frontpage_name: default_language['frontpage_name'],
107
+ page_layout: default_language['page_layout'],
108
+ public: true,
109
+ default: true
110
+ )
111
+ else
112
+ raise DefaultLanguageNotFoundError
113
+ end
99
114
  end
100
115
  end
101
116
  end
@@ -1,14 +1,15 @@
1
- <% p = params.dup %>
2
- <h2><%= Alchemy.t("Filter by tag") %></h2>
3
- <%= js_filter_field '.tag-list li' %>
4
- <ul>
5
- <%= render_tag_list('Alchemy::Attachment', p) %>
6
- </ul>
7
- <% if p[:tagged_with].present? %>
8
- <%= link_to(
9
- render_icon('delete-small') + Alchemy.t('Remove tag filter'),
10
- url_for(p.delete_if { |k, v| k == "tagged_with" }.merge(action: 'index')),
11
- remote: request.xhr?,
12
- class: 'button small with_icon please_wait'
13
- ) %>
1
+ <% if Alchemy::Attachment.tag_counts.any? %>
2
+ <h2><%= Alchemy.t("Filter by tag") %></h2>
3
+ <%= js_filter_field '.tag-list li' %>
4
+ <ul>
5
+ <%= render_tag_list('Alchemy::Attachment') %>
6
+ </ul>
7
+ <% if params[:tagged_with].present? %>
8
+ <%= link_to(
9
+ render_icon('delete-small') + Alchemy.t('Remove tag filter'),
10
+ url_for(tag_list_params.delete_if { |k, v| k == "tagged_with" }.merge(action: 'index')),
11
+ remote: request.xhr?,
12
+ class: 'button small with_icon please_wait'
13
+ ) %>
14
+ <% end %>
14
15
  <% end %>
@@ -46,7 +46,7 @@
46
46
  <script type="text/javascript">
47
47
  (function() {
48
48
  var el = $('#update_check');
49
- var spinner = Alchemy.Spinner.small();
49
+ var spinner = new Alchemy.Spinner('small');
50
50
  spinner.spin(el[0]);
51
51
  $.get('<%= alchemy.update_check_path %>', function(data, textStatus, jqXHR) {
52
52
  if (data == 'true') {
@@ -2,7 +2,7 @@
2
2
  <%= f.input :page_layout,
3
3
  collection: @page_layouts,
4
4
  label: page_layout_label(@page),
5
- include_blank: false,
5
+ include_blank: Alchemy.t('Please choose'),
6
6
  input_html: {class: 'alchemy_selectbox'} %>
7
7
  <%= f.input :name, autofocus: true %>
8
8
  <% if @page.taggable? %>
@@ -31,7 +31,7 @@
31
31
  collection: @page_layouts,
32
32
  selected: @language.page_layout,
33
33
  label: Alchemy.t(:page_type),
34
- include_blank: false,
34
+ include_blank: Alchemy.t('Please choose'),
35
35
  required: true,
36
36
  input_html: {class: 'alchemy_selectbox'} %>
37
37
  <%= form.hidden_field :language_id, value: @language.id %>
@@ -2,7 +2,7 @@
2
2
  <%= f.input :page_layout,
3
3
  collection: @page_layouts,
4
4
  label: page_layout_label(@page),
5
- include_blank: false,
5
+ include_blank: Alchemy.t('Please choose'),
6
6
  input_html: {class: 'alchemy_selectbox'} %>
7
7
 
8
8
  <div class="input check_boxes">
@@ -4,7 +4,7 @@
4
4
  <%= f.input :page_layout,
5
5
  collection: @page_layouts,
6
6
  label: Alchemy.t(:page_type),
7
- include_blank: false,
7
+ include_blank: Alchemy.t('Please choose'),
8
8
  required: true,
9
9
  input_html: {class: 'alchemy_selectbox'} %>
10
10
  <%= f.input :name %>
@@ -8,7 +8,7 @@
8
8
  alchemy.fold_admin_page_path(page),
9
9
  remote: true,
10
10
  method: :post,
11
- class: "page_folder {{#if folded}}folded{{else}}collapsed{{/if}} spinner",
11
+ class: "page_folder {{#if folded}}folded{{else}}collapsed{{/if}}",
12
12
  title: "{{#if folded}}#{Alchemy.t('Show childpages')}{{else}}#{Alchemy.t('Hide childpages')}{{/if}}",
13
13
  id: "fold_button_{{id}}"
14
14
  )
@@ -22,10 +22,10 @@
22
22
  full: <%= full %>
23
23
  <% if @sorting %>
24
24
  ,ready: function () {
25
- Alchemy.PageSorter.init();
25
+ Alchemy.PageSorter();
26
26
  }
27
27
  <% elsif action_name == 'link' %>
28
- ,spinner: Alchemy.Spinner.small(),
28
+ ,spinner: new Alchemy.Spinner('small'),
29
29
  ready: function () {
30
30
  if (Alchemy.currentDialog()) {
31
31
  Alchemy.currentDialog().attachTreeEvents();
@@ -2,7 +2,7 @@
2
2
  <%= f.input :page_layout,
3
3
  collection: @page_layouts,
4
4
  label: Alchemy.t(:page_type),
5
- include_blank: false,
5
+ include_blank: Alchemy.t('Please choose'),
6
6
  input_html: {class: 'alchemy_selectbox'} %>
7
7
  <div class="input check_boxes">
8
8
  <label class="control-label"><%= Alchemy.t(:page_status) %></label>
@@ -16,15 +16,13 @@
16
16
  </div>
17
17
  <% end %>
18
18
  <% if can?(:sort, Alchemy::Page) %>
19
- <div class="button_with_label" id="page_sorting_button">
19
+ <div class="button_with_label">
20
20
  <%= link_to(
21
- render_icon('sort'),
21
+ render_icon(:sort),
22
22
  alchemy.sort_admin_pages_path,
23
- :complete => '',
24
- :method => :get,
25
- :remote => true,
26
- :class => 'icon_button please_wait',
27
- :title => Alchemy.t('Sort pages')
23
+ method: :get,
24
+ class: 'icon_button please_wait',
25
+ title: Alchemy.t('Sort pages')
28
26
  ) %>
29
27
  <label><%= Alchemy.t('Sort pages') %></label>
30
28
  </div>
@@ -0,0 +1,19 @@
1
+ <% content_for :toolbar do %>
2
+ <div class="button_with_label">
3
+ <%= link_to alchemy.admin_pages_path, class: 'icon_button' do %>
4
+ <%= render_icon :back %>
5
+ <% end %>
6
+ <label><%= Alchemy.t(:cancel) %></label>
7
+ </div>
8
+ <% end %>
9
+
10
+ <div id="sort_panel">
11
+ <%= render_message do %>
12
+ <%= Alchemy.t(:explain_sitemap_dragndrop_sorting) %>
13
+ <% end %>
14
+ <div class="buttons">
15
+ <%= button_tag Alchemy.t('save order'), id: 'save_page_order' %>
16
+ </div>
17
+ </div>
18
+
19
+ <%= render 'sitemap', page_partial: 'page', full: true %>
@@ -15,7 +15,7 @@
15
15
 
16
16
  var page_html = "<%= j render('page', page: @page) %>";
17
17
  var compiler = Handlebars.compile(page_html);
18
- var tree = JSON.parse('<%== @tree.to_json %>');
18
+ var tree = <%== @tree.to_json %>;
19
19
  var html = compiler(tree.pages[0]);
20
20
  $('#page_<%= @page.id %>').replaceWith(html);
21
21
 
@@ -1,37 +1,37 @@
1
1
  <div id="library_sidebar">
2
- <%= render :partial => 'filter_bar' %>
2
+ <%= render 'filter_bar' %>
3
3
  <div class="tag-list with_filter_bar<%= params[:tagged_with].present? ? ' filtered' : '' %>">
4
- <%= render :partial => 'tag_list' %>
4
+ <%= render 'tag_list' %>
5
5
  </div>
6
6
  </div>
7
- <%= form_tag delete_multiple_admin_pictures_path, :method => :delete do %>
7
+ <%= form_tag delete_multiple_admin_pictures_path, method: :delete do %>
8
8
  <div class="selected_item_tools">
9
9
  <h2><%= Alchemy.t(:edit_selected_pictures) %></h2>
10
10
  <%= link_to(
11
11
  render_icon('edit') + Alchemy.t("Edit"),
12
12
  edit_multiple_admin_pictures_path,
13
- :class => 'button with_icon',
14
- :title => Alchemy.t('Edit multiple pictures'),
15
- :id => 'edit_multiple_pictures',
16
- :style => 'float: none'
13
+ class: 'button with_icon',
14
+ title: Alchemy.t('Edit multiple pictures'),
15
+ id: 'edit_multiple_pictures',
16
+ style: 'float: none'
17
17
  ) %>
18
18
  <%= button_tag render_icon('destroy') + Alchemy.t("Delete"), 'data-alchemy-confirm' => {
19
- :title => Alchemy.t(:please_confirm),
20
- :message => Alchemy.t(:confirm_to_delete_images_from_server),
21
- :ok_label => Alchemy.t("Yes"),
22
- :cancel_label => Alchemy.t("No")
23
- }.to_json, :class => 'button with_icon' %>
19
+ title: Alchemy.t(:please_confirm),
20
+ message: Alchemy.t(:confirm_to_delete_images_from_server),
21
+ ok_label: Alchemy.t("Yes"),
22
+ cancel_label: Alchemy.t("No")
23
+ }.to_json, class: 'button with_icon' %>
24
24
  &nbsp;<%= Alchemy.t(:or) %>&nbsp;
25
25
  <%= link_to(
26
26
  render_icon('delete-small') + Alchemy.t("Clear selection"),
27
27
  admin_pictures_path(
28
- :q => params[:q],
29
- :tagged_with => params[:tagged_with],
30
- :size => params[:size],
31
- :filter => params[:filter]
28
+ q: params[:q],
29
+ tagged_with: params[:tagged_with],
30
+ size: params[:size],
31
+ filter: params[:filter]
32
32
  ),
33
- :class => 'button with_icon',
34
- :style => 'float: none'
33
+ class: 'button with_icon',
34
+ style: 'float: none'
35
35
  ) %>
36
36
  </div>
37
37
  <div id="pictures">
@@ -46,7 +46,7 @@
46
46
  <%= Alchemy.t(:no_search_results) %>
47
47
  </div>
48
48
  <% else %>
49
- <%= render :partial => 'picture', :collection => @pictures %>
49
+ <%= render partial: 'picture', collection: @pictures %>
50
50
  <%= paginate @pictures, theme: 'alchemy' %>
51
51
  <% end %>
52
52
  </div>