pages_core 3.7.0 → 3.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -2
- data/app/assets/builds/pages_core/admin-dist.js +55 -0
- data/app/assets/stylesheets/pages/admin/components/image_editor.scss +1 -0
- data/app/assets/stylesheets/pages/admin/components/image_grid.scss +33 -5
- data/app/assets/stylesheets/pages/admin/components/layout.scss +2 -1
- data/app/assets/stylesheets/pages/admin/components/login.scss +6 -0
- data/app/assets/stylesheets/pages/admin/components/tabs.scss +5 -0
- data/app/assets/stylesheets/pages/admin/components/tag_editor.scss +13 -7
- data/app/assets/stylesheets/pages/admin/controllers/pages.scss +13 -5
- data/app/assets/stylesheets/pages/admin.scss +0 -1
- data/app/controller_dummies/admin/admin_controller.rb +1 -1
- data/app/controller_dummies/application_controller.rb +1 -1
- data/app/controller_dummies/attachments_controller.rb +1 -1
- data/app/controller_dummies/frontend_controller.rb +1 -1
- data/app/controller_dummies/images_controller.rb +1 -1
- data/app/controller_dummies/page_files_controller.rb +1 -1
- data/app/controller_dummies/pages_controller.rb +1 -1
- data/app/controller_dummies/sitemaps_controller.rb +1 -1
- data/app/controllers/admin/attachments_controller.rb +1 -1
- data/app/controllers/admin/images_controller.rb +10 -7
- data/app/controllers/concerns/pages_core/authentication.rb +9 -4
- data/app/controllers/concerns/pages_core/preview_pages_controller.rb +5 -0
- data/app/controllers/pages_core/frontend/pages_controller.rb +5 -2
- data/app/controllers/sessions_controller.rb +1 -1
- data/app/formatters/pages_core/link_renderer.rb +2 -2
- data/app/helpers/application_helper.rb +1 -1
- data/app/helpers/frontend_helper.rb +1 -1
- data/app/helpers/pages_core/admin/content_tabs_helper.rb +5 -2
- data/app/helpers/pages_core/admin/image_uploads_helper.rb +2 -3
- data/app/helpers/pages_core/admin/tag_editor_helper.rb +9 -39
- data/app/helpers/pages_core/head_tags_helper.rb +11 -20
- data/app/helpers/pages_core/open_graph_tags_helper.rb +1 -1
- data/app/javascript/admin-dist.js +2 -0
- data/app/javascript/components/Attachments/Attachment.jsx +121 -0
- data/app/javascript/components/Attachments/AttachmentEditor.jsx +116 -0
- data/app/javascript/components/Attachments/Placeholder.jsx +10 -0
- data/app/javascript/components/Attachments.jsx +165 -0
- data/app/{assets/javascripts/pages/admin/components/date_range_select.jsx → javascript/components/DateRangeSelect.jsx} +16 -5
- data/app/javascript/components/EditableImage.jsx +61 -0
- data/app/{assets/javascripts/pages/admin/components/file_upload_button.jsx → javascript/components/FileUploadButton.jsx} +11 -1
- data/app/{assets/javascripts/pages/admin/components/focal_point.jsx → javascript/components/ImageCropper/FocalPoint.jsx} +12 -1
- data/app/javascript/components/ImageCropper/Image.jsx +65 -0
- data/app/javascript/components/ImageCropper/Toolbar.jsx +73 -0
- data/app/javascript/components/ImageCropper/useCrop.js +199 -0
- data/app/javascript/components/ImageCropper.jsx +90 -0
- data/app/javascript/components/ImageEditor/Form.jsx +98 -0
- data/app/javascript/components/ImageEditor.jsx +62 -0
- data/app/javascript/components/ImageGrid/DragElement.jsx +30 -0
- data/app/javascript/components/ImageGrid/FilePlaceholder.jsx +9 -0
- data/app/javascript/components/ImageGrid/GridImage.jsx +103 -0
- data/app/javascript/components/ImageGrid/Placeholder.jsx +23 -0
- data/app/javascript/components/ImageGrid.jsx +257 -0
- data/app/javascript/components/ImageUploader.jsx +171 -0
- data/app/{assets/javascripts/pages/admin/components/modal.jsx → javascript/components/Modal.jsx} +13 -2
- data/app/javascript/components/ModalStore.jsx +12 -0
- data/app/{assets/javascripts/pages/admin/components/page_dates.jsx → javascript/components/PageDates.jsx} +11 -1
- data/app/{assets/javascripts/pages/admin/components/page_files.jsx → javascript/components/PageFiles.jsx} +11 -2
- data/app/{assets/javascripts/pages/admin/components/page_images.jsx → javascript/components/PageImages.jsx} +11 -2
- data/app/{assets/javascripts/pages/admin/components/page_tree_store.jsx → javascript/components/PageTree.jsx} +127 -137
- data/app/{assets/javascripts/pages/admin/components/page_tree.jsx → javascript/components/PageTreeDraggable.jsx} +35 -29
- data/app/{assets/javascripts/pages/admin/components/page_tree_node.jsx → javascript/components/PageTreeNode.jsx} +35 -20
- data/app/javascript/components/RichTextArea.jsx +213 -0
- data/app/javascript/components/RichTextToolbarButton.jsx +20 -0
- data/app/javascript/components/TagEditor/AddTagForm.jsx +42 -0
- data/app/javascript/components/TagEditor/Tag.jsx +32 -0
- data/app/javascript/components/TagEditor.jsx +61 -0
- data/app/javascript/components/Toast.jsx +72 -0
- data/app/javascript/components/ToastStore.jsx +14 -0
- data/app/javascript/components/drag/draggedOrder.js +51 -0
- data/app/javascript/components/drag/useDragCollection.js +84 -0
- data/app/javascript/components/drag/useDragUploader.js +112 -0
- data/app/javascript/components/drag/useDraggable.js +17 -0
- data/app/javascript/components/drag.js +6 -0
- data/app/javascript/components.js +14 -0
- data/app/javascript/controllers/EditPageController.js +20 -0
- data/app/javascript/controllers/LoginController.js +29 -0
- data/app/javascript/controllers/MainController.js +65 -0
- data/app/javascript/controllers/PageOptionsController.js +62 -0
- data/app/javascript/features/RichText.jsx +34 -0
- data/app/javascript/hooks.js +2 -0
- data/app/javascript/index.js +33 -0
- data/app/{assets/javascripts/pages/admin/lib/tree.jsx → javascript/lib/Tree.js} +55 -54
- data/app/javascript/lib/copyToClipboard.js +13 -0
- data/app/javascript/lib/readyHandler.js +22 -0
- data/app/javascript/lib/request.js +36 -0
- data/app/models/concerns/pages_core/page_model/images.rb +3 -1
- data/app/models/concerns/pages_core/page_model/searchable.rb +19 -0
- data/app/models/concerns/pages_core/searchable_document.rb +71 -0
- data/app/models/concerns/pages_core/taggable.rb +27 -12
- data/app/models/page.rb +2 -0
- data/app/models/page_exporter.rb +2 -2
- data/app/models/page_image.rb +0 -2
- data/app/models/role.rb +1 -1
- data/app/models/search_document.rb +72 -0
- data/app/models/tag.rb +1 -0
- data/app/models/user.rb +1 -1
- data/app/{serializers/admin/attachment_serializer.rb → resources/admin/attachment_resource.rb} +6 -5
- data/app/{serializers/admin/image_serializer.rb → resources/admin/image_resource.rb} +9 -9
- data/app/resources/admin/page_file_resource.rb +10 -0
- data/app/{serializers/admin/page_image_serializer.rb → resources/admin/page_image_resource.rb} +4 -2
- data/app/resources/export/attachment_resource.rb +10 -0
- data/app/resources/export/page_image_resource.rb +45 -0
- data/app/resources/export/page_resource.rb +42 -0
- data/app/{serializers/page_image_serializer.rb → resources/page_image_resource.rb} +8 -16
- data/app/resources/page_resource.rb +33 -0
- data/app/services/pages_core/destroy_invite_service.rb +2 -2
- data/app/services/pages_core/invite_service.rb +2 -2
- data/app/views/admin/pages/_edit_content.html.erb +1 -1
- data/app/views/admin/pages/_edit_files.html.erb +1 -5
- data/app/views/admin/pages/_edit_images.html.erb +1 -5
- data/app/views/admin/pages/_edit_options.html.erb +74 -55
- data/app/views/admin/pages/_form.html.erb +19 -0
- data/app/views/admin/pages/edit.html.erb +35 -61
- data/app/views/admin/pages/index.html.erb +0 -1
- data/app/views/admin/pages/new.html.erb +32 -32
- data/app/views/admin/users/_access_control.html.erb +5 -1
- data/app/views/admin/users/login.html.erb +12 -4
- data/app/views/feeds/pages.rss.builder +1 -2
- data/app/views/layouts/admin/_header.html.erb +1 -1
- data/app/views/layouts/admin/_page_header.html.erb +33 -0
- data/app/views/layouts/admin.html.erb +23 -42
- data/app/views/pages_core/_google_analytics.html.erb +8 -0
- data/db/migrate/20180625154059_enable_search_extensions.rb +10 -0
- data/db/migrate/20210209151400_create_search_configurations.rb +35 -0
- data/db/migrate/20210210235200_create_search_documents.rb +74 -0
- data/lib/pages_core/engine.rb +1 -5
- data/lib/pages_core/templates/block_configuration.rb +1 -1
- data/lib/pages_core/templates/configuration_handler.rb +1 -1
- data/lib/pages_core/version.rb +1 -1
- data/lib/pages_core.rb +3 -5
- data/lib/rails/generators/pages_core/frontend/frontend_generator.rb +0 -7
- data/lib/rails/generators/pages_core/install/templates/page_templates_initializer.rb +2 -2
- metadata +101 -115
- data/app/assets/javascripts/pages/admin/components/attachment.jsx +0 -130
- data/app/assets/javascripts/pages/admin/components/attachment_editor.jsx +0 -131
- data/app/assets/javascripts/pages/admin/components/attachments.jsx +0 -211
- data/app/assets/javascripts/pages/admin/components/drag_uploader.jsx +0 -174
- data/app/assets/javascripts/pages/admin/components/editable_image.jsx +0 -57
- data/app/assets/javascripts/pages/admin/components/grid_image.jsx +0 -124
- data/app/assets/javascripts/pages/admin/components/image_editor.jsx +0 -496
- data/app/assets/javascripts/pages/admin/components/image_grid.jsx +0 -306
- data/app/assets/javascripts/pages/admin/components/image_uploader.jsx +0 -176
- data/app/assets/javascripts/pages/admin/components/modal_store.jsx +0 -20
- data/app/assets/javascripts/pages/admin/components/rich_text_area.jsx +0 -64
- data/app/assets/javascripts/pages/admin/components/rich_text_toolbar.jsx +0 -91
- data/app/assets/javascripts/pages/admin/components/toast.jsx +0 -34
- data/app/assets/javascripts/pages/admin/components/toast_store.jsx +0 -52
- data/app/assets/javascripts/pages/admin/components.jsx +0 -2
- data/app/assets/javascripts/pages/admin/features/content_tabs.jsx +0 -72
- data/app/assets/javascripts/pages/admin/features/edit_page.jsx +0 -97
- data/app/assets/javascripts/pages/admin/features/rich_text.jsx +0 -14
- data/app/assets/javascripts/pages/admin/features/tag_editor.jsx +0 -160
- data/app/assets/javascripts/pages/admin.jsx +0 -17
- data/app/assets/javascripts/pages/login_form.jsx +0 -21
- data/app/serializers/admin/page_file_serializer.rb +0 -8
- data/app/serializers/page_export_serializer.rb +0 -32
- data/app/serializers/page_file_export_serializer.rb +0 -6
- data/app/serializers/page_image_export_serializer.rb +0 -42
- data/app/serializers/page_serializer.rb +0 -23
- data/app/views/layouts/admin/_analytics.html.erb +0 -16
- data/lib/rails/generators/pages_core/frontend/templates/application.js.erb +0 -15
- data/vendor/assets/javascripts/ReactCrop.min.js +0 -1
- 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
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
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
|
-
|
68
|
-
|
69
|
-
|
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 :
|
14
|
+
<% content_for :main_wrapper do %>
|
15
15
|
<%= form_for(@page,
|
16
16
|
url: admin_pages_url(@locale),
|
17
|
-
|
18
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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:
|
31
|
+
length: item.image.content_length,
|
33
32
|
type: item.image.content_type
|
34
33
|
)
|
35
34
|
end
|
@@ -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
|
-
|
23
|
-
|
24
|
-
|
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
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
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
|
-
|
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
|
data/lib/pages_core/engine.rb
CHANGED
@@ -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
|
-
|
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!(
|
@@ -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
|
-
|
52
|
+
{ key => hash }
|
53
53
|
end
|
54
54
|
@configuration = @configuration.deep_merge(partial_hash)
|
55
55
|
value
|
data/lib/pages_core/version.rb
CHANGED
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 "
|
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
|
@@ -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
|
-
|
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
|
-
|
25
|
+
"related to the article."
|
26
26
|
)
|
27
27
|
end
|
28
28
|
|