schienenzeppelin 0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.github/workflows/main.yml +17 -0
- data/.github/workflows/outdated.yml +20 -0
- data/.gitignore +282 -0
- data/.rspec_status +3 -0
- data/.rubocop.yml +28 -0
- data/.tool-versions +1 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/GALLERY.md +29 -0
- data/Gemfile +13 -0
- data/Gemfile.lock +184 -0
- data/LICENSE +21 -0
- data/LICENSE.txt +21 -0
- data/README.md +174 -0
- data/Rakefile +12 -0
- data/TODO.md +32 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/exe/sz +25 -0
- data/images/create.png +0 -0
- data/images/error.png +0 -0
- data/images/home.png +0 -0
- data/images/index.png +0 -0
- data/images/login.png +0 -0
- data/images/mobile.png +0 -0
- data/lib/schienenzeppelin.rb +18 -0
- data/lib/schienenzeppelin/app_builder.rb +88 -0
- data/lib/schienenzeppelin/app_generator.rb +95 -0
- data/lib/schienenzeppelin/helper_base.rb +28 -0
- data/lib/schienenzeppelin/helpers/annotate.rb +11 -0
- data/lib/schienenzeppelin/helpers/capistrano.rb +35 -0
- data/lib/schienenzeppelin/helpers/continuous_integration.rb +12 -0
- data/lib/schienenzeppelin/helpers/credentials.rb +49 -0
- data/lib/schienenzeppelin/helpers/devise.rb +45 -0
- data/lib/schienenzeppelin/helpers/errors.rb +67 -0
- data/lib/schienenzeppelin/helpers/factory_bot.rb +13 -0
- data/lib/schienenzeppelin/helpers/generators.rb +26 -0
- data/lib/schienenzeppelin/helpers/high_voltage.rb +11 -0
- data/lib/schienenzeppelin/helpers/home.rb +17 -0
- data/lib/schienenzeppelin/helpers/hotwire.rb +11 -0
- data/lib/schienenzeppelin/helpers/pundit.rb +12 -0
- data/lib/schienenzeppelin/helpers/rspec.rb +13 -0
- data/lib/schienenzeppelin/helpers/rubocop.rb +11 -0
- data/lib/schienenzeppelin/helpers/scaffold.rb +11 -0
- data/lib/schienenzeppelin/helpers/services.rb +11 -0
- data/lib/schienenzeppelin/helpers/sidekiq.rb +13 -0
- data/lib/schienenzeppelin/helpers/stimulus.rb +11 -0
- data/lib/schienenzeppelin/helpers/stimulus_components.rb +29 -0
- data/lib/schienenzeppelin/helpers/tailwind.rb +18 -0
- data/lib/schienenzeppelin/version.rb +7 -0
- data/schienenzeppelin.gemspec +37 -0
- data/schienenzeppelin.jpg +0 -0
- data/script.md +104 -0
- data/templates/.dockerignore.erb +51 -0
- data/templates/.entrypoint.sh.erb +16 -0
- data/templates/.env.development.erb +3 -0
- data/templates/.foreman.erb +1 -0
- data/templates/.github/workflows/build.yml.erb +49 -0
- data/templates/.gitignore.erb +285 -0
- data/templates/.irbrc.erb +12 -0
- data/templates/.rubocop.yml.erb +37 -0
- data/templates/.tool-versions.erb +1 -0
- data/templates/Capfile.erb +24 -0
- data/templates/Dockerfile.erb +45 -0
- data/templates/Gemfile.erb +122 -0
- data/templates/Procfile.dev.erb +6 -0
- data/templates/Procfile.erb +2 -0
- data/templates/README.md.erb +43 -0
- data/templates/app/controllers/authorized_controller.rb.erb +10 -0
- data/templates/app/controllers/errors_controller.rb.erb +24 -0
- data/templates/app/javascript/images/checkmark.svg +1 -0
- data/templates/app/javascript/images/logo.svg +1 -0
- data/templates/app/javascript/stylesheets/components.scss +206 -0
- data/templates/app/policies/application_policy.rb +55 -0
- data/templates/app/services/application_service.rb +14 -0
- data/templates/app/views/devise/confirmations/new.html.erb +24 -0
- data/templates/app/views/devise/passwords/edit.html.erb +34 -0
- data/templates/app/views/devise/passwords/new.html.erb +23 -0
- data/templates/app/views/devise/registrations/edit.html.erb +62 -0
- data/templates/app/views/devise/registrations/new.html.erb +45 -0
- data/templates/app/views/devise/sessions/new.html.erb +33 -0
- data/templates/app/views/devise/shared/_error_messages.html.erb +15 -0
- data/templates/app/views/devise/shared/_form_wrap.html.erb +5 -0
- data/templates/app/views/devise/shared/_links.html.erb +25 -0
- data/templates/app/views/devise/unlocks/new.html.erb +22 -0
- data/templates/app/views/errors/internal_error.html.erb +14 -0
- data/templates/app/views/errors/not_found.html.erb +14 -0
- data/templates/app/views/errors/unacceptable.html.erb +14 -0
- data/templates/app/views/layouts/application.html.erb.tt +30 -0
- data/templates/app/views/pages/home.html.erb.tt +20 -0
- data/templates/app/views/shared/_flashes.html.erb.tt +12 -0
- data/templates/app/views/shared/_footer.html.erb.tt +21 -0
- data/templates/app/views/shared/_navbar.html.erb.tt +40 -0
- data/templates/bin/setup.erb +146 -0
- data/templates/config/credentials.yml.erb +7 -0
- data/templates/config/initializers/high_voltage.rb +6 -0
- data/templates/config/initializers/lograge.rb +5 -0
- data/templates/config/initializers/sidekiq.rb +10 -0
- data/templates/config/postgresql.yml.erb +23 -0
- data/templates/docker-compose.yml.erb +21 -0
- data/templates/lib/capistrano/tasks/seeds.rake +12 -0
- data/templates/lib/capistrano/tasks/sidekiq.rake +36 -0
- data/templates/lib/generators/rails/navigation/USAGE +6 -0
- data/templates/lib/generators/rails/navigation/navigation_generator.rb +15 -0
- data/templates/lib/generators/rails/scaffold_controller_generator.rb +12 -0
- data/templates/lib/tasks/auto_annotate_models.rake +58 -0
- data/templates/lib/templates/erb/scaffold/_form.html.erb +39 -0
- data/templates/lib/templates/erb/scaffold/edit.html.erb +7 -0
- data/templates/lib/templates/erb/scaffold/index.html.erb +34 -0
- data/templates/lib/templates/erb/scaffold/new.html.erb +7 -0
- data/templates/lib/templates/erb/scaffold/show.html.erb +18 -0
- data/templates/public/500.html.erb +26 -0
- data/templates/spec/rails_helper.rb +26 -0
- data/templates/spec/spec_helper.rb +61 -0
- data/templates/spec/support/factory_bot.rb +5 -0
- data/templates/spec/support/shoulda_matchers.rb +8 -0
- metadata +179 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class ApplicationPolicy
|
|
4
|
+
attr_reader :user, :record
|
|
5
|
+
|
|
6
|
+
def initialize(user, record)
|
|
7
|
+
raise Pundit::NotAuthorizedError, 'must be logged in' unless user
|
|
8
|
+
|
|
9
|
+
@user = user
|
|
10
|
+
@record = record
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def index?
|
|
14
|
+
false
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def show?
|
|
18
|
+
false
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def create?
|
|
22
|
+
false
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def new?
|
|
26
|
+
false
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def update?
|
|
30
|
+
false
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def edit?
|
|
34
|
+
false
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def destroy?
|
|
38
|
+
false
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
class Scope
|
|
42
|
+
attr_reader :user, :scope
|
|
43
|
+
|
|
44
|
+
def initialize(user, scope)
|
|
45
|
+
raise Pundit::NotAuthorizedError, 'must be logged in' unless user
|
|
46
|
+
|
|
47
|
+
@user = user
|
|
48
|
+
@scope = scope
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def resolve
|
|
52
|
+
scope.all
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class ApplicationService
|
|
4
|
+
def self.call(*args, &block)
|
|
5
|
+
instance = new(*args, &block)
|
|
6
|
+
instance.call
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def call
|
|
10
|
+
raise NotImplementedError('Services must implement call')
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
private_class_method :new
|
|
14
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<% content_for :devise_form do %>
|
|
2
|
+
|
|
3
|
+
<h2 class="pt-4 mb-8 text-4xl font-bold heading">Resend confirmation instructions</h2>
|
|
4
|
+
|
|
5
|
+
<%= form_for(resource, as: resource_name, url: confirmation_path(resource_name), html: { method: :post }) do |f| %>
|
|
6
|
+
<%= render "devise/shared/error_messages", resource: resource %>
|
|
7
|
+
|
|
8
|
+
<div class="input-group">
|
|
9
|
+
<%= f.label :email, class: "label" %>
|
|
10
|
+
<%= f.email_field :email, autofocus: true, autocomplete: "email", value: (resource.pending_reconfirmation? ? resource.unconfirmed_email : resource.email), class: "input" %>
|
|
11
|
+
</div>
|
|
12
|
+
|
|
13
|
+
<div class="input-group">
|
|
14
|
+
<%= f.submit "Resend confirmation instructions", class: "btn btn-default" %>
|
|
15
|
+
</div>
|
|
16
|
+
<% end %>
|
|
17
|
+
|
|
18
|
+
<hr class="mt-6 border" />
|
|
19
|
+
|
|
20
|
+
<%= render "devise/shared/links" %>
|
|
21
|
+
|
|
22
|
+
<% end %>
|
|
23
|
+
|
|
24
|
+
<%= render "devise/shared/form_wrap" %>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<% content_for :devise_form do %>
|
|
2
|
+
<h2 class="pt-4 mb-8 text-4xl font-bold heading">Change your password</h2>
|
|
3
|
+
|
|
4
|
+
<%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f| %>
|
|
5
|
+
<%= render "devise/shared/error_messages", resource: resource %>
|
|
6
|
+
<%= f.hidden_field :reset_password_token %>
|
|
7
|
+
|
|
8
|
+
<div class="input-group">
|
|
9
|
+
<div class="flex">
|
|
10
|
+
<%= f.label :password, "New password", class:"label" %>
|
|
11
|
+
<% if @minimum_password_length %>
|
|
12
|
+
<em>(<%= @minimum_password_length %> characters minimum)</em>
|
|
13
|
+
<% end %>
|
|
14
|
+
</div>
|
|
15
|
+
<%= f.password_field :password, autofocus: true, autocomplete: "new-password", class: "input" %>
|
|
16
|
+
</div>
|
|
17
|
+
|
|
18
|
+
<div class="input-group">
|
|
19
|
+
<%= f.label :password_confirmation, "Confirm new password", class: "label" %>
|
|
20
|
+
<%= f.password_field :password_confirmation, autocomplete: "off", class: "input" %>
|
|
21
|
+
</div>
|
|
22
|
+
|
|
23
|
+
<div class="input-group">
|
|
24
|
+
<%= f.submit "Change my password", class: "btn btn-default" %>
|
|
25
|
+
</div>
|
|
26
|
+
<% end %>
|
|
27
|
+
|
|
28
|
+
<hr class="mt-6 border" />
|
|
29
|
+
|
|
30
|
+
<%= render "devise/shared/links" %>
|
|
31
|
+
|
|
32
|
+
<% end %>
|
|
33
|
+
|
|
34
|
+
<%= render "devise/shared/form_wrap" %>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<% content_for :devise_form do %>
|
|
2
|
+
|
|
3
|
+
<h2 class="pt-4 mb-8 text-4xl font-bold heading">Forgot your password?</h2>
|
|
4
|
+
|
|
5
|
+
<%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| %>
|
|
6
|
+
<%= render "devise/shared/error_messages", resource: resource %>
|
|
7
|
+
|
|
8
|
+
<div class="input-group">
|
|
9
|
+
<%= f.label :email, class: "label" %>
|
|
10
|
+
<%= f.email_field :email, autofocus: true, autocomplete: "email", class: "input" %>
|
|
11
|
+
</div>
|
|
12
|
+
|
|
13
|
+
<div class="input-group">
|
|
14
|
+
<%= f.submit "Send me reset password instructions", class: "btn btn-default" %>
|
|
15
|
+
</div>
|
|
16
|
+
<% end %>
|
|
17
|
+
|
|
18
|
+
<hr class="mt-6 border" />
|
|
19
|
+
|
|
20
|
+
<%= render "devise/shared/links" %>
|
|
21
|
+
<% end %>
|
|
22
|
+
|
|
23
|
+
<%= render "devise/shared/form_wrap" %>
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
<% content_for :devise_form do %>
|
|
2
|
+
<h2 class="pt-4 mb-8 text-4xl font-bold heading">Edit <%= resource_name.to_s.humanize %></h2>
|
|
3
|
+
|
|
4
|
+
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
|
|
5
|
+
|
|
6
|
+
<%= render "devise/shared/error_messages", resource: resource %>
|
|
7
|
+
|
|
8
|
+
<div class="input-group">
|
|
9
|
+
<%= f.label :name, class:"label" %>
|
|
10
|
+
<%= f.text_field :name, class:"input" %>
|
|
11
|
+
</div>
|
|
12
|
+
|
|
13
|
+
<div class="input-group">
|
|
14
|
+
<%= f.label :email, class:"label" %>
|
|
15
|
+
<%= f.email_field :email, autocomplete: "email", class:"input" %>
|
|
16
|
+
</div>
|
|
17
|
+
|
|
18
|
+
<div class="input-group">
|
|
19
|
+
<% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
|
|
20
|
+
<div>Currently waiting confirmation for: <%= resource.unconfirmed_email %></div>
|
|
21
|
+
<% end %>
|
|
22
|
+
</div>
|
|
23
|
+
|
|
24
|
+
<div class="input-group">
|
|
25
|
+
<%= f.label :password, class:"label" %>
|
|
26
|
+
<%= f.password_field :password, autocomplete: "new-password", class:"input" %>
|
|
27
|
+
<p class="pt-1 text-sm italic text-grey-dark"> <% if @minimum_password_length %>
|
|
28
|
+
<%= @minimum_password_length %> characters minimum <% end %> (leave blank if you don't want to change it) </p>
|
|
29
|
+
|
|
30
|
+
</div>
|
|
31
|
+
|
|
32
|
+
<div class="input-group">
|
|
33
|
+
<%= f.label :password_confirmation, class: "label" %>
|
|
34
|
+
<%= f.password_field :password_confirmation, autocomplete: "new-password", class: "input" %>
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
<div class="input-group">
|
|
38
|
+
<%= f.label :current_password, class: "label" %>
|
|
39
|
+
<%= f.password_field :current_password, autocomplete: "current-password", class: "input" %>
|
|
40
|
+
<p class="pt-2 text-sm italic text-grey-dark">(we need your current password to confirm your changes)</p>
|
|
41
|
+
</div>
|
|
42
|
+
|
|
43
|
+
<div class="input-group">
|
|
44
|
+
<%= f.submit "Update", class: "btn btn-default" %>
|
|
45
|
+
</div>
|
|
46
|
+
<% end %>
|
|
47
|
+
|
|
48
|
+
<hr class="mt-6 mb-3 border" />
|
|
49
|
+
|
|
50
|
+
<h3 class="mb-4 text-xl font-bold heading">Cancel my account</h3>
|
|
51
|
+
|
|
52
|
+
<div class="flex items-center justify-between">
|
|
53
|
+
<div class="flex-1">
|
|
54
|
+
<p class="py-4">Unhappy?</p>
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
<%= button_to "Cancel my account", registration_path(resource_name), data: { confirm: "Are you sure?" }, method: :delete, class: "btn btn-red" %>
|
|
58
|
+
</div>
|
|
59
|
+
|
|
60
|
+
<% end %>
|
|
61
|
+
|
|
62
|
+
<%= render 'devise/shared/form_wrap' %>
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
<% content_for :devise_form do %>
|
|
2
|
+
|
|
3
|
+
<h2 class="pt-4 mb-8 text-4xl font-bold heading">Sign up</h2>
|
|
4
|
+
|
|
5
|
+
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
|
|
6
|
+
<%= render "devise/shared/error_messages", resource: resource %>
|
|
7
|
+
|
|
8
|
+
<div class="input-group">
|
|
9
|
+
<%= f.label :name, class:"label" %>
|
|
10
|
+
<%= f.text_field :name, class:"input" %>
|
|
11
|
+
</div>
|
|
12
|
+
|
|
13
|
+
<div class="input-group">
|
|
14
|
+
<%= f.label :email, class:"label" %>
|
|
15
|
+
<%= f.email_field :email, autocomplete: "email", class:"input" %>
|
|
16
|
+
</div>
|
|
17
|
+
|
|
18
|
+
<div class="input-group">
|
|
19
|
+
<div class="flex">
|
|
20
|
+
<%= f.label :password, class: "label" %>
|
|
21
|
+
<% if @minimum_password_length %>
|
|
22
|
+
<span class="pl-1 text-xs text-grey-dark"><em>(<%= @minimum_password_length %> characters minimum)</em></span>
|
|
23
|
+
<% end %>
|
|
24
|
+
</div>
|
|
25
|
+
<%= f.password_field :password, autocomplete: "new-password", class: "input" %>
|
|
26
|
+
</div>
|
|
27
|
+
|
|
28
|
+
<div class="input-group">
|
|
29
|
+
<%= f.label :password_confirmation, class:"label" %>
|
|
30
|
+
<%= f.password_field :password_confirmation, autocomplete: "new-password", class: "input" %>
|
|
31
|
+
</div>
|
|
32
|
+
|
|
33
|
+
<div class="input-group">
|
|
34
|
+
<%= f.submit "Sign up", class: "btn btn-default" %>
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
<hr class="mt-6 border" />
|
|
38
|
+
|
|
39
|
+
<% end %>
|
|
40
|
+
|
|
41
|
+
<%= render "devise/shared/links" %>
|
|
42
|
+
|
|
43
|
+
<% end %>
|
|
44
|
+
|
|
45
|
+
<%= render "devise/shared/form_wrap" %>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<% content_for :devise_form do %>
|
|
2
|
+
<h2 class="pt-4 mb-8 text-4xl font-bold heading">Log in</h2>
|
|
3
|
+
<%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
|
|
4
|
+
|
|
5
|
+
<div class="input-group">
|
|
6
|
+
<%= f.label :email, class:"label" %>
|
|
7
|
+
<%= f.email_field :email, autofocus: true, autocomplete: "email", class: "input" %>
|
|
8
|
+
</div>
|
|
9
|
+
|
|
10
|
+
<div class="input-group">
|
|
11
|
+
<%= f.label :password, class:"label" %>
|
|
12
|
+
<%= f.password_field :password, autocomplete: "current-password", class: "input" %>
|
|
13
|
+
</div>
|
|
14
|
+
|
|
15
|
+
<div class="mb-6 input-checkbox">
|
|
16
|
+
<% if devise_mapping.rememberable? -%>
|
|
17
|
+
<%= f.check_box :remember_me %>
|
|
18
|
+
<%= f.label :remember_me, class:"label" %>
|
|
19
|
+
<% end -%>
|
|
20
|
+
</div>
|
|
21
|
+
|
|
22
|
+
<div class="input-group">
|
|
23
|
+
<%= f.submit "Log in", class: "btn btn-default" %>
|
|
24
|
+
</div>
|
|
25
|
+
|
|
26
|
+
<% end %>
|
|
27
|
+
|
|
28
|
+
<hr class="mt-6 border" />
|
|
29
|
+
|
|
30
|
+
<%= render "devise/shared/links" %>
|
|
31
|
+
<% end %>
|
|
32
|
+
|
|
33
|
+
<%= render "devise/shared/form_wrap" %>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<% if resource.errors.any? %>
|
|
2
|
+
<div id="error_explanation" class="text-red-500">
|
|
3
|
+
<h2 class="font-semibold text-lg">
|
|
4
|
+
<%= I18n.t("errors.messages.not_saved",
|
|
5
|
+
count: resource.errors.count,
|
|
6
|
+
resource: resource.class.model_name.human.downcase)
|
|
7
|
+
%>
|
|
8
|
+
</h2>
|
|
9
|
+
<ul class="list-none p-0">
|
|
10
|
+
<% resource.errors.full_messages.each do |message| %>
|
|
11
|
+
<li><%= message %></li>
|
|
12
|
+
<% end %>
|
|
13
|
+
</ul>
|
|
14
|
+
</div>
|
|
15
|
+
<% end %>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<%- if controller_name != 'sessions' %>
|
|
2
|
+
<div class="flex flex-wrap"><%= link_to "Log in", new_session_path(resource_name), class: "block py-2 text-gray-700 underline hover:no-underline" %></div>
|
|
3
|
+
<% end -%>
|
|
4
|
+
|
|
5
|
+
<%- if devise_mapping.registerable? && controller_name != 'registrations' %>
|
|
6
|
+
<%= link_to "Sign up", new_registration_path(resource_name), class: "block py-2 text-gray-700 underline hover:no-underline" %>
|
|
7
|
+
<% end -%>
|
|
8
|
+
|
|
9
|
+
<%- if devise_mapping.recoverable? && controller_name != 'passwords' && controller_name != 'registrations' %>
|
|
10
|
+
<%= link_to "Forgot your password?", new_password_path(resource_name), class: "block py-2 text-gray-700 underline hover:no-underline" %>
|
|
11
|
+
<% end -%>
|
|
12
|
+
|
|
13
|
+
<%- if devise_mapping.confirmable? && controller_name != 'confirmations' %>
|
|
14
|
+
<%= link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name), class: "block py-2 text-gray-700 underline hover:no-underline"%>
|
|
15
|
+
<% end -%>
|
|
16
|
+
|
|
17
|
+
<%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %>
|
|
18
|
+
<%= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name), class: "block py-2 text-gray-700 underline hover:no-underline" %>
|
|
19
|
+
<% end -%>
|
|
20
|
+
|
|
21
|
+
<%- if devise_mapping.omniauthable? %>
|
|
22
|
+
<%- resource_class.omniauth_providers.each do |provider| %>
|
|
23
|
+
<%= link_to "Sign in with #{OmniAuth::Utils.camelize(provider)}", omniauth_authorize_path(resource_name, provider), class: "btn btn-default my-4" %>
|
|
24
|
+
<% end -%>
|
|
25
|
+
<% end -%>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<% content_for :devise_form do %>
|
|
2
|
+
<h2 class="pt-4 mb-8 text-4xl font-bold heading">Resend unlock instructions</h2>
|
|
3
|
+
|
|
4
|
+
<%= form_for(resource, as: resource_name, url: unlock_path(resource_name), html: { method: :post }) do |f| %>
|
|
5
|
+
<%= render "devise/shared/error_messages", resource: resource %>
|
|
6
|
+
|
|
7
|
+
<div class="input-group">
|
|
8
|
+
<%= f.label :email, class: "label" %>
|
|
9
|
+
<%= f.email_field :email, autofocus: true, autocomplete: "email", class: "input" %>
|
|
10
|
+
</div>
|
|
11
|
+
|
|
12
|
+
<div class="input-group">
|
|
13
|
+
<%= f.submit "Resend unlock instructions", class: "btn btn-default" %>
|
|
14
|
+
</div>
|
|
15
|
+
<% end %>
|
|
16
|
+
|
|
17
|
+
<hr class="mt-6 border"/>
|
|
18
|
+
|
|
19
|
+
<%= render "devise/shared/links" %>
|
|
20
|
+
<% end %>
|
|
21
|
+
|
|
22
|
+
<%= render "devise/shared/form_wrap" %>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<div class="container mx-auto px-4">
|
|
2
|
+
<section class="py-8 px-4 text-center">
|
|
3
|
+
<div class="max-w-auto mx-auto">
|
|
4
|
+
<div class="md:max-w-lg mx-auto flex justify-center">
|
|
5
|
+
<svg class="fill-current text-gray-300 h-48" viewBox="0 0 445 202" xmlns="http://www.w3.org/2000/svg">
|
|
6
|
+
<path d="M38.804 144.71c1.527 8.356 4.447 14.803 8.76 19.34 4.312 4.537 10.601 6.805 18.867 6.805 9.523 0 16.778-3.346 21.764-10.04 4.987-6.693 7.48-15.116 7.48-25.268 0-9.973-2.336-18.396-7.008-25.269-4.672-6.873-11.95-10.31-21.832-10.31-4.672 0-8.715.585-12.129 1.753-6.02 2.156-10.557 6.154-13.611 11.994l-34.5-1.617L20.34 4.15h107.678v32.614H48.103l-7.008 42.72c5.93-3.863 10.556-6.423 13.88-7.681 5.57-2.067 12.354-3.1 20.35-3.1 16.172 0 30.277 5.436 42.317 16.307 12.039 10.87 18.058 26.683 18.058 47.437 0 18.059-5.795 34.186-17.385 48.381-11.59 14.196-28.93 21.293-52.02 21.293-18.597 0-33.87-4.986-45.82-14.959C8.527 177.19 1.879 163.04.53 144.711h38.274zm155.789-43.528c0 22.46 1.842 39.643 5.525 51.547 3.684 11.905 11.23 17.857 22.64 17.857 11.411 0 18.89-5.952 22.44-17.857 3.548-11.904 5.323-29.086 5.323-51.547 0-23.54-1.775-40.97-5.324-52.29s-11.028-16.98-22.438-16.98c-11.41 0-18.957 5.66-22.64 16.98-3.684 11.32-5.526 28.75-5.526 52.29zM222.759.242c24.887 0 42.339 8.76 52.356 26.28 10.018 17.52 15.027 42.406 15.027 74.66s-5.01 57.095-15.027 74.525c-10.017 17.43-27.47 26.145-52.356 26.145-24.887 0-42.339-8.715-52.357-26.145-10.017-17.43-15.026-42.271-15.026-74.525 0-32.254 5.009-57.14 15.026-74.66C180.42 9.001 197.872.241 222.76.241zm125.332 100.94c0 22.46 1.842 39.643 5.525 51.547 3.684 11.905 11.23 17.857 22.64 17.857 11.411 0 18.89-5.952 22.44-17.857 3.548-11.904 5.323-29.086 5.323-51.547 0-23.54-1.775-40.97-5.324-52.29s-11.028-16.98-22.438-16.98c-11.41 0-18.957 5.66-22.64 16.98-3.684 11.32-5.526 28.75-5.526 52.29zM376.257.242c24.887 0 42.339 8.76 52.356 26.28 10.018 17.52 15.027 42.406 15.027 74.66s-5.01 57.095-15.027 74.525c-10.017 17.43-27.47 26.145-52.356 26.145-24.887 0-42.339-8.715-52.357-26.145-10.017-17.43-15.026-42.271-15.026-74.525 0-32.254 5.009-57.14 15.026-74.66C333.918 9.001 351.37.241 376.257.241z" fill-rule="nonzero"/>
|
|
7
|
+
</svg>
|
|
8
|
+
</div>
|
|
9
|
+
<h2 class="mt-8 uppercase text-xl lg:text-5xl font-black">Something went terribly wrong</h2>
|
|
10
|
+
<p class="mt-6 text-sm lg:text-base text-gray-900">If you are the application owner check the logs for more information.</p>
|
|
11
|
+
<a href="/" class="mt-12 btn btn-default">Back To Homepage</a>
|
|
12
|
+
</div>
|
|
13
|
+
</section>
|
|
14
|
+
</div>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<div class="container mx-auto px-4">
|
|
2
|
+
<section class="py-8 px-4 text-center">
|
|
3
|
+
<div class="max-w-auto mx-auto">
|
|
4
|
+
<div class="md:max-w-lg mx-auto flex justify-center">
|
|
5
|
+
<svg class="fill-current text-gray-300 h-48" viewBox="0 0 445 202" xmlns="http://www.w3.org/2000/svg">
|
|
6
|
+
<path d="M137.587 154.953h-22.102V197h-37.6v-42.047H.53v-33.557L72.36 2.803h43.125V124.9h22.102v30.053zM77.886 124.9V40.537L28.966 124.9h48.92zm116.707-23.718c0 22.46 1.842 39.643 5.525 51.547 3.684 11.905 11.23 17.857 22.64 17.857 11.411 0 18.89-5.952 22.44-17.857 3.548-11.904 5.323-29.086 5.323-51.547 0-23.54-1.775-40.97-5.324-52.29s-11.028-16.98-22.438-16.98c-11.41 0-18.957 5.66-22.64 16.98-3.684 11.32-5.526 28.75-5.526 52.29zM222.759.242c24.887 0 42.339 8.76 52.356 26.28 10.018 17.52 15.027 42.406 15.027 74.66s-5.01 57.095-15.027 74.525c-10.017 17.43-27.47 26.145-52.356 26.145-24.887 0-42.339-8.715-52.357-26.145-10.017-17.43-15.026-42.271-15.026-74.525 0-32.254 5.009-57.14 15.026-74.66C180.42 9.001 197.872.241 222.76.241zm221.824 154.711h-22.102V197h-37.6v-42.047h-77.355v-33.557l71.83-118.593h43.125V124.9h22.102v30.053zM384.882 124.9V40.537l-48.92 84.363h48.92z" fill-rule="nonzero" />
|
|
7
|
+
</svg>
|
|
8
|
+
</div>
|
|
9
|
+
<h2 class="mt-8 uppercase text-xl lg:text-5xl font-black">Page not found</h2>
|
|
10
|
+
<p class="mt-6 text-sm lg:text-base text-gray-900">The page you are looking for might have been removed had its name changed or is temporarily unavailable.</p>
|
|
11
|
+
<a href="/" class="mt-12 btn btn-default">Back To Homepage</a>
|
|
12
|
+
</div>
|
|
13
|
+
</section>
|
|
14
|
+
</div>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<div class="container mx-auto px-4">
|
|
2
|
+
<section class="py-8 px-4 text-center">
|
|
3
|
+
<div class="max-w-auto mx-auto">
|
|
4
|
+
<div class="md:max-w-lg mx-auto flex justify-center">
|
|
5
|
+
<svg class="fill-current text-gray-300 h-48" viewBox="0 0 445 202" xmlns="http://www.w3.org/2000/svg">
|
|
6
|
+
<path d="M137.587 154.953h-22.102V197h-37.6v-42.047H.53v-33.557L72.36 2.803h43.125V124.9h22.102v30.053zM77.886 124.9V40.537L28.966 124.9h48.92zm77.49 72.1c.36-14.016 3.37-26.818 9.03-38.408 5.48-13.028 18.417-26.818 38.812-41.373 17.7-12.668 29.154-21.742 34.365-27.223 7.996-8.535 11.994-17.879 11.994-28.031 0-8.266-2.29-15.139-6.873-20.62-4.582-5.48-11.14-8.22-19.676-8.22-11.68 0-19.63 4.357-23.853 13.072-2.426 5.032-3.863 13.028-4.313 23.989h-37.33c.63-16.622 3.639-30.053 9.03-40.295C176.804 10.394 194.997.646 221.142.646c20.664 0 37.105 5.728 49.324 17.183 12.219 11.455 18.328 26.616 18.328 45.483 0 14.465-4.313 27.313-12.938 38.543-5.66 7.458-14.958 15.768-27.896 24.932l-15.363 10.916c-9.614 6.828-16.195 11.77-19.743 14.824a43.443 43.443 0 00-8.962 10.647h85.306V197H155.376zm153.498 0c.36-14.016 3.37-26.818 9.03-38.408 5.48-13.028 18.417-26.818 38.812-41.373 17.7-12.668 29.154-21.742 34.365-27.223 7.996-8.535 11.994-17.879 11.994-28.031 0-8.266-2.29-15.139-6.873-20.62-4.582-5.48-11.14-8.22-19.676-8.22-11.68 0-19.63 4.357-23.853 13.072-2.426 5.032-3.863 13.028-4.313 23.989h-37.33c.63-16.622 3.639-30.053 9.03-40.295C330.302 10.394 348.495.646 374.64.646c20.664 0 37.105 5.728 49.324 17.183 12.219 11.455 18.328 26.616 18.328 45.483 0 14.465-4.312 27.313-12.938 38.543-5.66 7.458-14.958 15.768-27.896 24.932l-15.363 10.916c-9.614 6.828-16.195 11.77-19.743 14.824a43.443 43.443 0 00-8.962 10.647h85.306V197H308.874z" fill-rule="nonzero"/>
|
|
7
|
+
</svg>
|
|
8
|
+
</div>
|
|
9
|
+
<h2 class="mt-8 uppercase text-xl lg:text-5xl font-black">The change you wanted was rejected</h2>
|
|
10
|
+
<p class="mt-6 text-sm lg:text-base text-gray-900">Maybe you tried to change something you didn't have access to?</p>
|
|
11
|
+
<a href="/" class="mt-12 btn btn-default">Back To Homepage</a>
|
|
12
|
+
</div>
|
|
13
|
+
</section>
|
|
14
|
+
</div>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title><%= camelized %></title>
|
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
6
|
+
<%%= csrf_meta_tags %>
|
|
7
|
+
<%%= csp_meta_tag %>
|
|
8
|
+
|
|
9
|
+
<%- if options[:skip_javascript] -%>
|
|
10
|
+
<%%= stylesheet_link_tag 'application' %>
|
|
11
|
+
<%- else -%>
|
|
12
|
+
<%- unless options[:skip_turbolinks] -%>
|
|
13
|
+
<%%= stylesheet_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
|
|
14
|
+
<%%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
|
|
15
|
+
<%- else -%>
|
|
16
|
+
<%%= stylesheet_pack_tag 'application' %>
|
|
17
|
+
<%%= javascript_pack_tag 'application' %>
|
|
18
|
+
<%- end -%>
|
|
19
|
+
<%- end -%>
|
|
20
|
+
</head>
|
|
21
|
+
|
|
22
|
+
<body class="flex flex-col min-h-screen">
|
|
23
|
+
<%%= render 'shared/navbar' %>
|
|
24
|
+
<%%= render 'shared/flashes' %>
|
|
25
|
+
<main class="flex-grow">
|
|
26
|
+
<%%= yield %>
|
|
27
|
+
</main>
|
|
28
|
+
<%%= render 'shared/footer' %>
|
|
29
|
+
</body>
|
|
30
|
+
</html>
|