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
data/app/models/page.rb CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  class Page < ApplicationRecord
4
4
  include PagesCore::HumanizableParam
5
+ include PagesCore::SearchableDocument
5
6
  include PagesCore::Sweepable
6
7
  include PagesCore::Taggable
7
8
 
@@ -12,6 +13,7 @@ class Page < ApplicationRecord
12
13
  include PagesCore::PageModel::Localizable
13
14
  include PagesCore::PageModel::Pathable
14
15
  include PagesCore::PageModel::Redirectable
16
+ include PagesCore::PageModel::Searchable
15
17
  include PagesCore::PageModel::Sortable
16
18
  include PagesCore::PageModel::Status
17
19
  include PagesCore::PageModel::Tree
@@ -29,7 +29,7 @@ class PageExporter
29
29
  end
30
30
 
31
31
  def export_files(page)
32
- path = page_path(page).join("files")
32
+ path = page_path(page).join("attachments")
33
33
  page.attachments.each do |file|
34
34
  write_file(
35
35
  path.join([file.content_hash, file.filename].join("-")),
@@ -57,7 +57,7 @@ class PageExporter
57
57
  end
58
58
 
59
59
  def export_page_json(path, page)
60
- json = PageExportSerializer.new(page).to_json
60
+ json = Export::PageResource.new(page).serialize
61
61
  write_file(path.join("page.#{page.locale}.json"), json)
62
62
  write_file(path.join("page.#{page.locale}.yml"), JSON.parse(json).to_yaml)
63
63
  end
@@ -6,8 +6,6 @@ class PageImage < ApplicationRecord
6
6
  belongs_to :page
7
7
  belongs_to_image :image
8
8
 
9
- validates :page_id, presence: true
10
-
11
9
  accepts_nested_attributes_for :image
12
10
  validates_associated :image
13
11
 
data/app/models/role.rb CHANGED
@@ -11,7 +11,7 @@ class Role < ApplicationRecord
11
11
  def define(name, description, default: false)
12
12
  if roles.map(&:name).include?(name.to_s)
13
13
  raise ArgumentError, "Tried to define role :#{role}, " \
14
- "but a role by that name already exists"
14
+ "but a role by that name already exists"
15
15
  else
16
16
  roles << OpenStruct.new(
17
17
  name: name.to_s,
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SearchDocument < ApplicationRecord
4
+ include PgSearch::Model
5
+
6
+ belongs_to :searchable, polymorphic: true
7
+
8
+ validates :locale, presence: true
9
+
10
+ before_validation :configure_dictionary,
11
+ :inherit_updated_at
12
+
13
+ scope :published, -> { where(published: true) }
14
+
15
+ pg_search_scope :full_text_search_scope, lambda { |query, dictionary|
16
+ { against: %i[name description content tags],
17
+ using: { tsearch: { prefix: true,
18
+ dictionary: dictionary,
19
+ tsvector_column: "tsv" },
20
+ trigram: { only: %i[name] } },
21
+ ignoring: :accents,
22
+ order_within_rank: "search_documents.record_updated_at DESC",
23
+ query: query }
24
+ }
25
+
26
+ class << self
27
+ def results
28
+ select(:searchable_id, :searchable_type, :locale)
29
+ .map(&:localized_searchable)
30
+ end
31
+
32
+ def search(query, locale: nil)
33
+ locale ||= I18n.locale
34
+ where(locale: locale)
35
+ .includes(:searchable)
36
+ .full_text_search_scope(query, search_configuration(locale))
37
+ end
38
+
39
+ def search_configuration(locale)
40
+ search_configurations[locale&.to_sym] || "simple_unaccent"
41
+ end
42
+
43
+ def search_configurations
44
+ # These are the dictionaries PostgreSQL 12 ships with.
45
+ # Also available in PostgreSQL 13: el: "greek_unaccent",
46
+ { ar: "arabic_unaccent", da: "danish_unaccent", nl: "dutch_unaccent",
47
+ en: "english_unaccent", fi: "finnish_unaccent", fr: "french_unaccent",
48
+ de: "german_unaccent", hu: "hungarian_unaccent",
49
+ id: "indonesian_unaccent", ga: "irish_unaccent", it: "italian_unaccent",
50
+ lt: "lithuanian_unaccent", ne: "nepali_unaccent",
51
+ nb: "norwegian_unaccent", pt: "portuguese_unaccent",
52
+ rm: "romanian_unaccent", ru: "russian_unaccent", es: "spanish_unaccent",
53
+ sv: "swedish_unaccent", ta: "tamil_unaccent", tr: "turkish_unaccent" }
54
+ end
55
+ end
56
+
57
+ def localized_searchable
58
+ return searchable unless searchable.respond_to?(:localize)
59
+
60
+ searchable.localize(locale)
61
+ end
62
+
63
+ private
64
+
65
+ def configure_dictionary
66
+ self.tsv_config = self.class.search_configuration(locale)
67
+ end
68
+
69
+ def inherit_updated_at
70
+ self.record_updated_at = searchable.updated_at
71
+ end
72
+ end
data/app/models/tag.rb CHANGED
@@ -4,6 +4,7 @@ class Tag < ApplicationRecord
4
4
  include PagesCore::HumanizableParam
5
5
  has_many :taggings, dependent: :destroy
6
6
 
7
+ scope :by_name, -> { order("name ASC") }
7
8
  scope :pinned, -> { where(pinned: true) }
8
9
  scope :sorted, -> { order("pinned DESC, name ASC") }
9
10
 
data/app/models/user.rb CHANGED
@@ -83,7 +83,7 @@ class User < ApplicationRecord
83
83
  end
84
84
 
85
85
  def online?
86
- last_login_at && last_login_at > 15.minutes.ago ? true : false
86
+ last_login_at && last_login_at > 15.minutes.ago
87
87
  end
88
88
 
89
89
  def realname
@@ -1,22 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Admin
4
- class AttachmentSerializer < ActiveModel::Serializer
4
+ class AttachmentResource
5
+ include Alba::Resource
5
6
  include Rails.application.routes.url_helpers
6
7
  include PagesCore::AttachmentsHelper
7
8
 
8
9
  attributes :id, :filename, :content_type, :content_hash, :content_length,
9
- :name, :description, :created_at, :updated_at, :url
10
+ :created_at, :updated_at
10
11
 
11
- def name
12
+ attribute :name do
12
13
  localized_attribute(:name)
13
14
  end
14
15
 
15
- def description
16
+ attribute :description do
16
17
  localized_attribute(:description)
17
18
  end
18
19
 
19
- def url
20
+ attribute :url do
20
21
  attachment_path(object)
21
22
  end
22
23
 
@@ -1,29 +1,29 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Admin
4
- class ImageSerializer < ActiveModel::Serializer
4
+ class ImageResource
5
+ include Alba::Resource
5
6
  include Rails.application.routes.url_helpers
6
7
  include DynamicImage::Helper
7
8
 
8
9
  attributes :id, :filename, :content_type, :content_hash, :content_length,
9
10
  :colorspace, :real_width, :real_height, :crop_width,
10
11
  :crop_height, :crop_start_x, :crop_start_y, :crop_gravity_x,
11
- :crop_gravity_y, :alternative, :caption, :created_at, :updated_at
12
- attributes :cropped_url, :uncropped_url, :original_url, :thumbnail_url
12
+ :crop_gravity_y, :created_at, :updated_at
13
13
 
14
- def alternative
14
+ attribute :alternative do
15
15
  localized_attribute(:alternative)
16
16
  end
17
17
 
18
- def caption
18
+ attribute :caption do
19
19
  localized_attribute(:caption)
20
20
  end
21
21
 
22
- def original_url
22
+ attribute :original_url do
23
23
  original_dynamic_image_path(object)
24
24
  end
25
25
 
26
- def thumbnail_url
26
+ attribute :thumbnail_url do
27
27
  dynamic_image_path(
28
28
  object,
29
29
  size: "500x",
@@ -31,7 +31,7 @@ module Admin
31
31
  )
32
32
  end
33
33
 
34
- def cropped_url
34
+ attribute :cropped_url do
35
35
  dynamic_image_path(
36
36
  object,
37
37
  size: "1200x1200",
@@ -40,7 +40,7 @@ module Admin
40
40
  )
41
41
  end
42
42
 
43
- def uncropped_url
43
+ attribute :uncropped_url do
44
44
  uncropped_dynamic_image_path(
45
45
  object,
46
46
  size: "2000x2000",
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Admin
4
+ class PageFileResource
5
+ include Alba::Resource
6
+
7
+ attributes :id, :page_id, :attachment_id, :position
8
+ one :attachment, resource: Admin::AttachmentResource
9
+ end
10
+ end
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Admin
4
- class PageImageSerializer < ActiveModel::Serializer
4
+ class PageImageResource
5
+ include Alba::Resource
6
+
5
7
  attributes :id, :page_id, :image_id, :position, :primary
6
- has_one :image, serializer: Admin::ImageSerializer
8
+ one :image, resource: Admin::ImageResource
7
9
  end
8
10
  end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Export
4
+ class AttachmentResource
5
+ include Alba::Resource
6
+
7
+ attributes :id, :filename, :content_type, :content_length, :content_hash,
8
+ :created_at, :updated_at
9
+ end
10
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Export
4
+ class PageImageResource
5
+ include Alba::Resource
6
+
7
+ attributes :primary
8
+
9
+ attribute :id do
10
+ object.image.id
11
+ end
12
+
13
+ attribute :name do
14
+ object.image.name
15
+ end
16
+
17
+ attribute :alternative do
18
+ object.image.alternative
19
+ end
20
+
21
+ attribute :caption do
22
+ object.image.caption
23
+ end
24
+
25
+ attribute :content_hash do
26
+ object.image.content_hash
27
+ end
28
+
29
+ attribute :content_type do
30
+ object.image.content_type
31
+ end
32
+
33
+ attribute :filename do
34
+ object.image.filename
35
+ end
36
+
37
+ attribute :size do
38
+ object.image.crop_size
39
+ end
40
+
41
+ attribute :created_at do
42
+ object.image.created_at
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Export
4
+ class PageResource
5
+ include Alba::Resource
6
+
7
+ attributes :id, :locale
8
+ attributes(*PagesCore::Templates::TemplateConfiguration.all_blocks)
9
+ attributes :created_at, :published_at, :pinned, :template, :redirect_to,
10
+ :starts_at, :ends_at, :all_day
11
+
12
+ has_many :attachments, resource: Export::AttachmentResource
13
+
14
+ attribute :author_name do
15
+ object&.author&.name
16
+ end
17
+
18
+ attribute :path do
19
+ object.full_path || object.to_param
20
+ end
21
+
22
+ attribute :image do
23
+ image_resource(object.page_images.where(primary: true).try(:first))
24
+ end
25
+
26
+ attribute :images do
27
+ object.page_images.map { |image| image_resource(image) }
28
+ end
29
+
30
+ attribute :status do
31
+ object.status_label
32
+ end
33
+
34
+ private
35
+
36
+ def image_resource(image)
37
+ return nil unless image
38
+
39
+ Export::PageImageResource.new(image)
40
+ end
41
+ end
42
+ end
@@ -1,37 +1,29 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class PageImageSerializer < ActiveModel::Serializer
3
+ class PageImageResource
4
+ include Alba::Resource
4
5
  include Rails.application.routes.url_helpers
5
6
  include DynamicImage::Helper
6
7
 
7
- attributes :id, :image_id, :primary, :filename
8
- attributes :alternative, :caption, :created_at, :url
8
+ attributes :id, :image_id, :primary
9
9
 
10
- def name
11
- object.image.name
12
- end
13
-
14
- def alternative
10
+ attribute :alternative do
15
11
  object.image.alternative
16
12
  end
17
13
 
18
- def caption
14
+ attribute :caption do
19
15
  object.image.caption
20
16
  end
21
17
 
22
- def filename
18
+ attribute :filename do
23
19
  object.image.filename
24
20
  end
25
21
 
26
- def size
27
- object.image.crop_size
28
- end
29
-
30
- def created_at
22
+ attribute :created_at do
31
23
  object.image.created_at
32
24
  end
33
25
 
34
- def url
26
+ attribute :url do
35
27
  dynamic_image_path(
36
28
  object.image,
37
29
  size: "2000x2000",
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ class PageResource
4
+ include Alba::Resource
5
+
6
+ attributes :id, :parent_page_id, :locale
7
+ attributes(*PagesCore::Templates::TemplateConfiguration.all_blocks)
8
+ attributes :published_at, :pinned
9
+
10
+ attribute :param do
11
+ object.to_param
12
+ end
13
+
14
+ attribute :image do
15
+ image_resource(object.page_images.where(primary: true).try(:first))
16
+ end
17
+
18
+ attribute :images do
19
+ object.page_images.map { |image| image_resource(image) }
20
+ end
21
+
22
+ attribute :pages do
23
+ object.pages.map { |p| PageResource.new(p) }
24
+ end
25
+
26
+ private
27
+
28
+ def image_resource(image)
29
+ return nil unless image
30
+
31
+ PageImageResource.new(image)
32
+ end
33
+ end
@@ -9,8 +9,8 @@ module PagesCore
9
9
  end
10
10
 
11
11
  class << self
12
- def call(*attrs)
13
- new(*attrs).call
12
+ def call(invite:)
13
+ new(invite: invite).call
14
14
  end
15
15
  end
16
16
 
@@ -14,8 +14,8 @@ module PagesCore
14
14
  end
15
15
 
16
16
  class << self
17
- def call(*attrs)
18
- new(*attrs).call
17
+ def call(attrs, user:, host:, protocol: "http")
18
+ new(attrs, user: user, host: host, protocol: protocol).call
19
19
  end
20
20
  end
21
21
 
@@ -9,7 +9,7 @@
9
9
  all_day: @page.all_day }) %>
10
10
  <% end %>
11
11
 
12
- <% if !@page.new_record? && @page.template_config.value(:tags) %>
12
+ <% if @page.template_config.value(:tags) %>
13
13
  <div class="field">
14
14
  <label>
15
15
  Tags
@@ -1,8 +1,4 @@
1
1
  <%= react_component("PageFiles",
2
2
  locale: @locale,
3
3
  locales: PagesCore.config.locales,
4
- csrf_token: form_authenticity_token,
5
- records: ActiveModel::Serializer::CollectionSerializer.new(
6
- @page.files,
7
- serializer: Admin::PageFileSerializer
8
- )) %>
4
+ records: @page.files.map { |pf| Admin::PageFileResource.new(pf).to_hash }) %>
@@ -1,8 +1,4 @@
1
1
  <%= react_component("PageImages",
2
2
  locale: @locale,
3
3
  locales: PagesCore.config.locales,
4
- csrf_token: form_authenticity_token,
5
- records: ActiveModel::Serializer::CollectionSerializer.new(
6
- @page.page_images,
7
- serializer: Admin::PageImageSerializer
8
- )) %>
4
+ records: @page.page_images.map { |pi| Admin::PageImageResource.new(pi).to_hash }) %>
@@ -1,72 +1,91 @@
1
- <%= labelled_field(f.select(:status, Page.status_labels.invert),
2
- "Status",
3
- errors: @page.errors[:status]) %>
4
- <div class="published-date">
5
- <%= labelled_field (
1
+ <div class="page-options"
2
+ data-controller="page-options">
3
+ <%= labelled_field(f.select(:status,
4
+ Page.status_labels.invert,
5
+ {},
6
+ data: {
7
+ "page-options-target": "published",
8
+ action: "change->page-options#checkPublishedDate"
9
+ }),
10
+ "Status",
11
+ errors: @page.errors[:status]) %>
12
+ <div class="published-date"
13
+ data-page-options-target="publishedDate">
14
+ <%= labelled_field (
6
15
  f.date_select(
7
16
  :published_at,
8
- start_year: (Time.now.year - 20),
9
- end_year: (Time.now.year + 5)
17
+ { start_year: (Time.now.year - 20),
18
+ end_year: (Time.now.year + 5),
19
+ with_css_classes: true },
20
+ data: { action: "change->page-options#checkAutoPublish" }
10
21
  ) +
11
22
  '<br />'.html_safe +
12
- f.time_select(:published_at)
23
+ f.time_select(:published_at,
24
+ { with_css_classes: true,
25
+ ignore_date: true },
26
+ data: { action: "change->page-options#checkAutoPublish" })
13
27
  ),
14
- "Date",
15
- errors: @page.errors[:published_at]
16
- %>
17
- <p class="autopublish-notice">
18
- This page will publish later
19
- </p>
20
- </div>
28
+ "Date",
29
+ errors: @page.errors[:published_at]
30
+ %>
31
+ <p class="autopublish-notice"
32
+ data-page-options-target="autoPublishNotice">
33
+ This page will publish later
34
+ </p>
35
+ </div>
21
36
 
22
- <%= labelled_field (
37
+ <%= labelled_field (
23
38
  f.select(:user_id, page_authors(@page).map{|a| [a.name, a.id]})
24
39
  ),
25
- "Author",
26
- errors: @page.errors[:user_id]
27
- %>
28
-
29
- <div class="field">
30
- <label>
31
- Pin to top
32
- </label>
33
- <%= f.check_box(:pinned) %>
34
- Make post featured<br />
35
- </div>
40
+ "Author",
41
+ errors: @page.errors[:user_id]
42
+ %>
36
43
 
37
- <% if @categories.length > 0 %>
38
44
  <div class="field">
39
- <label>Categories</label>
40
- <% @categories.each do |category| %>
41
- <%= check_box_tag("category[#{category.id}]",
42
- "1",
43
- @page.categories.map { |c| c.id }.include?(category.id)) %>
44
- <%= category.name %><br />
45
- <% end %>
45
+ <label>
46
+ Pin to top
47
+ </label>
48
+ <%= f.check_box(:pinned) %>
49
+ Make post featured<br />
46
50
  </div>
47
- <% end %>
48
51
 
49
- <%= labelled_field(f.select(:template, available_templates_for_select),
50
- "Template",
51
- errors: @page.errors[:template]) %>
52
+ <% if @categories.length > 0 %>
53
+ <div class="field">
54
+ <label>Categories</label>
55
+ <% @categories.each do |category| %>
56
+ <%= check_box_tag("category[#{category.id}]",
57
+ "1",
58
+ @page.categories.map { |c| c.id }.include?(category.id)) %>
59
+ <%= category.name %><br />
60
+ <% end %>
61
+ </div>
62
+ <% end %>
52
63
 
53
- <%= link_to "Advanced options", "#", class: "advanced-toggle" %>
64
+ <%= labelled_field(f.select(:template, available_templates_for_select),
65
+ "Template",
66
+ errors: @page.errors[:template]) %>
54
67
 
55
- <div class="advanced-options">
68
+ <%= link_to("Advanced options",
69
+ "#",
70
+ class: "advanced-toggle",
71
+ data: { action: "click->page-options#toggleAdvancedOptions" }) %>
56
72
 
57
- <div class="field">
58
- <label>Subpages</label>
59
- <%= f.check_box(:feed_enabled) %> RSS feed enabled<br />
60
- <%= f.check_box(:news_page) %> Show in News<br />
73
+ <div class="advanced-options"
74
+ data-page-options-target="advancedOptions">
75
+ <div class="field">
76
+ <label>Subpages</label>
77
+ <%= f.check_box(:feed_enabled) %> RSS feed enabled<br />
78
+ <%= f.check_box(:news_page) %> Show in News<br />
79
+ </div>
80
+ <%= labelled_field f.text_field(:unique_name), "Unique name", errors: @page.errors[:unique_name] %>
81
+ <%= labelled_field f.text_field(:redirect_to), "Redirect", errors: @page.errors[:redirect_to] %>
61
82
  </div>
62
- <%= labelled_field f.text_field(:unique_name), "Unique name", errors: @page.errors[:unique_name] %>
63
- <%= labelled_field f.text_field(:redirect_to), "Redirect", errors: @page.errors[:redirect_to] %>
64
- </div>
65
83
 
66
- <% if @page.id? && @page.name? %>
67
- <div class="field">
68
- <label>Page link</label>
69
- <%= link_to(page_path(@page.locale, @page),
70
- page_path(@page.locale, @page)) %>
71
- </div>
72
- <% end %>
84
+ <% if @page.id? && @page.name? %>
85
+ <div class="field">
86
+ <label>Page link</label>
87
+ <%= link_to(page_path(@page.locale, @page),
88
+ page_path(@page.locale, @page)) %>
89
+ </div>
90
+ <% end %>
91
+ </div>
@@ -0,0 +1,19 @@
1
+ <%= content_tab "Content" do %>
2
+ <%= render partial: "edit_content", locals: { f: f } %>
3
+ <% end %>
4
+
5
+ <% if @page.template_config.value(:images) || @page.template_config.value(:image) %>
6
+ <%= content_tab "Images" do %>
7
+ <%= render partial: "edit_images", locals: { f: f } %>
8
+ <% end %>
9
+ <% end %>
10
+
11
+ <% if @page.template_config.value(:files) %>
12
+ <%= content_tab "Files" do %>
13
+ <%= render partial: "edit_files", locals: { f: f } %>
14
+ <% end %>
15
+ <% end %>
16
+
17
+ <%= content_tab "Metadata" do %>
18
+ <%= render partial: "edit_metadata", locals: { f: f } %>
19
+ <% end %>