schienenzeppelin 0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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>
|