diff --git a/app/assets/stylesheets/admin.scss b/app/assets/stylesheets/admin.scss index 17e221cf7..fbb7a3176 100644 --- a/app/assets/stylesheets/admin.scss +++ b/app/assets/stylesheets/admin.scss @@ -293,6 +293,11 @@ $table-header: #ecf1f6; } } + .form-label { + font-weight: bold; + margin-bottom: 0; + } + .menu.simple { margin-bottom: $line-height / 2; diff --git a/app/assets/stylesheets/participation.scss b/app/assets/stylesheets/participation.scss index 371f44f58..947d347ff 100644 --- a/app/assets/stylesheets/participation.scss +++ b/app/assets/stylesheets/participation.scss @@ -1132,8 +1132,9 @@ .budget-header { @extend %brand-background; margin-top: -$line-height; + min-height: $line-height * 25; padding-bottom: $line-height; - padding-top: $line-height; + padding-top: $line-height * 4; .budget-title { font-weight: bold; @@ -1149,6 +1150,11 @@ } } + h1 { + font-size: rem-calc(60); + padding: $line-height * 2 0 $line-height; + } + h1, h2, p, @@ -1176,6 +1182,15 @@ text-transform: uppercase; } } + + .main-link { + @include regular-button($color: rgba(0, 0, 0, 0.5)); + + font-size: 1.25rem; + margin-bottom: $line-height * 2; + min-width: 30%; + text-decoration: none; + } } .jumbo-budget { diff --git a/app/components/admin/budgets/form_component.html.erb b/app/components/admin/budgets/form_component.html.erb index 57a3f8d44..621804c8f 100644 --- a/app/components/admin/budgets/form_component.html.erb +++ b/app/components/admin/budgets/form_component.html.erb @@ -5,19 +5,36 @@ <%= render "shared/errors", resource: budget %> <%= f.translatable_fields do |translations_form| %> -
<%= link_to t("budgets.index.section_header.help"), "#section_help" %>
diff --git a/app/controllers/admin/budgets_controller.rb b/app/controllers/admin/budgets_controller.rb index 572d55fc1..030a86916 100644 --- a/app/controllers/admin/budgets_controller.rb +++ b/app/controllers/admin/budgets_controller.rb @@ -61,6 +61,7 @@ class Admin::BudgetsController < Admin::BaseController valid_attributes = [:phase, :currency_symbol, :voting_style, + :main_link_url, administrator_ids: [], valuator_ids: [] ] + descriptions diff --git a/app/models/budget.rb b/app/models/budget.rb index dba0d6e0b..c7152676d 100644 --- a/app/models/budget.rb +++ b/app/models/budget.rb @@ -4,7 +4,7 @@ class Budget < ApplicationRecord include StatsVersionable include Reportable - translates :name, touch: true + translates :name, :main_link_text, touch: true include Globalizable class Translation @@ -27,6 +27,7 @@ class Budget < ApplicationRecord validates :currency_symbol, presence: true validates :slug, presence: true, format: /\A[a-z0-9\-_]+\z/ validates :voting_style, inclusion: { in: VOTING_STYLES } + validates :main_link_url, presence: true, if: -> { main_link_text.present? } has_many :investments, dependent: :destroy has_many :ballots, dependent: :destroy diff --git a/config/locales/en/activerecord.yml b/config/locales/en/activerecord.yml index e76c00725..cb49d44dd 100644 --- a/config/locales/en/activerecord.yml +++ b/config/locales/en/activerecord.yml @@ -160,7 +160,9 @@ en: voting_style: "Final voting style" voting_style_knapsack: "Knapsack" voting_style_approval: "Approval" + main_link_url: "The link takes you to (add a link)" budget/translation: + main_link_text: "Text on the link" name: "Name" budget/investment: heading_id: "Heading" diff --git a/config/locales/en/admin.yml b/config/locales/en/admin.yml index 144cb6503..1712cb291 100644 --- a/config/locales/en/admin.yml +++ b/config/locales/en/admin.yml @@ -121,6 +121,8 @@ en: empty_administrators: "There are no administrators" empty_valuators: "There are no valuators" name_description: "This is the name of the participatory budget used on the header and cards whenever it is active" + main_call_to_action: "Main call to action (optional)" + main_call_to_action_description: "This link will appear on main banner of this participatory budget and encourages your user to perform a specific action like creating a proposal, voting for existing ones, or learn more about the process." info: budget_settings: "General participatory budget settings" phases_settings: "Phases settings" @@ -1350,6 +1352,7 @@ en: color_help: Hexadecimal format show_results_and_stats: "Show results and stats" results_and_stats_reminder: "Marking these checkboxes the results and/or stats will be publicly available and every user will see them." + example_url: "https://consulproject.org" geozones: index: title: Geozone diff --git a/config/locales/es/activerecord.yml b/config/locales/es/activerecord.yml index 5811a7afe..775cff009 100644 --- a/config/locales/es/activerecord.yml +++ b/config/locales/es/activerecord.yml @@ -160,7 +160,9 @@ es: voting_style: "Estilo de la votación final" voting_style_knapsack: Bolsa de dinero voting_style_approval: Por aprobación + main_link_url: "El enlace te lleva a (añade un enlace)" budget/translation: + main_link_text: "Texto del enlace" name: "Nombre" budget/investment: heading_id: "Partida presupuestaria" diff --git a/config/locales/es/admin.yml b/config/locales/es/admin.yml index e45e5bb13..8394f896b 100644 --- a/config/locales/es/admin.yml +++ b/config/locales/es/admin.yml @@ -121,6 +121,8 @@ es: empty_administrators: "No hay administradores" empty_valuators: "No hay evaluadores" name_description: "Este es el nombre del presupuesto participativo usado en la cabecera y tarjetas cuando éste está activo" + main_call_to_action: "Enlace de acción principal (opcional)" + main_call_to_action_description: "Este enlace aparecerá en la cabecera de este presupuesto participativo y permite al usuario ejecutar una acción específica como crear una nueva propuesta, votar las existentes, o leer más sobre el funcionamiento de los presupuestos participativos." info: budget_settings: "Configuración genérica del presupuesto participativo" phases_settings: "Configuración de las fases" @@ -1349,6 +1351,7 @@ es: color_help: Formato hexadecimal show_results_and_stats: "Mostrar resultados y estadísticas" results_and_stats_reminder: "Si marcas estas casillas los resultados y/o estadísticas serán públicos y podrán verlos todos los usuarios." + example_url: "https://consulproject.org" geozones: index: title: Zonas diff --git a/db/migrate/20200213163214_add_main_link_to_budgets.rb b/db/migrate/20200213163214_add_main_link_to_budgets.rb new file mode 100644 index 000000000..35207c730 --- /dev/null +++ b/db/migrate/20200213163214_add_main_link_to_budgets.rb @@ -0,0 +1,6 @@ +class AddMainLinkToBudgets < ActiveRecord::Migration[5.2] + def change + add_column :budgets, :main_link_url, :string + add_column :budget_translations, :main_link_text, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 5d116c21b..d13bbd02f 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -318,6 +318,7 @@ ActiveRecord::Schema.define(version: 2021_01_23_100638) do t.datetime "created_at", null: false t.datetime "updated_at", null: false t.string "name" + t.string "main_link_text" t.index ["budget_id"], name: "index_budget_translations_on_budget_id" t.index ["locale"], name: "index_budget_translations_on_locale" end @@ -362,6 +363,7 @@ ActiveRecord::Schema.define(version: 2021_01_23_100638) do t.text "description_informing" t.string "voting_style", default: "knapsack" t.boolean "published" + t.string "main_link_url" end create_table "campaigns", id: :serial, force: :cascade do |t| diff --git a/spec/components/budgets/budget_component_spec.rb b/spec/components/budgets/budget_component_spec.rb index 799e03e12..6aafa1409 100644 --- a/spec/components/budgets/budget_component_spec.rb +++ b/spec/components/budgets/budget_component_spec.rb @@ -21,6 +21,22 @@ describe Budgets::BudgetComponent, type: :component do expect(page).to have_link("Help with participatory budgets") end end + + it "shows budget main link when defined" do + render_inline Budgets::BudgetComponent.new(budget) + + within(".budget-header") do + expect(page).not_to have_css("a.main-link") + end + + budget.update!(main_link_text: "Partitipate now!", main_link_url: "https://consulproject.org") + + render_inline Budgets::BudgetComponent.new(budget) + + within(".budget-header") do + expect(page).to have_css("a.main-link", text: "Participate now!", href: "https://consulproject.org") + end + end end describe "map" do diff --git a/spec/models/budget_spec.rb b/spec/models/budget_spec.rb index e82485cb7..bbe5835f1 100644 --- a/spec/models/budget_spec.rb +++ b/spec/models/budget_spec.rb @@ -114,6 +114,29 @@ describe Budget do end end + describe "main_link_url" do + it "is not required if main_link_text is not provided" do + valid_budget = build(:budget, main_link_text: nil) + + expect(valid_budget).to be_valid + end + + it "is required if main_link_text is provided" do + invalid_budget = build(:budget, main_link_text: "link text") + + expect(invalid_budget).not_to be_valid + expect(invalid_budget.errors.count).to be 1 + expect(invalid_budget.errors[:main_link_url].count).to be 1 + expect(invalid_budget.errors[:main_link_url].first).to eq "can't be blank" + end + + it "is valid if main_link_text and main_link_url are both provided" do + valid_budget = build(:budget, main_link_text: "Text link", main_link_url: "https://consulproject.org") + + expect(valid_budget).to be_valid + end + end + describe "phase" do it "is validated" do Budget::Phase::PHASE_KINDS.each do |phase| diff --git a/spec/models/concerns/globalizable.rb b/spec/models/concerns/globalizable.rb index dce50d4af..21f4bd556 100644 --- a/spec/models/concerns/globalizable.rb +++ b/spec/models/concerns/globalizable.rb @@ -13,6 +13,9 @@ shared_examples_for "globalizable" do |factory_name| let(:attribute) { required_fields.sample || fields.sample } before do + if factory_name == :budget + record.main_link_url = "https://consulproject.org" + end record.update!(attribute => "In English") I18n.with_locale(:es) do diff --git a/spec/system/admin/budgets_spec.rb b/spec/system/admin/budgets_spec.rb index 1f5a755d8..fd3b65a13 100644 --- a/spec/system/admin/budgets_spec.rb +++ b/spec/system/admin/budgets_spec.rb @@ -233,6 +233,21 @@ describe "Admin budgets", :admin do end end + scenario "Show CTA link in public site if added" do + visit edit_admin_budget_path(budget) + + expect(page).to have_content("Main call to action (optional)") + + fill_in "Text on the link", with: "Participate now" + fill_in "The link takes you to (add a link)", with: "https://consulproject.org" + click_button "Update Budget" + + expect(page).to have_content "Participatory budget updated successfully" + + visit budgets_path + expect(page).to have_link("Participate now", href: "https://consulproject.org") + end + scenario "Changing name for current locale will update the slug if budget is in draft phase" do budget.update!(published: false, name: "Old English Name") diff --git a/spec/system/admin/translatable_spec.rb b/spec/system/admin/translatable_spec.rb index 491efcf5d..4cf6868a8 100644 --- a/spec/system/admin/translatable_spec.rb +++ b/spec/system/admin/translatable_spec.rb @@ -122,7 +122,7 @@ describe "Admin edit translatable records", :admin do let(:translatable) { create(:budget_investment) } context "Input field" do - let(:translatable) { create(:budget) } + let(:translatable) { create(:budget, main_link_url: "https://consulproject.org") } scenario "Shows validation erros" do visit edit_admin_budget_path(translatable)