pages_core 3.7.0 → 3.8.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (167) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -2
  3. data/Rakefile +37 -0
  4. data/app/assets/builds/pages_core/admin-dist.js +55 -0
  5. data/app/assets/stylesheets/pages/admin/components/image_editor.scss +1 -0
  6. data/app/assets/stylesheets/pages/admin/components/image_grid.scss +33 -5
  7. data/app/assets/stylesheets/pages/admin/components/layout.scss +2 -1
  8. data/app/assets/stylesheets/pages/admin/components/login.scss +6 -0
  9. data/app/assets/stylesheets/pages/admin/components/tabs.scss +5 -0
  10. data/app/assets/stylesheets/pages/admin/components/tag_editor.scss +13 -7
  11. data/app/assets/stylesheets/pages/admin/controllers/pages.scss +13 -5
  12. data/app/assets/stylesheets/pages/admin.scss +0 -1
  13. data/app/controller_dummies/admin/admin_controller.rb +1 -1
  14. data/app/controller_dummies/application_controller.rb +1 -1
  15. data/app/controller_dummies/attachments_controller.rb +1 -1
  16. data/app/controller_dummies/frontend_controller.rb +1 -1
  17. data/app/controller_dummies/images_controller.rb +1 -1
  18. data/app/controller_dummies/page_files_controller.rb +1 -1
  19. data/app/controller_dummies/pages_controller.rb +1 -1
  20. data/app/controller_dummies/sitemaps_controller.rb +1 -1
  21. data/app/controllers/admin/attachments_controller.rb +1 -1
  22. data/app/controllers/admin/images_controller.rb +11 -8
  23. data/app/controllers/concerns/pages_core/authentication.rb +9 -4
  24. data/app/controllers/concerns/pages_core/preview_pages_controller.rb +5 -0
  25. data/app/controllers/pages_core/frontend/pages_controller.rb +5 -2
  26. data/app/controllers/sessions_controller.rb +1 -1
  27. data/app/formatters/pages_core/link_renderer.rb +2 -2
  28. data/app/helpers/application_helper.rb +1 -1
  29. data/app/helpers/frontend_helper.rb +1 -1
  30. data/app/helpers/pages_core/admin/content_tabs_helper.rb +5 -2
  31. data/app/helpers/pages_core/admin/image_uploads_helper.rb +2 -3
  32. data/app/helpers/pages_core/admin/tag_editor_helper.rb +9 -39
  33. data/app/helpers/pages_core/head_tags_helper.rb +11 -20
  34. data/app/helpers/pages_core/open_graph_tags_helper.rb +1 -1
  35. data/app/javascript/admin-dist.js +2 -0
  36. data/app/javascript/components/Attachments/Attachment.jsx +121 -0
  37. data/app/javascript/components/Attachments/AttachmentEditor.jsx +116 -0
  38. data/app/javascript/components/Attachments/Placeholder.jsx +10 -0
  39. data/app/javascript/components/Attachments.jsx +165 -0
  40. data/app/{assets/javascripts/pages/admin/components/date_range_select.jsx → javascript/components/DateRangeSelect.jsx} +16 -5
  41. data/app/javascript/components/EditableImage.jsx +61 -0
  42. data/app/javascript/components/FileUploadButton.jsx +47 -0
  43. data/app/{assets/javascripts/pages/admin/components/focal_point.jsx → javascript/components/ImageCropper/FocalPoint.jsx} +12 -1
  44. data/app/javascript/components/ImageCropper/Image.jsx +65 -0
  45. data/app/javascript/components/ImageCropper/Toolbar.jsx +73 -0
  46. data/app/javascript/components/ImageCropper/useCrop.js +199 -0
  47. data/app/javascript/components/ImageCropper.jsx +90 -0
  48. data/app/javascript/components/ImageEditor/Form.jsx +98 -0
  49. data/app/javascript/components/ImageEditor.jsx +62 -0
  50. data/app/javascript/components/ImageGrid/DragElement.jsx +30 -0
  51. data/app/javascript/components/ImageGrid/FilePlaceholder.jsx +9 -0
  52. data/app/javascript/components/ImageGrid/GridImage.jsx +103 -0
  53. data/app/javascript/components/ImageGrid/Placeholder.jsx +23 -0
  54. data/app/javascript/components/ImageGrid.jsx +257 -0
  55. data/app/javascript/components/ImageUploader.jsx +171 -0
  56. data/app/{assets/javascripts/pages/admin/components/modal.jsx → javascript/components/Modal.jsx} +13 -2
  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/drag/draggedOrder.js +51 -0
  70. data/app/javascript/components/drag/useDragCollection.js +84 -0
  71. data/app/javascript/components/drag/useDragUploader.js +112 -0
  72. data/app/javascript/components/drag/useDraggable.js +17 -0
  73. data/app/javascript/components/drag.js +6 -0
  74. data/app/javascript/components.js +15 -0
  75. data/app/javascript/controllers/EditPageController.js +20 -0
  76. data/app/javascript/controllers/LoginController.js +29 -0
  77. data/app/javascript/controllers/MainController.js +65 -0
  78. data/app/javascript/controllers/PageOptionsController.js +62 -0
  79. data/app/javascript/features/RichText.jsx +34 -0
  80. data/app/javascript/hooks.js +2 -0
  81. data/app/javascript/index.js +38 -0
  82. data/app/{assets/javascripts/pages/admin/lib/tree.jsx → javascript/lib/Tree.js} +55 -54
  83. data/app/javascript/lib/copyToClipboard.js +13 -0
  84. data/app/javascript/lib/readyHandler.js +22 -0
  85. data/app/javascript/lib/request.js +36 -0
  86. data/app/javascript/stores/ModalStore.jsx +12 -0
  87. data/app/javascript/stores/ToastStore.jsx +14 -0
  88. data/app/javascript/stores.js +2 -0
  89. data/app/models/concerns/pages_core/page_model/images.rb +3 -1
  90. data/app/models/concerns/pages_core/page_model/searchable.rb +19 -0
  91. data/app/models/concerns/pages_core/searchable_document.rb +71 -0
  92. data/app/models/concerns/pages_core/taggable.rb +27 -12
  93. data/app/models/page.rb +2 -0
  94. data/app/models/page_exporter.rb +2 -2
  95. data/app/models/page_image.rb +0 -2
  96. data/app/models/role.rb +1 -1
  97. data/app/models/search_document.rb +72 -0
  98. data/app/models/tag.rb +1 -0
  99. data/app/models/user.rb +1 -1
  100. data/app/{serializers/admin/attachment_serializer.rb → resources/admin/attachment_resource.rb} +6 -5
  101. data/app/{serializers/admin/image_serializer.rb → resources/admin/image_resource.rb} +9 -9
  102. data/app/resources/admin/page_file_resource.rb +10 -0
  103. data/app/{serializers/admin/page_image_serializer.rb → resources/admin/page_image_resource.rb} +4 -2
  104. data/app/resources/export/attachment_resource.rb +10 -0
  105. data/app/resources/export/page_image_resource.rb +45 -0
  106. data/app/resources/export/page_resource.rb +42 -0
  107. data/app/{serializers/page_image_serializer.rb → resources/page_image_resource.rb} +8 -16
  108. data/app/resources/page_resource.rb +33 -0
  109. data/app/services/pages_core/destroy_invite_service.rb +2 -2
  110. data/app/services/pages_core/invite_service.rb +2 -2
  111. data/app/views/admin/pages/_edit_content.html.erb +1 -1
  112. data/app/views/admin/pages/_edit_files.html.erb +1 -5
  113. data/app/views/admin/pages/_edit_images.html.erb +1 -5
  114. data/app/views/admin/pages/_edit_options.html.erb +74 -55
  115. data/app/views/admin/pages/_form.html.erb +19 -0
  116. data/app/views/admin/pages/edit.html.erb +35 -61
  117. data/app/views/admin/pages/index.html.erb +0 -1
  118. data/app/views/admin/pages/new.html.erb +32 -32
  119. data/app/views/admin/users/_access_control.html.erb +5 -1
  120. data/app/views/admin/users/login.html.erb +12 -4
  121. data/app/views/feeds/pages.rss.builder +1 -2
  122. data/app/views/layouts/admin/_header.html.erb +1 -1
  123. data/app/views/layouts/admin/_page_header.html.erb +33 -0
  124. data/app/views/layouts/admin.html.erb +23 -42
  125. data/app/views/pages_core/_google_analytics.html.erb +8 -0
  126. data/db/migrate/20180625154059_enable_search_extensions.rb +10 -0
  127. data/db/migrate/20210209151400_create_search_configurations.rb +35 -0
  128. data/db/migrate/20210210235200_create_search_documents.rb +74 -0
  129. data/lib/pages_core/engine.rb +1 -5
  130. data/lib/pages_core/templates/block_configuration.rb +1 -1
  131. data/lib/pages_core/templates/configuration_handler.rb +1 -1
  132. data/lib/pages_core/version.rb +3 -1
  133. data/lib/pages_core.rb +3 -5
  134. data/lib/rails/generators/pages_core/frontend/frontend_generator.rb +0 -7
  135. data/lib/rails/generators/pages_core/install/templates/page_templates_initializer.rb +2 -2
  136. metadata +116 -115
  137. data/app/assets/javascripts/pages/admin/components/attachment.jsx +0 -130
  138. data/app/assets/javascripts/pages/admin/components/attachment_editor.jsx +0 -131
  139. data/app/assets/javascripts/pages/admin/components/attachments.jsx +0 -211
  140. data/app/assets/javascripts/pages/admin/components/drag_uploader.jsx +0 -174
  141. data/app/assets/javascripts/pages/admin/components/editable_image.jsx +0 -57
  142. data/app/assets/javascripts/pages/admin/components/file_upload_button.jsx +0 -44
  143. data/app/assets/javascripts/pages/admin/components/grid_image.jsx +0 -124
  144. data/app/assets/javascripts/pages/admin/components/image_editor.jsx +0 -496
  145. data/app/assets/javascripts/pages/admin/components/image_grid.jsx +0 -306
  146. data/app/assets/javascripts/pages/admin/components/image_uploader.jsx +0 -176
  147. data/app/assets/javascripts/pages/admin/components/modal_store.jsx +0 -20
  148. data/app/assets/javascripts/pages/admin/components/rich_text_area.jsx +0 -64
  149. data/app/assets/javascripts/pages/admin/components/rich_text_toolbar.jsx +0 -91
  150. data/app/assets/javascripts/pages/admin/components/toast.jsx +0 -34
  151. data/app/assets/javascripts/pages/admin/components/toast_store.jsx +0 -52
  152. data/app/assets/javascripts/pages/admin/components.jsx +0 -2
  153. data/app/assets/javascripts/pages/admin/features/content_tabs.jsx +0 -72
  154. data/app/assets/javascripts/pages/admin/features/edit_page.jsx +0 -97
  155. data/app/assets/javascripts/pages/admin/features/rich_text.jsx +0 -14
  156. data/app/assets/javascripts/pages/admin/features/tag_editor.jsx +0 -160
  157. data/app/assets/javascripts/pages/admin.jsx +0 -17
  158. data/app/assets/javascripts/pages/login_form.jsx +0 -21
  159. data/app/serializers/admin/page_file_serializer.rb +0 -8
  160. data/app/serializers/page_export_serializer.rb +0 -32
  161. data/app/serializers/page_file_export_serializer.rb +0 -6
  162. data/app/serializers/page_image_export_serializer.rb +0 -42
  163. data/app/serializers/page_serializer.rb +0 -23
  164. data/app/views/layouts/admin/_analytics.html.erb +0 -16
  165. data/lib/rails/generators/pages_core/frontend/templates/application.js.erb +0 -15
  166. data/vendor/assets/javascripts/ReactCrop.min.js +0 -1
  167. data/vendor/assets/javascripts/reflux.min.js +0 -1
@@ -14,6 +14,7 @@
14
14
  font-size: 14px;
15
15
  color: $c-warn-light;
16
16
  text-shadow: 0px 0px 5px rgba(0, 0, 0, 1.0);
17
+ z-index: 100;
17
18
  }
18
19
 
19
20
  img {
@@ -135,10 +135,7 @@ $grid-image-padding: 7px;
135
135
  }
136
136
 
137
137
  .grid {
138
- width: 66.67%;
139
- @include breakpoint-mobile {
140
- width: 100%;
141
- }
138
+ width: 100%;
142
139
  .images {
143
140
  position: relative;
144
141
  display: flex;
@@ -148,7 +145,7 @@ $grid-image-padding: 7px;
148
145
  display: flex;
149
146
  flex-direction: column;
150
147
  justify-content: flex-end;
151
- width: 25%;
148
+ width: 16.66%;
152
149
  @include breakpoint-max(1150px) {
153
150
  width: 50%;
154
151
  }
@@ -159,6 +156,19 @@ $grid-image-padding: 7px;
159
156
  }
160
157
  }
161
158
 
159
+ .editable-image {
160
+ padding-bottom: 75%;
161
+ img {
162
+ position: absolute;
163
+ top: 0px;
164
+ left: 0px;
165
+ width: 100%;
166
+ height: 100%;
167
+ object-fit: contain;
168
+ object-position: 50% 50%;
169
+ }
170
+ }
171
+
162
172
  .drop-target {
163
173
  margin: 10px $grid-image-padding;
164
174
  padding-top: 10px;
@@ -168,6 +178,24 @@ $grid-image-padding: 7px;
168
178
  }
169
179
  }
170
180
 
181
+ &.with-primary-image {
182
+ .grid {
183
+ width: 66.67%;
184
+ @include breakpoint-mobile {
185
+ width: 100%;
186
+ }
187
+ }
188
+ .images .grid-image {
189
+ width: 25%;
190
+ @include breakpoint-max(1150px) {
191
+ width: 50%;
192
+ }
193
+ @include breakpoint-mobile {
194
+ width: 50%;
195
+ }
196
+ }
197
+ }
198
+
171
199
  .drag-image {
172
200
  position: absolute;
173
201
  width: 150px;
@@ -17,7 +17,8 @@ html, body {
17
17
  display: flex;
18
18
  flex-flow: column nowrap;
19
19
  height: 100vh;
20
- > * {
20
+ > *,
21
+ .main-wrapper {
21
22
  flex-shrink: 0;
22
23
  }
23
24
  }
@@ -24,3 +24,9 @@ main .login-form {
24
24
  }
25
25
  }
26
26
  }
27
+
28
+ .login-tab {
29
+ &.hidden {
30
+ display: none;
31
+ }
32
+ }
@@ -0,0 +1,5 @@
1
+ .content-tab {
2
+ &.hidden {
3
+ display: none;
4
+ }
5
+ }
@@ -12,13 +12,24 @@
12
12
  display: block;
13
13
  float: left;
14
14
  margin: 0 5px 5px 0;
15
- padding: 0px 10px;
15
+ padding: 0px;
16
16
  background: $c-background-disabled;
17
17
  border-radius: 5px;
18
18
  line-height: 26px;
19
19
  line-height: 36px;
20
20
  min-width: 40px;
21
21
  transition: all 200ms ease-out;
22
+ -webkit-user-select: none;
23
+ -khtml-user-select: none;
24
+ -moz-user-select: none;
25
+ -ms-user-select: none;
26
+ user-select: none;
27
+
28
+ label {
29
+ margin: 0px;
30
+ padding: 0px 10px;
31
+ color: inherit;
32
+ }
22
33
 
23
34
  input {
24
35
  margin: 2px 3px 0 0;
@@ -30,10 +41,6 @@
30
41
  }
31
42
 
32
43
  &.enabled {
33
- //background: #396e97;
34
- //border-color: #274b67;
35
- //text-shadow: #274b67 1px 1px 1px;
36
-
37
44
  color: #fff;
38
45
  background: $c-link;
39
46
  background: $c-blue-dark;
@@ -49,8 +56,7 @@
49
56
  input.add-tag {
50
57
  margin-top: 0px;
51
58
  border-radius: 5px;
52
- //margin: 0 4px 0 0;
53
- //padding: 4px 3px 3px 3px;
59
+ margin: 0 4px 0 0;
54
60
 
55
61
  &.example {
56
62
  color: $c-text-light;
@@ -126,24 +126,32 @@
126
126
  }
127
127
 
128
128
  .edit-page {
129
- padding-top: 1px;
130
129
  width: auto;
131
130
 
131
+ main div.content {
132
+ padding-top: 16px;
133
+ }
134
+
132
135
  .hidden-options {
133
136
  display: none;
134
137
  }
135
138
 
139
+ .autopublish-notice,
140
+ .published-date,
136
141
  .advanced-options {
137
- visibility: none;
142
+ display: none;
143
+ &.show {
144
+ display: block;
145
+ }
138
146
  }
139
147
 
140
- main & input[type=text],
141
- main & textarea {
148
+ main input[type=text],
149
+ main textarea {
142
150
  width: 100%;
143
151
  max-width: 100%;
144
152
  }
145
153
 
146
- main & input.page_title {
154
+ main input.page_title {
147
155
  font-weight: bold;
148
156
  font-size: 1.4em;
149
157
  color: $c-text;
@@ -1,4 +1,3 @@
1
- @import 'jquery-ui';
2
1
  @import 'ReactCrop';
3
2
  @import 'font-awesome';
4
3
  @import 'admin/vars';
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Admin
4
- class AdminController < PagesCore::AdminController #:nodoc:
4
+ class AdminController < PagesCore::AdminController # :nodoc:
5
5
  end
6
6
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class ApplicationController < PagesCore::BaseController #:nodoc:
3
+ class ApplicationController < PagesCore::BaseController # :nodoc:
4
4
  helper :all
5
5
  protect_from_forgery with: :exception
6
6
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class AttachmentsController < PagesCore::AttachmentsController #:nodoc:
3
+ class AttachmentsController < PagesCore::AttachmentsController # :nodoc:
4
4
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class FrontendController < PagesCore::FrontendController #:nodoc:
3
+ class FrontendController < PagesCore::FrontendController # :nodoc:
4
4
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class ImagesController < PagesCore::ImagesController #:nodoc:
3
+ class ImagesController < PagesCore::ImagesController # :nodoc:
4
4
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class PageFilesController < PagesCore::Frontend::PageFilesController #:nodoc:
3
+ class PageFilesController < PagesCore::Frontend::PageFilesController # :nodoc:
4
4
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class PagesController < PagesCore::Frontend::PagesController #:nodoc:
3
+ class PagesController < PagesCore::Frontend::PagesController # :nodoc:
4
4
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class SitemapsController < PagesCore::SitemapsController #:nodoc:
3
+ class SitemapsController < PagesCore::SitemapsController # :nodoc:
4
4
  end
@@ -44,7 +44,7 @@ module Admin
44
44
  end
45
45
 
46
46
  def render_attachment(attachment)
47
- render json: attachment, serializer: Admin::AttachmentSerializer
47
+ render json: Admin::AttachmentResource.new(attachment)
48
48
  end
49
49
  end
50
50
  end
@@ -16,20 +16,14 @@ module Admin
16
16
  @image = Image.create(image_params)
17
17
 
18
18
  respond_to do |format|
19
- format.json do
20
- if @image.valid?
21
- render json: @image, serializer: Admin::ImageSerializer
22
- else
23
- render json: { status: "error", error: @image.errors.first }
24
- end
25
- end
19
+ format.json { render_image_json(@image) }
26
20
  end
27
21
  end
28
22
 
29
23
  def update
30
24
  @image.update(image_params)
31
25
  respond_to do |format|
32
- format.json { render action: :show }
26
+ format.json { render_image_json(@image) }
33
27
  end
34
28
  end
35
29
 
@@ -55,5 +49,14 @@ module Admin
55
49
  def find_image
56
50
  @image = Image.find(params[:id])
57
51
  end
52
+
53
+ def render_image_json(image)
54
+ if image.valid?
55
+ render json: Admin::ImageResource.new(image)
56
+ else
57
+ render json: { status: "error",
58
+ error: image.errors.first.full_message }
59
+ end
60
+ end
58
61
  end
59
62
  end
@@ -19,17 +19,22 @@ module PagesCore
19
19
  end
20
20
 
21
21
  def authenticate!(user)
22
- user.mark_active!
23
- @current_user = user
22
+ reset_session
23
+ authenticated(user)
24
24
  end
25
25
 
26
26
  def deauthenticate!
27
27
  @current_user = nil
28
- session[:current_user_id] = nil
28
+ reset_session
29
29
  end
30
30
 
31
31
  protected
32
32
 
33
+ def authenticated(user)
34
+ user.mark_active!
35
+ @current_user = user
36
+ end
37
+
33
38
  def start_authenticated_session
34
39
  if session[:current_user_id]
35
40
  user = User.where(id: session[:current_user_id]).first
@@ -37,7 +42,7 @@ module PagesCore
37
42
 
38
43
  return unless user&.can_login?
39
44
 
40
- authenticate!(user)
45
+ authenticated(user)
41
46
  end
42
47
 
43
48
  def finalize_authenticated_session
@@ -11,6 +11,7 @@ module PagesCore
11
11
  def preview
12
12
  redirect_to(page_url(@locale, @page)) && return unless logged_in?
13
13
 
14
+ @preview = true
14
15
  @page.attributes = page_params.merge(
15
16
  status: 2,
16
17
  published_at: Time.zone.now,
@@ -20,6 +21,10 @@ module PagesCore
20
21
  render_page
21
22
  end
22
23
 
24
+ def preview?
25
+ @preview || false
26
+ end
27
+
23
28
  private
24
29
 
25
30
  def disable_xss_protection
@@ -27,8 +27,11 @@ module PagesCore
27
27
  def show
28
28
  respond_to do |format|
29
29
  format.html { render_published_page(@page) }
30
- format.rss { render_rss(@page.pages.limit(20), title: @page.name) }
31
- format.json { render json: @page }
30
+ format.json { render json: PageResource.new(@page) }
31
+ format.rss do
32
+ render_rss(@page.pages.limit(20).includes(:image, :author),
33
+ title: @page.name)
34
+ end
32
35
  end
33
36
  end
34
37
 
@@ -9,7 +9,7 @@ class SessionsController < ::ApplicationController
9
9
  redirect_to admin_default_url
10
10
  else
11
11
  flash[:notice] = "The provided email address and password combination " \
12
- "was not valid"
12
+ "was not valid"
13
13
  redirect_to login_admin_users_url
14
14
  end
15
15
  end
@@ -4,13 +4,13 @@ module PagesCore
4
4
  class LinkRenderer < WillPaginate::ActionView::LinkRenderer
5
5
  def previous_page
6
6
  num = @collection.current_page > 1 &&
7
- @collection.current_page - 1
7
+ (@collection.current_page - 1)
8
8
  previous_or_next_page(num, "Previous", "previous")
9
9
  end
10
10
 
11
11
  def next_page
12
12
  num = @collection.current_page < total_pages &&
13
- @collection.current_page + 1
13
+ (@collection.current_page + 1)
14
14
  previous_or_next_page(num, "Next", "next")
15
15
  end
16
16
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module ApplicationHelper #:nodoc:
3
+ module ApplicationHelper # :nodoc:
4
4
  include PagesCore::ApplicationHelper
5
5
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module FrontendHelper #:nodoc:
3
+ module FrontendHelper # :nodoc:
4
4
  include PagesCore::FrontendHelper
5
5
  end
@@ -20,8 +20,11 @@ module PagesCore
20
20
  private
21
21
 
22
22
  def content_tab_tag(key, content)
23
- tag.div(content, class: "content_tab",
24
- id: "content-tab-#{key}")
23
+ tag.div(content,
24
+ class: "content-tab",
25
+ id: "content-tab-#{key}",
26
+ data: { tab: key,
27
+ "main-target" => "tab" })
25
28
  end
26
29
  end
27
30
  end
@@ -31,7 +31,7 @@ module PagesCore
31
31
  return {} unless image
32
32
 
33
33
  { src: dynamic_image_path(image, size: "#{width * 2}x"),
34
- image: ::Admin::ImageSerializer.new(image) }
34
+ image: ::Admin::ImageResource.new(image).to_hash }
35
35
  end
36
36
 
37
37
  def editable_image_options(image, width: 250, caption: false, locale: nil)
@@ -39,8 +39,7 @@ module PagesCore
39
39
  width: width,
40
40
  caption: caption,
41
41
  locale: locale || I18n.default_locale,
42
- locales: PagesCore.config.locales,
43
- csrf_token: form_authenticity_token
42
+ locales: PagesCore.config.locales
44
43
  )
45
44
  end
46
45
  end
@@ -3,45 +3,15 @@
3
3
  module PagesCore
4
4
  module Admin
5
5
  module TagEditorHelper
6
- def tag_editor_for(
7
- form_helper, item, field_name = :serialized_tags, options = {}
8
- )
9
- tags = options[:tags] || Tag.tags_and_suggestions_for(item, limit: 20)
10
- tagged = options[:tagged] || item.tags
11
- options[:placeholder] ||= "Add tag..."
12
- tag.div(class: "tag-editor clearfix") do
13
- form_helper.hidden_field(field_name, class: "serialized_tags") +
14
- tag_check_boxes(tags, tagged) +
15
- add_tag_button(options)
16
- end
17
- end
18
-
19
- private
20
-
21
- def tag_check_box(tag_instance, tagged)
22
- tag.span(class: :tag) do
23
- check_box_tag(
24
- "tag-#{tag_instance.id}",
25
- 1,
26
- tagged.include?(tag_instance)
27
- ) + tag.span(tag_instance.name, class: :name)
28
- end
29
- end
30
-
31
- def tag_check_boxes(tags, tagged)
32
- tag.div(class: :tags) do
33
- safe_join(tags.map { |t| tag_check_box(t, tagged) }, "")
34
- end
35
- end
36
-
37
- def add_tag_button(options = {})
38
- tag.div(class: "add-tag-form") do
39
- text_field_tag(
40
- "add_tag",
41
- options[:placeholder],
42
- class: "add-tag"
43
- ) + tag.button("Add", class: "add-tag-button")
44
- end
6
+ def tag_editor_for(form, object, attribute: :serialized_tags)
7
+ object ||= form.object
8
+ react_component(
9
+ "TagEditor",
10
+ { enabled: object.tags.map(&:name),
11
+ tags: Tag.tags_and_suggestions_for(object, limit: 20)
12
+ .map(&:name),
13
+ name: "#{form.object_name}[#{attribute}]" }
14
+ )
45
15
  end
46
16
  end
47
17
  end
@@ -48,14 +48,8 @@ module PagesCore
48
48
  # google_analytics_tags "UA-12345678-1"
49
49
  #
50
50
  def google_analytics_tags(account_id)
51
- javascript_tag(
52
- "(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||" \
53
- "function(){\n (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new " \
54
- "Date();a=s.createElement(o),\nm=s.getElementsByTagName(o)[0];" \
55
- "a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n})(window," \
56
- "document,'script','//www.google-analytics.com/analytics.js','ga');" \
57
- "\n\nga('create', '#{account_id}', 'auto');\nga('send', 'pageview');"
58
- )
51
+ render(partial: "pages_core/google_analytics",
52
+ locals: { account_id: account_id })
59
53
  end
60
54
 
61
55
  # Outputs a HTML5 doctype and head tags, with document title
@@ -87,13 +81,10 @@ module PagesCore
87
81
  # rss_link_tag "My feed", "feed.rss"
88
82
  #
89
83
  def rss_link_tag(title, href)
90
- tag(
91
- :link,
92
- rel: "alternate",
93
- type: "application/rss+xml",
94
- title: title,
95
- href: href
96
- )
84
+ tag.link(rel: "alternate",
85
+ type: "application/rss+xml",
86
+ title: title,
87
+ href: href)
97
88
  end
98
89
 
99
90
  # Outputs Typekit tags.
@@ -111,11 +102,11 @@ module PagesCore
111
102
 
112
103
  def head_tag_contents(block_output)
113
104
  [
114
- tag(:meta, charset: "utf-8"),
115
- tag(:meta, "http-equiv" => "X-UA-Compatible", "content" => "IE=edge"),
105
+ tag.meta(charset: "utf-8"),
106
+ tag.meta("http-equiv" => "X-UA-Compatible", "content" => "IE=edge"),
116
107
  tag.title(document_title),
117
108
  meta_description_tag, meta_keywords_tag,
118
- (tag(:link, rel: "image_src", href: meta_image) if meta_image?),
109
+ (tag.link(rel: "image_src", href: meta_image) if meta_image?),
119
110
  open_graph_tags,
120
111
  csrf_meta_tags,
121
112
  block_output
@@ -125,13 +116,13 @@ module PagesCore
125
116
  def meta_description_tag
126
117
  return unless meta_description?
127
118
 
128
- tag(:meta, name: "description", content: meta_description)
119
+ tag.meta(name: "description", content: meta_description)
129
120
  end
130
121
 
131
122
  def meta_keywords_tag
132
123
  return unless meta_keywords?
133
124
 
134
- tag(:meta, name: "keywords", content: meta_keywords)
125
+ tag.meta(name: "keywords", content: meta_keywords)
135
126
  end
136
127
  end
137
128
  end
@@ -13,7 +13,7 @@ module PagesCore
13
13
  properties
14
14
  .delete_if { |_, content| content.nil? }
15
15
  .map do |name, content|
16
- tag(:meta, property: "og:#{name}", content: content)
16
+ tag.meta(property: "og:#{name}", content: content)
17
17
  end,
18
18
  "\n"
19
19
  )
@@ -0,0 +1,2 @@
1
+ import startPages from "./index.js";
2
+ startPages();