diff --git a/app/assets/stylesheets/article-show.scss b/app/assets/stylesheets/article-show.scss index 4c70ceae5..df72d5327 100644 --- a/app/assets/stylesheets/article-show.scss +++ b/app/assets/stylesheets/article-show.scss @@ -153,6 +153,17 @@ article { font-size: 57px; } + .article-title-preamble { + display: block; + color: var(--base-60); + font-size: calc(16px + 0.2vw); + margin-bottom: -1.25vw; + @media screen and (min-width: 1600px) { + font-size: 18px; + margin-bottom: -18px; + } + } + .title-block { display: inline-block; } diff --git a/app/dashboards/article_dashboard.rb b/app/dashboards/article_dashboard.rb index dceeac52f..8856a69d3 100644 --- a/app/dashboards/article_dashboard.rb +++ b/app/dashboards/article_dashboard.rb @@ -15,6 +15,8 @@ class ArticleDashboard < Administrate::BaseDashboard organization: Field::BelongsTo, id: Field::Number, title: Field::String, + search_optimized_title_preamble: Field::String, + search_optimized_description_replacement: Field::String, body_html: Field::Text, body_markdown: Field::Text, slug: Field::String, @@ -67,6 +69,8 @@ class ArticleDashboard < Administrate::BaseDashboard third_user_id organization title + search_optimized_title_preamble + search_optimized_description_replacement body_markdown slug social_image diff --git a/app/decorators/article_decorator.rb b/app/decorators/article_decorator.rb index f05865408..b4f1278b4 100644 --- a/app/decorators/article_decorator.rb +++ b/app/decorators/article_decorator.rb @@ -53,7 +53,17 @@ class ArticleDecorator < ApplicationDecorator published_at.to_i end + def title_with_query_preamble(user_signed_in) + if search_optimized_title_preamble.present? && !user_signed_in + "#{search_optimized_title_preamble}: #{title}" + else + title + end + end + def description_and_tags + return search_optimized_description_replacement if search_optimized_description_replacement.present? + modified_description = description.strip modified_description += "." unless description.end_with?(".") return modified_description if cached_tag_list.blank? diff --git a/app/views/articles/show.html.erb b/app/views/articles/show.html.erb index 2d05386ff..bd4f8b689 100644 --- a/app/views/articles/show.html.erb +++ b/app/views/articles/show.html.erb @@ -1,4 +1,4 @@ -<% title @article.title %> +<% title @article.title_with_query_preamble(user_signed_in?) %> <%= render "shared/webcomponents_loader_script" %> <%= javascript_packs_with_chunks_tag "clipboardCopy", "webShare", "articlePage", defer: true %> @@ -115,6 +115,9 @@ <% end %>

+ <% if @article.search_optimized_title_preamble.present? && !user_signed_in? %> + <%= @article.search_optimized_title_preamble %> + <% end %> <%= @article.title %>

diff --git a/db/migrate/20200511224704_add_query_friendly_admin_fields_to_articles.rb b/db/migrate/20200511224704_add_query_friendly_admin_fields_to_articles.rb new file mode 100644 index 000000000..1831ec23c --- /dev/null +++ b/db/migrate/20200511224704_add_query_friendly_admin_fields_to_articles.rb @@ -0,0 +1,6 @@ +class AddQueryFriendlyAdminFieldsToArticles < ActiveRecord::Migration[5.2] + def change + add_column :articles, :search_optimized_title_preamble, :string + add_column :articles, :search_optimized_description_replacement, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 0ce95f13f..2c24e340a 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_05_04_075409) do +ActiveRecord::Schema.define(version: 2020_05_11_224704) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -98,6 +98,8 @@ ActiveRecord::Schema.define(version: 2020_05_04_075409) do t.boolean "published", default: false t.datetime "published_at" t.boolean "published_from_feed", default: false + t.string "search_optimized_description_replacement" + t.string "search_optimized_title_preamble" t.integer "rating_votes_count", default: 0, null: false t.integer "reactions_count", default: 0, null: false t.integer "reading_time", default: 0 diff --git a/spec/decorators/article_decorator_spec.rb b/spec/decorators/article_decorator_spec.rb index c2839cb68..1203240df 100644 --- a/spec/decorators/article_decorator_spec.rb +++ b/spec/decorators/article_decorator_spec.rb @@ -174,5 +174,12 @@ RSpec.describe ArticleDecorator, type: :decorator do parsed_post_by_string += "." unless created_article.user.name.end_with?(".") expect(created_article.description_and_tags).to eq("#{parsed_post_by_string} Tagged with heytag.") end + + it "returns search_optimized_description_replacement if it is present" do + body_markdown = "---\ntitle: Title\npublished: false\ndescription:\ntags: heytag\n---\n\nHey this is the article" + search_optimized_description_replacement = "Hey this is the expected result" + expect(create_article(body_markdown: body_markdown, search_optimized_description_replacement: search_optimized_description_replacement). + description_and_tags).to eq(search_optimized_description_replacement) + end end end diff --git a/spec/requests/stories_show_spec.rb b/spec/requests/stories_show_spec.rb index 68b294169..009e4ecd0 100644 --- a/spec/requests/stories_show_spec.rb +++ b/spec/requests/stories_show_spec.rb @@ -31,6 +31,44 @@ RSpec.describe "StoriesShow", type: :request do expect(response.body).to include "#{CGI.escapeHTML(article.title)} - #{community_name}" end + # search_optimized_title_preamble + + it "renders title tag with search_optimized_title_preamble if set and not signed in" do + article.update_column(:search_optimized_title_preamble, "Hey this is a test") + get article.reload.path + expect(response.body).to include "Hey this is a test: #{CGI.escapeHTML(article.title)} - #{community_name}" + end + + it "does not render title tag with search_optimized_title_preamble if set and not signed in" do + sign_in user + article.update_column(:search_optimized_title_preamble, "Hey this is a test") + get article.path + expect(response.body).to include "#{CGI.escapeHTML(article.title)} - #{community_qualified_name} 👩‍💻👨‍💻" + end + + it "does not render preamble with search_optimized_title_preamble not signed in but search_optimized_title_preamble not set" do + get article.path + expect(response.body).to include "#{CGI.escapeHTML(article.title)} - #{community_name}" + end + + it "renders title preamble with search_optimized_title_preamble if set and not signed in" do + article.update_column(:search_optimized_title_preamble, "Hey this is a test") + get article.reload.path + expect(response.body).to include "Hey this is a test" + end + + it "does not render preamble with search_optimized_title_preamble if set and signed in" do + sign_in user + article.update_column(:search_optimized_title_preamble, "Hey this is a test") + get article.path + expect(response.body).not_to include "Hey this is a test" + end + + it "does not render title tag with search_optimized_title_preamble not signed in but search_optimized_title_preamble not set" do + get article.path + expect(response.body).not_to include "Hey this is a test" + end + it "renders second and third users if present" do # 3rd user doesn't seem to get rendered for some reason user2 = create(:user)