From 12369b49ec9c0942f4cd79c4eeadf1d19e449bde Mon Sep 17 00:00:00 2001 From: Tim Fischbach Date: Fri, 7 Aug 2020 09:36:50 +0200 Subject: [PATCH] Extract widget and page server rendering to Paged When we add server rendering to Scrolled, this will make it clearer which parts are reused and will allow aligning the structure of Paged and Scrolled. REDMINE-17566 --- .../pageflow_paged/application_controller.rb | 4 +-- .../page_background_asset_helper.rb | 7 +++-- .../react_server_side_rendering_helper.rb | 2 +- .../page_background_asset/_element.html.erb | 0 .../pageflow_paged}/react/_widget.html.erb | 0 .../views/pageflow_paged}/react/page.html.erb | 0 entry_types/paged/lib/pageflow_paged/react.rb | 12 ++++++++ .../lib/pageflow_paged}/react/page_type.rb | 4 +-- .../lib/pageflow_paged}/react/widget_type.rb | 4 +-- .../page_background_asset_helper_spec.rb | 13 ++++---- .../paged/spec/pageflow_paged/react_spec.rb | 30 +++++++++++++++++++ lib/pageflow/react.rb | 6 ++-- spec/factories/published_entries.rb | 7 ++++- spec/pageflow/react_spec.rb | 30 ------------------- .../pageflow/render_page_test_helper.rb | 2 +- 15 files changed, 71 insertions(+), 50 deletions(-) rename {app/helpers/pageflow => entry_types/paged/app/helpers/pageflow_paged}/page_background_asset_helper.rb (51%) rename {app/helpers/pageflow => entry_types/paged/app/helpers/pageflow_paged}/react_server_side_rendering_helper.rb (97%) rename {app/views/pageflow => entry_types/paged/app/views/pageflow_paged}/page_background_asset/_element.html.erb (100%) rename {app/views/pageflow => entry_types/paged/app/views/pageflow_paged}/react/_widget.html.erb (100%) rename {app/views/pageflow => entry_types/paged/app/views/pageflow_paged}/react/page.html.erb (100%) create mode 100644 entry_types/paged/lib/pageflow_paged/react.rb rename {lib/pageflow => entry_types/paged/lib/pageflow_paged}/react/page_type.rb (93%) rename {lib/pageflow => entry_types/paged/lib/pageflow_paged}/react/widget_type.rb (85%) rename {spec/helpers/pageflow => entry_types/paged/spec/helpers/pageflow_paged}/page_background_asset_helper_spec.rb (84%) create mode 100644 entry_types/paged/spec/pageflow_paged/react_spec.rb delete mode 100644 spec/pageflow/react_spec.rb diff --git a/entry_types/paged/app/controllers/pageflow_paged/application_controller.rb b/entry_types/paged/app/controllers/pageflow_paged/application_controller.rb index e2414cf49c..6fb627492c 100644 --- a/entry_types/paged/app/controllers/pageflow_paged/application_controller.rb +++ b/entry_types/paged/app/controllers/pageflow_paged/application_controller.rb @@ -11,10 +11,10 @@ class ApplicationController < ActionController::Base helper Pageflow::InfoBoxHelper helper Pageflow::NavigationBarHelper helper Pageflow::OverviewHelper - helper Pageflow::PageBackgroundAssetHelper + helper PageBackgroundAssetHelper helper Pageflow::PagesHelper helper Pageflow::PageTypesHelper - helper Pageflow::ReactServerSideRenderingHelper + helper ReactServerSideRenderingHelper helper Pageflow::RevisionFileHelper helper Pageflow::SocialShareHelper helper Pageflow::SocialShareLinksHelper diff --git a/app/helpers/pageflow/page_background_asset_helper.rb b/entry_types/paged/app/helpers/pageflow_paged/page_background_asset_helper.rb similarity index 51% rename from app/helpers/pageflow/page_background_asset_helper.rb rename to entry_types/paged/app/helpers/pageflow_paged/page_background_asset_helper.rb index 8fe23f14f7..bc9a06d632 100644 --- a/app/helpers/pageflow/page_background_asset_helper.rb +++ b/entry_types/paged/app/helpers/pageflow_paged/page_background_asset_helper.rb @@ -1,10 +1,11 @@ -module Pageflow +module PageflowPaged + # Render image or video loop page backgrounds module PageBackgroundAssetHelper - include EntryJsonSeedHelper + include Pageflow::EntryJsonSeedHelper include ReactServerSideRenderingHelper def page_background_asset(page) - render('pageflow/page_background_asset/element', + render('pageflow_paged/page_background_asset/element', entry: @entry, page: page) end diff --git a/app/helpers/pageflow/react_server_side_rendering_helper.rb b/entry_types/paged/app/helpers/pageflow_paged/react_server_side_rendering_helper.rb similarity index 97% rename from app/helpers/pageflow/react_server_side_rendering_helper.rb rename to entry_types/paged/app/helpers/pageflow_paged/react_server_side_rendering_helper.rb index 3c7c5b95a0..ca9dc186ea 100644 --- a/app/helpers/pageflow/react_server_side_rendering_helper.rb +++ b/entry_types/paged/app/helpers/pageflow_paged/react_server_side_rendering_helper.rb @@ -1,4 +1,4 @@ -module Pageflow +module PageflowPaged # @api private module ReactServerSideRenderingHelper def render_page_react_component(entry, page, component_name) diff --git a/app/views/pageflow/page_background_asset/_element.html.erb b/entry_types/paged/app/views/pageflow_paged/page_background_asset/_element.html.erb similarity index 100% rename from app/views/pageflow/page_background_asset/_element.html.erb rename to entry_types/paged/app/views/pageflow_paged/page_background_asset/_element.html.erb diff --git a/app/views/pageflow/react/_widget.html.erb b/entry_types/paged/app/views/pageflow_paged/react/_widget.html.erb similarity index 100% rename from app/views/pageflow/react/_widget.html.erb rename to entry_types/paged/app/views/pageflow_paged/react/_widget.html.erb diff --git a/app/views/pageflow/react/page.html.erb b/entry_types/paged/app/views/pageflow_paged/react/page.html.erb similarity index 100% rename from app/views/pageflow/react/page.html.erb rename to entry_types/paged/app/views/pageflow_paged/react/page.html.erb diff --git a/entry_types/paged/lib/pageflow_paged/react.rb b/entry_types/paged/lib/pageflow_paged/react.rb new file mode 100644 index 0000000000..bd30768e20 --- /dev/null +++ b/entry_types/paged/lib/pageflow_paged/react.rb @@ -0,0 +1,12 @@ +module PageflowPaged + # Create React based page and widget types + module React + def self.create_page_type(name, options = {}) + PageflowPaged::React::PageType.new(name, options) + end + + def self.create_widget_type(name, role, options = {}) + PageflowPaged::React::WidgetType.new(name, role, options) + end + end +end diff --git a/lib/pageflow/react/page_type.rb b/entry_types/paged/lib/pageflow_paged/react/page_type.rb similarity index 93% rename from lib/pageflow/react/page_type.rb rename to entry_types/paged/lib/pageflow_paged/react/page_type.rb index 4a0b57cd01..6e80b0964b 100644 --- a/lib/pageflow/react/page_type.rb +++ b/entry_types/paged/lib/pageflow_paged/react/page_type.rb @@ -1,4 +1,4 @@ -module Pageflow +module PageflowPaged module React class PageType < Pageflow::PageType attr_reader :name, :component_name, :file_types @@ -13,7 +13,7 @@ def initialize(name, options) end def template_path - 'pageflow/react/page' + 'pageflow_paged/react/page' end def thumbnail_candidates diff --git a/lib/pageflow/react/widget_type.rb b/entry_types/paged/lib/pageflow_paged/react/widget_type.rb similarity index 85% rename from lib/pageflow/react/widget_type.rb rename to entry_types/paged/lib/pageflow_paged/react/widget_type.rb index 5088ab6d9d..a169d857da 100644 --- a/lib/pageflow/react/widget_type.rb +++ b/entry_types/paged/lib/pageflow_paged/react/widget_type.rb @@ -1,4 +1,4 @@ -module Pageflow +module PageflowPaged module React class WidgetType < Pageflow::WidgetType attr_reader :name, :role, :options @@ -18,7 +18,7 @@ def insert_point end def render(template, entry) - template.render(File.join('pageflow', 'react', 'widget'), + template.render(File.join('pageflow_paged', 'react', 'widget'), entry: entry, name: name, server_rendering: options[:server_rendering]) diff --git a/spec/helpers/pageflow/page_background_asset_helper_spec.rb b/entry_types/paged/spec/helpers/pageflow_paged/page_background_asset_helper_spec.rb similarity index 84% rename from spec/helpers/pageflow/page_background_asset_helper_spec.rb rename to entry_types/paged/spec/helpers/pageflow_paged/page_background_asset_helper_spec.rb index c2cfc990b8..aaff0ddc25 100644 --- a/spec/helpers/pageflow/page_background_asset_helper_spec.rb +++ b/entry_types/paged/spec/helpers/pageflow_paged/page_background_asset_helper_spec.rb @@ -1,14 +1,15 @@ require 'spec_helper' require 'pageflow/matchers/have_json_ld' +require 'pageflow/used_file_test_helper' -module Pageflow - describe PageBackgroundAssetHelper do +module PageflowPaged + RSpec.describe PageBackgroundAssetHelper, type: :helper do include UsedFileTestHelper describe '#page_background_asset' do it 'renders background image div' do - entry = PublishedEntry.new(create(:entry, :published)) + entry = create(:published_entry) image_file = create_used_file(:image_file, entry: entry) page = create(:page, revision: entry.revision, @@ -20,7 +21,7 @@ module Pageflow end it 'renders structured data for background image' do - entry = PublishedEntry.new(create(:entry, :published)) + entry = create(:published_entry) image_file = create_used_file(:image_file, entry: entry) page = create(:page, revision: entry.revision, @@ -32,7 +33,7 @@ module Pageflow end it 'renders structured data for background vodep' do - entry = PublishedEntry.new(create(:entry, :published)) + entry = create(:published_entry) video_file = create_used_file(:video_file, entry: entry) page = create(:page, revision: entry.revision, @@ -47,7 +48,7 @@ module Pageflow end it 'does not render structured data if feature is disabled' do - entry = PublishedEntry.new(create(:entry, :published, without_feature: 'structured_data')) + entry = create(:published_entry, without_feature: 'structured_data') image_file = create_used_file(:image_file, entry: entry) page = create(:page, revision: entry.revision, diff --git a/entry_types/paged/spec/pageflow_paged/react_spec.rb b/entry_types/paged/spec/pageflow_paged/react_spec.rb new file mode 100644 index 0000000000..139920029a --- /dev/null +++ b/entry_types/paged/spec/pageflow_paged/react_spec.rb @@ -0,0 +1,30 @@ +require 'spec_helper' + +module PageflowPaged + RSpec.describe React, type: :helper do + describe '.create_widget_type' do + it 'renders div with data-widget attribute' do + widget_type = PageflowPaged::React.create_widget_type('some_loading_spinner', + 'loading_spinner') + entry = create(:published_entry) + + html = widget_type.render(helper, entry) + + expect(html).to have_selector('[data-widget=some_loading_spinner]') + end + + it 'supports server side rendering' do + widget_type = PageflowPaged::React.create_widget_type('classic_loading_spinner', + 'loading_spinner', + server_rendering: true) + entry = create(:published_entry) + + helper.extend(Pageflow::EntryJsonSeedHelper) + helper.extend(ReactServerSideRenderingHelper) + html = widget_type.render(helper, entry) + + expect(html).to have_selector('.loading_spinner') + end + end + end +end diff --git a/lib/pageflow/react.rb b/lib/pageflow/react.rb index 1bc2bee6c1..3cbbd16b50 100644 --- a/lib/pageflow/react.rb +++ b/lib/pageflow/react.rb @@ -1,11 +1,13 @@ module Pageflow module React + # @deprecated Use `PageflowPaged::React.create_page_type` instead. def self.create_page_type(name, options = {}) - Pageflow::React::PageType.new(name, options) + PageflowPaged::React.create_page_type(name, options) end + # @deprecated Use `PageflowPaged::React.create_widget_type` instead. def self.create_widget_type(name, role, options = {}) - Pageflow::React::WidgetType.new(name, role, options) + PageflowPaged::React.create_widget_type(name, role, options) end end end diff --git a/spec/factories/published_entries.rb b/spec/factories/published_entries.rb index 0f8a2c12eb..0cbea37005 100644 --- a/spec/factories/published_entries.rb +++ b/spec/factories/published_entries.rb @@ -4,13 +4,18 @@ module Pageflow transient do type_name { 'paged' } revision_attributes { {} } + + with_feature { nil } + without_feature { nil } end initialize_with do PublishedEntry.new(create(:entry, :published, type_name: type_name, - published_revision_attributes: revision_attributes)) + published_revision_attributes: revision_attributes, + with_feature: with_feature, + without_feature: without_feature)) end to_create { |published_entry| published_entry.entry.save! } diff --git a/spec/pageflow/react_spec.rb b/spec/pageflow/react_spec.rb deleted file mode 100644 index fb7f7fe859..0000000000 --- a/spec/pageflow/react_spec.rb +++ /dev/null @@ -1,30 +0,0 @@ -require 'spec_helper' - -module Pageflow - describe React, type: :helper do - describe '.create_widget_type' do - it 'renders div with data-widget attribute' do - widget_type = Pageflow::React.create_widget_type('some_loading_spinner', - 'loading_spinner') - entry = PublishedEntry.new(create(:entry, :published)) - - html = widget_type.render(helper, entry) - - expect(html).to have_selector('[data-widget=some_loading_spinner]') - end - - it 'supports server side rendering' do - widget_type = Pageflow::React.create_widget_type('classic_loading_spinner', - 'loading_spinner', - server_rendering: true) - entry = PublishedEntry.new(create(:entry, :published)) - - helper.extend(EntryJsonSeedHelper) - helper.extend(ReactServerSideRenderingHelper) - html = widget_type.render(helper, entry) - - expect(html).to have_selector('.loading_spinner') - end - end - end -end diff --git a/spec/support/pageflow/render_page_test_helper.rb b/spec/support/pageflow/render_page_test_helper.rb index e1218000c1..d150ddf312 100644 --- a/spec/support/pageflow/render_page_test_helper.rb +++ b/spec/support/pageflow/render_page_test_helper.rb @@ -18,7 +18,7 @@ def render_page(page_type_or_page, configuration = {}) helper.extend(InfoBoxHelper) helper.extend(BackgroundImageHelper) helper.extend(EntryJsonSeedHelper) - helper.extend(PageBackgroundAssetHelper) + helper.extend(PageflowPaged::PageBackgroundAssetHelper) helper.extend(PagesHelper) helper.extend(VideoFilesHelper)