docbrown/app/views/admin/configs/show.html.erb
Arit Amana f7bd75cf32
Cypress tests for /admin/config Authentication Section (#12539)
* write tests for invite-only mode and auth-providers

* text edits

* modify specs in light of new e2e database setup

* Still working things out

* Added the admin user name to the e2e fixture data.

* Added testid for config sections.

* Fixed up test to use cypress-testing-library APIs.

* Fixed unsetting invite only mode, still need to reset it at end of test.

* Small fix for local e2e development.

* Complete all tests; generalize updateAdminConfig cypress command

* correct spec

* Complete implementation

* Address code review comments

* address code review comments #2

Co-authored-by: Nick Taylor <nick@dev.to>
2021-02-03 15:31:55 -05:00

1348 lines
74 KiB
Text
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<div class="grid gap-6" data-controller="config">
<% unless current_user.has_role?(:super_admin) %>
<div class="crayons-notice crayons-notice--info" role="alert">
<p class="mb-1">
Only users with <strong>Super Admin</strong> privileges may edit this page.
</p>
</div>
<% end %>
<div id="getStarted">
<div class="card w-100">
<div
id="getStartedHeader"
class="card-header"
data-toggle="collapse"
data-target="#getStartedBodyContainer"
aria-expanded="true"
aria-controls="getStartedBodyContainer">
<h2 class="d-inline">Get Started</h2>
<button
class="crayons-btn crayons-btn--secondary float-right"
type="button"
data-action="click->config#toggleAccordionButtonLabel">
<%= VerifySetupCompleted.setup_completed? ? "Show Getting Started" : "Hide Getting Started" %>
</button>
</div>
<div
id="getStartedBodyContainer"
class="<%= VerifySetupCompleted.setup_completed? ? "hide collapse" : "show expand" %> p-3"
aria-labelledby="getStartedHeader">
<%= form_for(SiteConfig.new, url: admin_config_path) do |f| %>
<fieldset class="flex flex-column gap-4">
<% VerifySetupCompleted::MANDATORY_CONFIGS.each do |config_key| %>
<%# we need to list the config as separate fields if the data structure is a Hash %>
<% if SiteConfig.public_send(config_key).is_a?(Hash) %>
<%= admin_config_label config_key.to_s %>
<div class="form-group">
<%= f.fields_for config_key do |a_field| %>
<% SiteConfig.public_send(config_key).each do |key, value| %>
<div class="crayons-field">
<%= admin_config_label key.to_s %>
<%= admin_config_description "#{key} #{config_key.to_s.tr! '_', ' '}" %>
<%= a_field.text_field key,
class: "crayons-textfield",
value: SiteConfig.public_send(config_key)[key],
placeholder: Constants::SiteConfig::DETAILS[config_key][:placeholder] %>
</div>
<% end %>
<% end %>
</div>
<% elsif SiteConfig.public_send(config_key).is_a?(Array) %>
<div class="crayons-field">
<%= admin_config_label config_key %>
<%= admin_config_description Constants::SiteConfig::DETAILS[config_key][:description] %>
<%= f.text_field config_key,
class: "crayons-textfield",
value: SiteConfig.public_send(config_key).join(","),
placeholder: Constants::SiteConfig::DETAILS[config_key][:placeholder] %>
</div>
<% else %>
<div class="crayons-field">
<%= admin_config_label config_key %>
<%= admin_config_description Constants::SiteConfig::DETAILS[config_key][:description] %>
<%= f.text_field config_key,
class: "form-control",
value: SiteConfig.public_send(config_key),
placeholder: Constants::SiteConfig::DETAILS[config_key][:placeholder] %>
</div>
<% end %>
<% end %>
<% if current_user.has_role?(:super_admin) %>
<div class="crayons-notice p-4 mt-4">
<div class="crayons-field">
<%= label_tag :confirmation_update, "Confirmation update", class: "crayons-field__label" %>
<p class="crayons-field__description">Type the sentence: <strong><%= @confirmation_text %></strong></p>
<div class="flex">
<%= text_field_tag :confirmation, nil, class: "crayons-textfield flex-1 mr-2", placeholder: "Confirmation text", autocomplete: "off", required: true, pattern: @confirmation_text %>
<%= f.submit "Update Site Configuration", class: "crayons-btn align-self-start" %>
</div>
</div>
</div>
<% end %>
</fieldset>
<% end %>
</div>
</div>
</div>
<div id="siteConfig">
<div class="card w-100">
<div
id="siteConfigHeader"
class="card-header"
data-toggle="collapse"
data-target="#siteConfigBodyContainer"
aria-expanded="true"
aria-controls="siteConfigBodyContainer">
<h2 class="d-inline">All Site Configuration</h2>
<button
class="crayons-btn crayons-btn--secondary float-right"
type="button"
data-action="click->config#toggleAccordionButtonLabel">
Hide Site Configuration
</button>
</div>
<div id="siteConfigBodyContainer" class="show expand p-3" aria-labelledby="siteConfigHeader">
<%= form_for(SiteConfig.new, url: admin_config_path) do |f| %>
<div class="card mt-3">
<%= render partial: "admin/shared/card_header",
locals: {
header: "API Tokens",
state: "collapse",
target: "apiBodyContainer",
expanded: false
} %>
<div id="apiBodyContainer" class="card-body collapse hide" aria-labelledby="apiBodyContainer">
<fieldset class="flex flex-column gap-4">
<div class="crayons-field">
<%= admin_config_label :health_check_token %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:health_check_token][:description] %>
<%= f.text_field :health_check_token,
class: "crayons-textfield",
value: SiteConfig.health_check_token,
placeholder: Constants::SiteConfig::DETAILS[:health_check_token][:placeholder] %>
</div>
<div class="crayons-field">
<%= admin_config_label :video_encoder_key %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:video_encoder_key][:description] %>
<%= f.text_field :video_encoder_key,
class: "crayons-textfield",
value: SiteConfig.video_encoder_key,
placeholder: Constants::SiteConfig::DETAILS[:video_encoder_key][:placeholder] %>
</div>
<%= render "form_submission", f: f %>
</fieldset>
</div>
</div>
<% end %>
<%= form_for(SiteConfig.new, url: admin_config_path, html: { data: { action: "submit->config#configUpdatePrecheck", "config-target": "authSectionForm", "testid": "authSectionForm" } }) do |f| %>
<div class="card mt-3">
<%= render partial: "admin/shared/card_header",
locals: {
header: "Authentication",
state: "collapse",
target: "authenticationBodyContainer",
expanded: false
} %>
<div id="authenticationBodyContainer" class="card-body collapse hide" aria-labelledby="authenticationBodyContainer">
<section class="mb-6">
<h3 class="crayons-subtitle-3 mb-3">
General settings
</h3>
<div
class="crayons-field crayons-field--checkbox <%= invite_only_mode_or_no_enabled_auth_options ? "crayons-tooltip" : "" %>"
data-tooltip="Unchecking this will enable Email Registration">
<%= f.check_box :invite_only_mode,
checked: invite_only_mode_or_no_enabled_auth_options,
data: { action: "config#adjustAuthenticationOptions", target: "config.inviteOnlyMode" },
class: "crayons-checkbox" %>
<div class="mt-0">
<%= admin_config_label :invite_only_mode, "Invite-only mode" %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:invite_only_mode][:description] %>
</div>
</div>
</section>
<section>
<header class="mb-2">
<h3 class="crayons-subtitle-3">
Registration options
</h3>
<p class="crayons-field__description">
How can people create an account on your community?
</p>
</header>
<section class="config-authentication__item mb-0">
<figure class="config-authentication__item--icon">
<%= inline_svg_tag("email.svg", class: "crayons-icon", aria: true, title: "Email icon") %>
</figure>
<div class="config-authentication__item--container">
<div
class="config-authentication__item--row flex items-center justify-between <%= tooltip_class_on_auth_provider_enablebtn %>"
data-tooltip="<%= tooltip_text_email_or_auth_provider_btns %>">
<div class="config-authentication__item--label">
<p class="crayons-field__label <%= SiteConfig.allow_email_password_registration ? "pb-0" : "" %>">
Email address
</p>
<div
class="enabled-indicator <%= SiteConfig.allow_email_password_registration ? "visible" : "" %>"
data-config-target="enabledIndicator">
<%= inline_svg_tag("checkmark.svg", aria: true, class: "crayons-icon admin-config-checkmark", title: "Email enabled") %>
<small class="crayons-field__description ml-1">Enabled</small>
</div>
</div>
<button
class="crayons-btn crayons-btn--secondary"
id="email-auth-enable-edit-btn"
data-button-text="<%= SiteConfig.allow_email_password_registration ? "edit" : "enable" %>"
data-config-target="emailAuthSettingsBtn"
data-action="click->config#enableOrEditEmailAuthSettings"
<%= disabled_attr_on_auth_provider_enable_btn %>>
<%= SiteConfig.allow_email_password_registration ? "Edit" : "Enable" %>
</button>
</div>
<div id="email-auth-settings-section" class="config-authentication__item--body hidden">
<fieldset class="config-authentication-form">
<div class="crayons-field--checkbox hidden">
<%= f.check_box :allow_email_password_registration,
checked: SiteConfig.allow_email_password_registration,
id: "email-registration-checkbox",
class: "crayons-checkbox" %>
</div>
<div class="crayons-field">
<%= admin_config_label :allowed_registration_email_domains, "Allowed email domains" %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:allowed_registration_email_domains][:description] %>
<%= f.text_field :allowed_registration_email_domains,
class: "crayons-textfield",
value: SiteConfig.allowed_registration_email_domains.join(","),
placeholder: Constants::SiteConfig::DETAILS[:allowed_registration_email_domains][:placeholder] %>
</div>
<div class="crayons-field--checkbox">
<%= f.check_box :display_email_domain_allow_list_publicly,
checked: SiteConfig.display_email_domain_allow_list_publicly,
id: "email-display-emails-publicly-checkbox",
class: "crayons-checkbox mt-2" %>
<div>
<%= admin_config_label :display_email_domain_allow_list_publicly %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:display_email_domain_allow_list_publicly][:description] %>
</div>
</div>
<div class="crayons-field--checkbox">
<%= f.check_box :require_captcha_for_email_password_registration,
checked: SiteConfig.require_captcha_for_email_password_registration,
data: {
action: "config#toggleGoogleRecaptchaFields",
"config-target": "requireCaptchaForEmailPasswordRegistration"
},
class: "crayons-checkbox mt-2" %>
<div>
<%= admin_config_label :require_captcha_for_email_password_registration, "Enable Google reCAPTCHA for email password registration" %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:require_captcha_for_email_password_registration][:description] %>
</div>
</div>
<div id="recaptchaContainer" class="ml-7 <%= SiteConfig.require_captcha_for_email_password_registration ? "flex flex-col gap-4" : "hidden" %>" aria-labelledby="recaptchaContainer">
<div class="crayons-field">
<%= admin_config_label :recaptcha_site_key, "Google reCAPTCHA site key" %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:recaptcha_site_key][:description] %>
<%= f.text_field :recaptcha_site_key,
class: "crayons-textfield",
value: SiteConfig.recaptcha_site_key,
placeholder: Constants::SiteConfig::DETAILS[:recaptcha_site_key][:placeholder] %>
</div>
<div class="crayons-field">
<%= admin_config_label :recaptcha_secret_key, "Google reCAPTCHA secret key" %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:recaptcha_secret_key][:description] %>
<%= f.text_field :recaptcha_secret_key,
class: "crayons-textfield",
value: SiteConfig.recaptcha_secret_key,
placeholder: Constants::SiteConfig::DETAILS[:recaptcha_secret_key][:placeholder] %>
</div>
</div>
<div class="flex gap-2">
<% if SiteConfig.allow_email_password_registration %>
<button
class="crayons-btn crayons-btn--danger"
data-action="click->config#activateEmailAuthModal">
Disable
</button>
<button
class="crayons-btn crayons-btn--secondary"
data-action="click->config#hideEmailAuthSettings">
Close
</button>
<% else %>
<button
class="crayons-btn crayons-btn--secondary"
data-action="click->config#disableEmailAuth">
Undo
</button>
<% end %>
</div>
</fieldset>
</div>
</div>
</section>
<hr class="my-0" />
<section class="mb-6">
<div class="form-group mb-0">
<%= f.text_field :auth_providers_to_enable,
id: "auth_providers_to_enable",
class: "form-control hidden",
value: SiteConfig.authentication_providers.join(","),
readonly: true %>
</div>
<% authentication_available_providers.each do |provider| %>
<% next if provider.provider_name == :apple && !Flipper.enabled?(:apple_auth) %>
<section class="config-authentication__item mb-0">
<figure class="config-authentication__item--icon">
<%= inline_svg_tag("#{provider.provider_name}.svg", class: "crayons-icon", aria: true, title: "#{provider.official_name} logo") %>
</figure>
<div class="config-authentication__item--container">
<div
class="flex items-center justify-between <%= tooltip_class_on_auth_provider_enablebtn %>"
data-tooltip="<%= tooltip_text_email_or_auth_provider_btns %>">
<div class="config-authentication__item--label">
<p class="crayons-field__label <%= authentication_provider_enabled?(provider) ? "pb-0" : "" %>">
<%= provider.official_name %>
</p>
<div
id="<%= provider.provider_name %>-enabled-indicator"
class="enabled-indicator <%= authentication_provider_enabled?(provider) ? "visible" : "" %>">
<%= inline_svg_tag("checkmark.svg", aria: true, class: "crayons-icon admin-config-checkmark", title: "#{provider.official_name} enabled") %>
<small class="crayons-field__description ml-1">Enabled</small>
</div>
</div>
<button
class="crayons-btn crayons-btn--secondary"
id="<%= provider.provider_name %>-auth-btn"
data-button-text="<%= authentication_provider_enabled?(provider) ? "edit" : "enable" %>"
data-action="click->config#enableOrEditAuthProvider"
data-provider-name="<%= provider.provider_name %>"
data-provider-official-name="<%= provider.official_name %>"
data-enable-auth="<%= authentication_provider_enabled?(provider) ? "true" : "false" %>"
<%= disabled_attr_on_auth_provider_enable_btn %>>
<%= authentication_provider_enabled?(provider) ? "Edit" : "Enable" %>
</button>
</div>
<div id="<%= provider.provider_name %>-auth-settings" class="config-authentication__item--body hidden">
<% auth_partial = provider.provider_name == :apple ? "apple_auth_provider_settings" : "auth_provider_settings" %>
<%= render partial: auth_partial,
locals: {
f: f,
provider: provider
} %>
</div>
</div>
</section>
<hr class="my-0" />
<% end %>
</section>
</section>
<div class="crayons-notice crayons-notice--info mb-4">
Changing authentication keys will not take affect until this forem instance is restarted.
</div>
<%= render "form_submission", f: f %>
</div>
</div>
<% end %>
<%= form_for(SiteConfig.new, url: admin_config_path) do |f| %>
<div class="card mt-3">
<%= render partial: "admin/shared/card_header",
locals: {
header: "Campaign",
state: "collapse",
target: "campaignBodyContainer",
expanded: false
} %>
<div id="campaignBodyContainer" class="card-body collapse hide" aria-labelledby="campaignBodyContainer">
<fieldset class="flex flex-column gap-4">
<div class="crayons-field">
<%= admin_config_label :campaign_hero_html_variant_name, "Campaign hero HTML variant name" %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:campaign_hero_html_variant_name][:description] %>
<%= f.text_field :campaign_hero_html_variant_name,
class: "crayons-textfield",
value: SiteConfig.campaign_hero_html_variant_name,
placeholder: Constants::SiteConfig::DETAILS[:campaign_hero_html_variant_name][:placeholder] %>
</div>
<div class="crayons-field crayons-field--checkbox">
<%= f.check_box :campaign_articles_require_approval, checked: SiteConfig.campaign_articles_require_approval, class: "crayons-checkbox" %>
<%= admin_config_label :campaign_articles_require_approval %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:campaign_articles_require_approval][:description] %>
</div>
<div class="crayons-field crayons-field--checkbox">
<%= f.check_box :campaign_sidebar_enabled, checked: SiteConfig.campaign_sidebar_enabled, class: "crayons-checkbox" %>
<%= admin_config_label :campaign_sidebar_enabled %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:campaign_sidebar_enabled][:description] %>
</div>
<div class="crayons-field">
<%= admin_config_label :campaign_sidebar_image %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:campaign_sidebar_image][:description] %>
<% if SiteConfig.campaign_sidebar_image.present? %>
<div class="row mt-2">
<div class="col-12">
<img alt="Campaign sidebar image" class="img-fluid" src="<%= SiteConfig.campaign_sidebar_image %>" />
</div>
</div>
<% end %>
<%= f.text_field :campaign_sidebar_image,
class: "crayons-textfield",
value: SiteConfig.campaign_sidebar_image,
placeholder: Constants::SiteConfig::DETAILS[:campaign_sidebar_image][:placeholder] %>
</div>
<div class="crayons-field">
<%= admin_config_label :campaign_url, "Campaign URL" %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:campaign_url][:description] %>
<%= f.text_field :campaign_url,
class: "crayons-textfield",
value: SiteConfig.campaign_url,
placeholder: Constants::SiteConfig::DETAILS[:campaign_url][:placeholder] %>
</div>
<div class="crayons-field">
<%= admin_config_label :campaign_featured_tags %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:campaign_featured_tags][:description] %>
<%= f.text_field :campaign_featured_tags,
class: "crayons-textfield",
value: SiteConfig.campaign_featured_tags.join(","),
placeholder: Constants::SiteConfig::DETAILS[:campaign_featured_tags][:placeholder] %>
</div>
<div class="crayons-field">
<%= admin_config_label :campaign_call_to_action, "Campaign Call to Action" %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:campaign_call_to_action][:description] %>
<%= f.text_field :campaign_call_to_action,
class: "crayons-textfield",
value: SiteConfig.campaign_call_to_action,
placeholder: Constants::SiteConfig::DETAILS[:campaign_call_to_action][:placeholder] %>
</div>
<div class="crayons-field">
<%= admin_config_label :campaign_articles_expiry_time, "Campaign article expiry time" %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:campaign_articles_expiry_time][:description] %>
<%= f.number_field :campaign_articles_expiry_time,
class: "crayons-textfield",
value: SiteConfig.campaign_articles_expiry_time,
placeholder: Constants::SiteConfig::DETAILS[:campaign_articles_expiry_time][:placeholder] %>
</div>
<%= render "form_submission", f: f %>
</fieldset>
</div>
</div>
<% end %>
<%= form_for(SiteConfig.new, url: admin_config_path) do |f| %>
<div class="card mt-3">
<%= render partial: "admin/shared/card_header",
locals: {
header: "Community Content",
state: "collapse",
target: "contentBodyContainer",
expanded: false
} %>
<div id="contentBodyContainer" class="card-body collapse hide" aria-labelledby="contentBodyContainer">
<fieldset class="flex flex-column gap-4">
<div class="crayons-field">
<%= admin_config_label :community_name %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:community_name][:description] %>
<%= f.text_field :community_name,
class: "crayons-textfield",
value: SiteConfig.community_name,
placeholder: Constants::SiteConfig::DETAILS[:community_name][:placeholder] %>
</div>
<div class="crayons-field">
<%= admin_config_label :community_emoji %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:community_emoji][:description] %>
<%= f.text_field :community_emoji,
class: "crayons-textfield",
value: SiteConfig.community_emoji,
placeholder: Constants::SiteConfig::DETAILS[:community_emoji][:placeholder] %>
</div>
<div class="crayons-field">
<%= admin_config_label :tagline %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:tagline][:description] %>
<%= f.text_field :tagline,
class: "crayons-textfield",
value: SiteConfig.tagline,
placeholder: Constants::SiteConfig::DETAILS[:tagline][:placeholder] %>
</div>
<div class="crayons-field">
<%= admin_config_label :community_description %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:community_description][:description] %>
<%= f.text_field :community_description,
class: "crayons-textfield",
value: SiteConfig.community_description,
placeholder: Constants::SiteConfig::DETAILS[:community_description][:placeholder] %>
</div>
<div class="crayons-field">
<%= admin_config_label :community_member_label %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:community_member_label][:description] %>
<%= f.text_field :community_member_label,
class: "crayons-textfield",
value: SiteConfig.community_member_label,
placeholder: Constants::SiteConfig::DETAILS[:community_member_label][:placeholder] %>
</div>
<div class="crayons-field">
<%= admin_config_label :community_copyright_start_year %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:community_copyright_start_year][:description] %>
<%= f.text_field :community_copyright_start_year,
class: "crayons-textfield",
value: SiteConfig.community_copyright_start_year,
placeholder: Constants::SiteConfig::DETAILS[:community_copyright_start_year][:placeholder] %>
</div>
<div class="crayons-field">
<%= admin_config_label :staff_user_id %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:staff_user_id][:description] %>
<%= f.text_field :staff_user_id,
class: "crayons-textfield",
value: SiteConfig.staff_user_id,
placeholder: Constants::SiteConfig::DETAILS[:staff_user_id][:placeholder] %>
</div>
<div class="crayons-field">
<%= admin_config_label :experience_low %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:experience_low][:description] %>
<%= f.text_field :experience_low,
class: "crayons-texfield",
value: SiteConfig.experience_low,
placeholder: Constants::SiteConfig::DETAILS[:experience_low][:placeholder] %>
</div>
<div class="crayons-field">
<%= admin_config_label :experience_high %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:experience_high][:description] %>
<%= f.text_field :experience_high,
class: "crayons-texfield",
value: SiteConfig.experience_high,
placeholder: Constants::SiteConfig::DETAILS[:experience_high][:placeholder] %>
</div>
<%= render "form_submission", f: f %>
</fieldset>
</div>
</div>
<% end %>
<%= form_for(SiteConfig.new, url: admin_config_path) do |f| %>
<div class="card mt-3">
<%= render partial: "admin/shared/card_header",
locals: {
header: "Credits",
state: "collapse",
target: "creditsBodyContainer",
expanded: false
} %>
<div id="creditsBodyContainer" class="card-body collapse hide" aria-labelledby="creditsBodyContainer">
<fieldset class="flex flex-column gap-4">
<%= f.fields_for :credit_prices_in_cents do |price_field| %>
<div class="crayons-field">
<%= admin_config_label "Credit price in cents (S)" %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:credit_prices_in_cents][:small][:description] %>
<%= price_field.number_field :small,
class: "crayons-textfield",
value: SiteConfig.credit_prices_in_cents[:small] %>
</div>
<div class="crayons-field">
<%= admin_config_label "Credit price in cents (M)" %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:credit_prices_in_cents][:medium][:description] %>
<%= price_field.number_field :medium,
class: "crayons-textfield",
value: SiteConfig.credit_prices_in_cents[:medium] %>
</div>
<div class="crayons-field">
<%= admin_config_label "Credit price in cents (L)" %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:credit_prices_in_cents][:large][:description] %>
<%= price_field.number_field :large,
class: "crayons-textfield",
value: SiteConfig.credit_prices_in_cents[:large] %>
</div>
<div class="crayons-field">
<%= admin_config_label "Credit price in cents (XL)" %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:credit_prices_in_cents][:xlarge][:description] %>
<%= price_field.number_field :xlarge,
class: "crayons-textfield",
value: SiteConfig.credit_prices_in_cents[:xlarge] %>
</div>
<% end %>
<%= render "form_submission", f: f %>
</fieldset>
</div>
</div>
<% end %>
<%= form_for(SiteConfig.new, url: admin_config_path) do |f| %>
<div class="card mt-3">
<%= render partial: "admin/shared/card_header",
locals: {
header: "Emails",
state: "collapse",
target: "emailBodyContainer",
expanded: false
} %>
<div id="emailBodyContainer" class="card-body collapse hide" aria-labelledby="emailBodyContainer">
<fieldset class="flex flex-column gap-4">
<div class="crayons-field">
<label for="site_config_email_addresses_default" class="crayons-field__label">
Default
</label>
<div class="crayons-field__description">
Default (set via <span class="ff-monospace">default_email</span> environment variable)
</div>
<input type="text" value="<%= ApplicationConfig["DEFAULT_EMAIL"] %>" class="form-control" readonly>
</div>
<%= f.fields_for :email_addresses do |email_field| %>
<% SiteConfig.email_addresses.except(:default).each do |type, address| %>
<div class="crayons-field">
<%= admin_config_label type %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:email_addresses][:description] %>
<%= email_field.text_field type,
class: "crayons-textfield",
value: SiteConfig.email_addresses[type],
placeholder: Constants::SiteConfig::DETAILS[:email_addresses][:placeholder] %>
</div>
<% end %>
<% end %>
<%= render "form_submission", f: f %>
</fieldset>
</div>
</div>
<% end %>
<%= form_for(SiteConfig.new, url: admin_config_path) do |f| %>
<div class="card mt-3">
<%= render partial: "admin/shared/card_header",
locals: {
header: "Email digest frequency",
state: "collapse",
target: "emailDigestBodyContainer",
expanded: false
} %>
<div id="emailDigestBodyContainer" class="card-body collapse hide" aria-labelledby="emailDigestBodyContainer">
<fieldset class="flex flex-column gap-4">
<div class="crayons-field">
<%= admin_config_label :periodic_email_digest_max %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:periodic_email_digest_max][:description] %>
<%= f.number_field :periodic_email_digest_max,
class: "crayons-textfield",
value: SiteConfig.periodic_email_digest_max,
placeholder: Constants::SiteConfig::DETAILS[:periodic_email_digest_max][:placeholder] %>
</div>
<div class="crayons-field">
<%= admin_config_label :periodic_email_digest_min %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:periodic_email_digest_max][:description] %>
<%= f.number_field :periodic_email_digest_min,
class: "crayons-textfield",
value: SiteConfig.periodic_email_digest_min,
placeholder: Constants::SiteConfig::DETAILS[:periodic_email_digest_min][:placeholder] %>
</div>
<%= render "form_submission", f: f %>
</fieldset>
</div>
</div>
<% end %>
<%= form_for(SiteConfig.new, url: admin_config_path) do |f| %>
<div class="card mt-3">
<%= render partial: "admin/shared/card_header",
locals: {
header: "Jobs",
state: "collapse",
target: "jobsBodyContainer",
expanded: false
} %>
<div id="jobsBodyContainer" class="card-body collapse hide" aria-labelledby="jobsBodyContainer">
<fieldset class="flex flex-column gap-4">
<div class="crayons-field">
<%= admin_config_label :jobs_url, "Jobs URL" %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:jobs_url][:description] %>
<%= f.text_field :jobs_url,
class: "crayons-textfield",
value: SiteConfig.jobs_url,
placeholder: Constants::SiteConfig::DETAILS[:jobs_url][:placeholder] %>
</div>
<div class="crayons-field crayons-field--checkbox">
<%= f.check_box :display_jobs_banner, checked: SiteConfig.display_jobs_banner, class: "crayons-checkbox" %>
<div class="mt-0">
<%= admin_config_label :display_jobs_banner %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:display_jobs_banner][:description] %>
</div>
</div>
<%= render "form_submission", f: f %>
</fieldset>
</div>
</div>
<% end %>
<%= form_for(SiteConfig.new, url: admin_config_path) do |f| %>
<div class="card mt-3">
<%= render partial: "admin/shared/card_header",
locals: {
header: "Google Analytics",
state: "collapse",
target: "gaBodyContainer",
expanded: false
} %>
<div id="gaBodyContainer" class="card-body collapse hide" aria-labelledby="gaBodyContainer">
<fieldset class="flex flex-column gap-4">
<div class="crayons-field">
<%= admin_config_label :ga_tracking_id, "View ID" %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:ga_tracking_id][:description] %>
<%= f.text_field :ga_tracking_id,
class: "crayons-textfield",
value: SiteConfig.ga_tracking_id %>
</div>
<%= render "form_submission", f: f %>
</fieldset>
</div>
</div>
<% end %>
<%= form_for(SiteConfig.new, url: admin_config_path) do |f| %>
<div class="card mt-3">
<%= render partial: "admin/shared/card_header",
locals: {
header: "Images",
state: "collapse",
target: "imagesBodyContainer",
expanded: false
} %>
<div id="imagesBodyContainer" class="card-body collapse hide" aria-labelledby="imagesBodyContainer">
<fieldset class="flex flex-column gap-4">
<div class="crayons-field">
<%= admin_config_label :main_social_image %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:main_social_image][:description] %>
<%= f.text_field :main_social_image,
class: "crayons-textfield",
value: SiteConfig.main_social_image,
placeholder: Constants::SiteConfig::DETAILS[:main_social_image][:placeholder] %>
<% if SiteConfig.main_social_image.present? %>
<img alt="main social image" class="img-fluid" src="<%= SiteConfig.main_social_image %>" width="600px" height="337px" />
<% end %>
</div>
<div class="crayons-field">
<%= admin_config_label :favicon_url, "Favicon URL" %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:favicon_url][:description] %>
<%= f.text_field :favicon_url,
class: "form-control",
value: SiteConfig.favicon_url,
placeholder: Constants::SiteConfig::DETAILS[:favicon_url][:placeholder] %>
<img alt="favicon" class="preview" src="<%= Images::Optimizer.call(SiteConfig.favicon_url, width: 32) %>" width="32px" height="32px" />
</div>
<div class="crayons-field">
<%= admin_config_label :logo_png %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:logo_png][:description] %>
<%= f.text_field :logo_png,
class: "crayons-textfield",
value: SiteConfig.logo_png,
placeholder: Constants::SiteConfig::DETAILS[:logo_png][:placeholder] %>
<% if SiteConfig.logo_png.present? %>
<img src="<%= Images::Optimizer.call(SiteConfig.logo_png, width: 128) %>" width="128px" height="128px" />
<% end %>
</div>
<div class="crayons-field">
<%= admin_config_label :logo_svg %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:logo_svg][:description] %>
<%= f.text_area :logo_svg,
class: "crayons-textfield",
value: SiteConfig.logo_svg,
rows: 6,
placeholder: Constants::SiteConfig::DETAILS[:logo_svg][:placeholder] %>
<% if SiteConfig.logo_svg.present? %>
<div class="site-logo">
<%= SiteConfig.logo_svg.html_safe %>
</div>
<% end %>
</div>
<div class="crayons-field">
<%= admin_config_label :secondary_logo_url %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:secondary_logo_url][:description] %>
<%= f.text_field :secondary_logo_url,
class: "crayons-textfield",
value: SiteConfig.secondary_logo_url,
placeholder: Constants::SiteConfig::DETAILS[:secondary_logo_url][:placeholder] %>
<% if SiteConfig.secondary_logo_url.present? %>
<img alt="secondary logo image" class="img-fluid" src="<%= Images::Optimizer.call(SiteConfig.secondary_logo_url, width: 256) %>" width="128px" height="128px" />
<% end %>
</div>
<div class="crayons-field">
<%= admin_config_label :left_navbar_svg_icon %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:left_navbar_svg_icon][:description] %>
<%= f.text_area :left_navbar_svg_icon,
class: "crayons-textfield",
value: SiteConfig.left_navbar_svg_icon,
rows: 6,
placeholder: Constants::SiteConfig::DETAILS[:left_navbar_svg_icon][:placeholder] %>
<%= SiteConfig.left_navbar_svg_icon.html_safe %>
</div>
<div class="crayons-field">
<%= admin_config_label :right_navbar_svg_icon %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:right_navbar_svg_icon][:description] %>
<%= f.text_area :right_navbar_svg_icon,
class: "crayons-textfield",
value: SiteConfig.right_navbar_svg_icon,
rows: 6,
placeholder: Constants::SiteConfig::DETAILS[:right_navbar_svg_icon][:placeholder] %>
<%= SiteConfig.right_navbar_svg_icon.html_safe %>
</div>
<%= render "form_submission", f: f %>
</fieldset>
</div>
</div>
<% end %>
<%= form_for(SiteConfig.new, url: admin_config_path) do |f| %>
<div class="card mt-3">
<%= render partial: "admin/shared/card_header",
locals: {
header: "Mascot",
state: "collapse",
target: "mascotBodyContainer",
expanded: false
} %>
<div id="mascotBodyContainer" class="card-body collapse hide" aria-labelledby="mascotBodyContainer">
<fieldset class="flex flex-column gap-4">
<div class="crayons-field">
<%= admin_config_label :mascot_user_id, "Mascot user ID" %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:mascot_user_id][:description] %>
<%= f.text_field :mascot_user_id,
class: "crayons-textfield",
value: SiteConfig.mascot_user_id,
min: 1,
placeholder: Constants::SiteConfig::DETAILS[:mascot_user_id][:placeholder] %>
</div>
<div class="crayons-field">
<%= admin_config_label :mascot_image_url, "Mascot Image URL" %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:mascot_image_url][:description] %>
<%= f.text_field :mascot_image_url,
class: "crayons-textfield",
value: SiteConfig.mascot_image_url,
placeholder: Constants::SiteConfig::DETAILS[:mascot_image_url][:placeholder] %>
<div class="col-12">
<img alt="<%= SiteConfig.mascot_image_description %>" class="img-fluid" src="<%= SiteConfig.mascot_image_url %>" />
</div>
</div>
<div class="crayons-field">
<%= admin_config_label :mascot_footer_image_url %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:mascot_footer_image_url][:description] %>
<%= f.text_field :mascot_footer_image_url,
class: "crayons-textfield",
value: SiteConfig.mascot_footer_image_url,
placeholder: Constants::SiteConfig::DETAILS[:mascot_footer_image_url][:placeholder] %>
<div class="col-12">
<img alt="<%= SiteConfig.mascot_image_description %>" class="img-fluid" src="<%= SiteConfig.mascot_footer_image_url %>" />
</div>
</div>
<div class="crayons-field">
<%= admin_config_label :mascot_footer_image_width %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:mascot_footer_image_width][:description] %>
<%= f.text_field :mascot_footer_image_width,
class: "form-control",
value: SiteConfig.mascot_footer_image_width %>
</div>
<div class="crayons-field">
<%= admin_config_label :mascot_footer_image_height %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:mascot_footer_image_height][:description] %>
<%= f.text_field :mascot_footer_image_height,
class: "form-control",
value: SiteConfig.mascot_footer_image_height %>
</div>
<div class="crayons-field">
<%= admin_config_label :mascot_image_description %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:mascot_image_description][:description] %>
<%= f.text_field :mascot_image_description,
class: "form-control",
value: SiteConfig.mascot_image_description %>
</div>
<%= render "form_submission", f: f %>
</fieldset>
</div>
</div>
<% end %>
<%= form_for(SiteConfig.new, url: admin_config_path) do |f| %>
<div class="card mt-3">
<%= render partial: "admin/shared/card_header",
locals: {
header: "Meta Keywords",
state: "collapse",
target: "metaKeywordsBodyContainer",
expanded: false
} %>
<div id="metaKeywordsBodyContainer" class="card-body collapse hide" aria-labelledby="metaKeywordsBodyContainer">
<fieldset class="flex flex-column gap-4">
<%= f.fields_for :meta_keywords do |meta_keywords_field| %>
<% SiteConfig.meta_keywords.each do |area, keywords| %>
<div class="crayons-field">
<%= admin_config_label area.to_s %>
<p class="crayons-field__description">
<%= area.capitalize %><%= "page" unless area == "default" %> keywords
</p>
<%= meta_keywords_field.text_field area,
class: "crayons-textfield",
value: SiteConfig.meta_keywords[area],
placeholder: Constants::SiteConfig::DETAILS[:meta_keywords][:placeholder] %>
</div>
<% end %>
<% end %>
<%= render "form_submission", f: f %>
</fieldset>
</div>
</div>
<% end %>
<%= form_for(SiteConfig.new, url: admin_config_path) do |f| %>
<div class="card mt-3">
<%= render partial: "admin/shared/card_header",
locals: {
header: "Monetization",
state: "collapse",
target: "monetizationBodyContainer",
expanded: false
} %>
<div id="monetizationBodyContainer" class="card-body collapse hide" aria-labelledby="monetizationBodyContainer">
<fieldset class="flex flex-column gap-4">
<div class="crayons-field">
<%= admin_config_label :shop_url, "Shop URL" %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:shop_url][:description] %>
<%= f.text_field :shop_url,
class: "crayons-textfield",
value: SiteConfig.shop_url,
placeholder: Constants::SiteConfig::DETAILS[:shop_url][:placeholder] %>
</div>
<div class="crayons-field">
<%= admin_config_label :stripe_api_key, "Stripe API key" %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:stripe_api_key][:description] %>
<%= f.text_field :stripe_api_key,
class: "crayons-textfield",
value: SiteConfig.stripe_api_key,
placeholder: Constants::SiteConfig::DETAILS[:stripe_api_key][:placeholder] %>
</div>
<div class="crayons-field">
<%= admin_config_label :stripe_publishable_key %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:stripe_publishable_key][:description] %>
<%= f.text_field :stripe_publishable_key,
class: "crayons-textfield",
value: SiteConfig.stripe_publishable_key,
placeholder: Constants::SiteConfig::DETAILS[:stripe_publishable_key][:placeholder] %>
</div>
<div class="crayons-field">
<%= admin_config_label :payment_pointer %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:payment_pointer][:description] %>
<%= f.text_field :payment_pointer,
class: "crayons-textfield",
value: SiteConfig.payment_pointer,
placeholder: Constants::SiteConfig::DETAILS[:payment_pointer][:placeholder] %>
</div>
<%= render "form_submission", f: f %>
</fieldset>
</div>
</div>
<% end %>
<%= form_for(SiteConfig.new, url: admin_config_path) do |f| %>
<div class="card mt-3">
<%= render partial: "admin/shared/card_header",
locals: {
header: "Newsletter",
state: "collapse",
target: "newsletterBodyContainer",
expanded: false
} %>
<div id="newsletterBodyContainer" class="card-body collapse hide" aria-labelledby="newsletterBodyContainer">
<fieldset class="flex flex-column gap-4">
<div class="crayons-field">
<%= admin_config_label :mailchimp_api_key, "Mailchimp API Key" %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:mailchimp_api_key][:description] %>
<%= f.text_field :mailchimp_api_key,
class: "crayons-textfield",
value: SiteConfig.mailchimp_api_key %>
</div>
<div class="crayons-field">
<%= admin_config_label :mailchimp_newsletter_id, "Main Newsletter" %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:mailchimp_newsletter_id][:description] %>
<%= f.text_field :mailchimp_newsletter_id,
class: "crayons-textfield",
value: SiteConfig.mailchimp_newsletter_id %>
</div>
<div class="crayons-field">
<%= admin_config_label :mailchimp_sustaining_members_id, "Sustaining Members Newsletter" %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:mailchimp_sustaining_members_id][:description] %>
<%= f.text_field :mailchimp_sustaining_members_id,
class: "crayons-textfield",
value: SiteConfig.mailchimp_sustaining_members_id %>
</div>
<div class="crayons-field">
<%= admin_config_label :mailchimp_tag_moderators_id, "Tag Moderators Newsletter" %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:mailchimp_tag_moderators_id][:description] %>
<%= f.text_field :mailchimp_tag_moderators_id,
class: "crayons-textfield",
value: SiteConfig.mailchimp_tag_moderators_id %>
</div>
<div class="crayons-field">
<%= admin_config_label :mailchimp_community_moderators_id, "Community Moderators Newsletter" %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:mailchimp_community_moderators_id][:description] %>
<%= f.text_field :mailchimp_community_moderators_id,
class: "crayons-textfield",
value: SiteConfig.mailchimp_community_moderators_id %>
</div>
<%= render "form_submission", f: f %>
</fieldset>
</div>
</div>
<% end %>
<%= form_for(SiteConfig.new, url: admin_config_path) do |f| %>
<div class="card mt-3">
<%= render partial: "admin/shared/card_header",
locals: {
header: "Onboarding",
state: "collapse",
target: "onboardingBodyContainer",
expanded: false
} %>
<div id="onboardingBodyContainer" class="card-body collapse hide" aria-labelledby="onboardingBodyContainer">
<fieldset class="flex flex-column gap-4">
<div class="crayons-field">
<%= admin_config_label :onboarding_logo_image %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:onboarding_logo_image][:description] %>
<%= f.text_field :onboarding_logo_image,
class: "crayons-textfield",
value: SiteConfig.onboarding_logo_image,
placeholder: Constants::SiteConfig::DETAILS[:onboarding_logo_image][:placeholder] %>
<div class="row mt-2">
<div class="col-12">
<img alt="main social image" class="img-fluid" src="<%= SiteConfig.onboarding_logo_image %>" width="600px" height="337px" />
</div>
</div>
</div>
<div class="crayons-field">
<%= admin_config_label :onboarding_background_image %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:onboarding_background_image][:description] %>
<%= f.text_field :onboarding_background_image,
class: "crayons-textfield",
value: SiteConfig.onboarding_background_image,
placeholder: Constants::SiteConfig::DETAILS[:onboarding_background_image][:placeholder] %>
<div class="row mt-2">
<div class="col-12">
<img alt="onboarding background image" class="img-fluid" src="<%= SiteConfig.onboarding_background_image %>" />
</div>
</div>
</div>
<div class="crayons-field">
<%= admin_config_label :onboarding_taskcard_image %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:onboarding_taskcard_image][:description] %>
<%= f.text_field :onboarding_taskcard_image,
class: "crayons-textfield",
value: SiteConfig.onboarding_taskcard_image,
placeholder: Constants::SiteConfig::DETAILS[:onboarding_taskcard_image][:placeholder] %>
<div class="row mt-2">
<div class="col-12">
<img alt="onboarding taskcard image" class="img-fluid" src="<%= SiteConfig.onboarding_taskcard_image %>" />
</div>
</div>
</div>
<div class="crayons-field">
<%= admin_config_label :suggested_users %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:suggested_users][:description] %>
<%= f.text_field :suggested_users,
class: "crayons-textfield",
value: SiteConfig.suggested_users.join(","),
placeholder: Constants::SiteConfig::DETAILS[:suggested_users][:placeholder] %>
</div>
<div class="crayons-field crayons-field--checkbox">
<%= f.check_box :prefer_manual_suggested_users, checked: SiteConfig.prefer_manual_suggested_users, class: "crayons-checkbox" %>
<div class="mt-0">
<%= admin_config_label :prefer_manual_suggested_users %>
<p class="crayons-field__description">
<%= Constants::SiteConfig::DETAILS[:prefer_manual_suggested_users][:description] %>
</p>
</div>
</div>
<%= render "form_submission", f: f %>
</fieldset>
</div>
</div>
<% end %>
<%= form_for(SiteConfig.new, url: admin_config_path) do |f| %>
<div class="card mt-3">
<%= render partial: "admin/shared/card_header",
locals: {
header: "Rate limits and anti-spam",
state: "collapse",
target: "rateLimitsBodyContainer",
expanded: false
} %>
<div id="rateLimitsBodyContainer" class="card-body collapse hide" aria-labelledby="rateLimitsBodyContainer">
<fieldset class="flex flex-column gap-4">
<% configurable_rate_limits.each do |key, field_hash| %>
<div class="crayons-field">
<%= admin_config_label field_hash[:title] %>
<p class="crayons-field__description">
<%= field_hash[:description] %>
</p>
<%= f.number_field key,
class: "crayons-textfield",
value: SiteConfig.public_send(key),
min: field_hash[:min],
placeholder: field_hash[:placeholder] %>
</div>
<% end %>
<div class="crayons-field">
<%= admin_config_label :spam_trigger_terms %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:spam_trigger_terms][:description] %>
<%= f.text_area :spam_trigger_terms,
class: "crayons-textfield",
value: SiteConfig.spam_trigger_terms.join(","),
placeholder: Constants::SiteConfig::DETAILS[:spam_trigger_terms][:placeholder] %>
</div>
<%= render "form_submission", f: f %>
</fieldset>
</div>
</div>
<% end %>
<%= form_for(SiteConfig.new, url: admin_config_path) do |f| %>
<div class="card mt-3">
<%= render partial: "admin/shared/card_header",
locals: {
header: "Social Media",
state: "collapse",
target: "socialMediaBodyContainer",
expanded: false
} %>
<div id="socialMediaBodyContainer" class="card-body collapse hide" aria-labelledby="socialMediaBodyContainer">
<fieldset class="flex flex-column gap-4">
<div class="crayons-field">
<%= admin_config_label :twitter_hashtag %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:twitter_hashtag][:description] %>
<%= f.text_field :twitter_hashtag,
class: "crayons-textfield",
value: SiteConfig.twitter_hashtag.to_s,
placeholder: Constants::SiteConfig::DETAILS[:twitter_hashtag][:placeholder] %>
</div>
<%= f.fields_for :social_media_handles do |social_media_field| %>
<% SiteConfig.social_media_handles.each do |platform, username| %>
<div class="crayons-field">
<%= admin_config_label platform %>
<p class="crayons-field__description">
<%= platform.capitalize %> username
</p>
<%= social_media_field.text_field platform,
class: "crayons-textfield",
value: SiteConfig.social_media_handles[platform],
placeholder: "" %>
</div>
<% end %>
<% end %>
<%= render "form_submission", f: f %>
</fieldset>
</div>
</div>
<% end %>
<%= form_for(SiteConfig.new, url: admin_config_path) do |f| %>
<div class="card mt-3">
<%= render partial: "admin/shared/card_header",
locals: {
header: "Sponsors",
state: "collapse",
target: "sponsorsContainer",
expanded: false
} %>
<div id="sponsorsContainer" class="card-body collapse hide" aria-labelledby="sponsorsContainer">
<fieldset class="flex flex-column gap-4">
<div class="crayons-field">
<%= admin_config_label :sponsor_headline %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:sponsor_headline][:description] %>
<%= f.text_field :sponsor_headline,
class: "crayons-textfield",
value: SiteConfig.sponsor_headline,
placeholder: Constants::SiteConfig::DETAILS[:sponsor_headline][:placeholder] %>
</div>
<%= render "form_submission", f: f %>
</fieldset>
</div>
</div>
<% end %>
<%= form_for(SiteConfig.new, url: admin_config_path) do |f| %>
<div class="card mt-3">
<%= render partial: "admin/shared/card_header",
locals: {
header: "Tags",
state: "collapse",
target: "tagsBodyContainer",
expanded: false
} %>
<div id="tagsBodyContainer" class="card-body collapse hide" aria-labelledby="tagsBodyContainer">
<fieldset class="flex flex-column gap-4">
<div class="crayons-field">
<%= admin_config_label :sidebar_tags %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:sidebar_tags][:description] %>
<%= f.text_field :sidebar_tags,
class: "crayons-textfield",
value: SiteConfig.sidebar_tags.join(","),
placeholder: Constants::SiteConfig::DETAILS[:sidebar_tags][:placeholder],
pattern: "[a-z0-9,]+" %>
</div>
<%= render "form_submission", f: f %>
</fieldset>
</div>
</div>
<% end %>
<%= form_for(SiteConfig.new, url: admin_config_path) do |f| %>
<div class=" card mt-3">
<%= render partial: "admin/shared/card_header",
locals: {
header: "User Experience and Brand",
state: "collapse",
target: "uxBodyContainer",
expanded: false
} %>
<div id="uxBodyContainer" class="card-body collapse hide" aria-labelledby="uxBodyContainer">
<fieldset class="flex flex-column gap-4">
<div class="crayons-fieldx">
<%= admin_config_label :feed_style %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:feed_style][:description] %>
<%= f.text_field :feed_style,
class: "crayons-textfield",
value: SiteConfig.feed_style,
placeholder: Constants::SiteConfig::DETAILS[:feed_style][:placeholder] %>
</div>
<div class="crayons-field">
<%= admin_config_label :feed_strategy %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:feed_strategy][:description] %>
<%= f.text_field :feed_strategy,
class: "crayons-textfield",
value: SiteConfig.feed_strategy,
placeholder: Constants::SiteConfig::DETAILS[:feed_strategy][:placeholder] %>
</div>
<div class="crayons-field">
<%= admin_config_label :tag_feed_minimum_score %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:tag_feed_minimum_score][:description] %>
<%= f.number_field :tag_feed_minimum_score,
class: "crayons-textfield",
value: SiteConfig.tag_feed_minimum_score,
placeholder: Constants::SiteConfig::DETAILS[:tag_feed_minimum_score][:placeholder] %>
</div>
<div class="crayons-field">
<%= admin_config_label :home_feed_minimum_score %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:home_feed_minimum_score][:description] %>
<%= f.number_field :home_feed_minimum_score,
class: "crayons-textfield",
value: SiteConfig.home_feed_minimum_score,
placeholder: Constants::SiteConfig::DETAILS[:home_feed_minimum_score][:placeholder] %>
</div>
<div class="crayons-field">
<%= admin_config_label :default_font %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:default_font][:description] %>
<%= select_tag "site_config[default_font]",
options_for_select(
[%w[sans-serif sans_serif], %w[serif serif], %w[open-dyslexic open_dyslexic]],
SiteConfig.default_font,
),
multiple: false,
class: "selectpicker" %>
</div>
<div class="crayons-field">
<%= admin_config_label :primary_brand_color_hex %>
<%= admin_config_description Constants::SiteConfig::DETAILS[:primary_brand_color_hex][:description] %>
<%= f.color_field :primary_brand_color_hex,
class: "crayons-color-selector",
value: SiteConfig.primary_brand_color_hex,
pattern: "^#+([a-fA-F0-9]{6})$",
placeholder: Constants::SiteConfig::DETAILS[:primary_brand_color_hex][:placeholder] %>
</div>
<div class="crayons-field crayons-field--checkbox">
<%= f.check_box :public, checked: SiteConfig.public, class: "crayons-checkbox" %>
<div class="mt-0">
<%= admin_config_label :public %>
<p class="crayons-field__description">
Are most of the site pages (e.g. posts, profiles) public? <strong>Please take precaution when changing this setting.</strong>
</p>
</div>
</div>
<%= render "form_submission", f: f %>
</fieldset>
</div>
</div>
<% end %>
</div>
</div>
</div>
<div data-config-target="configModalAnchor"></div>
</div>