update views, mailers, styles, etc.
This commit is contained in:
parent
c36423e53a
commit
e31b2782e6
3
Gemfile
3
Gemfile
|
@ -15,6 +15,7 @@ gem 'rails', '~> 6.0'
|
||||||
gem 'redis-rails', '~> 5.0'
|
gem 'redis-rails', '~> 5.0'
|
||||||
gem 'responders', '~> 3.0'
|
gem 'responders', '~> 3.0'
|
||||||
gem 'sidekiq', '~> 6.0'
|
gem 'sidekiq', '~> 6.0'
|
||||||
|
gem 'simple_form', '~> 5.0'
|
||||||
gem 'validates_email_format_of', '~> 1.6'
|
gem 'validates_email_format_of', '~> 1.6'
|
||||||
gem 'webpacker', '~> 4.2'
|
gem 'webpacker', '~> 4.2'
|
||||||
|
|
||||||
|
@ -25,7 +26,7 @@ gem 'devise', '~> 4.7'
|
||||||
|
|
||||||
# styles
|
# styles
|
||||||
gem 'bulma-rails', '~> 0.8.0'
|
gem 'bulma-rails', '~> 0.8.0'
|
||||||
gem 'foundation_emails', '~> 2.2'
|
gem 'premailer-rails', '~> 1.11'
|
||||||
|
|
||||||
group :development, :test do
|
group :development, :test do
|
||||||
gem 'factory_bot_rails', '~> 5.1'
|
gem 'factory_bot_rails', '~> 5.1'
|
||||||
|
|
|
@ -303,6 +303,9 @@ GEM
|
||||||
rack (~> 2.0)
|
rack (~> 2.0)
|
||||||
rack-protection (>= 2.0.0)
|
rack-protection (>= 2.0.0)
|
||||||
redis (>= 4.1.0)
|
redis (>= 4.1.0)
|
||||||
|
simple_form (5.0.2)
|
||||||
|
actionpack (>= 5.0)
|
||||||
|
activemodel (>= 5.0)
|
||||||
simplecov (0.18.5)
|
simplecov (0.18.5)
|
||||||
docile (~> 1.1)
|
docile (~> 1.1)
|
||||||
simplecov-html (~> 0.11)
|
simplecov-html (~> 0.11)
|
||||||
|
@ -370,6 +373,7 @@ DEPENDENCIES
|
||||||
shoulda-callback-matchers (~> 1.1)
|
shoulda-callback-matchers (~> 1.1)
|
||||||
shoulda-matchers (~> 3.1)
|
shoulda-matchers (~> 3.1)
|
||||||
sidekiq (~> 6.0)
|
sidekiq (~> 6.0)
|
||||||
|
simple_form (~> 5.0)
|
||||||
simplecov (~> 0.16)
|
simplecov (~> 0.16)
|
||||||
spring
|
spring
|
||||||
spring-watcher-listen (~> 2.0)
|
spring-watcher-listen (~> 2.0)
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
web: bundle exec puma -C config/puma.rb
|
||||||
|
webpack: bin/webpack
|
||||||
|
worker: bundle exec sidekiq -C config/sidekiq.yml
|
||||||
|
release: bin/rake db:migrate
|
|
@ -14,6 +14,7 @@ This repo is a designed to be a Dockerized Rails 6 template:
|
||||||
- `bundle`
|
- `bundle`
|
||||||
- `yarn install --check-files`
|
- `yarn install --check-files`
|
||||||
- `Find/replace all TODO`
|
- `Find/replace all TODO`
|
||||||
|
- `docker-compose up --build`
|
||||||
|
|
||||||
### Dependencies
|
### Dependencies
|
||||||
|
|
||||||
|
|
|
@ -13,3 +13,22 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@import "bulma"; // https://bulma.io/documentation/
|
@import "bulma"; // https://bulma.io/documentation/
|
||||||
|
@import "./devise";
|
||||||
|
|
||||||
|
html {
|
||||||
|
background-image: radial-gradient(circle at 13% 47%, rgba(140, 140, 140,0.03) 0%, rgba(140, 140, 140,0.03) 25%,transparent 25%, transparent 100%),radial-gradient(circle at 28% 63%, rgba(143, 143, 143,0.03) 0%, rgba(143, 143, 143,0.03) 16%,transparent 16%, transparent 100%),radial-gradient(circle at 81% 56%, rgba(65, 65, 65,0.03) 0%, rgba(65, 65, 65,0.03) 12%,transparent 12%, transparent 100%),radial-gradient(circle at 26% 48%, rgba(60, 60, 60,0.03) 0%, rgba(60, 60, 60,0.03) 6%,transparent 6%, transparent 100%),radial-gradient(circle at 97% 17%, rgba(150, 150, 150,0.03) 0%, rgba(150, 150, 150,0.03) 56%,transparent 56%, transparent 100%),radial-gradient(circle at 50% 100%, rgba(25, 25, 25,0.03) 0%, rgba(25, 25, 25,0.03) 36%,transparent 36%, transparent 100%),radial-gradient(circle at 55% 52%, rgba(69, 69, 69,0.03) 0%, rgba(69, 69, 69,0.03) 6%,transparent 6%, transparent 100%),linear-gradient(90deg, rgb(255,255,255),rgb(255,255,255));
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-size: cover;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toggleable {
|
||||||
|
display: none;
|
||||||
|
|
||||||
|
&.is-active {
|
||||||
|
display: inherit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.notifications-container {
|
||||||
|
padding: $size-7;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
#registrations, #passwords {
|
||||||
|
padding-top: $size-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#registrations-column {
|
||||||
|
background-color: $white;
|
||||||
|
padding: $size-6;
|
||||||
|
}
|
||||||
|
|
||||||
|
#registrations-column-form, #registrations-column-form-submit-button,
|
||||||
|
#registration-edit-account-deletion-container, #registrations-edit-passwords,
|
||||||
|
#registrations-edit-update-password, #passwords-column-form, #unlocks-column-form,
|
||||||
|
#confirmations-column-form {
|
||||||
|
padding: $size-3;
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
@import "bulma";
|
||||||
|
|
||||||
|
body {
|
||||||
|
background-color: $grey-light;
|
||||||
|
}
|
||||||
|
|
||||||
|
.email-main-container {
|
||||||
|
padding: $size-3;
|
||||||
|
background-color: $white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.email-details {
|
||||||
|
padding: $size-1 $size-5 ;
|
||||||
|
}
|
||||||
|
|
||||||
|
.email-action-button-container {
|
||||||
|
padding: $size-1;
|
||||||
|
}
|
|
@ -8,7 +8,7 @@ class ApplicationController < ActionController::Base
|
||||||
authenticate_user!
|
authenticate_user!
|
||||||
return if current_user.admin?
|
return if current_user.admin?
|
||||||
|
|
||||||
redirect_to root_path, flash: { alert: 'You are not allowed to do that.' }
|
redirect_to root_path, flash: { alert: "Whoops! We don't know where that path goes ¯\\_(ツ)_/¯" }
|
||||||
end
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
|
@ -1,4 +1,27 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module ApplicationHelper
|
module ApplicationHelper
|
||||||
|
# Javascript Pack helper for controller-based JS
|
||||||
|
def javascript_controller_pack_tag_helper
|
||||||
|
javascript_pack_tag params[:controller]
|
||||||
|
rescue Webpacker::Manifest::MissingEntryError
|
||||||
|
begin
|
||||||
|
# Fallback retry for nested controllers
|
||||||
|
namespace = params[:controller].split('/').first
|
||||||
|
javascript_pack_tag namespace
|
||||||
|
rescue StandardError
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def notification_type(name)
|
||||||
|
case name.to_sym
|
||||||
|
when :notice
|
||||||
|
'info'
|
||||||
|
when :alert
|
||||||
|
'danger'
|
||||||
|
else
|
||||||
|
name
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,8 +4,10 @@
|
||||||
// that code so it'll be compiled.
|
// that code so it'll be compiled.
|
||||||
|
|
||||||
require("@rails/ujs").start()
|
require("@rails/ujs").start()
|
||||||
require("turbolinks").start()
|
// require("turbolinks").start()
|
||||||
require("channels")
|
require("channels")
|
||||||
|
require("./bulma/base")
|
||||||
|
require("jquery")
|
||||||
|
|
||||||
// Uncomment to copy all static images under ../images to the output folder and reference
|
// Uncomment to copy all static images under ../images to the output folder and reference
|
||||||
// them with the image_pack_tag helper in views (e.g <%= image_pack_tag 'rails.png' %>)
|
// them with the image_pack_tag helper in views (e.g <%= image_pack_tag 'rails.png' %>)
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
require("./notification")
|
|
@ -0,0 +1,16 @@
|
||||||
|
// https://bulma.io/documentation/elements/notification/#javascript-example
|
||||||
|
// document.addEventListener('DOMContentLoaded', () => {
|
||||||
|
// (document.querySelectorAll('.notification .delete') || []).forEach(($delete) => {
|
||||||
|
// $notification = $delete.parentNode;
|
||||||
|
//
|
||||||
|
// $delete.addEventListener('click', () => {
|
||||||
|
// $notification.parentNode.removeChild($notification);
|
||||||
|
// });
|
||||||
|
// });
|
||||||
|
// });
|
||||||
|
|
||||||
|
$(function(){
|
||||||
|
$('.notification .delete').on('click', function(){
|
||||||
|
$(this).parent().hide();
|
||||||
|
});
|
||||||
|
});
|
|
@ -0,0 +1,11 @@
|
||||||
|
$(function() {
|
||||||
|
$('#registration-edit-password-button').on('click', function(){
|
||||||
|
$('#registrations-edit-update-password').toggleClass('is-active');
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#registration-edit-account-delete-button').on('click', function(){
|
||||||
|
$('#registration-edit-account-delete').toggleClass('is-active');
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
});
|
|
@ -0,0 +1,6 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class BulmaDeviseMailer < Devise::Mailer
|
||||||
|
default from: App::Config::DEFAULT_EMAIL
|
||||||
|
layout 'mailer'
|
||||||
|
end
|
|
@ -3,10 +3,23 @@
|
||||||
class User < ApplicationRecord
|
class User < ApplicationRecord
|
||||||
acts_as_paranoid
|
acts_as_paranoid
|
||||||
|
|
||||||
|
before
|
||||||
|
|
||||||
# Include default devise modules. Others available are:
|
# Include default devise modules. Others available are:
|
||||||
# :omniauthable
|
# :omniauthable
|
||||||
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable,
|
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable,
|
||||||
:confirmable, :lockable, :timeoutable, :trackable
|
:confirmable, :lockable, :timeoutable, :trackable
|
||||||
|
|
||||||
|
validates :username, uniqueness: true
|
||||||
validates :email, presence: true, email_format: { message: 'format is not valid' }
|
validates :email, presence: true, email_format: { message: 'format is not valid' }
|
||||||
|
|
||||||
|
before_validation :set_username, on: :create
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def set_username
|
||||||
|
return if username.present?
|
||||||
|
|
||||||
|
self.username = Digest::MD5.hexdigest(Time.now.to_f.to_s + email)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
<div class="container is-fluid" id="passwords">
|
||||||
|
<div class="columns is-centered is-mobile">
|
||||||
|
<div id="registrations-column" class="column is-four-fifths-mobile is-two-thirds-tablet is-half-desktop">
|
||||||
|
<section class="hero is-primary">
|
||||||
|
<div class="hero-body">
|
||||||
|
<div class="container">
|
||||||
|
<h1 class="title has-text-centered">
|
||||||
|
Resend Confirmation Email
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<div id="confirmations-column-form">
|
||||||
|
<%= simple_form_for(resource, as: resource_name, url: confirmation_path(resource_name), html: { method: :post }) do |f| %>
|
||||||
|
<div class="field">
|
||||||
|
<%= f.label :email, class: "label" %>
|
||||||
|
|
||||||
|
<p class="control has-icons-left has-icons-right">
|
||||||
|
<%= f.input_field :email,
|
||||||
|
required: true,
|
||||||
|
autofocus: true,
|
||||||
|
autocomplete: "email",
|
||||||
|
value: (resource.pending_reconfirmation? ? resource.unconfirmed_email : resource.email),
|
||||||
|
class: "input" %>
|
||||||
|
|
||||||
|
<span class="icon is-small is-left">
|
||||||
|
<i class="fas fa-envelope"></i>
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<%= f.full_error :email, class: "help is-danger" %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="field">
|
||||||
|
<p class="control" id="registrations-column-form-submit-button">
|
||||||
|
<%= f.button :submit, "Resend confirmation", class: "button is-primary is-fullwidth is-rounded" %>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<%= render "devise/shared/links" %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -0,0 +1,25 @@
|
||||||
|
<div class="hero is-primary">
|
||||||
|
<div class="hero-body">
|
||||||
|
<div class="container">
|
||||||
|
<h1 class="title has-text-centered">
|
||||||
|
Account Confirmation
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="container is-fluid">
|
||||||
|
<div class="columns is-centered is-mobile">
|
||||||
|
<div class="column">
|
||||||
|
<div class="email-details">
|
||||||
|
<p>
|
||||||
|
Welcome <%= @email %>! Please confirm your email address to verify your account.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="email-action-button-container">
|
||||||
|
<%= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token), class: "button is-primary is-fullwidth is-rounded" %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -0,0 +1,28 @@
|
||||||
|
<div class="hero is-primary">
|
||||||
|
<div class="hero-body">
|
||||||
|
<div class="container">
|
||||||
|
<h1 class="title has-text-centered">
|
||||||
|
Account Email Updated
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="container is-fluid">
|
||||||
|
<div class="columns is-centered is-mobile">
|
||||||
|
<div class="column">
|
||||||
|
<div class="email-details">
|
||||||
|
<p>
|
||||||
|
Your email has been chnaged to <strong><%= @resource.try(:unconfirmed_email?) ? @resource.unconfirmed_email : @resource.email %></strong>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="notification is-danger">
|
||||||
|
<p>
|
||||||
|
Please contact support if you did not make these changes.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -0,0 +1,26 @@
|
||||||
|
<div class="hero is-primary">
|
||||||
|
<div class="hero-body">
|
||||||
|
<div class="container">
|
||||||
|
<h1 class="title has-text-centered">
|
||||||
|
Account Password Updated
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="container is-fluid">
|
||||||
|
<div class="columns is-centered is-mobile">
|
||||||
|
<div class="column">
|
||||||
|
<div class="email-details">
|
||||||
|
<p>We're contacting you to notify you that your password has been changed.</p>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="notification is-danger">
|
||||||
|
<p>
|
||||||
|
Please contact support if you did not make these changes.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -0,0 +1,26 @@
|
||||||
|
<div class="hero is-primary">
|
||||||
|
<div class="hero-body">
|
||||||
|
<div class="container">
|
||||||
|
<h1 class="title has-text-centered">
|
||||||
|
Reset Password
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="container is-fluid">
|
||||||
|
<div class="columns is-centered is-mobile">
|
||||||
|
<div class="column">
|
||||||
|
<div class="email-details">
|
||||||
|
<p>Someone has requested a link to change your password. You can do this through the link below.</p>
|
||||||
|
|
||||||
|
<p>If you didn't request this, please ignore this email.</p>
|
||||||
|
<p>Your password won't change until you access the link above and create a new one.</p>
|
||||||
|
|
||||||
|
<div class="email-action-button-container">
|
||||||
|
<%= link_to 'Change my password', edit_password_url(@resource, reset_password_token: @token), class: "button is-primary is-fullwidth is-rounded" %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -0,0 +1,25 @@
|
||||||
|
<div class="hero is-primary">
|
||||||
|
<div class="hero-body">
|
||||||
|
<div class="container">
|
||||||
|
<h1 class="title has-text-centered">
|
||||||
|
Account Unlock
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="container is-fluid">
|
||||||
|
<div class="columns is-centered is-mobile">
|
||||||
|
<div class="column">
|
||||||
|
<div class="email-details">
|
||||||
|
<p>Your account has been locked due to an excessive number of unsuccessful sign in attempts.</p>
|
||||||
|
|
||||||
|
<p>Click the link below to unlock your account:</p>
|
||||||
|
|
||||||
|
<div class="email-action-button-container">
|
||||||
|
<%= link_to 'Unlock my account', unlock_url(@resource, unlock_token: @token), class: "button is-primary is-fullwidth is-rounded" %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -0,0 +1,66 @@
|
||||||
|
<div class="container is-fluid" id="passwords">
|
||||||
|
<div class="columns is-centered is-mobile">
|
||||||
|
<div id="registrations-column" class="column is-four-fifths-mobile is-two-thirds-tablet is-half-desktop">
|
||||||
|
<section class="hero is-primary">
|
||||||
|
<div class="hero-body">
|
||||||
|
<div class="container">
|
||||||
|
<h1 class="title has-text-centered">
|
||||||
|
Update Password
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<div id="passwords-column-form">
|
||||||
|
<%= simple_form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f| %>
|
||||||
|
<%= f.input :reset_password_token, as: :hidden %>
|
||||||
|
<%= f.full_error :reset_password_token %>
|
||||||
|
|
||||||
|
<div class="field">
|
||||||
|
<%= f.label :password, class: "label" %>
|
||||||
|
|
||||||
|
<p class="control has-icons-left has-icons-right">
|
||||||
|
<%= f.input_field :password,
|
||||||
|
required: true,
|
||||||
|
autofocus: true,
|
||||||
|
autocomplete: "new-password",
|
||||||
|
hint: ("#{@minimum_password_length} characters minimum"),
|
||||||
|
class: "input" %>
|
||||||
|
|
||||||
|
<span class="icon is-small is-left">
|
||||||
|
<i class="fas fa-lock"></i>
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<%= f.full_error :password, class: "help is-danger" %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="field">
|
||||||
|
<%= f.label :password_confirmation, class: "label" %>
|
||||||
|
|
||||||
|
<p class="control has-icons-left has-icons-right">
|
||||||
|
<%= f.input_field :password_confirmation,
|
||||||
|
required: true,
|
||||||
|
autocomplete: "new-password",
|
||||||
|
class: "input" %>
|
||||||
|
|
||||||
|
<span class="icon is-small is-left">
|
||||||
|
<i class="fas fa-lock"></i>
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<%= f.full_error :password_confirmation, class: "help is-danger" %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="field">
|
||||||
|
<p class="control" id="registrations-column-form-submit-button">
|
||||||
|
<%= f.button :submit, "Update password", class: "button is-primary is-fullwidth is-rounded" %>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<%= render "devise/shared/links" %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -0,0 +1,45 @@
|
||||||
|
<div class="container is-fluid" id="passwords">
|
||||||
|
<div class="columns is-centered is-mobile">
|
||||||
|
<div id="registrations-column" class="column is-four-fifths-mobile is-two-thirds-tablet is-half-desktop">
|
||||||
|
<section class="hero is-primary">
|
||||||
|
<div class="hero-body">
|
||||||
|
<div class="container">
|
||||||
|
<h1 class="title has-text-centered">
|
||||||
|
Reset My Password
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<div id="passwords-column-form">
|
||||||
|
<%= simple_form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| %>
|
||||||
|
<div class="field">
|
||||||
|
<%= f.label :email, class: "label" %>
|
||||||
|
|
||||||
|
<p class="control has-icons-left has-icons-right">
|
||||||
|
<%= f.input_field :email,
|
||||||
|
required: true,
|
||||||
|
autofocus: true,
|
||||||
|
autocomplete: "email",
|
||||||
|
class: "input" %>
|
||||||
|
|
||||||
|
<span class="icon is-small is-left">
|
||||||
|
<i class="fas fa-envelope"></i>
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<%= f.full_error :email, class: "help is-danger" %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="field">
|
||||||
|
<p class="control" id="registrations-column-form-submit-button">
|
||||||
|
<%= f.button :submit, "Reset password", class: "button is-primary is-fullwidth is-rounded" %>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<%= render "devise/shared/links" %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -0,0 +1,124 @@
|
||||||
|
<div class="container is-fluid" id="registrations" data-controller="notification">
|
||||||
|
<div class="columns is-centered">
|
||||||
|
<div id="registrations-column" class="column is-four-fifths is-two-thirds-tablet is-half-desktop">
|
||||||
|
<section class="hero is-primary">
|
||||||
|
<div class="hero-body">
|
||||||
|
<div class="container">
|
||||||
|
<h1 class="title has-text-centered">
|
||||||
|
Edit Account
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<div id="registrations-column-form">
|
||||||
|
<% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
|
||||||
|
<div class="notification is-warning">
|
||||||
|
<button class="delete"></button>
|
||||||
|
|
||||||
|
Account confirmation pending for <strong><%= resource.unconfirmed_email %></strong>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<%= simple_form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
|
||||||
|
<div class="field">
|
||||||
|
<%= f.label :email, class: "label" %>
|
||||||
|
|
||||||
|
<p class="control has-icons-left has-icons-right">
|
||||||
|
<%= f.input_field :email, required: true, autofocus: true, autocomplete: "email", class: "input" %>
|
||||||
|
|
||||||
|
<span class="icon is-small is-left">
|
||||||
|
<i class="fas fa-envelope"></i>
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<%= f.full_error :email, class: "help is-danger" %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="registrations-edit-passwords">
|
||||||
|
<%= link_to "Change password", "#", id: "registration-edit-password-button", class: "button is-fullwidth is-rounded" %>
|
||||||
|
|
||||||
|
<div class="toggleable" id="registrations-edit-update-password">
|
||||||
|
<div class="notification">
|
||||||
|
<div class="field">
|
||||||
|
<%= f.label :password, class: "label" %>
|
||||||
|
|
||||||
|
<p class="control has-icons-left">
|
||||||
|
<%= f.input_field :password, required: false, autocomplete: "new-password", class: "input" %>
|
||||||
|
|
||||||
|
<span class="icon is-small is-left">
|
||||||
|
<i class="fas fa-lock"></i>
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<%= f.hint "Leave blank to not change password", class: "help" %>
|
||||||
|
<%= f.full_error :password, class: "help is-danger" %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="field">
|
||||||
|
<%= f.label :password_confirmation, class: "label" %>
|
||||||
|
|
||||||
|
<p class="control has-icons-left">
|
||||||
|
<%= f.input_field :password_confirmation, required: false, autocomplete: "new-password", class: "input" %>
|
||||||
|
|
||||||
|
<span class="icon is-small is-left">
|
||||||
|
<i class="fas fa-lock"></i>
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<%= f.full_error :password_confirmation, class: "help is-danger" %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="field">
|
||||||
|
<%= f.label :current_password, class: "label" %>
|
||||||
|
|
||||||
|
<p class="control has-icons-left">
|
||||||
|
<%= f.input_field :current_password, required: true, autocomplete: "current-password", class: "input" %>
|
||||||
|
|
||||||
|
<span class="icon is-small is-left">
|
||||||
|
<i class="fas fa-lock"></i>
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<%= f.hint "Password confirmation needed for changes", class: "help" %>
|
||||||
|
<%= f.full_error :current_password, class: "help is-danger" %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="field">
|
||||||
|
<p class="control" id="registrations-column-form-submit-button">
|
||||||
|
<%= f.button :submit, "Update Account", class: "button is-primary is-fullwidth is-rounded" %>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="columns">
|
||||||
|
<div class="column">
|
||||||
|
<%= link_to "Back", :back, class: "button is-primary is-fullwidth is-rounded is-light" %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="column">
|
||||||
|
<%= link_to "Close my account", "#registration-edit-account-delete", id: "registration-edit-account-delete-button", class: "button is-danger is-fullwidth is-rounded is-light" %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="registration-edit-account-delete" class="has-text-centered toggleable">
|
||||||
|
<article class="message is-danger">
|
||||||
|
<div class="message-body">
|
||||||
|
<strong>Warning!</strong> Account deletion is permanant and can not be recovered.
|
||||||
|
|
||||||
|
<div class="is-centered" id="registration-edit-account-deletion-container">
|
||||||
|
<%= link_to "Delete My Account", registration_path(resource_name),
|
||||||
|
data: { confirm: "Are you sure?" }, method: :delete,
|
||||||
|
class: "button is-danger is-two-thirds is-rounded" %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -0,0 +1,71 @@
|
||||||
|
<div class="container is-fluid" id="registrations">
|
||||||
|
<div class="columns is-centered is-mobile">
|
||||||
|
<div id="registrations-column" class="column is-four-fifths-mobile is-two-thirds-tablet is-half-desktop">
|
||||||
|
<section class="hero is-primary">
|
||||||
|
<div class="hero-body">
|
||||||
|
<div class="container">
|
||||||
|
<h1 class="title has-text-centered">
|
||||||
|
Sign up
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<div id="registrations-column-form">
|
||||||
|
<%= simple_form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
|
||||||
|
<div class="field">
|
||||||
|
<%= f.label :email, class: "label" %>
|
||||||
|
|
||||||
|
<p class="control has-icons-left has-icons-right">
|
||||||
|
<%= f.input_field :email, required: true, autofocus: true, autocomplete: "email", class: "input" %>
|
||||||
|
|
||||||
|
<span class="icon is-small is-left">
|
||||||
|
<i class="fas fa-envelope"></i>
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<%= f.full_error :email, class: "help is-danger" %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="field">
|
||||||
|
<%= f.label :password, class: "label" %>
|
||||||
|
|
||||||
|
<p class="control has-icons-left">
|
||||||
|
<%= f.input_field :password, required: true,
|
||||||
|
hint: ("#{@minimum_password_length} characters minimum" if @minimum_password_length),
|
||||||
|
autocomplete: "new-password", class: "input" %>
|
||||||
|
|
||||||
|
<span class="icon is-small is-left">
|
||||||
|
<i class="fas fa-lock"></i>
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<%= f.full_error :password, class: "help is-danger" %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="field">
|
||||||
|
<%= f.label :password_confirmation, class: "label" %>
|
||||||
|
|
||||||
|
<p class="control has-icons-left">
|
||||||
|
<%= f.input_field :password_confirmation, required: true, autocomplete: "new-password", class: "input" %>
|
||||||
|
|
||||||
|
<span class="icon is-small is-left">
|
||||||
|
<i class="fas fa-lock"></i>
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<%= f.full_error :password_confirmation, class: "help is-danger" %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="field">
|
||||||
|
<p class="control" id="registrations-column-form-submit-button">
|
||||||
|
<%= f.button :submit, "Sign up", class: "button is-primary is-fullwidth is-rounded" %>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<%= render "devise/shared/links" %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -0,0 +1,58 @@
|
||||||
|
<div class="container is-fluid" id="registrations">
|
||||||
|
<div class="columns is-centered">
|
||||||
|
<div id="registrations-column" class="column is-four-fifths is-two-thirds-tablet is-half-desktop">
|
||||||
|
<section class="hero is-primary">
|
||||||
|
<div class="hero-body">
|
||||||
|
<div class="container">
|
||||||
|
<h1 class="title has-text-centered">
|
||||||
|
Log in <%= resource_name %>
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<div id="registrations-column-form">
|
||||||
|
<%= simple_form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
|
||||||
|
<div class="field">
|
||||||
|
<%= f.label :email, class: "label" %>
|
||||||
|
|
||||||
|
<p class="control has-icons-left has-icons-right">
|
||||||
|
<%= f.input_field :email, required: true, autofocus: true, autocomplete: "email", class: "input" %>
|
||||||
|
|
||||||
|
<span class="icon is-small is-left">
|
||||||
|
<i class="fas fa-envelope"></i>
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<%= f.full_error :email, class: "help is-danger" %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="field">
|
||||||
|
<%= f.label :password, class: "label" %>
|
||||||
|
|
||||||
|
<p class="control has-icons-left">
|
||||||
|
<%= f.input_field :password, required: true, autocomplete: "current-password", class: "input" %>
|
||||||
|
|
||||||
|
<span class="icon is-small is-left">
|
||||||
|
<i class="fas fa-lock"></i>
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<%= f.full_error :password, class: "help is-danger" %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<%= f.check_box :remember_me, as: :boolean, class: "checkbox" %>
|
||||||
|
<%= f.label :remember_me, class: "checkbox" %>
|
||||||
|
|
||||||
|
<div class="field">
|
||||||
|
<p class="control" id="registrations-column-form-submit-button">
|
||||||
|
<%= f.button :submit, "Sign in", class: "button is-primary is-fullwidth is-rounded" %>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<%= render "devise/shared/links" %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -0,0 +1,12 @@
|
||||||
|
<% if resource.errors.any? %>
|
||||||
|
<div id="error_explanation">
|
||||||
|
<h2>
|
||||||
|
<%= I18n.t("errors.messages.not_saved", count: resource.errors.count, resource: resource.class.model_name.human.downcase) %>
|
||||||
|
</h2>
|
||||||
|
<ul>
|
||||||
|
<% resource.errors.full_messages.each do |message| %>
|
||||||
|
<li><%= message %></li>
|
||||||
|
<% end %>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
|
@ -0,0 +1,39 @@
|
||||||
|
<div class="columns is-centered is-mobile has-text-centered is-size-7">
|
||||||
|
<% if controller_name != 'sessions' %>
|
||||||
|
<div class="column">
|
||||||
|
<%= link_to "Log in", new_session_path(resource_name) %>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% if devise_mapping.registerable? && controller_name != 'registrations' %>
|
||||||
|
<div class="column">
|
||||||
|
<%= link_to "Sign up", new_registration_path(resource_name) %>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% if devise_mapping.recoverable? && controller_name != 'passwords' && controller_name != 'registrations' %>
|
||||||
|
<div class="column">
|
||||||
|
<%= link_to "Password Recovery", new_password_path(resource_name) %>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% if devise_mapping.confirmable? && controller_name != 'confirmations' %>
|
||||||
|
<div class="column">
|
||||||
|
<%= link_to "Confirm Account", new_confirmation_path(resource_name) %>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %>
|
||||||
|
<div class="column">
|
||||||
|
<%= link_to "Unlock Account", new_unlock_path(resource_name) %>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% if devise_mapping.omniauthable? %>
|
||||||
|
<% resource_class.omniauth_providers.each do |provider| %>
|
||||||
|
<div class="column">
|
||||||
|
<%= link_to "Sign in with #{OmniAuth::Utils.camelize(provider)}", omniauth_authorize_path(resource_name, provider) %>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
|
@ -0,0 +1,45 @@
|
||||||
|
<div class="container is-fluid" id="passwords">
|
||||||
|
<div class="columns is-centered is-mobile">
|
||||||
|
<div id="registrations-column" class="column is-four-fifths-mobile is-two-thirds-tablet is-half-desktop">
|
||||||
|
<section class="hero is-primary">
|
||||||
|
<div class="hero-body">
|
||||||
|
<div class="container">
|
||||||
|
<h1 class="title has-text-centered">
|
||||||
|
Account Unlock
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<div id="unlocks-column-form">
|
||||||
|
<%= simple_form_for(resource, as: resource_name, url: unlock_path(resource_name), html: { method: :post }) do |f| %>
|
||||||
|
<div class="field">
|
||||||
|
<%= f.label :email, class: "label" %>
|
||||||
|
|
||||||
|
<p class="control has-icons-left has-icons-right">
|
||||||
|
<%= f.input_field :email,
|
||||||
|
required: true,
|
||||||
|
autofocus: true,
|
||||||
|
autocomplete: "email",
|
||||||
|
class: "input" %>
|
||||||
|
|
||||||
|
<span class="icon is-small is-left">
|
||||||
|
<i class="fas fa-envelope"></i>
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<%= f.full_error :email, class: "help is-danger" %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="field">
|
||||||
|
<p class="control" id="registrations-column-form-submit-button">
|
||||||
|
<%= f.button :submit, "Send unlock instructions", class: "button is-primary is-fullwidth is-rounded" %>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<%= render "devise/shared/links" %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -12,12 +12,14 @@
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<p class="notice"><%= notice %></p>
|
<%= render "shared/notifications" %>
|
||||||
<p class="alert"><%= alert %></p>
|
|
||||||
|
|
||||||
<%= yield %>
|
<%= yield %>
|
||||||
|
|
||||||
|
<%= render "shared/developer_view" %>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
<%= javascript_pack_tag 'application' %>
|
<%= javascript_pack_tag 'application' %>
|
||||||
|
<%= javascript_controller_pack_tag_helper %>
|
||||||
<script defer src="https://use.fontawesome.com/releases/v5.3.1/js/all.js"></script>
|
<script defer src="https://use.fontawesome.com/releases/v5.3.1/js/all.js"></script>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -1,13 +1,22 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
<meta charset="utf-8">
|
||||||
<style>
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
/* Email styles need to be inline */
|
<meta http-equiv="Content-Type" content="text/html" />
|
||||||
</style>
|
|
||||||
|
<%= stylesheet_link_tag :mailer, media: "all" %>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<%= yield %>
|
<div class="email-main-container">
|
||||||
|
<div class="container is-fluid">
|
||||||
|
<div class="columns is-centered is-mobile">
|
||||||
|
<div class="column is-two-thirds">
|
||||||
|
<%= yield %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
<% if Rails.env.development? %>
|
||||||
|
<div class="developer-pane" style="padding:2rem;">
|
||||||
|
<div class="columns is-centered">
|
||||||
|
<div class="column is-four-fifths">
|
||||||
|
<article class="message">
|
||||||
|
<div class="message-header">
|
||||||
|
<p>Developer Pane</p>
|
||||||
|
</div>
|
||||||
|
<div class="message-body">
|
||||||
|
<% params.each do |key, value| %>
|
||||||
|
<div class="columns">
|
||||||
|
<div class="column is-one-third">
|
||||||
|
<%= key %>
|
||||||
|
</div>
|
||||||
|
<div class="column">
|
||||||
|
<%= value %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
|
@ -0,0 +1,13 @@
|
||||||
|
<div class="container notifications-container is-fluid <%= 'is-hidden' if flash.blank? %>">
|
||||||
|
<div class="columns is-centered">
|
||||||
|
<div class="column is-two-thirds">
|
||||||
|
<% flash.each do |name, msg| %>
|
||||||
|
<%= content_tag :div, msg, class: "notification app-notifications is-#{notification_type(name)}" do %>
|
||||||
|
<button class="delete"></button>
|
||||||
|
|
||||||
|
<%= msg %>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -14,3 +14,4 @@ Rails.application.config.assets.paths << Rails.root.join('node_modules')
|
||||||
# application.js, application.css, and all non-JS/CSS in the app/assets
|
# application.js, application.css, and all non-JS/CSS in the app/assets
|
||||||
# folder are already added.
|
# folder are already added.
|
||||||
# Rails.application.config.assets.precompile += %w( admin.js admin.css )
|
# Rails.application.config.assets.precompile += %w( admin.js admin.css )
|
||||||
|
Rails.application.config.assets.precompile += %w[mailer.css]
|
||||||
|
|
|
@ -18,10 +18,10 @@ Devise.setup do |config|
|
||||||
# Configure the e-mail address which will be shown in Devise::Mailer,
|
# Configure the e-mail address which will be shown in Devise::Mailer,
|
||||||
# note that it will be overwritten if you use your own mailer class
|
# note that it will be overwritten if you use your own mailer class
|
||||||
# with default "from" parameter.
|
# with default "from" parameter.
|
||||||
config.mailer_sender = 'please-change-me-at-config-initializers-devise@example.com'
|
# config.mailer_sender = 'please-change-me-at-config-initializers-devise@example.com'
|
||||||
|
|
||||||
# Configure the class responsible to send e-mails.
|
# Configure the class responsible to send e-mails.
|
||||||
# config.mailer = 'Devise::Mailer'
|
config.mailer = 'BulmaDeviseMailer'
|
||||||
|
|
||||||
# Configure the parent class responsible to send e-mails.
|
# Configure the parent class responsible to send e-mails.
|
||||||
# config.parent_mailer = 'ActionMailer::Base'
|
# config.parent_mailer = 'ActionMailer::Base'
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
Premailer::Rails.config.merge!(preserve_styles: true, remove_ids: true)
|
|
@ -0,0 +1,177 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
#
|
||||||
|
# Uncomment this and change the path if necessary to include your own
|
||||||
|
# components.
|
||||||
|
# See https://github.com/heartcombo/simple_form#custom-components to know
|
||||||
|
# more about custom components.
|
||||||
|
# Dir[Rails.root.join('lib/components/**/*.rb')].each { |f| require f }
|
||||||
|
#
|
||||||
|
# Use this setup block to configure all options available in SimpleForm.
|
||||||
|
SimpleForm.setup do |config|
|
||||||
|
# Wrappers are used by the form builder to generate a
|
||||||
|
# complete input. You can remove any component from the
|
||||||
|
# wrapper, change the order or even add your own to the
|
||||||
|
# stack. The options given below are used to wrap the
|
||||||
|
# whole input.
|
||||||
|
config.wrappers :default, class: :input,
|
||||||
|
hint_class: :field_with_hint, error_class: :field_with_errors, valid_class: :field_without_errors do |b|
|
||||||
|
## Extensions enabled by default
|
||||||
|
# Any of these extensions can be disabled for a
|
||||||
|
# given input by passing: `f.input EXTENSION_NAME => false`.
|
||||||
|
# You can make any of these extensions optional by
|
||||||
|
# renaming `b.use` to `b.optional`.
|
||||||
|
|
||||||
|
# Determines whether to use HTML5 (:email, :url, ...)
|
||||||
|
# and required attributes
|
||||||
|
b.use :html5
|
||||||
|
|
||||||
|
# Calculates placeholders automatically from I18n
|
||||||
|
# You can also pass a string as f.input placeholder: "Placeholder"
|
||||||
|
b.use :placeholder
|
||||||
|
|
||||||
|
## Optional extensions
|
||||||
|
# They are disabled unless you pass `f.input EXTENSION_NAME => true`
|
||||||
|
# to the input. If so, they will retrieve the values from the model
|
||||||
|
# if any exists. If you want to enable any of those
|
||||||
|
# extensions by default, you can change `b.optional` to `b.use`.
|
||||||
|
|
||||||
|
# Calculates maxlength from length validations for string inputs
|
||||||
|
# and/or database column lengths
|
||||||
|
b.optional :maxlength
|
||||||
|
|
||||||
|
# Calculate minlength from length validations for string inputs
|
||||||
|
b.optional :minlength
|
||||||
|
|
||||||
|
# Calculates pattern from format validations for string inputs
|
||||||
|
b.optional :pattern
|
||||||
|
|
||||||
|
# Calculates min and max from length validations for numeric inputs
|
||||||
|
b.optional :min_max
|
||||||
|
|
||||||
|
# Calculates readonly automatically from readonly attributes
|
||||||
|
b.optional :readonly
|
||||||
|
|
||||||
|
## Inputs
|
||||||
|
# b.use :input, class: 'input', error_class: 'is-invalid', valid_class: 'is-valid'
|
||||||
|
b.use :label_input
|
||||||
|
b.use :hint, wrap_with: { tag: :span, class: :hint }
|
||||||
|
b.use :error, wrap_with: { tag: :span, class: :error }
|
||||||
|
|
||||||
|
## full_messages_for
|
||||||
|
# If you want to display the full error message for the attribute, you can
|
||||||
|
# use the component :full_error, like:
|
||||||
|
#
|
||||||
|
# b.use :full_error, wrap_with: { tag: :span, class: :error }
|
||||||
|
end
|
||||||
|
|
||||||
|
# The default wrapper to be used by the FormBuilder.
|
||||||
|
config.default_wrapper = :default
|
||||||
|
|
||||||
|
# Define the way to render check boxes / radio buttons with labels.
|
||||||
|
# Defaults to :nested for bootstrap config.
|
||||||
|
# inline: input + label
|
||||||
|
# nested: label > input
|
||||||
|
config.boolean_style = :nested
|
||||||
|
|
||||||
|
# Default class for buttons
|
||||||
|
config.button_class = 'button'
|
||||||
|
|
||||||
|
# Method used to tidy up errors. Specify any Rails Array method.
|
||||||
|
# :first lists the first message for each field.
|
||||||
|
# Use :to_sentence to list all errors for each field.
|
||||||
|
# config.error_method = :first
|
||||||
|
|
||||||
|
# Default tag used for error notification helper.
|
||||||
|
config.error_notification_tag = :div
|
||||||
|
|
||||||
|
# CSS class to add for error notification helper.
|
||||||
|
config.error_notification_class = 'error_notification'
|
||||||
|
|
||||||
|
# Series of attempts to detect a default label method for collection.
|
||||||
|
# config.collection_label_methods = [ :to_label, :name, :title, :to_s ]
|
||||||
|
|
||||||
|
# Series of attempts to detect a default value method for collection.
|
||||||
|
# config.collection_value_methods = [ :id, :to_s ]
|
||||||
|
|
||||||
|
# You can wrap a collection of radio/check boxes in a pre-defined tag, defaulting to none.
|
||||||
|
# config.collection_wrapper_tag = nil
|
||||||
|
|
||||||
|
# You can define the class to use on all collection wrappers. Defaulting to none.
|
||||||
|
# config.collection_wrapper_class = nil
|
||||||
|
|
||||||
|
# You can wrap each item in a collection of radio/check boxes with a tag,
|
||||||
|
# defaulting to :span.
|
||||||
|
# config.item_wrapper_tag = :span
|
||||||
|
|
||||||
|
# You can define a class to use in all item wrappers. Defaulting to none.
|
||||||
|
# config.item_wrapper_class = nil
|
||||||
|
|
||||||
|
# How the label text should be generated altogether with the required text.
|
||||||
|
# config.label_text = lambda { |label, required, explicit_label| "#{required} #{label}" }
|
||||||
|
|
||||||
|
# You can define the class to use on all labels. Default is nil.
|
||||||
|
# config.label_class = nil
|
||||||
|
|
||||||
|
# You can define the default class to be used on forms. Can be overriden
|
||||||
|
# with `html: { :class }`. Defaulting to none.
|
||||||
|
# config.default_form_class = nil
|
||||||
|
|
||||||
|
# You can define which elements should obtain additional classes
|
||||||
|
# config.generate_additional_classes_for = [:wrapper, :label, :input]
|
||||||
|
|
||||||
|
# Whether attributes are required by default (or not). Default is true.
|
||||||
|
# config.required_by_default = true
|
||||||
|
|
||||||
|
# Tell browsers whether to use the native HTML5 validations (novalidate form option).
|
||||||
|
# These validations are enabled in SimpleForm's internal config but disabled by default
|
||||||
|
# in this configuration, which is recommended due to some quirks from different browsers.
|
||||||
|
# To stop SimpleForm from generating the novalidate option, enabling the HTML5 validations,
|
||||||
|
# change this configuration to true.
|
||||||
|
config.browser_validations = false
|
||||||
|
|
||||||
|
# Custom mappings for input types. This should be a hash containing a regexp
|
||||||
|
# to match as key, and the input type that will be used when the field name
|
||||||
|
# matches the regexp as value.
|
||||||
|
# config.input_mappings = { /count/ => :integer }
|
||||||
|
|
||||||
|
# Custom wrappers for input types. This should be a hash containing an input
|
||||||
|
# type as key and the wrapper that will be used for all inputs with specified type.
|
||||||
|
# config.wrapper_mappings = { string: :prepend }
|
||||||
|
|
||||||
|
# Namespaces where SimpleForm should look for custom input classes that
|
||||||
|
# override default inputs.
|
||||||
|
# config.custom_inputs_namespaces << "CustomInputs"
|
||||||
|
|
||||||
|
# Default priority for time_zone inputs.
|
||||||
|
# config.time_zone_priority = nil
|
||||||
|
|
||||||
|
# Default priority for country inputs.
|
||||||
|
# config.country_priority = nil
|
||||||
|
|
||||||
|
# When false, do not use translations for labels.
|
||||||
|
# config.translate_labels = true
|
||||||
|
|
||||||
|
# Automatically discover new inputs in Rails' autoload path.
|
||||||
|
# config.inputs_discovery = true
|
||||||
|
|
||||||
|
# Cache SimpleForm inputs discovery
|
||||||
|
# config.cache_discovery = !Rails.env.development?
|
||||||
|
|
||||||
|
# Default class for inputs
|
||||||
|
# config.input_class = nil
|
||||||
|
|
||||||
|
# Define the default class of the input wrapper of the boolean input.
|
||||||
|
config.boolean_label_class = 'checkbox'
|
||||||
|
|
||||||
|
# Defines if the default input wrapper class should be included in radio
|
||||||
|
# collection wrappers.
|
||||||
|
# config.include_default_input_wrapper_class = true
|
||||||
|
|
||||||
|
# Defines which i18n scope will be used in Simple Form.
|
||||||
|
# config.i18n_scope = 'simple_form'
|
||||||
|
|
||||||
|
# Defines validation classes to the input_field. By default it's nil.
|
||||||
|
config.input_field_valid_class = 'is-success'
|
||||||
|
config.input_field_error_class = 'is-danger'
|
||||||
|
end
|
|
@ -0,0 +1,31 @@
|
||||||
|
en:
|
||||||
|
simple_form:
|
||||||
|
"yes": 'Yes'
|
||||||
|
"no": 'No'
|
||||||
|
required:
|
||||||
|
text: 'required'
|
||||||
|
mark: '*'
|
||||||
|
# You can uncomment the line below if you need to overwrite the whole required html.
|
||||||
|
# When using html, text and mark won't be used.
|
||||||
|
# html: '<abbr title="required">*</abbr>'
|
||||||
|
error_notification:
|
||||||
|
default_message: "Please review the problems below:"
|
||||||
|
# Examples
|
||||||
|
# labels:
|
||||||
|
# defaults:
|
||||||
|
# password: 'Password'
|
||||||
|
# user:
|
||||||
|
# new:
|
||||||
|
# email: 'E-mail to sign in.'
|
||||||
|
# edit:
|
||||||
|
# email: 'E-mail.'
|
||||||
|
# hints:
|
||||||
|
# defaults:
|
||||||
|
# username: 'User name to sign in.'
|
||||||
|
# password: 'No special characters, please.'
|
||||||
|
# include_blanks:
|
||||||
|
# defaults:
|
||||||
|
# age: 'Rather not say'
|
||||||
|
# prompts:
|
||||||
|
# defaults:
|
||||||
|
# age: 'Select your age'
|
|
@ -1,3 +1,11 @@
|
||||||
const { environment } = require('@rails/webpacker')
|
const { environment } = require('@rails/webpacker')
|
||||||
|
const webpack = require('webpack')
|
||||||
|
|
||||||
|
environment.plugins.prepend('Provide',
|
||||||
|
new webpack.ProvidePlugin({
|
||||||
|
$: 'jquery/src/jquery',
|
||||||
|
jQuery: 'jquery/src/jquery'
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
module.exports = environment
|
module.exports = environment
|
||||||
|
|
|
@ -50,7 +50,7 @@ default: &default
|
||||||
|
|
||||||
development:
|
development:
|
||||||
<<: *default
|
<<: *default
|
||||||
compile: true
|
compile: false
|
||||||
|
|
||||||
# Verifies that correct packages and versions are installed by inspecting package.json, yarn.lock, and node_modules
|
# Verifies that correct packages and versions are installed by inspecting package.json, yarn.lock, and node_modules
|
||||||
# check_yarn_integrity: true
|
# check_yarn_integrity: true
|
||||||
|
@ -65,6 +65,7 @@ development:
|
||||||
# Non-docker: localhost:3035
|
# Non-docker: localhost:3035
|
||||||
public: webpacker:3035
|
public: webpacker:3035
|
||||||
hmr: false
|
hmr: false
|
||||||
|
# hmr: true
|
||||||
# Inline should be set to true if using HMR
|
# Inline should be set to true if using HMR
|
||||||
inline: true
|
inline: true
|
||||||
overlay: true
|
overlay: true
|
||||||
|
@ -76,6 +77,7 @@ development:
|
||||||
headers:
|
headers:
|
||||||
'Access-Control-Allow-Origin': '*'
|
'Access-Control-Allow-Origin': '*'
|
||||||
watch_options:
|
watch_options:
|
||||||
|
poll: true
|
||||||
ignored: '**/node_modules/**'
|
ignored: '**/node_modules/**'
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -13,16 +13,16 @@ services:
|
||||||
POSTGRES_PASSWORD: "password"
|
POSTGRES_PASSWORD: "password"
|
||||||
ports:
|
ports:
|
||||||
- "5432:5432"
|
- "5432:5432"
|
||||||
# volumes:
|
volumes:
|
||||||
# - "postgres:/var/lib/postgresql/data"
|
- /usr/local/var/postgres/data:/var/lib/postgresql/data
|
||||||
|
|
||||||
redis:
|
redis:
|
||||||
image: redis:5.0-alpine
|
image: redis:5.0-alpine
|
||||||
command: redis-server
|
command: redis-server
|
||||||
expose:
|
expose:
|
||||||
- "6379"
|
- "6379"
|
||||||
# volumes:
|
volumes:
|
||||||
# - "redis:/var/lib/redis/data"
|
- /usr/local/var/redis/data:/var/lib/redis/data
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: "redis-cli ping"
|
test: "redis-cli ping"
|
||||||
interval: 5s
|
interval: 5s
|
||||||
|
@ -42,6 +42,8 @@ services:
|
||||||
|
|
||||||
webpacker:
|
webpacker:
|
||||||
build: .
|
build: .
|
||||||
|
environment:
|
||||||
|
- WEBPACKER_DEV_SERVER_HOST=0.0.0.0
|
||||||
env_file:
|
env_file:
|
||||||
- '.env.docker'
|
- '.env.docker'
|
||||||
command: ./bin/webpack-dev-server
|
command: ./bin/webpack-dev-server
|
||||||
|
@ -67,8 +69,3 @@ services:
|
||||||
tty: true
|
tty: true
|
||||||
env_file:
|
env_file:
|
||||||
- '.env.docker'
|
- '.env.docker'
|
||||||
|
|
||||||
|
|
||||||
# volumes:
|
|
||||||
# redis:
|
|
||||||
# postgres:
|
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
<%# frozen_string_literal: true %>
|
||||||
|
<%%= simple_form_for(@<%= singular_table_name %>) do |f| %>
|
||||||
|
<%%= f.error_notification %>
|
||||||
|
<%%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>
|
||||||
|
|
||||||
|
<div class="form-inputs">
|
||||||
|
<%- attributes.each do |attribute| -%>
|
||||||
|
<%%= f.<%= attribute.reference? ? :association : :input %> :<%= attribute.name %> %>
|
||||||
|
<%- end -%>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-actions">
|
||||||
|
<%%= f.button :submit %>
|
||||||
|
</div>
|
||||||
|
<%% end %>
|
|
@ -5,6 +5,7 @@
|
||||||
"@rails/actioncable": "^6.0.0",
|
"@rails/actioncable": "^6.0.0",
|
||||||
"@rails/ujs": "^6.0.0",
|
"@rails/ujs": "^6.0.0",
|
||||||
"@rails/webpacker": "4.2.2",
|
"@rails/webpacker": "4.2.2",
|
||||||
|
"jquery": "^3.4.1",
|
||||||
"stimulus": "^1.1.1",
|
"stimulus": "^1.1.1",
|
||||||
"turbolinks": "^5.2.0"
|
"turbolinks": "^5.2.0"
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,67 +1,36 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>The page you were looking for doesn't exist (404)</title>
|
<title>404</title>
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<style>
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.8.2/css/bulma.min.css">
|
||||||
.rails-default-error-page {
|
</head>
|
||||||
background-color: #EFEFEF;
|
|
||||||
color: #2E2F30;
|
|
||||||
text-align: center;
|
|
||||||
font-family: arial, sans-serif;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.rails-default-error-page div.dialog {
|
<body>
|
||||||
width: 95%;
|
<div class="container is-fluid">
|
||||||
max-width: 33em;
|
<div class="columns is-centered is-mobile">
|
||||||
margin: 4em auto 0;
|
<div class="column is-four-fifths-mobile is-two-thirds-tablet is-half-desktop has-text-centered">
|
||||||
}
|
<section class="hero">
|
||||||
|
<div class="hero-body">
|
||||||
|
<div class="container">
|
||||||
|
<h1>
|
||||||
|
<i class="far fa-frown-open fa-9x"></i>
|
||||||
|
</h1>
|
||||||
|
|
||||||
.rails-default-error-page div.dialog > div {
|
<h1 class="title" style="padding:2rem;">
|
||||||
border: 1px solid #CCC;
|
This page does not exist.
|
||||||
border-right-color: #999;
|
</h1>
|
||||||
border-left-color: #999;
|
</div>
|
||||||
border-bottom-color: #BBB;
|
</div>
|
||||||
border-top: #B00100 solid 4px;
|
</section>
|
||||||
border-top-left-radius: 9px;
|
|
||||||
border-top-right-radius: 9px;
|
|
||||||
background-color: white;
|
|
||||||
padding: 7px 12% 0;
|
|
||||||
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
|
||||||
}
|
|
||||||
|
|
||||||
.rails-default-error-page h1 {
|
<p class="subtitle">
|
||||||
font-size: 100%;
|
Please contact support if the problem persists.
|
||||||
color: #730E15;
|
</p>
|
||||||
line-height: 1.5em;
|
</div>
|
||||||
}
|
</div>
|
||||||
|
|
||||||
.rails-default-error-page div.dialog > p {
|
|
||||||
margin: 0 0 1em;
|
|
||||||
padding: 1em;
|
|
||||||
background-color: #F7F7F7;
|
|
||||||
border: 1px solid #CCC;
|
|
||||||
border-right-color: #999;
|
|
||||||
border-left-color: #999;
|
|
||||||
border-bottom-color: #999;
|
|
||||||
border-bottom-left-radius: 4px;
|
|
||||||
border-bottom-right-radius: 4px;
|
|
||||||
border-top-color: #DADADA;
|
|
||||||
color: #666;
|
|
||||||
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body class="rails-default-error-page">
|
|
||||||
<!-- This file lives in public/404.html -->
|
|
||||||
<div class="dialog">
|
|
||||||
<div>
|
|
||||||
<h1>The page you were looking for doesn't exist.</h1>
|
|
||||||
<p>You may have mistyped the address or the page may have moved.</p>
|
|
||||||
</div>
|
</div>
|
||||||
<p>If you are the application owner check the logs for more information.</p>
|
</body>
|
||||||
</div>
|
|
||||||
</body>
|
<script defer src="https://use.fontawesome.com/releases/v5.3.1/js/all.js"></script>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -1,67 +1,32 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>The change you wanted was rejected (422)</title>
|
<title>422</title>
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<style>
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.8.2/css/bulma.min.css">
|
||||||
.rails-default-error-page {
|
</head>
|
||||||
background-color: #EFEFEF;
|
|
||||||
color: #2E2F30;
|
|
||||||
text-align: center;
|
|
||||||
font-family: arial, sans-serif;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.rails-default-error-page div.dialog {
|
<body>
|
||||||
width: 95%;
|
<div class="container is-fluid">
|
||||||
max-width: 33em;
|
<div class="columns is-centered is-mobile">
|
||||||
margin: 4em auto 0;
|
<div class="column is-four-fifths-mobile is-two-thirds-tablet is-half-desktop has-text-centered">
|
||||||
}
|
<section class="hero">
|
||||||
|
<div class="hero-body">
|
||||||
|
<div class="container">
|
||||||
|
<h1>
|
||||||
|
<i class="far fa-frown-open fa-9x"></i>
|
||||||
|
</h1>
|
||||||
|
|
||||||
.rails-default-error-page div.dialog > div {
|
<h1 class="title" style="padding:2rem;">
|
||||||
border: 1px solid #CCC;
|
Whoops. That didn't work. Please contact support if problem continues.
|
||||||
border-right-color: #999;
|
</h1>
|
||||||
border-left-color: #999;
|
</div>
|
||||||
border-bottom-color: #BBB;
|
</div>
|
||||||
border-top: #B00100 solid 4px;
|
</section>
|
||||||
border-top-left-radius: 9px;
|
</div>
|
||||||
border-top-right-radius: 9px;
|
</div>
|
||||||
background-color: white;
|
|
||||||
padding: 7px 12% 0;
|
|
||||||
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
|
||||||
}
|
|
||||||
|
|
||||||
.rails-default-error-page h1 {
|
|
||||||
font-size: 100%;
|
|
||||||
color: #730E15;
|
|
||||||
line-height: 1.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.rails-default-error-page div.dialog > p {
|
|
||||||
margin: 0 0 1em;
|
|
||||||
padding: 1em;
|
|
||||||
background-color: #F7F7F7;
|
|
||||||
border: 1px solid #CCC;
|
|
||||||
border-right-color: #999;
|
|
||||||
border-left-color: #999;
|
|
||||||
border-bottom-color: #999;
|
|
||||||
border-bottom-left-radius: 4px;
|
|
||||||
border-bottom-right-radius: 4px;
|
|
||||||
border-top-color: #DADADA;
|
|
||||||
color: #666;
|
|
||||||
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body class="rails-default-error-page">
|
|
||||||
<!-- This file lives in public/422.html -->
|
|
||||||
<div class="dialog">
|
|
||||||
<div>
|
|
||||||
<h1>The change you wanted was rejected.</h1>
|
|
||||||
<p>Maybe you tried to change something you didn't have access to.</p>
|
|
||||||
</div>
|
</div>
|
||||||
<p>If you are the application owner check the logs for more information.</p>
|
</body>
|
||||||
</div>
|
|
||||||
</body>
|
<script defer src="https://use.fontawesome.com/releases/v5.3.1/js/all.js"></script>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -1,66 +1,32 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>We're sorry, but something went wrong (500)</title>
|
<title>500</title>
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<style>
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.8.2/css/bulma.min.css">
|
||||||
.rails-default-error-page {
|
</head>
|
||||||
background-color: #EFEFEF;
|
|
||||||
color: #2E2F30;
|
|
||||||
text-align: center;
|
|
||||||
font-family: arial, sans-serif;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.rails-default-error-page div.dialog {
|
<body>
|
||||||
width: 95%;
|
<div class="container is-fluid">
|
||||||
max-width: 33em;
|
<div class="columns is-centered is-mobile">
|
||||||
margin: 4em auto 0;
|
<div class="column is-four-fifths-mobile is-two-thirds-tablet is-half-desktop has-text-centered">
|
||||||
}
|
<section class="hero">
|
||||||
|
<div class="hero-body">
|
||||||
|
<div class="container">
|
||||||
|
<h1>
|
||||||
|
<i class="far fa-frown-open fa-9x"></i>
|
||||||
|
</h1>
|
||||||
|
|
||||||
.rails-default-error-page div.dialog > div {
|
<h1 class="title" style="padding:2rem;">
|
||||||
border: 1px solid #CCC;
|
A system error occurred. Please contact support if problem continues.
|
||||||
border-right-color: #999;
|
</h1>
|
||||||
border-left-color: #999;
|
</div>
|
||||||
border-bottom-color: #BBB;
|
</div>
|
||||||
border-top: #B00100 solid 4px;
|
</section>
|
||||||
border-top-left-radius: 9px;
|
</div>
|
||||||
border-top-right-radius: 9px;
|
</div>
|
||||||
background-color: white;
|
|
||||||
padding: 7px 12% 0;
|
|
||||||
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
|
||||||
}
|
|
||||||
|
|
||||||
.rails-default-error-page h1 {
|
|
||||||
font-size: 100%;
|
|
||||||
color: #730E15;
|
|
||||||
line-height: 1.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.rails-default-error-page div.dialog > p {
|
|
||||||
margin: 0 0 1em;
|
|
||||||
padding: 1em;
|
|
||||||
background-color: #F7F7F7;
|
|
||||||
border: 1px solid #CCC;
|
|
||||||
border-right-color: #999;
|
|
||||||
border-left-color: #999;
|
|
||||||
border-bottom-color: #999;
|
|
||||||
border-bottom-left-radius: 4px;
|
|
||||||
border-bottom-right-radius: 4px;
|
|
||||||
border-top-color: #DADADA;
|
|
||||||
color: #666;
|
|
||||||
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body class="rails-default-error-page">
|
|
||||||
<!-- This file lives in public/500.html -->
|
|
||||||
<div class="dialog">
|
|
||||||
<div>
|
|
||||||
<h1>We're sorry, but something went wrong.</h1>
|
|
||||||
</div>
|
</div>
|
||||||
<p>If you are the application owner check the logs for more information.</p>
|
</body>
|
||||||
</div>
|
|
||||||
</body>
|
<script defer src="https://use.fontawesome.com/releases/v5.3.1/js/all.js"></script>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -3842,6 +3842,11 @@ jest-worker@^25.1.0:
|
||||||
merge-stream "^2.0.0"
|
merge-stream "^2.0.0"
|
||||||
supports-color "^7.0.0"
|
supports-color "^7.0.0"
|
||||||
|
|
||||||
|
jquery@^3.4.1:
|
||||||
|
version "3.4.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2"
|
||||||
|
integrity sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==
|
||||||
|
|
||||||
js-base64@^2.1.8:
|
js-base64@^2.1.8:
|
||||||
version "2.5.2"
|
version "2.5.2"
|
||||||
resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.2.tgz#313b6274dda718f714d00b3330bbae6e38e90209"
|
resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.2.tgz#313b6274dda718f714d00b3330bbae6e38e90209"
|
||||||
|
|
Loading…
Reference in New Issue