diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..4ed475f
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,2 @@
+## Dependency directories
+node_modules/
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 13a6f13..64b07a6 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -1,28 +1,33 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
-
-
+
-
-
-
+
+
-
@@ -37,6 +42,7 @@
+
@@ -63,20 +69,18 @@
-
-
+
+
-
+
-
-
-
+
@@ -98,7 +102,6 @@
-
@@ -121,7 +124,8 @@
1597686467739
-
+
+
1597695591871
@@ -130,7 +134,14 @@
1597695591871
-
+
+ 1597818691547
+
+
+
+ 1597818691547
+
+
@@ -138,25 +149,30 @@
-
+
+
-
+
-
-
+
+
-
-
+
+
-
+
+
+
+
+
@@ -169,10 +185,10 @@
-
+
-
+
@@ -181,9 +197,9 @@
-
+
-
+
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..a5dc57d
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,5 @@
+language: ruby
+rvm:
+ - 2.5
+ - 2.6
+bundler_args: --without production
\ No newline at end of file
diff --git a/Gemfile b/Gemfile
index e1868e3..8f648b2 100644
--- a/Gemfile
+++ b/Gemfile
@@ -58,7 +58,8 @@ gem 'rails_admin', '~> 2.0'
# Auth with devise
gem 'devise', '~> 4.7'
+gem 'devise-bootstrap-views', '~> 1.0'
gem 'omniauth-github'
gem 'omniauth-openid'
gem 'omniauth-google-oauth2'
-gem 'omniauth-facebook'
\ No newline at end of file
+gem 'omniauth-facebook'
diff --git a/Gemfile.lock b/Gemfile.lock
index 85d35e9..6f57974 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -85,6 +85,7 @@ GEM
railties (>= 4.1.0)
responders
warden (~> 1.2.3)
+ devise-bootstrap-views (1.1.0)
erubi (1.9.0)
faraday (1.0.1)
multipart-post (>= 1.2, < 3)
@@ -303,6 +304,7 @@ DEPENDENCIES
byebug
capybara (>= 2.15)
devise (~> 4.7)
+ devise-bootstrap-views (~> 1.0)
jbuilder (~> 2.7)
listen (~> 3.2)
omniauth-facebook
diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js
index 2c74500..38ad7cd 100644
--- a/app/javascript/packs/application.js
+++ b/app/javascript/packs/application.js
@@ -8,7 +8,11 @@ require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")
global.toastr = require("toastr")
+import "../stylesheets/bootstrap"
import "../stylesheets/application"
+import 'jquery'
+import 'popper.js'
+import 'bootstrap'
// 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' %>)
diff --git a/app/javascript/stylesheets/application.scss b/app/javascript/stylesheets/application.scss
index a9ca5af..9efdfd7 100644
--- a/app/javascript/stylesheets/application.scss
+++ b/app/javascript/stylesheets/application.scss
@@ -1 +1,6 @@
-@import 'toastr'
+@import 'toastr';
+
+body {
+ height: 100%;
+ padding-top: 5rem;
+}
\ No newline at end of file
diff --git a/app/javascript/stylesheets/bootstrap.scss b/app/javascript/stylesheets/bootstrap.scss
new file mode 100644
index 0000000..4007f0d
--- /dev/null
+++ b/app/javascript/stylesheets/bootstrap.scss
@@ -0,0 +1,2 @@
+
+@import '~bootstrap/scss/bootstrap.scss';
\ No newline at end of file
diff --git a/app/models/admin.rb b/app/models/admin.rb
index 86be4db..caf198b 100644
--- a/app/models/admin.rb
+++ b/app/models/admin.rb
@@ -1,7 +1,6 @@
class Admin < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
- devise :database_authenticatable, :registerable,
- :recoverable, :rememberable, :validatable, :confirmable,
- :lockable, :timeoutable, :trackable, :omniauthable
+ devise :database_authenticatable, :recoverable, :rememberable, :validatable, :confirmable,
+ :lockable, :timeoutable, :trackable
end
diff --git a/app/models/user.rb b/app/models/user.rb
new file mode 100644
index 0000000..0f919e7
--- /dev/null
+++ b/app/models/user.rb
@@ -0,0 +1,7 @@
+class User < ApplicationRecord
+ # Include default devise modules. Others available are:
+ # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
+ devise :database_authenticatable, :registerable,
+ :recoverable, :rememberable, :validatable, :confirmable,
+ :lockable, :timeoutable, :trackable, :omniauthable
+end
diff --git a/app/views/devise/confirmations/new.html.erb b/app/views/devise/confirmations/new.html.erb
index b12dd0c..cf9dc73 100644
--- a/app/views/devise/confirmations/new.html.erb
+++ b/app/views/devise/confirmations/new.html.erb
@@ -1,16 +1,16 @@
-
Resend confirmation instructions
+<%= t('.resend_confirmation_instructions') %>
<%= form_for(resource, as: resource_name, url: confirmation_path(resource_name), html: { method: :post }) do |f| %>
- <%= render "devise/shared/error_messages", resource: resource %>
+ <%= bootstrap_devise_error_messages! %>
-
- <%= f.label :email %>
- <%= f.email_field :email, autofocus: true, autocomplete: "email", value: (resource.pending_reconfirmation? ? resource.unconfirmed_email : resource.email) %>
+
+ <%= f.label :email %>
+ <%= f.email_field :email, autofocus: true, autocomplete: 'email', value: (resource.pending_reconfirmation? ? resource.unconfirmed_email : resource.email), class: 'form-control' %>
-
- <%= f.submit "Resend confirmation instructions" %>
+
+ <%= f.submit t('.resend_confirmation_instructions'), class: 'btn btn-primary' %>
<% end %>
-<%= render "devise/shared/links" %>
+<%= render 'devise/shared/links' %>
diff --git a/app/views/devise/passwords/edit.html.erb b/app/views/devise/passwords/edit.html.erb
index 5fbb9ff..acdc167 100644
--- a/app/views/devise/passwords/edit.html.erb
+++ b/app/views/devise/passwords/edit.html.erb
@@ -1,25 +1,26 @@
-
Change your password
+
<%= t('.change_your_password') %>
<%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f| %>
- <%= render "devise/shared/error_messages", resource: resource %>
+ <%= bootstrap_devise_error_messages! %>
<%= f.hidden_field :reset_password_token %>
-
- <%= f.label :password, "New password" %>
+
+ <%= f.label :password, t('.new_password') %>
+ <%= f.password_field :password, autofocus: true, class: 'form-control' %>
+
<% if @minimum_password_length %>
- (<%= @minimum_password_length %> characters minimum)
+ <%= t('devise.shared.minimum_password_length', count: @minimum_password_length) %>
<% end %>
- <%= f.password_field :password, autofocus: true, autocomplete: "new-password" %>
-
- <%= f.label :password_confirmation, "Confirm new password" %>
- <%= f.password_field :password_confirmation, autocomplete: "new-password" %>
+
+ <%= f.label :password_confirmation, t('.confirm_new_password') %>
+ <%= f.password_field :password_confirmation, autocomplete: 'off', class: 'form-control' %>
-
- <%= f.submit "Change my password" %>
+
+ <%= f.submit t('.change_my_password'), class: 'btn btn-primary' %>
<% end %>
-<%= render "devise/shared/links" %>
+<%= render 'devise/shared/links' %>
diff --git a/app/views/devise/passwords/new.html.erb b/app/views/devise/passwords/new.html.erb
index 9b486b8..37e3008 100644
--- a/app/views/devise/passwords/new.html.erb
+++ b/app/views/devise/passwords/new.html.erb
@@ -1,16 +1,16 @@
-
Forgot your password?
+
<%= t('.forgot_your_password') %>
<%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| %>
- <%= render "devise/shared/error_messages", resource: resource %>
+ <%= bootstrap_devise_error_messages! %>
-
- <%= f.label :email %>
- <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
+
+ <%= f.label :email %>
+ <%= f.email_field :email, autofocus: true, autocomplete: 'email', class: 'form-control' %>
-
- <%= f.submit "Send me reset password instructions" %>
+
+ <%= f.submit t('.send_me_reset_password_instructions'), class: 'btn btn-primary' %>
<% end %>
-<%= render "devise/shared/links" %>
+<%= render 'devise/shared/links' %>
diff --git a/app/views/devise/registrations/edit.html.erb b/app/views/devise/registrations/edit.html.erb
index 38d95b8..411aff0 100644
--- a/app/views/devise/registrations/edit.html.erb
+++ b/app/views/devise/registrations/edit.html.erb
@@ -1,43 +1,37 @@
-
Edit <%= resource_name.to_s.humanize %>
+
<%= t('.title', resource: resource_name.to_s.humanize) %>
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
- <%= render "devise/shared/error_messages", resource: resource %>
+ <%= bootstrap_devise_error_messages! %>
-
- <%= f.label :email %>
- <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
+
+ <%= f.label :email %>
+ <%= f.email_field :email, autofocus: true, autocomplete: 'email', class: 'form-control' %>
- <% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
-
Currently waiting confirmation for: <%= resource.unconfirmed_email %>
- <% end %>
+