[deploy] Prepare the database for the configurable navigation items (#10662)
* feat: add the order of the navigational items to the database + admin interface * refactor: rename :display_when_signed_in to :display_only_when_signed_in * chore: rename all instances of display_when_signed_in to display_only_when_signed_in * feat: add a data script that will setup the base urls * feat: add a temporary rake file that will allow us to seed prod db's * chore: oops rename file * chore: remove the index for now * chore: remove validation * feat: change the order field to position and add an index o the name and url * feat: update everything that uses order to position * refactor: order by name as a secondary attr
This commit is contained in:
parent
c53522a8a8
commit
19c78d6072
11 changed files with 122 additions and 11 deletions
|
|
@ -1,12 +1,12 @@
|
|||
module Admin
|
||||
class NavigationLinksController < Admin::ApplicationController
|
||||
ALLOWED_PARAMS = %i[
|
||||
name url icon display_when_signed_in
|
||||
name url icon display_only_when_signed_in position
|
||||
].freeze
|
||||
layout "admin"
|
||||
|
||||
def index
|
||||
@navigation_links = NavigationLink.order(:name)
|
||||
@navigation_links = NavigationLink.order(position: :asc, name: :asc)
|
||||
end
|
||||
|
||||
def create
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ class NavigationLink < ApplicationRecord
|
|||
SVG_REGEXP = /<svg .*>/i.freeze
|
||||
|
||||
validates :name, :url, :icon, presence: true
|
||||
validates :url, url: { schemes: %w[https http] }
|
||||
validates :url, url: { schemes: %w[https http] }, uniqueness: { scope: :name }
|
||||
validates :icon, format: SVG_REGEXP
|
||||
validates :display_when_signed_in, inclusion: { in: [true, false] }
|
||||
validates :display_only_when_signed_in, inclusion: { in: [true, false] }
|
||||
end
|
||||
|
|
|
|||
|
|
@ -30,8 +30,12 @@
|
|||
<%= form.text_area :icon, class: "form-control" %>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<%= form.check_box :display_when_signed_in %>
|
||||
<%= form.label :display_when_signed_in %>
|
||||
<%= form.label :position %>
|
||||
<%= form.number_field :position, class: "form-control" %>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<%= form.check_box :display_only_when_signed_in %>
|
||||
<%= form.label :display_only_when_signed_in %>
|
||||
</div>
|
||||
<%= form.submit "Add link", class: "crayons-btn" %>
|
||||
<% end %>
|
||||
|
|
|
|||
|
|
@ -29,8 +29,12 @@
|
|||
<%= form.text_field :icon, class: "form-control" %>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<%= form.check_box :display_when_signed_in %>
|
||||
<%= form.label :display_when_signed_in %>
|
||||
<%= form.label :position %>
|
||||
<%= form.number_field :position, class: "form-control" %>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<%= form.check_box :display_only_when_signed_in %>
|
||||
<%= form.label :display_only_when_signed_in %>
|
||||
</div>
|
||||
<%= form.submit class: "btn btn-primary" %>
|
||||
<% end %>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
<%= render "add_navigation_link_modal" %>
|
||||
<% @navigation_links.each do |link| %>
|
||||
<div class="flex pt-5">
|
||||
<div class="flex pt-5 items-center">
|
||||
<div class="mr-5"><%= link.position %></div>
|
||||
<div class="admin-navigation-links">
|
||||
<a href="<%= link[:url] %>" class="crayons-link crayons-link--block bg-base-20">
|
||||
<div class="crayons-icon crayons-icon--default">
|
||||
|
|
|
|||
|
|
@ -0,0 +1,5 @@
|
|||
class ChangeDisplayWhenSignedInColumnName < ActiveRecord::Migration[6.0]
|
||||
def change
|
||||
safety_assured { rename_column :navigation_links, :display_when_signed_in, :display_only_when_signed_in }
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
class AddPositionToNavigationLinks < ActiveRecord::Migration[6.0]
|
||||
def change
|
||||
add_column :navigation_links, :position, :integer
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
class AddUniqueIndexToNavigationLinksUrlAndName < ActiveRecord::Migration[6.0]
|
||||
disable_ddl_transaction!
|
||||
def change
|
||||
add_index :navigation_links, [:url, :name], unique: true, algorithm: :concurrently
|
||||
end
|
||||
end
|
||||
|
|
@ -10,7 +10,7 @@
|
|||
#
|
||||
# It's strongly recommended that you check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema.define(version: 2020_10_02_104711) do
|
||||
ActiveRecord::Schema.define(version: 2020_10_07_091041) do
|
||||
|
||||
# These are extensions that must be enabled in order to support this database
|
||||
enable_extension "citext"
|
||||
|
|
@ -671,11 +671,13 @@ ActiveRecord::Schema.define(version: 2020_10_02_104711) do
|
|||
|
||||
create_table "navigation_links", force: :cascade do |t|
|
||||
t.datetime "created_at", precision: 6, null: false
|
||||
t.boolean "display_when_signed_in", default: false
|
||||
t.boolean "display_only_when_signed_in", default: false
|
||||
t.string "icon", null: false
|
||||
t.string "name", null: false
|
||||
t.integer "position"
|
||||
t.datetime "updated_at", precision: 6, null: false
|
||||
t.string "url", null: false
|
||||
t.index ["url", "name"], name: "index_navigation_links_on_url_and_name", unique: true
|
||||
end
|
||||
|
||||
create_table "notes", force: :cascade do |t|
|
||||
|
|
|
|||
|
|
@ -0,0 +1,26 @@
|
|||
module DataUpdateScripts
|
||||
class AddNavigationLinks
|
||||
PROTOCOL = ApplicationConfig["APP_PROTOCOL"].freeze
|
||||
DOMAIN = Rails.application&.initialized? ? SiteConfig.app_domain : ApplicationConfig["APP_DOMAIN"]
|
||||
BASE_URL = "#{PROTOCOL}#{DOMAIN}".freeze
|
||||
|
||||
READING_ICON = File.read(Rails.root.join("app/assets/images/twemoji/drawer.svg")).freeze
|
||||
THUMB_UP_ICON = File.read(Rails.root.join("app/assets/images/twemoji/thumb-up.svg")).freeze
|
||||
SMART_ICON = File.read(Rails.root.join("app/assets/images/twemoji/smart.svg")).freeze
|
||||
LOOK_ICON = File.read(Rails.root.join("app/assets/images/twemoji/look.svg")).freeze
|
||||
CONTACT_ICON = File.read(Rails.root.join("app/assets/images/twemoji/contact.svg")).freeze
|
||||
|
||||
def run
|
||||
NavigationLink.where(name: "Reading List", url: "#{BASE_URL}/readinglist", icon: READING_ICON,
|
||||
display_only_when_signed_in: true, position: 0).first_or_create
|
||||
NavigationLink.where(name: "Code of Conduct", url: "#{BASE_URL}/code-of-conduct", icon: THUMB_UP_ICON,
|
||||
display_only_when_signed_in: false, position: 1).first_or_create
|
||||
NavigationLink.where(name: "Privacy Policy", url: "#{BASE_URL}/privacy", icon: SMART_ICON,
|
||||
display_only_when_signed_in: false, position: 2).first_or_create
|
||||
NavigationLink.where(name: "Terms of use", url: "#{BASE_URL}/terms", icon: LOOK_ICON,
|
||||
display_only_when_signed_in: false, position: 3).first_or_create
|
||||
NavigationLink.where(name: "Contact", url: "#{BASE_URL}/contact", icon: CONTACT_ICON,
|
||||
display_only_when_signed_in: false, position: 4).first_or_create
|
||||
end
|
||||
end
|
||||
end
|
||||
58
lib/tasks/temporary/add_dev_navigation_links.rake
Normal file
58
lib/tasks/temporary/add_dev_navigation_links.rake
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
# rubocop:disable Metrics/BlockLength
|
||||
namespace :temporary do
|
||||
namespace :navigation_links do
|
||||
desc "Update DEV's navigation_links"
|
||||
task update_links: :environment do
|
||||
protocol = ApplicationConfig["APP_PROTOCOL"].freeze
|
||||
domain = Rails.application&.initialized? ? SiteConfig.app_domain : ApplicationConfig["APP_DOMAIN"]
|
||||
base_url = "#{protocol}#{domain}".freeze
|
||||
|
||||
reading_icon = File.read(Rails.root.join("app/assets/images/twemoji/drawer.svg")).freeze
|
||||
thumb_up_icon = File.read(Rails.root.join("app/assets/images/twemoji/thumb-up.svg")).freeze
|
||||
smart_icon = File.read(Rails.root.join("app/assets/images/twemoji/smart.svg")).freeze
|
||||
look_icon = File.read(Rails.root.join("app/assets/images/twemoji/look.svg")).freeze
|
||||
contact_icon = File.read(Rails.root.join("app/assets/images/twemoji/contact.svg")).freeze
|
||||
|
||||
# we can probably remove these icons once they in the database
|
||||
listing_icon = File.read(Rails.root.join("app/assets/images/twemoji/listing.svg")).freeze
|
||||
mic_icon = File.read(Rails.root.join("app/assets/images/twemoji/mic.svg")).freeze
|
||||
camera_icon = File.read(Rails.root.join("app/assets/images/twemoji/camera.svg")).freeze
|
||||
tag_icon = File.read(Rails.root.join("app/assets/images/twemoji/tag.svg")).freeze
|
||||
bulb_icon = File.read(Rails.root.join("app/assets/images/twemoji/bulb.svg")).freeze
|
||||
shopping_icon = File.read(Rails.root.join("app/assets/images/twemoji/shopping.svg")).freeze
|
||||
heart_icon = File.read(Rails.root.join("app/assets/images/twemoji/heart.svg")).freeze
|
||||
rainbowdev = File.read(Rails.root.join("app/assets/images/rainbowdev.svg")).freeze
|
||||
|
||||
NavigationLink.where(url: "#{base_url}/readinglist").first_or_create(name: "Reading List", icon: reading_icon,
|
||||
display_only_when_signed_in: true,
|
||||
position: 0)
|
||||
NavigationLink.where(url: "#{base_url}/listings").first_or_create(name: "Listings", icon: listing_icon,
|
||||
display_only_when_signed_in: false, position: 1)
|
||||
NavigationLink.where(url: "#{base_url}/pod").first_or_create(name: "Podcasts", icon: mic_icon,
|
||||
display_only_when_signed_in: false, position: 2)
|
||||
NavigationLink.where(url: "#{base_url}/videos").first_or_create(name: "Videos", icon: camera_icon,
|
||||
display_only_when_signed_in: false, position: 3)
|
||||
NavigationLink.where(url: "#{base_url}/tags").first_or_create(name: "Tags", icon: tag_icon,
|
||||
display_only_when_signed_in: false, position: 4)
|
||||
NavigationLink.where(url: "#{base_url}/code-of-conduct").first_or_create(name: "Code of Conduct",
|
||||
icon: thumb_up_icon,
|
||||
display_only_when_signed_in: false,
|
||||
position: 5)
|
||||
NavigationLink.where(url: "#{base_url}/faq").first_or_create(name: "FAQ", icon: bulb_icon,
|
||||
display_only_when_signed_in: false, position: 6)
|
||||
NavigationLink.where(url: "https://shop.dev.to/").first_or_create(name: "DEV Shop", icon: shopping_icon,
|
||||
display_only_when_signed_in: false, position: 7)
|
||||
NavigationLink.where(url: "#{base_url}/sponsors").first_or_create(name: "Sponsors", icon: heart_icon,
|
||||
display_only_when_signed_in: false, position: 8)
|
||||
NavigationLink.where(url: "#{base_url}/about").first_or_create(name: "About", icon: rainbowdev,
|
||||
display_only_when_signed_in: false, position: 9)
|
||||
NavigationLink.where(url: "#{base_url}/privacy").first_or_create(name: "Privacy Policy", icon: smart_icon,
|
||||
display_only_when_signed_in: false, position: 10)
|
||||
NavigationLink.where(url: "#{base_url}/terms").first_or_create(name: "Terms of use", icon: look_icon,
|
||||
display_only_when_signed_in: false, position: 11)
|
||||
NavigationLink.where(url: "#{base_url}/contact").first_or_create(name: "Contact", icon: contact_icon,
|
||||
display_only_when_signed_in: false, position: 12)
|
||||
end
|
||||
end
|
||||
end
|
||||
# rubocop:enable Metrics/BlockLength
|
||||
Loading…
Add table
Reference in a new issue