pages_core 3.7.0 → 3.8.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 (164) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -2
  3. data/app/assets/builds/pages_core/admin-dist.js +55 -0
  4. data/app/assets/stylesheets/pages/admin/components/image_editor.scss +1 -0
  5. data/app/assets/stylesheets/pages/admin/components/image_grid.scss +33 -5
  6. data/app/assets/stylesheets/pages/admin/components/layout.scss +2 -1
  7. data/app/assets/stylesheets/pages/admin/components/login.scss +6 -0
  8. data/app/assets/stylesheets/pages/admin/components/tabs.scss +5 -0
  9. data/app/assets/stylesheets/pages/admin/components/tag_editor.scss +13 -7
  10. data/app/assets/stylesheets/pages/admin/controllers/pages.scss +13 -5
  11. data/app/assets/stylesheets/pages/admin.scss +0 -1
  12. data/app/controller_dummies/admin/admin_controller.rb +1 -1
  13. data/app/controller_dummies/application_controller.rb +1 -1
  14. data/app/controller_dummies/attachments_controller.rb +1 -1
  15. data/app/controller_dummies/frontend_controller.rb +1 -1
  16. data/app/controller_dummies/images_controller.rb +1 -1
  17. data/app/controller_dummies/page_files_controller.rb +1 -1
  18. data/app/controller_dummies/pages_controller.rb +1 -1
  19. data/app/controller_dummies/sitemaps_controller.rb +1 -1
  20. data/app/controllers/admin/attachments_controller.rb +1 -1
  21. data/app/controllers/admin/images_controller.rb +10 -7
  22. data/app/controllers/concerns/pages_core/authentication.rb +9 -4
  23. data/app/controllers/concerns/pages_core/preview_pages_controller.rb +5 -0
  24. data/app/controllers/pages_core/frontend/pages_controller.rb +5 -2
  25. data/app/controllers/sessions_controller.rb +1 -1
  26. data/app/formatters/pages_core/link_renderer.rb +2 -2
  27. data/app/helpers/application_helper.rb +1 -1
  28. data/app/helpers/frontend_helper.rb +1 -1
  29. data/app/helpers/pages_core/admin/content_tabs_helper.rb +5 -2
  30. data/app/helpers/pages_core/admin/image_uploads_helper.rb +2 -3
  31. data/app/helpers/pages_core/admin/tag_editor_helper.rb +9 -39
  32. data/app/helpers/pages_core/head_tags_helper.rb +11 -20
  33. data/app/helpers/pages_core/open_graph_tags_helper.rb +1 -1
  34. data/app/javascript/admin-dist.js +2 -0
  35. data/app/javascript/components/Attachments/Attachment.jsx +121 -0
  36. data/app/javascript/components/Attachments/AttachmentEditor.jsx +116 -0
  37. data/app/javascript/components/Attachments/Placeholder.jsx +10 -0
  38. data/app/javascript/components/Attachments.jsx +165 -0
  39. data/app/{assets/javascripts/pages/admin/components/date_range_select.jsx → javascript/components/DateRangeSelect.jsx} +16 -5
  40. data/app/javascript/components/EditableImage.jsx +61 -0
  41. data/app/{assets/javascripts/pages/admin/components/file_upload_button.jsx → javascript/components/FileUploadButton.jsx} +11 -1
  42. data/app/{assets/javascripts/pages/admin/components/focal_point.jsx → javascript/components/ImageCropper/FocalPoint.jsx} +12 -1
  43. data/app/javascript/components/ImageCropper/Image.jsx +65 -0
  44. data/app/javascript/components/ImageCropper/Toolbar.jsx +73 -0
  45. data/app/javascript/components/ImageCropper/useCrop.js +199 -0
  46. data/app/javascript/components/ImageCropper.jsx +90 -0
  47. data/app/javascript/components/ImageEditor/Form.jsx +98 -0
  48. data/app/javascript/components/ImageEditor.jsx +62 -0
  49. data/app/javascript/components/ImageGrid/DragElement.jsx +30 -0
  50. data/app/javascript/components/ImageGrid/FilePlaceholder.jsx +9 -0
  51. data/app/javascript/components/ImageGrid/GridImage.jsx +103 -0
  52. data/app/javascript/components/ImageGrid/Placeholder.jsx +23 -0
  53. data/app/javascript/components/ImageGrid.jsx +257 -0
  54. data/app/javascript/components/ImageUploader.jsx +171 -0
  55. data/app/{assets/javascripts/pages/admin/components/modal.jsx → javascript/components/Modal.jsx} +13 -2
  56. data/app/javascript/components/ModalStore.jsx +12 -0
  57. data/app/{assets/javascripts/pages/admin/components/page_dates.jsx → javascript/components/PageDates.jsx} +11 -1
  58. data/app/{assets/javascripts/pages/admin/components/page_files.jsx → javascript/components/PageFiles.jsx} +11 -2
  59. data/app/{assets/javascripts/pages/admin/components/page_images.jsx → javascript/components/PageImages.jsx} +11 -2
  60. data/app/{assets/javascripts/pages/admin/components/page_tree_store.jsx → javascript/components/PageTree.jsx} +127 -137
  61. data/app/{assets/javascripts/pages/admin/components/page_tree.jsx → javascript/components/PageTreeDraggable.jsx} +35 -29
  62. data/app/{assets/javascripts/pages/admin/components/page_tree_node.jsx → javascript/components/PageTreeNode.jsx} +35 -20
  63. data/app/javascript/components/RichTextArea.jsx +213 -0
  64. data/app/javascript/components/RichTextToolbarButton.jsx +20 -0
  65. data/app/javascript/components/TagEditor/AddTagForm.jsx +42 -0
  66. data/app/javascript/components/TagEditor/Tag.jsx +32 -0
  67. data/app/javascript/components/TagEditor.jsx +61 -0
  68. data/app/javascript/components/Toast.jsx +72 -0
  69. data/app/javascript/components/ToastStore.jsx +14 -0
  70. data/app/javascript/components/drag/draggedOrder.js +51 -0
  71. data/app/javascript/components/drag/useDragCollection.js +84 -0
  72. data/app/javascript/components/drag/useDragUploader.js +112 -0
  73. data/app/javascript/components/drag/useDraggable.js +17 -0
  74. data/app/javascript/components/drag.js +6 -0
  75. data/app/javascript/components.js +14 -0
  76. data/app/javascript/controllers/EditPageController.js +20 -0
  77. data/app/javascript/controllers/LoginController.js +29 -0
  78. data/app/javascript/controllers/MainController.js +65 -0
  79. data/app/javascript/controllers/PageOptionsController.js +62 -0
  80. data/app/javascript/features/RichText.jsx +34 -0
  81. data/app/javascript/hooks.js +2 -0
  82. data/app/javascript/index.js +33 -0
  83. data/app/{assets/javascripts/pages/admin/lib/tree.jsx → javascript/lib/Tree.js} +55 -54
  84. data/app/javascript/lib/copyToClipboard.js +13 -0
  85. data/app/javascript/lib/readyHandler.js +22 -0
  86. data/app/javascript/lib/request.js +36 -0
  87. data/app/models/concerns/pages_core/page_model/images.rb +3 -1
  88. data/app/models/concerns/pages_core/page_model/searchable.rb +19 -0
  89. data/app/models/concerns/pages_core/searchable_document.rb +71 -0
  90. data/app/models/concerns/pages_core/taggable.rb +27 -12
  91. data/app/models/page.rb +2 -0
  92. data/app/models/page_exporter.rb +2 -2
  93. data/app/models/page_image.rb +0 -2
  94. data/app/models/role.rb +1 -1
  95. data/app/models/search_document.rb +72 -0
  96. data/app/models/tag.rb +1 -0
  97. data/app/models/user.rb +1 -1
  98. data/app/{serializers/admin/attachment_serializer.rb → resources/admin/attachment_resource.rb} +6 -5
  99. data/app/{serializers/admin/image_serializer.rb → resources/admin/image_resource.rb} +9 -9
  100. data/app/resources/admin/page_file_resource.rb +10 -0
  101. data/app/{serializers/admin/page_image_serializer.rb → resources/admin/page_image_resource.rb} +4 -2
  102. data/app/resources/export/attachment_resource.rb +10 -0
  103. data/app/resources/export/page_image_resource.rb +45 -0
  104. data/app/resources/export/page_resource.rb +42 -0
  105. data/app/{serializers/page_image_serializer.rb → resources/page_image_resource.rb} +8 -16
  106. data/app/resources/page_resource.rb +33 -0
  107. data/app/services/pages_core/destroy_invite_service.rb +2 -2
  108. data/app/services/pages_core/invite_service.rb +2 -2
  109. data/app/views/admin/pages/_edit_content.html.erb +1 -1
  110. data/app/views/admin/pages/_edit_files.html.erb +1 -5
  111. data/app/views/admin/pages/_edit_images.html.erb +1 -5
  112. data/app/views/admin/pages/_edit_options.html.erb +74 -55
  113. data/app/views/admin/pages/_form.html.erb +19 -0
  114. data/app/views/admin/pages/edit.html.erb +35 -61
  115. data/app/views/admin/pages/index.html.erb +0 -1
  116. data/app/views/admin/pages/new.html.erb +32 -32
  117. data/app/views/admin/users/_access_control.html.erb +5 -1
  118. data/app/views/admin/users/login.html.erb +12 -4
  119. data/app/views/feeds/pages.rss.builder +1 -2
  120. data/app/views/layouts/admin/_header.html.erb +1 -1
  121. data/app/views/layouts/admin/_page_header.html.erb +33 -0
  122. data/app/views/layouts/admin.html.erb +23 -42
  123. data/app/views/pages_core/_google_analytics.html.erb +8 -0
  124. data/db/migrate/20180625154059_enable_search_extensions.rb +10 -0
  125. data/db/migrate/20210209151400_create_search_configurations.rb +35 -0
  126. data/db/migrate/20210210235200_create_search_documents.rb +74 -0
  127. data/lib/pages_core/engine.rb +1 -5
  128. data/lib/pages_core/templates/block_configuration.rb +1 -1
  129. data/lib/pages_core/templates/configuration_handler.rb +1 -1
  130. data/lib/pages_core/version.rb +1 -1
  131. data/lib/pages_core.rb +3 -5
  132. data/lib/rails/generators/pages_core/frontend/frontend_generator.rb +0 -7
  133. data/lib/rails/generators/pages_core/install/templates/page_templates_initializer.rb +2 -2
  134. metadata +101 -115
  135. data/app/assets/javascripts/pages/admin/components/attachment.jsx +0 -130
  136. data/app/assets/javascripts/pages/admin/components/attachment_editor.jsx +0 -131
  137. data/app/assets/javascripts/pages/admin/components/attachments.jsx +0 -211
  138. data/app/assets/javascripts/pages/admin/components/drag_uploader.jsx +0 -174
  139. data/app/assets/javascripts/pages/admin/components/editable_image.jsx +0 -57
  140. data/app/assets/javascripts/pages/admin/components/grid_image.jsx +0 -124
  141. data/app/assets/javascripts/pages/admin/components/image_editor.jsx +0 -496
  142. data/app/assets/javascripts/pages/admin/components/image_grid.jsx +0 -306
  143. data/app/assets/javascripts/pages/admin/components/image_uploader.jsx +0 -176
  144. data/app/assets/javascripts/pages/admin/components/modal_store.jsx +0 -20
  145. data/app/assets/javascripts/pages/admin/components/rich_text_area.jsx +0 -64
  146. data/app/assets/javascripts/pages/admin/components/rich_text_toolbar.jsx +0 -91
  147. data/app/assets/javascripts/pages/admin/components/toast.jsx +0 -34
  148. data/app/assets/javascripts/pages/admin/components/toast_store.jsx +0 -52
  149. data/app/assets/javascripts/pages/admin/components.jsx +0 -2
  150. data/app/assets/javascripts/pages/admin/features/content_tabs.jsx +0 -72
  151. data/app/assets/javascripts/pages/admin/features/edit_page.jsx +0 -97
  152. data/app/assets/javascripts/pages/admin/features/rich_text.jsx +0 -14
  153. data/app/assets/javascripts/pages/admin/features/tag_editor.jsx +0 -160
  154. data/app/assets/javascripts/pages/admin.jsx +0 -17
  155. data/app/assets/javascripts/pages/login_form.jsx +0 -21
  156. data/app/serializers/admin/page_file_serializer.rb +0 -8
  157. data/app/serializers/page_export_serializer.rb +0 -32
  158. data/app/serializers/page_file_export_serializer.rb +0 -6
  159. data/app/serializers/page_image_export_serializer.rb +0 -42
  160. data/app/serializers/page_serializer.rb +0 -23
  161. data/app/views/layouts/admin/_analytics.html.erb +0 -16
  162. data/lib/rails/generators/pages_core/frontend/templates/application.js.erb +0 -15
  163. data/vendor/assets/javascripts/ReactCrop.min.js +0 -1
  164. data/vendor/assets/javascripts/reflux.min.js +0 -1
@@ -11,71 +11,45 @@
11
11
  end
12
12
  %>
13
13
 
14
-
15
-
16
- <%# #### SIDEBAR ########################################################### %>
17
-
18
- <% content_for :sidebar do %>
14
+ <% content_for :main_wrapper do %>
19
15
  <%= form_for(@page,
20
16
  url: admin_page_url(@locale, @page),
21
- html: {class: "edit-page", id: 'page-form-sidebar'},
22
- builder: PagesCore::Admin::FormBuilder) do |f| %>
23
- <%= render partial: 'edit_options', locals: {f: f} %>
24
- <% end %>
25
- <% end %>
26
-
27
-
28
-
29
- <%# #### EDIT AREA ######################################################### %>
30
-
31
- <%= form_for(@page,
32
- url: admin_page_url(@locale, @page),
33
- html: {
34
- class: "edit-page",
35
- id: 'page-form',
36
- method: :put,
37
- multipart: true
38
- },
39
- builder: PagesCore::Admin::FormBuilder
40
- ) do |f| %>
41
-
42
- <div class="hidden-options">
43
- <%= render partial: 'edit_options', locals: {f: f} %>
44
- </div>
45
-
46
- <%# #### CONTENT #### %>
47
- <%= content_tab "Content" do %>
48
- <%= render partial: 'edit_content', locals: {f: f} %>
49
- <% end %>
50
-
51
- <%# #### IMAGES #### %>
52
- <% if @page.template_config.value(:images) || @page.template_config.value(:image) %>
53
- <%= content_tab "Images" do %>
54
- <%= render partial: 'edit_images', locals: {f: f} %>
55
- <% end %>
56
- <% end %>
57
-
58
-
59
- <%# #### FILES #### %>
60
- <% if @page.template_config.value(:files) %>
61
- <%= content_tab "Files" do %>
62
- <%= render partial: 'edit_files', locals: {f: f} %>
17
+ builder: PagesCore::Admin::FormBuilder,
18
+ html: {
19
+ class: "edit-page main-wrapper",
20
+ method: :put,
21
+ data: {
22
+ controller: "edit-page",
23
+ "edit-page-target": "form",
24
+ "preview-url": preview_page_url(@page.locale, @page)
25
+ }
26
+ }) do |f| %>
27
+
28
+ <% content_for :main do %>
29
+ <div class="content">
30
+ <%= render(partial: "form", locals: { f: f }) %>
31
+
32
+ <div class="buttons">
33
+ <button type="button"
34
+ id="previewButton"
35
+ data-action="click->edit-page#preview"
36
+ data-url="<%= preview_page_url(@page.locale, @page) %>">
37
+ Preview
38
+ </button>
39
+ <button type="submit">
40
+ Save
41
+ </button>
42
+ </div>
43
+ </div>
63
44
  <% end %>
64
- <% end %>
65
45
 
46
+ <main data-controller="main">
47
+ <%= render(partial: "layouts/admin/page_header") %>
48
+ <%= yield :main %>
49
+ </main>
66
50
 
67
- <%# #### METADATA #### %>
68
- <%= content_tab "Metadata" do %>
69
- <%= render partial: 'edit_metadata', locals: {f: f} %>
51
+ <aside class="sidebar" id="page-form-sidebar">
52
+ <%= render partial: 'edit_options', locals: { f: f } %>
53
+ </aside>
70
54
  <% end %>
71
-
72
- <div class="buttons">
73
- <button type="button" id="previewButton" data-url="<%= preview_page_url(@page.locale, @page) %>">
74
- Preview
75
- </button>
76
- <button type="submit">
77
- Save
78
- </button>
79
- </div>
80
-
81
55
  <% end %>
@@ -14,7 +14,6 @@
14
14
  <% cache Page.visible.roots.to_a + [current_user, @locale] do %>
15
15
  <%= react_component(
16
16
  "PageTree", {
17
- csrf_token: form_authenticity_token,
18
17
  pages: @pages.map { |p| page_json(p) },
19
18
  locale: @locale,
20
19
  permissions: [(:create if policy(Page).create?)] }
@@ -11,39 +11,39 @@
11
11
  @url_options[:parent] = @page.parent if @page.parent
12
12
  %>
13
13
 
14
- <% content_for :sidebar do %>
14
+ <% content_for :main_wrapper do %>
15
15
  <%= form_for(@page,
16
16
  url: admin_pages_url(@locale),
17
- html: {class: "edit-page", id: 'page-form-sidebar'}) do |f| %>
18
- <%= render partial: 'edit_options', locals: {f: f} %>
17
+ builder: PagesCore::Admin::FormBuilder,
18
+ html: {
19
+ class: "edit-page main-wrapper",
20
+ data: {
21
+ controller: "edit-page",
22
+ "edit-page-target": "form"
23
+ }
24
+ }) do |f| %>
25
+
26
+ <% content_for :main do %>
27
+ <div class="content">
28
+ <%= f.hidden_field 'parent_page_id' if @page.parent %>
29
+
30
+ <%= render(partial: "form", locals: { f: f }) %>
31
+
32
+ <div class="buttons">
33
+ <button type="submit">
34
+ Save
35
+ </button>
36
+ </div>
37
+ </div>
38
+ <% end %>
39
+
40
+ <main data-controller="main">
41
+ <%= render(partial: "layouts/admin/page_header") %>
42
+ <%= yield :main %>
43
+ </main>
44
+
45
+ <aside class="sidebar" id="page-form-sidebar">
46
+ <%= render partial: 'edit_options', locals: { f: f } %>
47
+ </aside>
19
48
  <% end %>
20
49
  <% end %>
21
-
22
- <%= form_for(@page,
23
- url: admin_pages_url(@locale),
24
- builder: PagesCore::Admin::FormBuilder,
25
- html: {
26
- class: "edit-page",
27
- id: 'page-form',
28
- method: :post,
29
- multipart: true
30
- }
31
- ) do |f| %>
32
-
33
- <div class="hidden-options">
34
- <%= render partial: 'edit_options', locals: {f: f} %>
35
- </div>
36
-
37
- <%= hidden_field_tag 'locale', @locale %>
38
- <%= f.hidden_field 'parent_page_id' if @page.parent %>
39
-
40
- <%# #### CONTENT #### %>
41
- <%= content_tab "Content" do %>
42
- <%= render partial: 'edit_content', locals: {f: f} %>
43
- <% end %>
44
-
45
- <p>
46
- <%= submit_tag "Save" %>
47
- </p>
48
-
49
- <% end %>
@@ -10,8 +10,12 @@
10
10
  <%= check_box_tag("#{model_name_from_record_or_class(f.object).param_key}[role_names][]",
11
11
  role.name,
12
12
  f.object.role?(role.name.to_sym),
13
+ id: "role-#{role.name}",
13
14
  class: "role") %>
14
- <%= role.description %><br>
15
+ <label for="role-<%= role.name %>">
16
+ <%= role.description %>
17
+ </label>
18
+ <br>
15
19
  <% end %>
16
20
  </p>
17
21
  <% end %>
@@ -11,8 +11,11 @@
11
11
  </p>
12
12
  <% end %>
13
13
 
14
- <div class="login-form">
15
- <div class="login-tab password">
14
+ <div class="login-form"
15
+ data-controller="login">
16
+ <div class="login-tab password"
17
+ data-login-target="tab"
18
+ data-tab="password">
16
19
  <%= form_tag session_path do %>
17
20
  <p>
18
21
  <label>Email address</label>
@@ -29,13 +32,18 @@
29
32
  <li>
30
33
  <%= link_to("<b>Help!</b> I forgot my password!".html_safe,
31
34
  login_admin_users_path,
32
- class: 'show-password-reset') %>
35
+ data: {
36
+ action: "click->login#changeTab",
37
+ tab: "password-reset"
38
+ }) %>
33
39
  </li>
34
40
  </ul>
35
41
  <% end %>
36
42
  </div>
37
43
 
38
- <div class="login-tab password-reset">
44
+ <div class="login-tab password-reset"
45
+ data-login-target="tab"
46
+ data-tab="password-reset">
39
47
  <%= form_tag admin_password_resets_path do %>
40
48
  <h2>
41
49
  Forgot your password?
@@ -26,10 +26,9 @@ xml.rss("version" => "2.0", "xmlns:dc" => "http://purl.org/dc/elements/1.1/") do
26
26
  xml.pubDate item.published_at.to_formatted_s(:rfc822)
27
27
  xml.tag!("dc:creator", item.author.name)
28
28
  if item.image
29
- image_size = item.image.data.try(&:length)
30
29
  xml.enclosure(
31
30
  url: dynamic_image_url(item.image, size: "2000x2000"),
32
- length: image_size,
31
+ length: item.image.content_length,
33
32
  type: item.image.content_type
34
33
  )
35
34
  end
@@ -24,7 +24,7 @@
24
24
  </div>
25
25
  </header>
26
26
 
27
- <% if flash[:error] %>
27
+ <% if flash[:error] && false %>
28
28
  <div id="flash-error">
29
29
  <%= flash[:error] %>
30
30
  </div>
@@ -0,0 +1,33 @@
1
+ <% if @page_description || @content_tabs %>
2
+ <div id="page-description"<% if @content_tabs %> class="with_content_tabs"<% end %>>
3
+ <% if @page_description_links -%>
4
+ <div class="links">
5
+ <%= @page_description_links.html_safe %>
6
+ </div>
7
+ <% end %>
8
+ <h3>
9
+ <%= (@page_description || @page_title).html_safe %>
10
+ </h3>
11
+ <% if @content_tabs %>
12
+ <ul id="content-tabs">
13
+ <% @content_tabs.map do |t| %>
14
+ <li id="content-tab-link-<%= t[:key] %>"
15
+ data-tab="<%= t[:key] %>"
16
+ data-main-target="link">
17
+ <% if t[:options][:disabled] == true %>
18
+ <%= t[:name] %>
19
+ <% else %>
20
+ <%= link_to(
21
+ t[:name],
22
+ { anchor: "#{t[:key]}" },
23
+ data: {
24
+ action: "click->main#changeTab",
25
+ tab: t[:key]
26
+ }) %>
27
+ <% end %>
28
+ </li>
29
+ <% end %>
30
+ </ul>
31
+ <% end %>
32
+ </div>
33
+ <% end %>
@@ -19,14 +19,19 @@
19
19
  <%= stylesheet_link_tag "admin" %>
20
20
  <% end %>
21
21
 
22
- <%= javascript_include_tag "pages/admin" %>
23
- <% if Dir.glob(Rails.root.join("app/assets/javascripts/admin.*")).any? %>
24
- <%= javascript_include_tag "admin" %>
22
+ <% if File.exist?(Rails.root.join("app/assets/builds/admin.js")) %>
23
+ <%= javascript_include_tag("admin", defer: true) %>
24
+ <% else %>
25
+ <%= javascript_include_tag("pages_core/admin-dist", defer: true) %>
26
+ <% if Dir.glob(Rails.root.join("app/assets/javascripts/admin.*")).any? %>
27
+ <%= javascript_include_tag("admin", defer: true) %>
28
+ <% end %>
25
29
  <% end %>
26
30
 
27
31
  <%= csrf_meta_tag %>
28
32
  <meta name="viewport"
29
33
  content="width=device-width, initial-scale=1, user-scalable=no">
34
+ <%= google_analytics_tags "UA-5468672-21" %>
30
35
  </head>
31
36
 
32
37
  <body class="<%= body_classes.join(" ") %>"
@@ -35,49 +40,25 @@
35
40
  data-locale="<%= @locale %>">
36
41
 
37
42
  <div class="wrapper">
38
-
39
43
  <%= render partial: "layouts/admin/header" %>
44
+ <% if content_for?(:main_wrapper) %>
45
+ <%= yield :main_wrapper %>
46
+ <% else %>
47
+ <div class="main-wrapper">
48
+ <main data-controller="main">
49
+ <%= render(partial: "layouts/admin/page_header") %>
50
+ <%= yield %>
51
+ </main>
40
52
 
41
- <div class="main-wrapper">
42
- <main>
43
- <% if @page_description || @content_tabs %>
44
- <div id="page-description"<% if @content_tabs %> class="with_content_tabs"<% end %>>
45
- <% if @page_description_links -%>
46
- <div class="links">
47
- <%= @page_description_links.html_safe %>
48
- </div>
49
- <% end %>
50
- <h3>
51
- <%= (@page_description || @page_title).html_safe %>
52
- </h3>
53
- <% if @content_tabs %>
54
- <ul id="content-tabs">
55
- <% @content_tabs.map do |t| %>
56
- <li id="content-tab-link-<%= t[:key] %>" data-tab-name="<%= t[:key] %>">
57
- <% if t[:options][:disabled] == true %>
58
- <%= t[:name] %>
59
- <% else %>
60
- <%= link_to(t[:name], anchor: "#{t[:key]}") %>
61
- <% end %>
62
- </li>
63
- <% end %>
64
- </ul>
65
- <% end %>
66
- </div>
53
+ <% if content_for?(:sidebar) %>
54
+ <aside class="sidebar">
55
+ <%= content_for(:sidebar) %>
56
+ </aside>
67
57
  <% end %>
68
-
69
- <%= yield %>
70
- </main>
71
-
72
- <% if content_for?(:sidebar) %>
73
- <aside class="sidebar">
74
- <%= content_for(:sidebar) %>
75
- </aside>
76
- <% end %>
77
- </div>
58
+ </div>
59
+ <% end %>
78
60
  </div>
79
61
  <%= react_component "Modal", {} %>
80
- <%= react_component "Toast", { notice: flash[:notice] } %>
81
- <%= render partial: "layouts/admin/analytics" %>
62
+ <%= react_component "Toast", { notice: flash[:notice], error: flash[:error] } %>
82
63
  </body>
83
64
  </html>
@@ -0,0 +1,8 @@
1
+ <!-- Global site tag (gtag.js) - Google Analytics -->
2
+ <script async src="https://www.googletagmanager.com/gtag/js?id=<%= account_id %>"></script>
3
+ <script>
4
+ window.dataLayer = window.dataLayer || [];
5
+ function gtag(){dataLayer.push(arguments);}
6
+ gtag('js', new Date());
7
+ gtag('config', '<%= account_id %>', { 'anonymize_ip': true });
8
+ </script>
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ class EnableSearchExtensions < ActiveRecord::Migration[5.2]
4
+ def change
5
+ ActiveRecord::Base.connection.execute <<-SQL.squish
6
+ CREATE EXTENSION IF NOT EXISTS unaccent;
7
+ CREATE EXTENSION IF NOT EXISTS pg_trgm;
8
+ SQL
9
+ end
10
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateSearchConfigurations < ActiveRecord::Migration[5.2]
4
+ def up
5
+ dictionaries.each do |dict|
6
+ stem = dict == "simple" ? "simple" : "#{dict}_stem"
7
+
8
+ ActiveRecord::Base.connection.execute <<-SQL.squish
9
+ DROP TEXT SEARCH CONFIGURATION IF EXISTS #{dict}_unaccent;
10
+ CREATE TEXT SEARCH CONFIGURATION #{dict}_unaccent
11
+ (COPY = pg_catalog.#{dict});
12
+ ALTER TEXT SEARCH CONFIGURATION #{dict}_unaccent
13
+ ALTER MAPPING FOR hword, hword_part, word
14
+ WITH unaccent, #{stem};
15
+ SQL
16
+ end
17
+ end
18
+
19
+ def down
20
+ dictionaries.each do |dict|
21
+ ActiveRecord::Base.connection.execute <<-SQL.squish
22
+ DROP TEXT SEARCH CONFIGURATION IF EXISTS #{dict}_unaccent;
23
+ SQL
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def dictionaries
30
+ %w[arabic danish dutch english finnish french german
31
+ hungarian indonesian irish italian lithuanian nepali
32
+ norwegian portuguese romanian russian spanish swedish
33
+ tamil turkish simple]
34
+ end
35
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateSearchDocuments < ActiveRecord::Migration[6.0]
4
+ def change
5
+ create_table :search_documents do |t|
6
+ t.references :searchable, polymorphic: true, index: true, null: false
7
+ t.string :locale, null: false
8
+
9
+ t.text :name
10
+ t.text :description
11
+ t.text :content
12
+ t.text :tags
13
+ t.boolean :published, null: false, default: true
14
+ t.timestamps
15
+ t.datetime :record_updated_at, null: false
16
+
17
+ t.index %i[searchable_type searchable_id locale],
18
+ name: :search_documents_unique_index,
19
+ unique: true
20
+
21
+ # Tsvector index
22
+ t.string :tsv_config, null: false, default: "simple_unaccent"
23
+ t.tsvector :tsv
24
+ t.index :tsv, using: :gin
25
+
26
+ # Trigram index
27
+ t.index :name,
28
+ name: :search_documents_trgm_idx,
29
+ using: :gin,
30
+ opclass: { title: :gin_trgm_ops }
31
+ end
32
+
33
+ reversible do |dir|
34
+ dir.up do
35
+ ActiveRecord::Base.connection.execute <<-SQL.squish
36
+ DROP FUNCTION IF EXISTS tsvector_search_documents_trigger;
37
+ CREATE FUNCTION tsvector_search_documents_trigger()
38
+ RETURNS trigger AS $$
39
+ begin
40
+ new.tsv :=
41
+ setweight(to_tsvector(new.tsv_config::regconfig,
42
+ coalesce(new.name, '')), 'A') ||
43
+ setweight(to_tsvector(new.tsv_config::regconfig,
44
+ coalesce(new.description, '')), 'B') ||
45
+ setweight(to_tsvector(new.tsv_config::regconfig,
46
+ coalesce(new.content, '')), 'C') ||
47
+ setweight(to_tsvector(new.tsv_config::regconfig,
48
+ coalesce(new.tags, '')), 'B');
49
+ return new;
50
+ end
51
+ $$ LANGUAGE plpgsql;
52
+
53
+ DROP TRIGGER IF EXISTS tsvector_search_documents_update
54
+ ON search_documents;
55
+
56
+ CREATE TRIGGER tsvector_search_documents_update
57
+ BEFORE INSERT OR UPDATE
58
+ ON search_documents FOR EACH ROW EXECUTE PROCEDURE
59
+ tsvector_search_documents_trigger();
60
+ SQL
61
+
62
+ # Index all pages
63
+ PagesCore::SearchableDocument::Indexer.index_all!(Page)
64
+ end
65
+ dir.down do
66
+ ActiveRecord::Base.connection.execute <<-SQL.squish
67
+ DROP TRIGGER IF EXISTS tsvector_search_documents_update
68
+ ON search_documents;
69
+ DROP FUNCTION IF EXISTS tsvector_search_documents_trigger;
70
+ SQL
71
+ end
72
+ end
73
+ end
74
+ end
@@ -27,7 +27,7 @@ module PagesCore
27
27
  # Enable asset precompilation
28
28
  initializer :assets do |_config|
29
29
  Rails.application.config.assets.precompile += %w[
30
- pages/admin.js
30
+ pages_core/admin-dist.js
31
31
  pages/admin.css
32
32
  pages/errors.css
33
33
  pages/favicon.gif
@@ -38,10 +38,6 @@ module PagesCore
38
38
  ]
39
39
  end
40
40
 
41
- initializer :enable_recursive_serialization do |_app|
42
- ActiveModelSerializers.config.default_includes = "**"
43
- end
44
-
45
41
  initializer :handle_exceptions do |app|
46
42
  app.config.exceptions_app = app.routes
47
43
  ActionDispatch::ExceptionWrapper.rescue_responses.merge!(
@@ -11,7 +11,7 @@ module PagesCore
11
11
  end
12
12
 
13
13
  def large?
14
- small? ? false : true
14
+ !small?
15
15
  end
16
16
  end
17
17
  end
@@ -49,7 +49,7 @@ module PagesCore
49
49
  value = false if value == :disabled
50
50
  stack = [stack] unless stack.is_a?(Enumerable)
51
51
  partial_hash = stack.reverse.inject(value) do |hash, key|
52
- Hash[key => hash]
52
+ { key => hash }
53
53
  end
54
54
  @configuration = @configuration.deep_merge(partial_hash)
55
55
  value
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PagesCore
4
- VERSION = "3.7.0" unless PagesCore.const_defined?("VERSION")
4
+ VERSION = "3.8.0" unless PagesCore.const_defined?("VERSION")
5
5
  end
data/lib/pages_core.rb CHANGED
@@ -17,12 +17,11 @@ require "action_mailer"
17
17
 
18
18
  # Gems
19
19
  require "actionpack/page_caching"
20
- require "active_model_serializers"
21
20
  require "acts_as_list"
21
+ require "alba"
22
22
  require "bcrypt"
23
- require "coffee-script"
24
23
  require "country_select"
25
- require "delayed_job"
24
+ require "delayed_job_active_record"
26
25
  require "dis"
27
26
  require "dynamic_image"
28
27
  require "healthcheck"
@@ -30,6 +29,7 @@ require "localizable_model"
30
29
  require "lograge"
31
30
  require "nokogiri"
32
31
  require "json"
32
+ require "pg_search"
33
33
  require "progress_bar"
34
34
  require "rails_i18n"
35
35
  require "RedCloth"
@@ -42,8 +42,6 @@ require "will_paginate/view_helpers/action_view"
42
42
 
43
43
  # Assets
44
44
  require "font-awesome-rails"
45
- require "jquery-ui-rails"
46
- require "jquery/rails/engine"
47
45
  require "react-rails"
48
46
 
49
47
  # Pages
@@ -51,13 +51,6 @@ module PagesCore
51
51
  File.join("app/assets/stylesheets/components/base.scss")
52
52
  )
53
53
  end
54
-
55
- def create_application_js
56
- template(
57
- "application.js.erb",
58
- File.join("app/assets/javascripts/application.js")
59
- )
60
- end
61
54
  end
62
55
  end
63
56
  end
@@ -12,7 +12,7 @@ PagesCore::Templates.configure do |config|
12
12
  "Headline",
13
13
  size: :field,
14
14
  description: "The main statement, usually largest and boldest, " \
15
- "describing the main story."
15
+ "describing the main story."
16
16
  )
17
17
  block.excerpt(
18
18
  "Standfirst",
@@ -22,7 +22,7 @@ PagesCore::Templates.configure do |config|
22
22
  block.boxout(
23
23
  "Boxout",
24
24
  description: "Part of the page, usually background info or facts " \
25
- "related to the article."
25
+ "related to the article."
26
26
  )
27
27
  end
28
28