sun-sword 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +1141 -0
- data/CHANGELOG.md +5 -0
- data/LICENSE.txt +21 -0
- data/README.md +96 -0
- data/Rakefile +12 -0
- data/lib/generators/sun_sword/USAGE +9 -0
- data/lib/generators/sun_sword/frontend_generator.rb +148 -0
- data/lib/generators/sun_sword/scaffold_generator.rb +97 -0
- data/lib/generators/sun_sword/templates_frontend/Procfile.dev +1 -0
- data/lib/generators/sun_sword/templates_frontend/assets/config/manifest.js +1 -0
- data/lib/generators/sun_sword/templates_frontend/bin/watch +3 -0
- data/lib/generators/sun_sword/templates_frontend/config/database.yml +21 -0
- data/lib/generators/sun_sword/templates_frontend/config/vite.json +17 -0
- data/lib/generators/sun_sword/templates_frontend/controllers/application_controller.rb.tt +36 -0
- data/lib/generators/sun_sword/templates_frontend/controllers/dashboard/site_controller.rb +6 -0
- data/lib/generators/sun_sword/templates_frontend/controllers/site_controller.rb +15 -0
- data/lib/generators/sun_sword/templates_frontend/env.development +14 -0
- data/lib/generators/sun_sword/templates_frontend/frontend/assets/images/.keep +0 -0
- data/lib/generators/sun_sword/templates_frontend/frontend/assets/images/kotaro.ico +0 -0
- data/lib/generators/sun_sword/templates_frontend/frontend/assets/images/logo.svg +16 -0
- data/lib/generators/sun_sword/templates_frontend/frontend/assets/images/profile.jpeg +0 -0
- data/lib/generators/sun_sword/templates_frontend/frontend/entrypoints/application.js +17 -0
- data/lib/generators/sun_sword/templates_frontend/frontend/entrypoints/stimulus.js +9 -0
- data/lib/generators/sun_sword/templates_frontend/frontend/pages/stimulus.js +10 -0
- data/lib/generators/sun_sword/templates_frontend/frontend/pages/web.js +122 -0
- data/lib/generators/sun_sword/templates_frontend/frontend/stylesheets/application.scss +198 -0
- data/lib/generators/sun_sword/templates_frontend/helpers/application_helper.rb +5 -0
- data/lib/generators/sun_sword/templates_frontend/package.json +7 -0
- data/lib/generators/sun_sword/templates_frontend/postcss.config.js +6 -0
- data/lib/generators/sun_sword/templates_frontend/rubocop.yml.tt +1141 -0
- data/lib/generators/sun_sword/templates_frontend/tailwind.config.js +39 -0
- data/lib/generators/sun_sword/templates_frontend/views/components/_action_destroy.html.erb.tt +48 -0
- data/lib/generators/sun_sword/templates_frontend/views/components/_action_edit.html.erb.tt +7 -0
- data/lib/generators/sun_sword/templates_frontend/views/components/_action_show.html.erb.tt +8 -0
- data/lib/generators/sun_sword/templates_frontend/views/components/_alert.html.erb.tt +66 -0
- data/lib/generators/sun_sword/templates_frontend/views/components/_error_form_submit.html.erb.tt +20 -0
- data/lib/generators/sun_sword/templates_frontend/views/components/_link_action.html.erb.tt +9 -0
- data/lib/generators/sun_sword/templates_frontend/views/components/layouts/_sidebar_logo.html.erb +18 -0
- data/lib/generators/sun_sword/templates_frontend/views/layouts/application.html.erb.tt +42 -0
- data/lib/generators/sun_sword/templates_frontend/views/layouts/dashboard/_sidebar.html.erb.tt +60 -0
- data/lib/generators/sun_sword/templates_frontend/views/layouts/dashboard/application.html.erb.tt +71 -0
- data/lib/generators/sun_sword/templates_frontend/views/site/_comment.html.erb.tt +3 -0
- data/lib/generators/sun_sword/templates_frontend/views/site/stimulus.html.erb.tt +26 -0
- data/lib/generators/sun_sword/templates_frontend/vite.config.ts.tt +27 -0
- data/lib/generators/sun_sword/templates_scaffold/controllers/controller.rb.tt +90 -0
- data/lib/generators/sun_sword/templates_scaffold/example.rb.tt +2 -0
- data/lib/generators/sun_sword/templates_scaffold/views/_form.html.erb.tt +22 -0
- data/lib/generators/sun_sword/templates_scaffold/views/components/menu/link.html.erb.tt +1 -0
- data/lib/generators/sun_sword/templates_scaffold/views/edit.html.erb.tt +10 -0
- data/lib/generators/sun_sword/templates_scaffold/views/index.html.erb.tt +50 -0
- data/lib/generators/sun_sword/templates_scaffold/views/new.html.erb.tt +10 -0
- data/lib/generators/sun_sword/templates_scaffold/views/show.html.erb.tt +26 -0
- data/lib/sun-sword.rb +7 -0
- data/lib/sun_sword/version.rb +6 -0
- metadata +141 -0
@@ -0,0 +1,39 @@
|
|
1
|
+
/** @type {import('tailwindcss').Config} */
|
2
|
+
const defaultTheme = require('tailwindcss/defaultTheme')
|
3
|
+
|
4
|
+
module.exports = {
|
5
|
+
content: [
|
6
|
+
'./app/helpers/**/*.rb',
|
7
|
+
'./app/views/**/*.{.erb,erb}',
|
8
|
+
'./app/frontend/**/*.{js, css, scss, ejs}',
|
9
|
+
],
|
10
|
+
theme: {
|
11
|
+
screens: {
|
12
|
+
'sm': '640px',
|
13
|
+
// => @media (min-width: 640px) { ... }
|
14
|
+
|
15
|
+
'md': '768px',
|
16
|
+
// => @media (min-width: 768px) { ... }
|
17
|
+
|
18
|
+
'lg': '1024px',
|
19
|
+
// => @media (min-width: 1024px) { ... }
|
20
|
+
|
21
|
+
'xl': '1280px',
|
22
|
+
// => @media (min-width: 1280px) { ... }
|
23
|
+
|
24
|
+
'2xl': '1536px',
|
25
|
+
// => @media (min-width: 1536px) { ... }
|
26
|
+
},
|
27
|
+
extend: {
|
28
|
+
fontFamily: {
|
29
|
+
sans: ['Open Sans', ...defaultTheme.fontFamily.sans],
|
30
|
+
},
|
31
|
+
},
|
32
|
+
},
|
33
|
+
plugins: [
|
34
|
+
require('@tailwindcss/aspect-ratio'),
|
35
|
+
require('@tailwindcss/forms'),
|
36
|
+
require('@tailwindcss/typography'),
|
37
|
+
],
|
38
|
+
}
|
39
|
+
|
@@ -0,0 +1,48 @@
|
|
1
|
+
<div class="inline-block">
|
2
|
+
<button data-action="click->web#confirmationDestroy" data-web-id-param="<%%= value.id %>" class="text-sm font-semibold leading-6 text-gray-900">
|
3
|
+
<svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5 text-orange-400 hover:text-gray-600" viewBox="0 0 20 20" fill="currentColor">
|
4
|
+
<path fill-rule="evenodd" d="M9 2a1 1 0 00-.894.553L7.382 4H4a1 1 0 000 2v10a2 2 0 002 2h8a2 2 0 002-2V6a1 1 0 100-2h-3.382l-.724-1.447A1 1 0 0011 2H9zM7 8a1 1 0 012 0v6a1 1 0 11-2 0V8zm5-1a1 1 0 00-1 1v6a1 1 0 102 0V8a1 1 0 00-1-1z" clip-rule="evenodd"/>
|
5
|
+
</svg>
|
6
|
+
</button>
|
7
|
+
<div class="confirmation-destroy-<%%= value.id %> hidden relative z-10" aria-labelledby="modal-title" role="dialog" aria-modal="false">
|
8
|
+
<div class="fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity min-h-screen z-100"></div>
|
9
|
+
<div class="fixed inset-0 z-100 w-screen overflow-y-auto">
|
10
|
+
<div class="flex min-h-full justify-center p-4 text-center items-center sm:p-0">
|
11
|
+
<div class="relative transform overflow-hidden rounded-lg bg-white px-4 pb-4 pt-5 text-left shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-lg sm:p-6">
|
12
|
+
<div class="absolute right-0 top-0 hidden pr-4 pt-4 sm:block">
|
13
|
+
<button data-action="click->web#confirmationDestroyCancel" data-web-id-param="<%%= value.id %>" type="button" class="rounded-md bg-white text-gray-400 hover:text-gray-500 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2">
|
14
|
+
<span class="sr-only">Close</span>
|
15
|
+
<svg class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true">
|
16
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/>
|
17
|
+
</svg>
|
18
|
+
</button>
|
19
|
+
</div>
|
20
|
+
<div class="flex flex-row">
|
21
|
+
<div class="basis-1/4">
|
22
|
+
<div class="mx-auto flex h-12 w-12 flex-shrink-0 items-center justify-center rounded-full bg-red-100 sm:mx-0 sm:h-10 sm:w-10">
|
23
|
+
<svg class="h-6 w-6 text-red-600" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true">
|
24
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z"/>
|
25
|
+
</svg>
|
26
|
+
</div>
|
27
|
+
</div>
|
28
|
+
|
29
|
+
<div class="ml-4 mt-0 text-left basis-2/3">
|
30
|
+
<h3 class="font-semibold leading-6 text-gray-900" id="modal-title">Hapus Data</h3>
|
31
|
+
<div class="mt-2">
|
32
|
+
<p class="text-sm text-gray-500 whitespace-normal">Data yang di hapus akan terhapus. Apakah kamu ingin menghapus data?</p>
|
33
|
+
</div>
|
34
|
+
</div>
|
35
|
+
</div>
|
36
|
+
<div class="mt-5 sm:mt-4 flex flex-row-reverse">
|
37
|
+
<form class="button_to" method="post" action="<%%= eval("#{key}_path(id: '#{value.id}')") %>">
|
38
|
+
<input type="hidden" name="_method" value="delete" autocomplete="off">
|
39
|
+
<button type="submit" class="inline-flex justify-center m-2 class-button">Hapus</button>
|
40
|
+
<%%= hidden_field_tag :authenticity_token, form_authenticity_token -%>
|
41
|
+
</form>
|
42
|
+
<button data-action="click->web#confirmationDestroyCancel" data-web-id-param="<%%= value.id %>" type="button" class="inline-flex justify-center m-2 class-button-outline">Cancel</button>
|
43
|
+
</div>
|
44
|
+
</div>
|
45
|
+
</div>
|
46
|
+
</div>
|
47
|
+
</div>
|
48
|
+
</div>
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<div class="inline-block ml-2">
|
2
|
+
<%%= link_to eval("edit_#{key}_path(id: '#{value.id}')"), class: "text-sm font-semibold leading-6 text-gray-900" do %>
|
3
|
+
<svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5 text-gray-400 hover:text-gray-600" viewBox="0 0 20 20" fill="currentColor">
|
4
|
+
<path d="M13.586 3.586a2 2 0 112.828 2.828l-.793.793-2.828-2.828.793-.793zM11.379 5.793L3 14.172V17h2.828l8.38-8.379-2.83-2.828z"/>
|
5
|
+
</svg>
|
6
|
+
<%% end %>
|
7
|
+
</div>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<div class="inline-block ml-2">
|
2
|
+
<%%= link_to eval("#{key}_path(id: '#{value.id}')"), class: "text-sm font-semibold leading-6 text-gray-900" do %>
|
3
|
+
<svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5 text-gray-400 hover:text-gray-600" viewBox="0 0 20 20" fill="currentColor">
|
4
|
+
<path d="M10 12a2 2 0 100-4 2 2 0 000 4z"/>
|
5
|
+
<path fill-rule="evenodd" d="M.458 10C1.732 5.943 5.522 3 10 3s8.268 2.943 9.542 7c-1.274 4.057-5.064 7-9.542 7S1.732 14.057.458 10zM14 10a4 4 0 11-8 0 4 4 0 018 0z" clip-rule="evenodd"/>
|
6
|
+
</svg>
|
7
|
+
<%% end %>
|
8
|
+
</div>
|
@@ -0,0 +1,66 @@
|
|
1
|
+
<%% if flash.present? %>
|
2
|
+
<%% case flash_type flash %>
|
3
|
+
<%% when "success" %>
|
4
|
+
<div class="rounded-md bg-green-50 p-4 mb-3">
|
5
|
+
<div class="flex">
|
6
|
+
<div class="flex-shrink-0">
|
7
|
+
<svg class="h-5 w-5 text-green-400" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
8
|
+
<path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z" clip-rule="evenodd"/>
|
9
|
+
</svg>
|
10
|
+
</div>
|
11
|
+
<div class="ml-3">
|
12
|
+
<h3 class="text-sm font-medium text-green-800">Action completed</h3>
|
13
|
+
<div class="mt-2 text-sm text-green-700">
|
14
|
+
<%% flash.each do |type, msg| %>
|
15
|
+
<p><%%= msg %></p>
|
16
|
+
<%% end %>
|
17
|
+
</div>
|
18
|
+
</div>
|
19
|
+
</div>
|
20
|
+
</div>
|
21
|
+
<%% when "error" %>
|
22
|
+
<div class="rounded-md bg-red-50 p-4 mb-3">
|
23
|
+
<div class="flex">
|
24
|
+
<div class="flex-shrink-0">
|
25
|
+
<svg class="h-5 w-5 text-red-400" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
26
|
+
<path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z" clip-rule="evenodd"/>
|
27
|
+
</svg>
|
28
|
+
</div>
|
29
|
+
<div class="ml-3">
|
30
|
+
<h3 class="text-sm font-medium text-red-800">Action Failed</h3>
|
31
|
+
<div class="mt-2 text-sm text-red-700">
|
32
|
+
<ul role="list" class="list-disc space-y-1 pl-5">
|
33
|
+
<%% flash.each do |type, msg| %>
|
34
|
+
<%% if msg.is_a?(Array) %>
|
35
|
+
<%% msg.each do |list| %>
|
36
|
+
<li><%%= list %></li>
|
37
|
+
<%% end %>
|
38
|
+
<%% else %>
|
39
|
+
<li><%%= msg %></li>
|
40
|
+
<%% end %>
|
41
|
+
<%% end %>
|
42
|
+
</ul>
|
43
|
+
</div>
|
44
|
+
</div>
|
45
|
+
</div>
|
46
|
+
</div>
|
47
|
+
<%% else %>
|
48
|
+
<div class="rounded-md bg-green-50 p-4 mb-3">
|
49
|
+
<div class="flex">
|
50
|
+
<div class="flex-shrink-0">
|
51
|
+
<svg class="h-5 w-5 text-green-400" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
52
|
+
<path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z" clip-rule="evenodd"/>
|
53
|
+
</svg>
|
54
|
+
</div>
|
55
|
+
<div class="ml-3">
|
56
|
+
<h3 class="text-sm font-medium text-green-800">Action completed</h3>
|
57
|
+
<div class="mt-2 text-sm text-green-700">
|
58
|
+
<%% flash.each do |type, msg| %>
|
59
|
+
<p><%%= msg %></p>
|
60
|
+
<%% end %>
|
61
|
+
</div>
|
62
|
+
</div>
|
63
|
+
</div>
|
64
|
+
</div>
|
65
|
+
<%% end %>
|
66
|
+
<%% end %>
|
data/lib/generators/sun_sword/templates_frontend/views/components/_error_form_submit.html.erb.tt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
<div class="rounded-md bg-red-50 p-4">
|
2
|
+
<div class="flex">
|
3
|
+
<div class="flex-shrink-0">
|
4
|
+
<svg class="h-5 w-5 text-red-400" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
5
|
+
<path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z" clip-rule="evenodd"/>
|
6
|
+
</svg>
|
7
|
+
</div>
|
8
|
+
<div class="ml-3">
|
9
|
+
<h3 class="text-sm font-medium text-red-800"><%%= pluralize(resource.errors.count, "error") %> prohibited this
|
10
|
+
record from being saved</h3>
|
11
|
+
<div class="mt-2 text-sm text-red-700">
|
12
|
+
<ul role="list" class="list-disc space-y-1 pl-5">
|
13
|
+
<%% resource.errors.each do |error| %>
|
14
|
+
<li><%%= error.full_message %></li>
|
15
|
+
<%% end %>
|
16
|
+
</ul>
|
17
|
+
</div>
|
18
|
+
</div>
|
19
|
+
</div>
|
20
|
+
</div>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<%% if actions.include?(:show) %>
|
2
|
+
<%%= render "components/action_show", key: key, value: value %>
|
3
|
+
<%% end %>
|
4
|
+
<%% if actions.include?(:edit) %>
|
5
|
+
<%%= render "components/action_edit", key: key, value: value %>
|
6
|
+
<%% end %>
|
7
|
+
<%% if actions.include?(:destroy) %>
|
8
|
+
<%%= render "components/action_destroy", key: key, value: value, icon_class: "w-6 h-6", params: params %>
|
9
|
+
<%% end %>
|
data/lib/generators/sun_sword/templates_frontend/views/components/layouts/_sidebar_logo.html.erb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
<div class="items-center mt-8 ml-10">
|
2
|
+
<a href="#">
|
3
|
+
<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
4
|
+
viewBox="0 0 1024 704" class="h-24 w-24 p-3">
|
5
|
+
<path d="M759.9,602.1c-15.8,11.4-26.8,26.1-35.4,42.9c-5,9.7-5,9.6-15.4,6.4c-69.1-21-138.3-41.9-207.5-62.8
|
6
|
+
c-81.7-24.7-163.4-49.2-245.1-73.9c-75-22.6-150-45.3-225-68c-2.9-0.9-6.2-1.1-8.5-3.6c0.1-2.5,1.9-3.8,3.3-5.3
|
7
|
+
c79.8-89.3,172.4-162.3,278.4-218.3c20-10.5,40.3-20.4,60.9-29.5c5-2.2,6.2-4.5,4.7-10c-16.3-57.2,8-115.9,58.2-141.2
|
8
|
+
c44.8-22.6,104-7.6,129.9,32.8c6.9,10.8,8.8,23.1,10.6,35.4c0.6,4.1,1.2,8.4,2.6,12.3c4.1,11.4,12.4,17.9,24.5,18.9
|
9
|
+
c10.5,0.9,21-0.6,31.6-1.1c18.4-0.8,36.5,2.4,54.5,6.2c27.6,5.8,54,14.7,78.9,28.3c33,18.1,55.2,44.7,66.6,80.8
|
10
|
+
c6.3,20,10.2,40.4,13.4,60.9c3.3,21.6,15.9,35.8,35.2,44.6c21.7,9.9,43.8,18.7,67.8,21.5c10.5,1.2,20.9,2.1,31.4,3.2
|
11
|
+
c18.3,1.9,27.8,12.9,25,30.9c-4.5,29-11.2,57.6-22.1,84.8c-19.4,48.3-55.9,77.1-106.3,88.4c-14.5,3.3-29.4,2.5-44.1,1.1
|
12
|
+
C804,585.5,780.7,586.5,759.9,602.1 M725,357.5c4.3,7.8,9.3,15.1,16.1,21c11.6,10.1,23.4,10.3,35.5,0.7
|
13
|
+
c11.2-8.9,17.9-21.1,24.9-33.1c2.7-4.6,2-7.2-2.7-10.1c-23.7-14.2-47.1-28.9-70.6-43.3c-7.1-4.3-13.7-9.4-22.5-13.1
|
14
|
+
C707.4,307.2,712,332.9,725,357.5 M980.8,448.6c1.5,2.1,3,4.3,5.2,7.4c5.8-17.4,9.6-33.7,7.4-50.8c-0.8-6.1-4.2-10.8-9.8-13.9
|
15
|
+
c-5.7-3.1-11.9-4.1-18.1-4.9c-8.8-1.1-17.7-2.1-28.1-3.2C952.2,405.7,966.2,426.8,980.8,448.6z"/>
|
16
|
+
</svg>
|
17
|
+
</a>
|
18
|
+
</div>
|
@@ -0,0 +1,42 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title><%= Rails.application.class.module_parent_name %></title>
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
6
|
+
<meta name="mobile-web-app-capable" content="yes">
|
7
|
+
<meta name="viewport" content="width=device-width">
|
8
|
+
<meta name="theme-color" content="#000000"/>
|
9
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
10
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
11
|
+
<link href="https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300..800;1,300..800&display=swap" rel="stylesheet">
|
12
|
+
<link href="https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300..800;1,300..800&family=Preahvihear&display=swap" rel="stylesheet">
|
13
|
+
<link rel="icon" type="image/x-icon" href="<%%= vite_asset_path('assets/images/kotaro.ico') %>">
|
14
|
+
|
15
|
+
<%%= csrf_meta_tags %>
|
16
|
+
<%%= csp_meta_tag %>
|
17
|
+
|
18
|
+
<%%= vite_client_tag %>
|
19
|
+
<%%= vite_stylesheet_tag 'application.scss', data: { "turbo-track": "reload" } %>
|
20
|
+
<%%= vite_javascript_tag 'application' %>
|
21
|
+
</head>
|
22
|
+
|
23
|
+
<body class="h-full" data-turbo="true">
|
24
|
+
<div id="root" data-controller="web" class="flex flex-col h-screen" >
|
25
|
+
<div id="BASE_URL" class="hidden" data-base-url="<%%= ENV['BASE_URL'] %>"></div>
|
26
|
+
<main>
|
27
|
+
<div class="mx-auto max-w-full px-2 sm:px-2 lg:px-8">
|
28
|
+
<div id="root">
|
29
|
+
<%%= yield %>
|
30
|
+
</div>
|
31
|
+
</div>
|
32
|
+
</main>
|
33
|
+
<footer class="mt-auto">
|
34
|
+
<div class="mx-auto max-w-7xl overflow-hidden px-6 py-20 sm:py-24 lg:px-8">
|
35
|
+
<p class="mt-10 text-center text-xs leading-5 text-gray-500">© <%%= Date.today.year %> Kotaroisme. All rights
|
36
|
+
reserved.</p>
|
37
|
+
</div>
|
38
|
+
<p class="mt-3 text-center text-xs leading-5 text-gray-500">version <%%= <%= Rails.application.class.module_parent_name %>::VERSION %></p>
|
39
|
+
</footer>
|
40
|
+
</div>
|
41
|
+
</body>
|
42
|
+
</html>
|
@@ -0,0 +1,60 @@
|
|
1
|
+
<!-- Sidebar component, swap this element with another sidebar if you like -->
|
2
|
+
<div class="flex grow flex-col gap-y-5 overflow-y-auto px-6 pb-2">
|
3
|
+
<div class="flex h-16 shrink-0 items-center">
|
4
|
+
<%%= render 'components/layouts/sidebar_logo' %>
|
5
|
+
</div>
|
6
|
+
<nav class="flex flex-1 flex-col">
|
7
|
+
<ul role="list" class="flex flex-1 flex-col gap-y-7">
|
8
|
+
<li>
|
9
|
+
<ul role="list" class="-mx-2 space-y-1">
|
10
|
+
<li>
|
11
|
+
<div>
|
12
|
+
<button type="button" class="flex items-center w-full text-left rounded-md p-2 gap-x-3 text-sm leading-6 font-semibold text-gray-700" aria-controls="sub-menu-1" aria-expanded="false">
|
13
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="w-6 h-6">
|
14
|
+
<path d="M2.273 5.625A4.483 4.483 0 015.25 4.5h13.5c1.141 0 2.183.425 2.977 1.125A3 3 0 0018.75 3H5.25a3 3 0 00-2.977 2.625zM2.273 8.625A4.483 4.483 0 015.25 7.5h13.5c1.141 0 2.183.425 2.977 1.125A3 3 0 0018.75 6H5.25a3 3 0 00-2.977 2.625zM5.25 9a3 3 0 00-3 3v6a3 3 0 003 3h13.5a3 3 0 003-3v-6a3 3 0 00-3-3H15a.75.75 0 00-.75.75 2.25 2.25 0 01-4.5 0A.75.75 0 009 9H5.25z"/>
|
15
|
+
</svg>
|
16
|
+
Manages
|
17
|
+
</button>
|
18
|
+
<!-- Expandable link section, show/hide based on state. -->
|
19
|
+
<ul class="mt-1 px-2" id="sub-menu-1">
|
20
|
+
<%# generate_link %>
|
21
|
+
</ul>
|
22
|
+
</div>
|
23
|
+
</li>
|
24
|
+
|
25
|
+
</ul>
|
26
|
+
</li>
|
27
|
+
</ul>
|
28
|
+
</nav>
|
29
|
+
<nav class="flex flex-1 flex-col">
|
30
|
+
<ul role="list" class="flex flex-1 flex-col gap-y-7">
|
31
|
+
<li class="-mx-4 mt-auto">
|
32
|
+
<div class="profile-<%%= from %> hidden mt-2.5 mb-5 w-32 rounded-md bg-white shadow-lg ring-1 ring-gray-900/5 focus:outline-none">
|
33
|
+
<!-- Active: "bg-gray-50", Not Active: "" -->
|
34
|
+
<div class="mt-3 w-60 rounded-lg bg-white text-sm font-normal text-slate-900 shadow-md ring-1 ring-slate-900/5 focus:outline-none sm:-mr-3.5">
|
35
|
+
<div class="truncate px-3.5 py-3" role="none">
|
36
|
+
<div class="text-xs text-gray-500">Signed in as</div>
|
37
|
+
<div class="mt-3 font-semibold">kotaroisme@gmail.com</div>
|
38
|
+
</div>
|
39
|
+
<div class="divide-y divide-gray-100 ">
|
40
|
+
<div></div>
|
41
|
+
<div class="py-1.5" role="none">
|
42
|
+
<a class="block py-1.5 px-3.5 hover:bg-slate-100" href="#">Changelog</a>
|
43
|
+
<a class="block py-1.5 px-3.5 hover:bg-slate-100" href="#">idea</a>
|
44
|
+
</div>
|
45
|
+
<div class="py-1.5" role="none">
|
46
|
+
<a href="<%%#= destroy_auth_session_path %>" class="block w-full py-1.5 text-left px-3.5 hover:bg-slate-100" data-turbo="false">Sign
|
47
|
+
out</a>
|
48
|
+
</div>
|
49
|
+
</div>
|
50
|
+
</div>
|
51
|
+
</div>
|
52
|
+
<div data-action="click->web#profileSetting" class="flex cursor-pointer items-center gap-x-4 px-6 py-3 text-sm/6 font-semibold text-gray-900 hover:bg-gray-200">
|
53
|
+
<img class="size-8 rounded-full bg-gray-50" src="<%%= vite_asset_path('assets/images/profile.jpeg') %>" alt="Kotaro Minami">
|
54
|
+
<span class="sr-only">Your profile</span>
|
55
|
+
<span aria-hidden="true">Kotaro Minami</span>
|
56
|
+
</div>
|
57
|
+
</li>
|
58
|
+
</ul>
|
59
|
+
</nav>
|
60
|
+
</div>
|
data/lib/generators/sun_sword/templates_frontend/views/layouts/dashboard/application.html.erb.tt
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Jendral Jack</title>
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
6
|
+
<meta name="mobile-web-app-capable" content="yes">
|
7
|
+
<meta name="viewport" content="width=device-width">
|
8
|
+
<meta name="theme-color" content="#000000"/>
|
9
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
10
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
11
|
+
<link href="https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300..800;1,300..800&display=swap" rel="stylesheet">
|
12
|
+
<link href="https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300..800;1,300..800&family=Preahvihear&display=swap" rel="stylesheet">
|
13
|
+
<link rel="icon" type="image/x-icon" href="<%%= vite_asset_path('assets/images/kotaro.ico') %>">
|
14
|
+
|
15
|
+
<%%= csrf_meta_tags %>
|
16
|
+
<%%= csp_meta_tag %>
|
17
|
+
|
18
|
+
<%%= vite_client_tag %>
|
19
|
+
<%%= vite_javascript_tag 'application', data: { "turbo-track": "reload" } %>
|
20
|
+
</head>
|
21
|
+
|
22
|
+
<body class="h-full" data-turbo="true">
|
23
|
+
<div id="root" data-controller="web" class="flex flex-col h-screen">
|
24
|
+
<div id="BASE_URL" class="hidden" data-base-url="<%%= ENV['BASE_URL'] %>"></div>
|
25
|
+
<main>
|
26
|
+
<div class="mx-auto max-w-full">
|
27
|
+
<div class="relative isolate flex min-h-svh w-full bg-white max-lg:flex-col lg:bg-zinc-100 dark:bg-zinc-900 dark:lg:bg-zinc-950">
|
28
|
+
|
29
|
+
<%%# mobile %>
|
30
|
+
<div class="fixed bg-white rounded-2xl m-2 inset-y-0 w-64 -left-[300px] lg:hidden sidebar side_hide z-50" data-action="click->web#onSidebarClick">
|
31
|
+
<nav class="flex h-full min-h-0 flex-col">
|
32
|
+
<%%= render "layouts/dashboard/sidebar", from: :mobile %>
|
33
|
+
</nav>
|
34
|
+
</div>
|
35
|
+
|
36
|
+
<%%# browser %>
|
37
|
+
<div class="fixed inset-y-0 w-64 max-lg:hidden">
|
38
|
+
<nav class="flex h-full min-h-0 flex-col">
|
39
|
+
<%%= render "layouts/dashboard/sidebar", from: :browser %>
|
40
|
+
</nav>
|
41
|
+
</div>
|
42
|
+
|
43
|
+
<%%# Sidebar Toggle %>
|
44
|
+
<div class="z-50 relative flex items-center px-4 lg:hidden">
|
45
|
+
<div class="py-2.5">
|
46
|
+
<button type="button" class="-m-2.5 p-2.5 text-gray-700 lg:hidden cursor-pointer" data-action="click->web#sidebarToggle">
|
47
|
+
<span class="sr-only">Open sidebar</span>
|
48
|
+
<svg class="sidebar-toggle-close w-6 h-6 hidden" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
49
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18 18 6M6 6l12 12"/>
|
50
|
+
</svg>
|
51
|
+
<svg class="sidebar-toggle-open w-6 h-6" data-slot="icon" viewBox="0 0 20 20" aria-hidden="true">
|
52
|
+
<path d="M2 6.75C2 6.33579 2.33579 6 2.75 6H17.25C17.6642 6 18 6.33579 18 6.75C18 7.16421 17.6642 7.5 17.25 7.5H2.75C2.33579 7.5 2 7.16421 2 6.75ZM2 13.25C2 12.8358 2.33579 12.5 2.75 12.5H17.25C17.6642 12.5 18 12.8358 18 13.25C18 13.6642 17.6642 14 17.25 14H2.75C2.33579 14 2 13.6642 2 13.25Z"></path>
|
53
|
+
</svg>
|
54
|
+
</button>
|
55
|
+
</div>
|
56
|
+
</div>
|
57
|
+
|
58
|
+
<main class="flex flex-1 flex-col pb-2 lg:min-w-0 lg:pl-64 lg:pr-2 lg:pt-2">
|
59
|
+
<div class="fixed inset-0 bg-gray-900/60 backdrop-blur-sm backdrop-active opacity-0 hidden lg:hidden" aria-hidden="true"></div>
|
60
|
+
<div class="grow p-6 lg:rounded-lg lg:bg-white lg:p-10 lg:shadow-sm lg:ring-1 lg:ring-zinc-950/5 dark:lg:bg-zinc-900 dark:lg:ring-white/10">
|
61
|
+
<div class="mx-auto max-w-6xl">
|
62
|
+
<%%= yield %>
|
63
|
+
</div>
|
64
|
+
</div>
|
65
|
+
</main>
|
66
|
+
</div>
|
67
|
+
</div>
|
68
|
+
</main>
|
69
|
+
</div>
|
70
|
+
</body>
|
71
|
+
</html>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<!--HTML from anywhere-->
|
2
|
+
<container class="flex flex-col h-screen items-center justify-center bg-orange-500" data-controller="site-stimulus">
|
3
|
+
<div class="w-full">
|
4
|
+
<div class="font-bold flex items-center justify-center">
|
5
|
+
<input data-site-stimulus-target="name" type="text" name="name" id="name" class="rounded-md border-0 py-1.5 text-orange-900 shadow-sm ring-1 ring-inset ring-orange-500 placeholder:text-orange-400 focus:ring-2 focus:ring-inset focus:ring-orange-500 mr-5" placeholder="Kotaro">
|
6
|
+
<button data-action="click->site-stimulus#greet" type="button" class="rounded-full bg-white p-2 text-orange-500 shadow-sm hover:bg-white-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-orange-500">
|
7
|
+
<svg class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true" data-slot="icon">
|
8
|
+
<path d="M10.75 4.75a.75.75 0 0 0-1.5 0v4.5h-4.5a.75.75 0 0 0 0 1.5h4.5v4.5a.75.75 0 0 0 1.5 0v-4.5h4.5a.75.75 0 0 0 0-1.5h-4.5v-4.5Z"/>
|
9
|
+
</svg>
|
10
|
+
</button>
|
11
|
+
</div>
|
12
|
+
<br>
|
13
|
+
<div class="font-bold flex items-center justify-center">
|
14
|
+
<span class="text-white text-[2rem]" data-site-stimulus-target="output">. . .</span><br/>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
<div class="w-full">
|
18
|
+
<div class="comment flex items-center justify-center">
|
19
|
+
<%%= render partial: "site/comment" %>
|
20
|
+
</div>
|
21
|
+
<div class="action flex items-center justify-center">
|
22
|
+
<%%= link_to "Kotaro", site_jadi_a_path, class: "class-button-outline m-2", data: { turbo_frame: "comment_show" } %>
|
23
|
+
<%%= link_to "Minami", site_jadi_b_path, class: "class-button-outline m-2", data: { turbo_frame: "comment_show" } %>
|
24
|
+
</div>
|
25
|
+
</div>
|
26
|
+
</container>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
import {defineConfig} from 'vite'
|
2
|
+
import RubyPlugin from 'vite-plugin-ruby'
|
3
|
+
import FullReload from 'vite-plugin-full-reload'
|
4
|
+
import StimulusHMR from 'vite-plugin-stimulus-hmr';
|
5
|
+
export default defineConfig({
|
6
|
+
plugins: [
|
7
|
+
RubyPlugin(),
|
8
|
+
FullReload(['config/routes.rb', 'app/views/**/*', 'app/frontend/pages/**/*']),
|
9
|
+
StimulusHMR()
|
10
|
+
],
|
11
|
+
root: './app/frontend',
|
12
|
+
build: {
|
13
|
+
manifest: true,
|
14
|
+
rollupOptions: {
|
15
|
+
input: {
|
16
|
+
application: 'app/frontend/entrypoints/application.js'
|
17
|
+
}
|
18
|
+
}
|
19
|
+
},
|
20
|
+
css: {
|
21
|
+
preprocessorOptions: {
|
22
|
+
scss: {
|
23
|
+
api: 'modern-compiler' // or "modern"
|
24
|
+
}
|
25
|
+
}
|
26
|
+
}
|
27
|
+
})
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# Template for the controller (controllers/controller.rb.tt)
|
2
|
+
class <%= [@route_scope_class, @scope_class].join("::") %>Controller < ApplicationController
|
3
|
+
before_action :set_<%= @variable_subject %>, only: %i[show edit update destroy]
|
4
|
+
layout :set_layouts
|
5
|
+
|
6
|
+
# GET /<%= [@route_scope_path, @scope_path].join("/") %>
|
7
|
+
def index
|
8
|
+
use_case = Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('list')].join("::") %>
|
9
|
+
contract = use_case.contract!(build_contract({}))
|
10
|
+
result = use_case.new(contract).result
|
11
|
+
@<%= @scope_path %> = Dry::Matcher::ResultMatcher.call(result) do |matcher|
|
12
|
+
matcher.success { |response| response }
|
13
|
+
matcher.failure { |errors| errors }
|
14
|
+
end
|
15
|
+
render '<%= @route_scope_path %>/<%= @scope_path %>/index'
|
16
|
+
end
|
17
|
+
|
18
|
+
# GET /<%= [@route_scope_path, @scope_path, ":uuid"].join("/") %>
|
19
|
+
def show
|
20
|
+
end
|
21
|
+
|
22
|
+
# GET /<%= [@route_scope_path, @scope_path, "new"].join("/") %>
|
23
|
+
def new
|
24
|
+
@<%= @variable_subject %> = <%= @model_class %>.new
|
25
|
+
end
|
26
|
+
|
27
|
+
# GET /<%= [@route_scope_path, @scope_path, ":uuid", "edit"].join("/") %>
|
28
|
+
def edit
|
29
|
+
end
|
30
|
+
|
31
|
+
# POST /<%= @route_scope_path %>/<%= @scope_path %>
|
32
|
+
def create
|
33
|
+
use_case = Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('create')].join("::") %>
|
34
|
+
contract = use_case.contract!(build_contract(<%= @variable_subject %>_params))
|
35
|
+
result = use_case.new(contract).result
|
36
|
+
Dry::Matcher::ResultMatcher.call(result) do |matcher|
|
37
|
+
matcher.success do |response|
|
38
|
+
redirect_to <%= [@route_scope_path, @variable_subject].join("_") %>_url(id: response.id), success: '<%= @subject_class %> was successfully created.'
|
39
|
+
end
|
40
|
+
matcher.failure do |errors|
|
41
|
+
@<%= @variable_subject %> = build_form_errors(<%= @variable_subject %>_params, <%= @model_class %>.new, errors)
|
42
|
+
render '<%= [@route_scope_path, @scope_path, "new"].join("/") %>', status: :unprocessable_entity
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# PATCH/PUT /<%= [@route_scope_path, @scope_path, ":uuid"].join("/") %>
|
48
|
+
def update
|
49
|
+
use_case = Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('update')].join("::") %>
|
50
|
+
contract = use_case.contract!(build_contract(<%= @variable_subject %>_params).merge({ id: params[:id] }))
|
51
|
+
result = use_case.new(contract).result
|
52
|
+
Dry::Matcher::ResultMatcher.call(result) do |matcher|
|
53
|
+
matcher.success do |response|
|
54
|
+
redirect_to <%= [@route_scope_path, @variable_subject].join("_") %>_url(id: response.id), success: '<%= @subject_class %> was successfully updated.'
|
55
|
+
end
|
56
|
+
matcher.failure do |errors|
|
57
|
+
@<%= @variable_subject %> = build_form_errors(<%= @variable_subject %>_params, <%= @model_class %>.find(params[:id]), errors)
|
58
|
+
render '<%= [@route_scope_path, @scope_path, "edit"].join("/") %>', status: :unprocessable_entity
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# DELETE /<%= [@route_scope_path, @scope_path, ":uuid"].join("/") %>
|
64
|
+
def destroy
|
65
|
+
use_case = Core::UseCases::<%= [@route_scope_class, @scope_class, build_usecase_filename('destroy')].join("::") %>
|
66
|
+
contract = use_case.contract!(build_contract({ id: params[:id] }))
|
67
|
+
result = use_case.new(contract).result
|
68
|
+
Dry::Matcher::ResultMatcher.call(result) do |matcher|
|
69
|
+
matcher.success do |response|
|
70
|
+
redirect_to <%= [@route_scope_path, @scope_path].join("_") %>_url, notice: '<%= @subject_class %> was successfully destroyed.'
|
71
|
+
end
|
72
|
+
matcher.failure do |errors|
|
73
|
+
redirect_to <%= [@route_scope_path, @scope_path].join("_") %>_url, error: '<%= @subject_class %> could not be destroyed.'
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
# Use callbacks to share common setup or constraints between actions.
|
81
|
+
def set_<%= @variable_subject %>
|
82
|
+
@<%= @variable_subject %> = <%= @model_class %>.find_by(id: params[:id])
|
83
|
+
redirect_to <%= [@route_scope_path, @scope_path].join("_") %>_url, error: '<%= @subject_class %> not found.' if @<%= @variable_subject %>.nil?
|
84
|
+
end
|
85
|
+
|
86
|
+
# Only allow a list of trusted parameters through.
|
87
|
+
def <%= @variable_subject %>_params
|
88
|
+
params.require(:models_<%= @subject_class.underscore %>).permit(<%= strong_params %>)
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<%%= form_with(model: <%= @variable_subject %>, url: ((["new", "create"].include? action_name) ? <%= [@route_scope_path, @scope_path].join("_") %>_path : <%= [@route_scope_path, @scope_path.singularize].join("_") %>_path(<%= @variable_subject %>)), class: "contents") do |form| %>
|
2
|
+
|
3
|
+
<%%= render "components/error_form_submit", resource: <%= @variable_subject %> if <%= @variable_subject %>.errors.any? %>
|
4
|
+
|
5
|
+
<div class="space-y-12 sm:space-y-16">
|
6
|
+
<div>
|
7
|
+
<div class="mt-10 space-y-8 pb-12 sm:space-y-0 sm:pb-0 p-4 class-card-container">
|
8
|
+
<div class="class-input">
|
9
|
+
<%%= form.label :name, class: "class-label" %>
|
10
|
+
<div class="mt-2 sm:col-span-2 sm:mt-0">
|
11
|
+
<%%= form.text_field :name, class: "class-text-field" %>
|
12
|
+
</div>
|
13
|
+
</div>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
|
18
|
+
<div class="mt-6 flex items-center justify-end gap-x-6">
|
19
|
+
<%%= link_to "Back", <%= [@route_scope_path, @scope_path].join("_") %>_path, class: "inline-flex justify-center class-button" %>
|
20
|
+
<%%= form.submit class: "inline-flex justify-center class-button" %>
|
21
|
+
</div>
|
22
|
+
<%% end %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<a data-remote="true" id="<%= [@route_scope_path, @scope_path].join("_")%>" href="<%%=<%= [@route_scope_path, @scope_path].join("_")%>_path %>#<%= [@route_scope_path, @scope_path].join("_")%>" class="<%%= ['<%= [@route_scope_path, @scope_path].join("_")%>_index'].include?("#{controller_name}_#{action_name}") ? "class-menu-active-link" : "class-menu-link" %>"><%= @variable_subject.titleize%></a>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<div>
|
2
|
+
<div class="flow-root class-card-container">
|
3
|
+
<div class="flex items-center p-2 mb-10">
|
4
|
+
<div class="flex-auto">
|
5
|
+
<h1 class="font-semibold text-gray-900">Editing User</h1>
|
6
|
+
</div>
|
7
|
+
</div>
|
8
|
+
<%%= render "form", <%= @variable_subject %>: @<%= @variable_subject %> %>
|
9
|
+
</div>
|
10
|
+
</div>
|