alchemy_cms 6.0.0.pre.rc4 → 6.0.0.pre.rc7

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.

Potentially problematic release.


This version of alchemy_cms might be problematic. Click here for more details.

Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +8 -15
  3. data/.github/workflows/stale.yml +21 -7
  4. data/.gitignore +0 -1
  5. data/.rspec +1 -0
  6. data/CHANGELOG.md +87 -0
  7. data/Gemfile +7 -6
  8. data/Rakefile +5 -1
  9. data/alchemy_cms.gemspec +2 -2
  10. data/app/assets/javascripts/alchemy/admin.js +0 -2
  11. data/app/assets/javascripts/alchemy/alchemy.dialog.js.coffee +6 -1
  12. data/app/assets/javascripts/alchemy/page_select.js +13 -8
  13. data/app/assets/javascripts/alchemy/templates/index.js +1 -0
  14. data/app/assets/javascripts/alchemy/templates/page.hbs +17 -7
  15. data/app/assets/javascripts/alchemy/templates/page_folder.hbs +3 -0
  16. data/app/assets/stylesheets/alchemy/archive.scss +4 -0
  17. data/app/assets/stylesheets/alchemy/page-select.scss +29 -4
  18. data/app/assets/stylesheets/alchemy/sitemap.scss +9 -7
  19. data/app/controllers/alchemy/admin/pages_controller.rb +10 -15
  20. data/app/controllers/alchemy/api/pages_controller.rb +14 -4
  21. data/app/models/alchemy/ingredient.rb +6 -1
  22. data/app/models/alchemy/page.rb +9 -3
  23. data/app/serializers/alchemy/page_serializer.rb +7 -1
  24. data/app/serializers/alchemy/page_tree_serializer.rb +3 -3
  25. data/app/services/alchemy/tag_validations.rb +21 -0
  26. data/app/views/alchemy/admin/pages/_form.html.erb +19 -0
  27. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +16 -5
  28. data/app/views/alchemy/admin/pages/_page.html.erb +111 -133
  29. data/app/views/alchemy/admin/pages/_sitemap.html.erb +10 -16
  30. data/app/views/alchemy/admin/pages/_toolbar.html.erb +0 -12
  31. data/app/views/alchemy/admin/pages/edit.html.erb +1 -1
  32. data/app/views/alchemy/admin/pages/index.html.erb +1 -1
  33. data/app/views/alchemy/admin/pages/update.js.erb +7 -5
  34. data/app/views/alchemy/admin/partials/_routes.html.erb +8 -1
  35. data/app/views/alchemy/essences/_essence_page_editor.html.erb +1 -1
  36. data/config/locales/alchemy.en.yml +0 -4
  37. data/config/routes.rb +4 -3
  38. data/db/migrate/20200226213334_alchemy_four_point_four.rb +30 -30
  39. data/db/migrate/20200423073425_create_alchemy_essence_nodes.rb +1 -1
  40. data/db/migrate/20200504210159_remove_site_id_from_nodes.rb +1 -1
  41. data/db/migrate/20200505215518_add_language_id_foreign_key_to_alchemy_pages.rb +1 -1
  42. data/db/migrate/20200511113603_add_menu_type_to_alchemy_nodes.rb +1 -1
  43. data/db/migrate/20200514091507_make_page_layoutpage_null_false.rb +1 -1
  44. data/db/migrate/20200519073500_remove_visible_from_alchemy_pages.rb +1 -1
  45. data/db/migrate/20200617110713_create_alchemy_picture_thumbs.rb +1 -1
  46. data/db/migrate/20200907111332_remove_tri_state_booleans.rb +1 -1
  47. data/db/migrate/20201207131309_create_page_versions.rb +1 -1
  48. data/db/migrate/20201207135820_add_page_version_id_to_alchemy_elements.rb +1 -1
  49. data/lib/alchemy/engine.rb +5 -11
  50. data/lib/alchemy/permissions.rb +0 -1
  51. data/lib/alchemy/test_support/shared_ingredient_examples.rb +4 -2
  52. data/lib/alchemy/version.rb +1 -1
  53. data/lib/generators/alchemy/install/install_generator.rb +6 -1
  54. data/package/admin.js +5 -1
  55. data/package/src/image_loader.js +4 -2
  56. data/package/src/node_tree.js +13 -6
  57. data/package/src/page_publication_fields.js +28 -0
  58. data/package/src/page_sorter.js +62 -0
  59. data/package/src/picture_editors.js +4 -4
  60. data/package/src/sitemap.js +148 -0
  61. data/package/src/utils/__tests__/ajax.spec.js +52 -16
  62. data/package/src/utils/ajax.js +12 -0
  63. data/package.json +1 -1
  64. metadata +24 -24
  65. data/app/assets/javascripts/alchemy/alchemy.page_sorter.js +0 -24
  66. data/app/assets/javascripts/alchemy/alchemy.sitemap.js.coffee +0 -119
  67. data/app/views/alchemy/admin/pages/fold.js.erb +0 -2
  68. data/app/views/alchemy/admin/pages/sort.html.erb +0 -19
  69. data/lib/alchemy/error_tracking/airbrake_handler.rb +0 -13
  70. data/vendor/assets/javascripts/jquery_plugins/jquery.ui.nestedSortable.js +0 -434
@@ -144,7 +144,7 @@ module Alchemy
144
144
  after_update :create_legacy_url,
145
145
  if: :saved_change_to_urlname?
146
146
 
147
- after_update -> { nodes.update_all(updated_at: Time.current) }
147
+ after_update :touch_nodes
148
148
 
149
149
  # Concerns
150
150
  include PageScopes
@@ -245,8 +245,8 @@ module Alchemy
245
245
 
246
246
  def copy_and_paste(source, new_parent, new_name)
247
247
  page = copy(source, {
248
- parent_id: new_parent.id,
249
- language: new_parent.language,
248
+ parent: new_parent,
249
+ language: new_parent&.language,
250
250
  name: new_name,
251
251
  title: new_name,
252
252
  })
@@ -448,6 +448,7 @@ module Alchemy
448
448
  next if child == new_parent
449
449
 
450
450
  new_child = Page.copy(child, {
451
+ parent_id: new_parent.id,
451
452
  language_id: new_parent.language_id,
452
453
  language_code: new_parent.language_code,
453
454
  })
@@ -603,5 +604,10 @@ module Alchemy
603
604
  def create_legacy_url
604
605
  legacy_urls.find_or_create_by(urlname: urlname_before_last_save)
605
606
  end
607
+
608
+ def touch_nodes
609
+ ids = node_ids + nodes.flat_map { |n| n.ancestors.pluck(:id) }
610
+ Node.where(id: ids).touch_all
611
+ end
606
612
  end
607
613
  end
@@ -14,8 +14,14 @@ module Alchemy
14
14
  :created_at,
15
15
  :updated_at,
16
16
  :status,
17
- :url_path
17
+ :url_path,
18
+ :parent_id
18
19
 
19
20
  has_many :elements
21
+
22
+ with_options if: -> { scope.can?(:edit_content, object) } do
23
+ belongs_to :site
24
+ belongs_to :language
25
+ end
20
26
  end
21
27
  end
@@ -3,13 +3,13 @@
3
3
  module Alchemy
4
4
  class PageTreeSerializer < BaseSerializer
5
5
  def attributes
6
- {"pages" => nil}
6
+ { "pages" => nil }
7
7
  end
8
8
 
9
9
  def pages
10
10
  tree = []
11
- path = [{id: object.parent_id, children: tree}]
12
- page_list = object.self_and_descendants
11
+ path = [{ id: object.parent_id, children: tree }]
12
+ page_list = object.self_and_descendants.includes(:public_version, { language: :site })
13
13
  base_level = object.level - 1
14
14
  # Load folded pages in advance
15
15
  folded_user_pages = FoldedPage.folded_for_user(opts[:user]).pluck(:page_id)
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Alchemy
4
+ class TagValidations
5
+ def self.call(klass)
6
+ new(klass).call
7
+ end
8
+
9
+ def initialize(klass)
10
+ @klass = klass
11
+ end
12
+
13
+ def call
14
+ klass.validates :name, presence: true, uniqueness: { case_sensitive: true }
15
+ end
16
+
17
+ private
18
+
19
+ attr_reader :klass
20
+ end
21
+ end
@@ -1,4 +1,8 @@
1
1
  <%= alchemy_form_for [:admin, @page], class: 'edit_page' do |f| %>
2
+ <% unless @page.language_root? || @page.layoutpage %>
3
+ <%= f.input :parent_id, required: true, input_html: { class: 'alchemy_selectbox' } %>
4
+ <% end %>
5
+
2
6
  <div class="input check_boxes">
3
7
  <label class="control-label"><%= Alchemy.t(:page_status) %></label>
4
8
  <div class="control_group">
@@ -37,3 +41,18 @@
37
41
 
38
42
  <%= f.submit Alchemy.t(:save) %>
39
43
  <% end %>
44
+
45
+ <script>
46
+ $('#page_parent_id').alchemyPageSelect({
47
+ placeholder: "<%= Alchemy.t(:search_page) %>",
48
+ url: "<%= alchemy.api_pages_path %>",
49
+ allowClear: false,
50
+ <% if @page.parent %>
51
+ initialSelection: {
52
+ id: <%= @page.parent.id %>,
53
+ text: "<%= @page.parent.name %>",
54
+ url_path: "<%= @page.parent.url_path %>"
55
+ }
56
+ <% end %>
57
+ })
58
+ </script>
@@ -3,11 +3,7 @@
3
3
  <%= f.hidden_field(:parent_id) %>
4
4
  <% else %>
5
5
  <% @page.parent = @current_language.root_page %>
6
- <%= f.input :parent_id,
7
- collection: @current_language.pages.contentpages,
8
- label_method: :name,
9
- value_method: :id,
10
- input_html: { class: "alchemy_selectbox" } %>
6
+ <%= f.input :parent_id, as: :string, input_html: { class: 'alchemy_selectbox' } %>
11
7
  <% end %>
12
8
  <%= f.hidden_field(:language_id) %>
13
9
  <%= f.hidden_field(:layoutpage) %>
@@ -21,3 +17,18 @@
21
17
  <%= f.input :name %>
22
18
  <%= f.submit Alchemy.t(:create) %>
23
19
  <% end %>
20
+
21
+ <script>
22
+ $('input[type="text"]#page_parent_id').alchemyPageSelect({
23
+ placeholder: "<%= Alchemy.t(:search_page) %>",
24
+ url: "<%= alchemy.api_pages_path %>",
25
+ allowClear: false,
26
+ <% if @page.parent %>
27
+ initialSelection: {
28
+ id: <%= @page.parent.id %>,
29
+ text: "<%= @page.parent.name %>",
30
+ url_path: "<%= @page.parent.url_path %>"
31
+ }
32
+ <% end %>
33
+ })
34
+ </script>
@@ -1,24 +1,7 @@
1
- <li id="page_{{id}}" class="page_level_{{level}} {{page_layout}}" data-slug="{{slug}}" data-restricted="{{restricted}}">
1
+ <li id="page_{{id}}" class="sitemap-item {{page_layout}}" data-slug="{{slug}}" data-restricted="{{restricted}}" data-page-id="{{id}}" data-folded="{{folded}}">
2
2
  <div class="sitemap_page{{#if locked}} locked{{/if}}" name="{{name}}">
3
- <div class="sitemap_left_images<% if @sorting %>{{#unless root}} handle{{/unless}}<% end %>">
4
- <% unless @sorting %>
5
- {{#unless root_or_leaf}}
6
- <%= link_to(
7
- alchemy.fold_admin_page_path(page),
8
- remote: true,
9
- method: :post,
10
- class: "page_folder",
11
- title: "{{#if folded}}#{Alchemy.t('Show childpages')}{{else}}#{Alchemy.t('Hide childpages')}{{/if}}",
12
- id: "fold_button_{{id}}"
13
- ) do %>
14
- {{#if folded}}
15
- <i class="far fa-plus-square fa-fw"></i>
16
- {{else}}
17
- <i class="far fa-minus-square fa-fw"></i>
18
- {{/if}}
19
- <% end %>
20
- {{/unless}}
21
- <% end %>
3
+ <div class="sitemap_left_images">
4
+ <span class="page_folder"></span>
22
5
  {{#if definition_missing}}
23
6
  <%= page_layout_missing_warning %>
24
7
  {{else}}
@@ -31,121 +14,121 @@
31
14
  </span>
32
15
  </span>
33
16
  {{else}}
17
+ <span class="{{#unless root}}handle{{/unless}}">
34
18
  <i class="icon far fa-file fa-lg"></i>
19
+ </span>
35
20
  {{/if}}
36
21
  {{else}}
37
22
  <span class="with-hint">
38
23
  <i class="icon fas fa-ban fa-fw"></i>
39
24
  <span class="hint-bubble">
40
- <%= Alchemy.t('Your user role does not allow you to edit this page') %>
25
+ <%= Alchemy.t("Your user role does not allow you to edit this page") %>
41
26
  </span>
42
27
  </span>
43
28
  {{/if}}
44
29
  {{/if}}
45
30
  </div>
46
31
  <div class="sitemap_right_tools">
47
- <%- unless @sorting -%>
48
- {{#if permissions.info}}
49
- <div class="button_with_label sitemap_tool">
50
- <%= link_to_dialog(
51
- render_icon('info-circle'),
52
- alchemy.info_admin_page_path(page),
53
- {
54
- title: Alchemy.t(:page_infos),
55
- size: '520x290'
56
- }
57
- ) %>
58
- <label class="center"><%= Alchemy.t(:page_infos) %></label>
59
- {{else}}
60
- <div class="sitemap_tool disabled with-hint">
61
- <%= render_icon('info-circle') %>
62
- <span class="hint-bubble">
63
- <%= Alchemy.t('Your user role does not allow you to edit this page') %>
64
- </span>
65
- {{/if}}
66
- </div>
67
- {{#if permissions.configure}}
68
- <div class="button_with_label sitemap_tool">
69
- <%= link_to_dialog(
70
- render_icon(:cog),
71
- alchemy.configure_admin_page_path(page),
72
- {
73
- title: Alchemy.t(:edit_page_properties),
74
- size: '450x680'
75
- }
76
- ) -%>
77
- <label class="center"><%= Alchemy.t(:edit_page_properties) %></label>
78
- {{else}}
79
- <div class="sitemap_tool disabled with-hint">
80
- <%= render_icon(:cog) %>
81
- <span class="hint-bubble">
82
- <%= Alchemy.t('Your user role does not allow you to edit this page') %>
83
- </span>
84
- {{/if}}
85
- </div>
86
- {{#if permissions.copy}}
87
- <div class="button_with_label sitemap_tool">
88
- <%= link_to(
89
- render_icon(:copy),
90
- alchemy.insert_admin_clipboard_path(
91
- remarkable_type: page.class.name.demodulize.underscore.pluralize,
92
- remarkable_id: '__ID__',
93
- ).gsub('__ID__', '{{id}}'),
94
- remote: true,
95
- method: 'post'
96
- ) %>
97
- <label class="center"><%= Alchemy.t(:copy_page) %></label>
98
- {{else}}
99
- <div class="sitemap_tool disabled with-hint">
100
- <%= render_icon(:copy) %>
101
- <span class="hint-bubble">
102
- <%= Alchemy.t('Your user role does not allow you to edit this page') %>
103
- </span>
104
- {{/if}}
105
- </div>
106
- {{#if permissions.destroy}}
107
- <div class="button_with_label sitemap_tool">
108
- <%= link_to_confirm_dialog(
109
- render_icon(:minus),
110
- Alchemy.t(:confirm_to_delete_page),
111
- url_for(
112
- controller: 'pages',
113
- action: 'destroy',
114
- id: '__ID__'
115
- ).gsub('__ID__', '{{id}}')
116
- ) -%>
117
- <label class="center"><%= Alchemy.t(:delete_page) %></label>
118
- {{else}}
119
- <div class="sitemap_tool disabled with-hint">
120
- <%= render_icon(:minus) %>
121
- <span class="hint-bubble">
122
- <%= Alchemy.t('Your user role does not allow you to edit this page') %>
123
- </span>
124
- {{/if}}
125
- </div>
126
- {{#if permissions.create}}
127
- <div class="button_with_label sitemap_tool">
128
- <%= link_to_dialog(
129
- render_icon(:plus),
130
- alchemy.new_admin_page_path(parent_id: '__ID__').gsub('__ID__', '{{id}}'),
131
- {
132
- title: Alchemy.t(:create_page),
133
- size: '340x165',
134
- overflow: true
135
- }
136
- ) -%>
137
- <label class="left"><%= Alchemy.t(:create_page) %></label>
138
- {{else}}
139
- <div class="sitemap_tool disabled with-hint">
140
- <%= render_icon(:plus) %>
141
- <span class="hint-bubble">
142
- <%= Alchemy.t('Your user role does not allow you to edit this page') %>
143
- </span>
144
- {{/if}}
145
- </div>
146
- <%- end -%>
32
+ {{#if permissions.info}}
33
+ <div class="button_with_label sitemap_tool">
34
+ <%= link_to_dialog(
35
+ render_icon("info-circle"),
36
+ alchemy.info_admin_page_path(id: "__ID__"),
37
+ {
38
+ title: Alchemy.t(:page_infos),
39
+ size: "520x290"
40
+ }
41
+ ) %>
42
+ <label class="center"><%= Alchemy.t(:page_infos) %></label>
43
+ {{else}}
44
+ <div class="sitemap_tool disabled with-hint">
45
+ <%= render_icon("info-circle") %>
46
+ <span class="hint-bubble">
47
+ <%= Alchemy.t("Your user role does not allow you to edit this page") %>
48
+ </span>
49
+ {{/if}}
50
+ </div>
51
+ {{#if permissions.configure}}
52
+ <div class="button_with_label sitemap_tool">
53
+ <%= link_to_dialog(
54
+ render_icon(:cog),
55
+ alchemy.configure_admin_page_path(id: "__ID__"),
56
+ {
57
+ title: Alchemy.t(:edit_page_properties),
58
+ size: "450x680"
59
+ }
60
+ ) -%>
61
+ <label class="center"><%= Alchemy.t(:edit_page_properties) %></label>
62
+ {{else}}
63
+ <div class="sitemap_tool disabled with-hint">
64
+ <%= render_icon(:cog) %>
65
+ <span class="hint-bubble">
66
+ <%= Alchemy.t("Your user role does not allow you to edit this page") %>
67
+ </span>
68
+ {{/if}}
69
+ </div>
70
+ {{#if permissions.copy}}
71
+ <div class="button_with_label sitemap_tool">
72
+ <%= link_to(
73
+ render_icon(:copy),
74
+ alchemy.insert_admin_clipboard_path(
75
+ remarkable_type: :pages,
76
+ remarkable_id: "__ID__",
77
+ ),
78
+ remote: true,
79
+ method: :post
80
+ ) %>
81
+ <label class="center"><%= Alchemy.t(:copy_page) %></label>
82
+ {{else}}
83
+ <div class="sitemap_tool disabled with-hint">
84
+ <%= render_icon(:copy) %>
85
+ <span class="hint-bubble">
86
+ <%= Alchemy.t("Your user role does not allow you to edit this page") %>
87
+ </span>
88
+ {{/if}}
89
+ </div>
90
+ {{#if permissions.destroy}}
91
+ <div class="button_with_label sitemap_tool">
92
+ <%= link_to_confirm_dialog(
93
+ render_icon(:minus),
94
+ Alchemy.t(:confirm_to_delete_page),
95
+ url_for(
96
+ controller: "pages",
97
+ action: "destroy",
98
+ id: "__ID__"
99
+ )
100
+ ) -%>
101
+ <label class="center"><%= Alchemy.t(:delete_page) %></label>
102
+ {{else}}
103
+ <div class="sitemap_tool disabled with-hint">
104
+ <%= render_icon(:minus) %>
105
+ <span class="hint-bubble">
106
+ <%= Alchemy.t("Your user role does not allow you to edit this page") %>
107
+ </span>
108
+ {{/if}}
109
+ </div>
110
+ {{#if permissions.create}}
111
+ <div class="button_with_label sitemap_tool">
112
+ <%= link_to_dialog(
113
+ render_icon(:plus),
114
+ alchemy.new_admin_page_path(parent_id: "__ID__"),
115
+ {
116
+ title: Alchemy.t(:create_page),
117
+ size: "340x165",
118
+ overflow: true
119
+ }
120
+ ) -%>
121
+ <label class="left"><%= Alchemy.t(:create_page) %></label>
122
+ {{else}}
123
+ <div class="sitemap_tool disabled with-hint">
124
+ <%= render_icon(:plus) %>
125
+ <span class="hint-bubble">
126
+ <%= Alchemy.t("Your user role does not allow you to edit this page") %>
127
+ </span>
128
+ {{/if}}
129
+ </div>
147
130
  </div>
148
- <div class="page_infos" id="page_<%= page.id %>_infos">
131
+ <div class="page_infos">
149
132
  <span class="page_status with-hint">
150
133
  <i class="icon fas fa-fw fa-compass {{#unless public}}disabled{{/unless}}" data-fa-transform="shrink-2"></i>
151
134
  <span class="hint-bubble">{{status_titles.public}}</span>
@@ -160,23 +143,18 @@
160
143
  </div>
161
144
  <div class="sitemap_sitename">
162
145
  {{#if permissions.edit_content}}
163
- <%= link_to_unless(
164
- @sorting,
165
- '{{name}}',
166
- alchemy.edit_admin_page_path(page),
146
+ <%= link_to(
147
+ "{{name}}",
148
+ alchemy.edit_admin_page_path(id: "__ID__"),
167
149
  title: Alchemy.t(:edit_page),
168
150
  class: "sitemap_pagename_link"
169
- ) { content_tag('span', '{{name}}', class: "sitemap_pagename_link") } -%>
151
+ ) -%>
170
152
  {{else}}
171
- <%= content_tag('span', '{{name}}', class: "sitemap_pagename_link") %>
153
+ <%= content_tag("span", "{{name}}", class: "sitemap_pagename_link") %>
172
154
  {{/if}}
173
155
  </div>
174
156
  </div>
175
- {{#if children}}
176
- <% unless @sorting %>{{#unless folded}}<% end %>
177
- <ul id="page_{{id}}_children" class="level_{{level}}_children">
157
+ <ul id="page_{{id}}_children" class="children" data-parent-id="{{id}}">
178
158
  {{> list}}
179
159
  </ul>
180
- <% unless @sorting %>{{/unless}}<% end %>
181
- {{/if}}
182
160
  </li>
@@ -1,15 +1,14 @@
1
- <div id="sitemap-wrapper">
2
- <h4 id="sitemap_heading">
3
- <span class="page_name"><%= Alchemy::Page.human_attribute_name(:name) %></span>
4
- <span class="page_urlname"><%= Alchemy::Page.human_attribute_name(:urlname) %></span>
5
- <span class="page_status"><%= Alchemy.t(:page_status) %></span>
6
- </h4>
1
+ <h4 id="sitemap_heading">
2
+ <span class="page_name"><%= Alchemy::Page.human_attribute_name(:name) %></span>
3
+ <span class="page_urlname"><%= Alchemy::Page.human_attribute_name(:urlname) %></span>
4
+ <span class="page_status"><%= Alchemy.t(:page_status) %></span>
5
+ </h4>
7
6
 
8
- <p class="loading"></p>
7
+ <div id="sitemap-wrapper">
9
8
  </div>
10
9
 
11
10
  <script id="sitemap-template" type="text/x-handlebars-template">
12
- <ul id="sitemap" class="list<%= @sorting ? ' sorting' : nil %>">
11
+ <ul id="sitemap" class="list">
13
12
  {{> list}}
14
13
  </ul>
15
14
  </script>
@@ -22,15 +21,10 @@
22
21
 
23
22
  <script type="text/javascript">
24
23
  $(function() {
25
- Alchemy.Sitemap.init({
24
+ Alchemy.currentSitemap = new Alchemy.Sitemap({
26
25
  url: '<%= alchemy.tree_admin_pages_path %>',
27
- page_root_id: <%= @page_root.id %>,
28
- full: <%= full %>
29
- <% if @sorting %>
30
- ,ready: function () {
31
- Alchemy.PageSorter();
32
- }
33
- <% end %>
26
+ page_root_id: <%= @page_root.id %>
34
27
  });
28
+ Alchemy.PagePublicationFields();
35
29
  });
36
30
  </script>
@@ -28,18 +28,6 @@
28
28
  <label><%= Alchemy.t("Flush page cache") %></label>
29
29
  </div>
30
30
  <% end %>
31
- <% if can?(:sort, Alchemy::Page) %>
32
- <div class="button_with_label">
33
- <%= link_to(
34
- render_icon(:random),
35
- alchemy.sort_admin_pages_path,
36
- method: :get,
37
- class: "icon_button",
38
- title: Alchemy.t("Sort pages")
39
- ) %>
40
- <label><%= Alchemy.t("Sort pages") %></label>
41
- </div>
42
- <% end %>
43
31
  <div class="button_with_label" id="clipboard_button">
44
32
  <%= link_to_dialog(
45
33
  render_icon(clipboard_empty?("pages") ? :clipboard : :paste),
@@ -154,7 +154,7 @@
154
154
  if (!not_dirty) Alchemy.pleaseWaitOverlay(false);
155
155
  return not_dirty;
156
156
  });
157
- Alchemy.Sitemap.watchPagePublicationState();
157
+ Alchemy.PagePublicationFields();
158
158
  Alchemy.PageLeaveObserver();
159
159
  Alchemy.ElementsWindow.init('<%= alchemy.admin_elements_path(page_version_id: @page_version.id) %>', {
160
160
  texts: {
@@ -30,7 +30,7 @@
30
30
  <% else %>
31
31
  <% if @page_root %>
32
32
  <h2 id="page_filter_result"></h2>
33
- <%= render "sitemap", page_partial: "page", full: !!@sorting %>
33
+ <%= render "sitemap", page_partial: "page" %>
34
34
  <% elsif can?(:create, Alchemy::Page) %>
35
35
  <%= render partial: "create_language_form" %>
36
36
  <% else %>
@@ -1,11 +1,6 @@
1
1
  (function() {
2
2
  var page = document.querySelector('#page_<%= @page.id %>');
3
3
 
4
- <% if @old_page_layout != @page.page_layout -%>
5
- Alchemy.ElementsWindow.reload();
6
- Alchemy.growl('<%= j Alchemy.t(:page_layout_changed_notice) %>');
7
- <% end -%>
8
-
9
4
  <% if @while_page_edit -%>
10
5
 
11
6
  Alchemy.reloadPreview();
@@ -13,6 +8,13 @@
13
8
  Alchemy.growl("<%= j @notice %>");
14
9
  Alchemy.closeCurrentDialog();
15
10
 
11
+ <% elsif @page.parent_id != @old_parent_id -%>
12
+
13
+ Alchemy.closeCurrentDialog(function() {
14
+ Alchemy.growl("<%= j @notice %>");
15
+ Alchemy.currentSitemap.load(<%= @page.get_language_root.id %>);
16
+ });
17
+
16
18
  <% else -%>
17
19
 
18
20
  if (page) {
@@ -19,8 +19,15 @@
19
19
  },
20
20
  },
21
21
 
22
+ move_admin_page_path: function(id) {
23
+ return '<%= alchemy.move_api_page_path(id: 1) %>'.replace(/1/, id);
24
+ },
25
+
26
+ fold_admin_page_path: function(id) {
27
+ return '<%= alchemy.fold_admin_page_path(id: 1) %>'.replace(/1/, id);
28
+ },
29
+
22
30
  order_admin_elements_path: '<%= alchemy.order_admin_elements_path %>',
23
- order_admin_pages_path: '<%= alchemy.order_admin_pages_path %>',
24
31
  link_admin_pages_path: '<%= alchemy.link_admin_pages_path %>',
25
32
  api_pages_path: '<%= alchemy.api_pages_path %>',
26
33
  api_elements_path: '<%= alchemy.api_elements_path %>'
@@ -14,7 +14,7 @@
14
14
  <script>
15
15
  $('#<%= essence_page_editor.form_field_id %>').alchemyPageSelect({
16
16
  placeholder: "<%= Alchemy.t(:search_page) %>",
17
- url: "<%= alchemy.api_pages_path %>",
17
+ url: "<%= alchemy.api_pages_path language_id: essence_page_editor.page&.language_id %>",
18
18
  query_params: <%== essence_page_editor.settings[:query_params].to_json %>,
19
19
  <% if essence_page_editor.essence.page %>
20
20
  initialSelection: {
@@ -334,7 +334,6 @@ en:
334
334
  "Site successfully removed": "Website successfully removed."
335
335
  "Site successfully updated": "Website successfully updated."
336
336
  "Size": "Size"
337
- "Sort pages": "Reorder pages"
338
337
  "Successfully added content": "Successfully added %{content}"
339
338
  "Successfully deleted content": "Successfully deleted %{content}"
340
339
  "Successfully deleted element": "Successfully deleted %{element}"
@@ -437,7 +436,6 @@ en:
437
436
  enter_external_link: "Please enter the URL you want to link with"
438
437
  explain_cropping: "<p>Move the frame and change its size with the mouse or arrow keys to adjust the image mask. Click on \"apply\" when you are satisfied with your selection.</p><p>If you want to return to the original centered image mask like it was defined in the layout, click \"reset\" and \"apply\" afterwards.</p>"
439
438
  explain_publishing: "Publish current page content"
440
- explain_sitemap_dragndrop_sorting: "Tip: Drag the pages at the icon in order to sort them."
441
439
  explain_unlocking: "Leave page and unlock it for other users."
442
440
  external_link_notice_1: "Please enter the complete url with http:// or a similar protocol."
443
441
  external_link_notice_2: "To refer a path from your website url, start with a /."
@@ -534,7 +532,6 @@ en:
534
532
  or_replace_it_with_an_existing_tag: 'Or replace it with an existing tag'
535
533
  "Page created": "Page: '%{name}' created."
536
534
  page_infos: 'Page info'
537
- page_layout_changed_notice: "Page type was changed. Elements not usable anymore have been hided."
538
535
  page_properties: "Page properties"
539
536
  page_public: "published"
540
537
  page_published: "Published page"
@@ -593,7 +590,6 @@ en:
593
590
  robot_follow: "robot may follow links."
594
591
  robot_index: "allow robot to index."
595
592
  save: "Save"
596
- "save order": "Save order"
597
593
  saved_link: "Link saved."
598
594
  search: "search"
599
595
  search_engines: "Search engines"
data/config/routes.rb CHANGED
@@ -28,13 +28,12 @@ Alchemy::Engine.routes.draw do
28
28
  post :copy_language_tree
29
29
  get :create_language
30
30
  get :link
31
- get :sort
32
31
  get :tree
33
32
  end
34
33
  member do
35
34
  post :unlock
36
35
  post :publish
37
- post :fold
36
+ patch :fold
38
37
  get :configure
39
38
  get :preview
40
39
  get :info
@@ -124,7 +123,6 @@ Alchemy::Engine.routes.draw do
124
123
 
125
124
  resources :messages, only: [:index, :new, :create]
126
125
  resources :elements, only: :show
127
- resources :contents, only: :show
128
126
 
129
127
  namespace :api, defaults: { format: "json" } do
130
128
  resources :contents, only: [:index, :show]
@@ -140,6 +138,9 @@ Alchemy::Engine.routes.draw do
140
138
  collection do
141
139
  get :nested
142
140
  end
141
+ member do
142
+ patch :move
143
+ end
143
144
  end
144
145
 
145
146
  get "/pages/*urlname(.:format)" => "pages#show", as: "page"