inertia_rails 3.12.1 → 3.14.0

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.
Files changed (163) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +23 -0
  3. data/lib/generators/inertia/controller/templates/controller.rb.tt +1 -1
  4. data/lib/generators/inertia/install/frameworks.yml +10 -45
  5. data/lib/generators/inertia/install/install_generator.rb +102 -14
  6. data/lib/generators/inertia/install/js_package_manager.rb +6 -6
  7. data/lib/generators/inertia/install/templates/assets/rails.svg +9 -0
  8. data/lib/generators/inertia/install/templates/controller.rb +6 -3
  9. data/lib/generators/inertia/install/templates/inertia_controller.rb +5 -0
  10. data/lib/generators/inertia/install/templates/react/InertiaExample.jsx +43 -47
  11. data/lib/generators/inertia/install/templates/react/InertiaExample.module.css +63 -41
  12. data/lib/generators/inertia/install/templates/react/InertiaExample.tsx +46 -47
  13. data/lib/generators/inertia/install/templates/react/inertia.jsx +65 -0
  14. data/lib/generators/inertia/install/templates/react/inertia.tsx +65 -0
  15. data/lib/generators/inertia/install/templates/react/tsconfig.app.json +7 -0
  16. data/lib/generators/inertia/install/templates/react/types/globals.d.ts +8 -0
  17. data/lib/generators/inertia/install/templates/react/types/index.ts +8 -0
  18. data/lib/generators/inertia/install/templates/svelte/InertiaExample.svelte +103 -69
  19. data/lib/generators/inertia/install/templates/svelte/InertiaExample.ts.svelte +104 -69
  20. data/lib/generators/inertia/install/templates/svelte/inertia.js +14 -3
  21. data/lib/generators/inertia/install/templates/svelte/{inertia.ts.tt → inertia.ts} +12 -2
  22. data/lib/generators/inertia/install/templates/svelte/tsconfig.json +8 -0
  23. data/lib/generators/inertia/install/templates/svelte/types/globals.d.ts +8 -0
  24. data/lib/generators/inertia/install/templates/svelte/types/index.ts +8 -0
  25. data/lib/generators/inertia/install/templates/tailwind/application.css +3 -3
  26. data/lib/generators/inertia/install/templates/vue/InertiaExample.ts.vue +107 -70
  27. data/lib/generators/inertia/install/templates/vue/InertiaExample.vue +129 -92
  28. data/lib/generators/inertia/install/templates/vue/inertia.js +30 -3
  29. data/lib/generators/inertia/install/templates/vue/inertia.ts +31 -3
  30. data/lib/generators/inertia/install/templates/vue/tsconfig.app.json +9 -1
  31. data/lib/generators/inertia/install/templates/vue/types/globals.d.ts +8 -0
  32. data/lib/generators/inertia/install/templates/vue/types/index.ts +8 -0
  33. data/lib/generators/inertia/scaffold_controller/scaffold_controller_generator.rb +4 -0
  34. data/lib/generators/inertia/scaffold_controller/templates/controller.rb.tt +7 -5
  35. data/lib/generators/inertia_templates/scaffold/templates/react/{Edit.jsx.tt → edit.jsx.tt} +5 -8
  36. data/lib/generators/inertia_templates/scaffold/templates/react/{Edit.tsx.tt → edit.tsx.tt} +7 -9
  37. data/lib/generators/inertia_templates/scaffold/templates/react/form.jsx.tt +94 -0
  38. data/lib/generators/inertia_templates/scaffold/templates/react/form.tsx.tt +109 -0
  39. data/lib/generators/inertia_templates/scaffold/templates/react/{Index.jsx.tt → index.jsx.tt} +1 -1
  40. data/lib/generators/inertia_templates/scaffold/templates/react/{Index.tsx.tt → index.tsx.tt} +1 -1
  41. data/lib/generators/inertia_templates/scaffold/templates/react/{New.jsx.tt → new.jsx.tt} +3 -5
  42. data/lib/generators/inertia_templates/scaffold/templates/react/{New.tsx.tt → new.tsx.tt} +5 -6
  43. data/lib/generators/inertia_templates/scaffold/templates/react/{Show.jsx.tt → show.jsx.tt} +1 -1
  44. data/lib/generators/inertia_templates/scaffold/templates/react/{Show.tsx.tt → show.tsx.tt} +1 -1
  45. data/lib/generators/inertia_templates/scaffold/templates/svelte/{Edit.svelte.tt → edit.svelte.tt} +9 -13
  46. data/lib/generators/inertia_templates/scaffold/templates/{svelte4/Edit.svelte.tt → svelte/edit.ts.svelte.tt} +11 -15
  47. data/lib/generators/inertia_templates/scaffold/templates/svelte/form.svelte.tt +96 -0
  48. data/lib/generators/inertia_templates/scaffold/templates/svelte/form.ts.svelte.tt +103 -0
  49. data/lib/generators/inertia_templates/scaffold/templates/svelte/{Index.svelte.tt → index.svelte.tt} +1 -1
  50. data/lib/generators/inertia_templates/scaffold/templates/svelte/{Index.ts.svelte.tt → index.ts.svelte.tt} +1 -1
  51. data/lib/generators/inertia_templates/scaffold/templates/svelte/{New.svelte.tt → new.svelte.tt} +4 -7
  52. data/lib/generators/inertia_templates/scaffold/templates/{svelte4/New.svelte.tt → svelte/new.ts.svelte.tt} +6 -9
  53. data/lib/generators/inertia_templates/scaffold/templates/svelte/{Show.svelte.tt → show.svelte.tt} +1 -1
  54. data/lib/generators/inertia_templates/scaffold/templates/svelte/{Show.ts.svelte.tt → show.ts.svelte.tt} +1 -1
  55. data/lib/generators/inertia_templates/scaffold/templates/vue/{Edit.ts.vue.tt → edit.ts.vue.tt} +11 -15
  56. data/lib/generators/inertia_templates/scaffold/templates/vue/{Edit.vue.tt → edit.vue.tt} +9 -13
  57. data/lib/generators/inertia_templates/scaffold/templates/vue/form.ts.vue.tt +102 -0
  58. data/lib/generators/inertia_templates/scaffold/templates/vue/form.vue.tt +98 -0
  59. data/lib/generators/inertia_templates/scaffold/templates/vue/{Index.ts.vue.tt → index.ts.vue.tt} +1 -1
  60. data/lib/generators/inertia_templates/scaffold/templates/vue/{Index.vue.tt → index.vue.tt} +1 -1
  61. data/lib/generators/inertia_templates/scaffold/templates/vue/{New.ts.vue.tt → new.ts.vue.tt} +6 -9
  62. data/lib/generators/inertia_templates/scaffold/templates/vue/{New.vue.tt → new.vue.tt} +4 -7
  63. data/lib/generators/inertia_templates/scaffold/templates/vue/{Show.ts.vue.tt → show.ts.vue.tt} +1 -1
  64. data/lib/generators/inertia_templates/scaffold/templates/vue/{Show.vue.tt → show.vue.tt} +1 -1
  65. data/lib/generators/inertia_tw_templates/scaffold/templates/react/{Edit.jsx.tt → edit.jsx.tt} +5 -8
  66. data/lib/generators/inertia_tw_templates/scaffold/templates/react/{Edit.tsx.tt → edit.tsx.tt} +6 -9
  67. data/lib/generators/inertia_tw_templates/scaffold/templates/react/form.jsx.tt +106 -0
  68. data/lib/generators/inertia_tw_templates/scaffold/templates/react/form.tsx.tt +122 -0
  69. data/lib/generators/inertia_tw_templates/scaffold/templates/react/{Index.jsx.tt → index.jsx.tt} +1 -1
  70. data/lib/generators/inertia_tw_templates/scaffold/templates/react/{Index.tsx.tt → index.tsx.tt} +1 -1
  71. data/lib/generators/inertia_tw_templates/scaffold/templates/react/{New.jsx.tt → new.jsx.tt} +3 -5
  72. data/lib/generators/inertia_tw_templates/scaffold/templates/react/{New.tsx.tt → new.tsx.tt} +4 -6
  73. data/lib/generators/inertia_tw_templates/scaffold/templates/react/{Show.jsx.tt → show.jsx.tt} +1 -1
  74. data/lib/generators/inertia_tw_templates/scaffold/templates/react/{Show.tsx.tt → show.tsx.tt} +1 -1
  75. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/{Edit.svelte.tt → edit.svelte.tt} +9 -13
  76. data/lib/generators/inertia_tw_templates/scaffold/templates/{svelte4/Edit.svelte.tt → svelte/edit.ts.svelte.tt} +11 -15
  77. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/form.svelte.tt +109 -0
  78. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/form.ts.svelte.tt +115 -0
  79. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/{Index.svelte.tt → index.svelte.tt} +1 -1
  80. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/{Index.ts.svelte.tt → index.ts.svelte.tt} +1 -1
  81. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/{New.svelte.tt → new.svelte.tt} +4 -7
  82. data/lib/generators/inertia_tw_templates/scaffold/templates/{svelte4/New.svelte.tt → svelte/new.ts.svelte.tt} +6 -9
  83. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/{Show.svelte.tt → show.svelte.tt} +1 -1
  84. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/{Show.ts.svelte.tt → show.ts.svelte.tt} +1 -1
  85. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/{Edit.ts.vue.tt → edit.ts.vue.tt} +10 -15
  86. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/{Edit.vue.tt → edit.vue.tt} +8 -13
  87. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/{Form.ts.vue.tt → form.ts.vue.tt} +19 -42
  88. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/{Form.vue.tt → form.vue.tt} +18 -38
  89. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/{Index.ts.vue.tt → index.ts.vue.tt} +1 -1
  90. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/{Index.vue.tt → index.vue.tt} +1 -1
  91. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/{New.ts.vue.tt → new.ts.vue.tt} +6 -9
  92. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/{New.vue.tt → new.vue.tt} +4 -7
  93. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/{Show.ts.vue.tt → show.ts.vue.tt} +1 -1
  94. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/{Show.vue.tt → show.vue.tt} +1 -1
  95. data/lib/inertia_rails/generators/controller_template_base.rb +1 -1
  96. data/lib/inertia_rails/generators/helper.rb +2 -3
  97. data/lib/inertia_rails/generators/scaffold_template_base.rb +3 -3
  98. data/lib/inertia_rails/version.rb +1 -1
  99. data/lib/inertia_rails.rb +1 -0
  100. metadata +88 -116
  101. data/lib/generators/inertia/install/templates/react/inertia.js +0 -45
  102. data/lib/generators/inertia/install/templates/react/inertia.ts +0 -51
  103. data/lib/generators/inertia/install/templates/svelte4/InertiaExample.svelte +0 -116
  104. data/lib/generators/inertia/install/templates/svelte4/InertiaExample.ts.svelte +0 -116
  105. data/lib/generators/inertia/install/templates/svelte4/inertia.js +0 -43
  106. data/lib/generators/inertia/install/templates/svelte4/inertia.ts.tt +0 -44
  107. data/lib/generators/inertia/install/templates/svelte4/svelte.config.js +0 -7
  108. data/lib/generators/inertia/install/templates/svelte4/tsconfig.json +0 -21
  109. data/lib/generators/inertia/install/templates/svelte4/tsconfig.node.json +0 -12
  110. data/lib/generators/inertia/install/templates/svelte4/vite-env.d.ts +0 -2
  111. data/lib/generators/inertia_templates/controller/templates/svelte4/view.svelte.tt +0 -2
  112. data/lib/generators/inertia_templates/scaffold/templates/react/Form.jsx.tt +0 -111
  113. data/lib/generators/inertia_templates/scaffold/templates/react/Form.tsx.tt +0 -130
  114. data/lib/generators/inertia_templates/scaffold/templates/svelte/Edit.ts.svelte.tt +0 -37
  115. data/lib/generators/inertia_templates/scaffold/templates/svelte/Form.svelte.tt +0 -97
  116. data/lib/generators/inertia_templates/scaffold/templates/svelte/Form.ts.svelte.tt +0 -102
  117. data/lib/generators/inertia_templates/scaffold/templates/svelte/New.ts.svelte.tt +0 -30
  118. data/lib/generators/inertia_templates/scaffold/templates/svelte4/Edit.ts.svelte.tt +0 -38
  119. data/lib/generators/inertia_templates/scaffold/templates/svelte4/Form.svelte.tt +0 -96
  120. data/lib/generators/inertia_templates/scaffold/templates/svelte4/Form.ts.svelte.tt +0 -106
  121. data/lib/generators/inertia_templates/scaffold/templates/svelte4/Index.svelte.tt +0 -36
  122. data/lib/generators/inertia_templates/scaffold/templates/svelte4/Index.ts.svelte.tt +0 -37
  123. data/lib/generators/inertia_templates/scaffold/templates/svelte4/New.ts.svelte.tt +0 -31
  124. data/lib/generators/inertia_templates/scaffold/templates/svelte4/One.svelte.tt +0 -28
  125. data/lib/generators/inertia_templates/scaffold/templates/svelte4/One.ts.svelte.tt +0 -30
  126. data/lib/generators/inertia_templates/scaffold/templates/svelte4/Show.svelte.tt +0 -39
  127. data/lib/generators/inertia_templates/scaffold/templates/svelte4/Show.ts.svelte.tt +0 -40
  128. data/lib/generators/inertia_templates/scaffold/templates/svelte4/types.ts.tt +0 -19
  129. data/lib/generators/inertia_templates/scaffold/templates/vue/Form.ts.vue.tt +0 -101
  130. data/lib/generators/inertia_templates/scaffold/templates/vue/Form.vue.tt +0 -94
  131. data/lib/generators/inertia_tw_templates/controller/templates/svelte4/view.svelte.tt +0 -2
  132. data/lib/generators/inertia_tw_templates/scaffold/templates/react/Form.jsx.tt +0 -122
  133. data/lib/generators/inertia_tw_templates/scaffold/templates/react/Form.tsx.tt +0 -142
  134. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/Edit.ts.svelte.tt +0 -45
  135. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/Form.svelte.tt +0 -118
  136. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/Form.ts.svelte.tt +0 -123
  137. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/New.ts.svelte.tt +0 -33
  138. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/Edit.ts.svelte.tt +0 -46
  139. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/Form.svelte.tt +0 -120
  140. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/Form.ts.svelte.tt +0 -130
  141. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/Index.svelte.tt +0 -43
  142. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/Index.ts.svelte.tt +0 -44
  143. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/New.ts.svelte.tt +0 -34
  144. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/One.svelte.tt +0 -28
  145. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/One.ts.svelte.tt +0 -30
  146. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/Show.svelte.tt +0 -51
  147. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/Show.ts.svelte.tt +0 -52
  148. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/types.ts.tt +0 -19
  149. /data/lib/generators/inertia/install/templates/react/{vite-env.d.ts → types/vite-env.d.ts} +0 -0
  150. /data/lib/generators/inertia/install/templates/svelte/{vite-env.d.ts → types/vite-env.d.ts} +0 -0
  151. /data/lib/generators/inertia/install/templates/vue/{vite-env.d.ts → types/vite-env.d.ts} +0 -0
  152. /data/lib/generators/inertia_templates/scaffold/templates/react/{One.jsx.tt → one.jsx.tt} +0 -0
  153. /data/lib/generators/inertia_templates/scaffold/templates/react/{One.tsx.tt → one.tsx.tt} +0 -0
  154. /data/lib/generators/inertia_templates/scaffold/templates/svelte/{One.svelte.tt → one.svelte.tt} +0 -0
  155. /data/lib/generators/inertia_templates/scaffold/templates/svelte/{One.ts.svelte.tt → one.ts.svelte.tt} +0 -0
  156. /data/lib/generators/inertia_templates/scaffold/templates/vue/{One.ts.vue.tt → one.ts.vue.tt} +0 -0
  157. /data/lib/generators/inertia_templates/scaffold/templates/vue/{One.vue.tt → one.vue.tt} +0 -0
  158. /data/lib/generators/inertia_tw_templates/scaffold/templates/react/{One.jsx.tt → one.jsx.tt} +0 -0
  159. /data/lib/generators/inertia_tw_templates/scaffold/templates/react/{One.tsx.tt → one.tsx.tt} +0 -0
  160. /data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/{One.svelte.tt → one.svelte.tt} +0 -0
  161. /data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/{One.ts.svelte.tt → one.ts.svelte.tt} +0 -0
  162. /data/lib/generators/inertia_tw_templates/scaffold/templates/vue/{One.ts.vue.tt → one.ts.vue.tt} +0 -0
  163. /data/lib/generators/inertia_tw_templates/scaffold/templates/vue/{One.vue.tt → one.vue.tt} +0 -0
@@ -1,117 +1,154 @@
1
1
  <template>
2
- <Head title="Inertia + Vite Ruby + Vue Example" />
2
+ <Head title="Ruby on Rails + Inertia + Vue" />
3
3
 
4
4
  <div class="root">
5
- <h1 class="h1">Hello {{ name }}!</h1>
6
-
7
- <div>
8
- <a href="https://inertia-rails.dev" target="_blank">
9
- <img class="logo" :src="inertiaSvg" alt="Inertia logo" />
5
+ <nav class="subNav">
6
+ <a href="https://rubyonrails.org" target="_blank">
7
+ <img class="logo rails" :src="railsSvg" alt="Ruby on Rails Logo" />
10
8
  </a>
11
- <a href="https://vite-ruby.netlify.app" target="_blank">
12
- <img class="logo vite" :src="viteRubySvg" alt="Vite Ruby logo" />
9
+ <a href="https://inertia-rails.dev" target="_blank">
10
+ <img class="logo inertia" :src="inertiaSvg" alt="Inertia logo" />
13
11
  </a>
14
12
  <a href="https://vuejs.org" target="_blank">
15
- <img class="logo vue" :src="vueSvg" alt="Vue logo" />
13
+ <img class="logo vue" :src="vueSvg" alt="Vue logo"/>
16
14
  </a>
17
- </div>
15
+ </nav>
18
16
 
19
- <h2 class="h2">Inertia + Vite Ruby + Vue</h2>
17
+ <div class="footer">
18
+ <div class="card">
19
+ <p>
20
+ Edit <code><%= js_destination_path %>/pages/inertia_example/index.vue</code> and save to test <abbr title="Hot Module Replacement">HMR</abbr>.
21
+ </p>
22
+ </div>
20
23
 
21
- <div class="card">
22
- <button class="button" type="button" @click="count++">
23
- count is {{ count }}
24
- </button>
25
- <p>
26
- Edit <code>app/frontend/pages/InertiaExample.vue</code> and save to test
27
- HMR
28
- </p>
24
+ <ul>
25
+ <li>
26
+ <ul>
27
+ <li><strong>Rails version:</strong> {{ rails_version }}</li>
28
+ <li><strong>Rack version:</strong> {{ rack_version }}</li>
29
+ </ul>
30
+ </li>
31
+ <li><strong>Ruby version:</strong> {{ ruby_version }}</li>
32
+ <li>
33
+ <ul>
34
+ <li><strong>Inertia Rails version:</strong> {{ inertia_rails_version }}</li>
35
+ <li><strong>Vue version:</strong> {{ vue_version }}</li>
36
+ </ul>
37
+ </li>
38
+ </ul>
29
39
  </div>
30
- <p class="readTheDocs">
31
- Click on the Inertia, Vite Ruby, and Vue logos to learn more
32
- </p>
33
40
  </div>
34
41
  </template>
35
42
 
36
43
  <script setup>
37
44
  import { Head } from '@inertiajs/vue3'
38
- import { ref } from 'vue'
45
+ import { version as vue_version } from 'vue';
39
46
 
47
+ import railsSvg from '/assets/rails.svg'
40
48
  import inertiaSvg from '/assets/inertia.svg'
41
- import viteRubySvg from '/assets/vite_ruby.svg'
42
49
  import vueSvg from '/assets/vue.svg'
43
50
 
44
51
  defineProps({
45
- name: String,
52
+ rails_version: String,
53
+ rack_version: String,
54
+ ruby_version: String,
55
+ inertia_rails_version: String,
46
56
  })
47
-
48
- const count = ref(0)
49
57
  </script>
50
58
 
59
+ <style global>
60
+ body {
61
+ margin: 0;
62
+ padding: 0;
63
+ }
64
+ </style>
65
+
51
66
  <style scoped>
52
- .root {
53
- font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
54
- line-height: 1.5;
55
- font-weight: 400;
56
- color: #213547;
57
- background-color: #ffffff;
58
- max-width: 1280px;
59
- margin: 0 auto;
60
- padding: 2rem;
61
- text-align: center;
62
- }
63
-
64
- .h1 {
65
- font-size: 3.2em;
66
- line-height: 1.1;
67
- }
68
-
69
- .h2 {
70
- font-size: 2.6em;
71
- line-height: 1.1;
72
- }
73
-
74
- .button {
75
- border-radius: 8px;
76
- border: 1px solid transparent;
77
- padding: 0.6em 1.2em;
78
- font-size: 1em;
79
- font-weight: 500;
80
- font-family: inherit;
81
- background-color: #f9f9f9;
82
- cursor: pointer;
83
- transition: border-color 0.25s;
84
- }
85
- .button:hover {
86
- border-color: #646cff;
87
- }
88
- .button:focus,
89
- .button:focus-visible {
90
- outline: 4px auto -webkit-focus-ring-color;
91
- }
92
-
93
- .logo {
94
- display: inline-block;
95
- height: 6em;
96
- padding: 1.5em;
97
- will-change: filter;
98
- transition: filter 300ms;
99
- }
100
- .logo:hover {
101
- filter: drop-shadow(0 0 2em #646cffaa);
102
- }
103
- .logo.vite:hover {
104
- filter: drop-shadow(0 0 2em #e4023baa);
105
- }
106
- .logo.vue:hover {
107
- filter: drop-shadow(0 0 2em #41b883aa);
108
- }
109
-
110
- .card {
111
- padding: 2em;
112
- }
113
-
114
- .readTheDocs {
115
- color: #888;
116
- }
67
+ .root {
68
+ box-sizing: border-box;
69
+ margin: 0;
70
+ padding: 0;
71
+ align-items: center;
72
+ background-color: #F0E7E9;
73
+ background-image: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjEwMjQiIHZpZXdCb3g9IjAgMCAxNDQwIDEwMjQiIHdpZHRoPSIxNDQwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Im0xNDQwIDUxMC4wMDA2NDh2LTUxMC4wMDA2NDhoLTE0NDB2Mzg0LjAwMDY0OGM0MTcuMzExOTM5IDEzMS4xNDIxNzkgODkxIDE3MS41MTMgMTQ0MCAxMjZ6IiBmaWxsPSIjZmZmIi8+PC9zdmc+);
74
+ background-position: center center;
75
+ background-repeat: no-repeat;
76
+ background-size: cover;
77
+ color: #261B23;
78
+ display: flex;
79
+ flex-direction: column;
80
+ font-family: Sans-Serif;
81
+ font-size: calc(0.9em + 0.5vw);
82
+ font-style: normal;
83
+ font-weight: 400;
84
+ justify-content: center;
85
+ line-height: 1.25;
86
+ min-height: 100vh;
87
+ text-align: center;
88
+ }
89
+
90
+ @media (prefers-color-scheme: dark) {
91
+ .root {
92
+ background-color: #1a1a1a;
93
+ background-image: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjEwMjQiIHZpZXdCb3g9IjAgMCAxNDQwIDEwMjQiIHdpZHRoPSIxNDQwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Im0xNDQwIDUxMC4wMDA2NDh2LTUxMC4wMDA2NDhoLTE0NDB2Mzg0LjAwMDY0OGM0MTcuMzExOTM5IDEzMS4xNDIxNzkgODkxIDE3MS41MTMgMTQ0MCAxMjZ6IiBmaWxsPSIjMzMzIi8+PC9zdmc+);
94
+ color: #e0e0e0;
95
+ }
96
+ }
97
+
98
+ .logo {
99
+ display: inline-block;
100
+ height: 9.8vw;
101
+ min-height: 130px;
102
+ padding: 1.5em;
103
+ will-change: filter;
104
+ transition: filter 300ms;
105
+ filter: drop-shadow(0 20px 13px rgb(0 0 0 / 0.03)) drop-shadow(0 8px 5px rgb(0 0 0 / 0.08));
106
+ }
107
+ .logo.inertia:hover {
108
+ filter: drop-shadow(0 0 2em #646cffaa);
109
+ }
110
+ .logo.vue:hover {
111
+ filter: drop-shadow(0 0 2em #61dafbaa);
112
+ }
113
+ .logo.rails:hover {
114
+ filter: drop-shadow(0 0 2em rgb(211 0 1 / 0.6));
115
+ }
116
+
117
+ @media (prefers-color-scheme: dark) {
118
+ .logo {
119
+ filter: drop-shadow(0 20px 13px rgb(255 255 255 / 0.03)) drop-shadow(0 8px 5px rgb(255 255 255 / 0.08));
120
+ }
121
+ }
122
+
123
+ .card {
124
+ padding: 2em;
125
+ font-size: 0.7em;
126
+ color: #948e90;
127
+ }
128
+
129
+ .footer {
130
+ bottom: 0;
131
+ left: 0;
132
+ margin: 0 2rem 2rem 2rem;
133
+ position: absolute;
134
+ right: 0;
135
+ }
136
+
137
+ .footer ul {
138
+ list-style: none;
139
+ }
140
+
141
+ .footer ul li {
142
+ display: inline;
143
+ }
144
+
145
+ .footer ul ul li:after {
146
+ content: " | ";
147
+ font-weight: 300;
148
+ color: #948e90;
149
+ }
150
+
151
+ .footer ul ul li:last-child:after {
152
+ content: "";
153
+ }
117
154
  </style>
@@ -16,15 +16,18 @@ createInertiaApp({
16
16
  const pages = import.meta.glob('../pages/**/*.vue', {
17
17
  eager: true,
18
18
  })
19
- return pages[`../pages/${name}.vue`]
19
+ const page = pages[`../pages/${name}.vue`]
20
+ if (!page) {
21
+ console.error(`Missing Inertia page component: '${name}.vue'`)
22
+ }
20
23
 
21
24
  // To use a default layout, import the Layout component
22
25
  // and use the following lines.
23
26
  // see https://inertia-rails.dev/guide/pages#default-layouts
24
27
  //
25
- // const page = pages[`../pages/${name}.vue`]
26
28
  // page.default.layout = page.default.layout || Layout
27
- // return page
29
+
30
+ return page
28
31
  },
29
32
 
30
33
  setup({ el, App, props, plugin }) {
@@ -32,4 +35,28 @@ createInertiaApp({
32
35
  .use(plugin)
33
36
  .mount(el)
34
37
  },
38
+
39
+ defaults: {
40
+ form: {
41
+ forceIndicesArrayFormatInFormData: false,
42
+ },
43
+ future: {
44
+ useDataInertiaHeadAttribute: true,
45
+ useDialogForErrorModal: true,
46
+ preserveEqualProps: true,
47
+ },
48
+ },
49
+ }).catch((error) => {
50
+ // This ensures this entrypoint is only loaded on Inertia pages
51
+ // by checking for the presence of the root element (#app by default).
52
+ // Feel free to remove this `catch` if you don't need it.
53
+ if (document.getElementById("app")) {
54
+ throw error
55
+ } else {
56
+ console.error(
57
+ "Missing root element.\n\n" +
58
+ "If you see this error, it probably means you loaded Inertia.js on non-Inertia pages.\n" +
59
+ 'Consider moving <%= vite_javascript_tag "inertia" %> to the Inertia-specific layout instead.',
60
+ )
61
+ }
35
62
  })
@@ -16,15 +16,18 @@ createInertiaApp({
16
16
  const pages = import.meta.glob<DefineComponent>('../pages/**/*.vue', {
17
17
  eager: true,
18
18
  })
19
- return pages[`../pages/${name}.vue`]
19
+ const page = pages[`../pages/${name}.vue`]
20
+ if (!page) {
21
+ console.error(`Missing Inertia page component: '${name}.vue'`)
22
+ }
20
23
 
21
24
  // To use a default layout, import the Layout component
22
25
  // and use the following lines.
23
26
  // see https://inertia-rails.dev/guide/pages#default-layouts
24
27
  //
25
- // const page = pages[`../pages/${name}.vue`]
26
28
  // page.default.layout = page.default.layout || Layout
27
- // return page
29
+
30
+ return page
28
31
  },
29
32
 
30
33
  setup({ el, App, props, plugin }) {
@@ -32,4 +35,29 @@ createInertiaApp({
32
35
  .use(plugin)
33
36
  .mount(el)
34
37
  },
38
+
39
+ defaults: {
40
+ form: {
41
+ forceIndicesArrayFormatInFormData: false,
42
+ },
43
+ future: {
44
+ useDataInertiaHeadAttribute: true,
45
+ useDialogForErrorModal: true,
46
+ preserveEqualProps: true,
47
+ },
48
+ },
49
+ }).catch((error) => {
50
+ // This ensures this entrypoint is only loaded on Inertia pages
51
+ // by checking for the presence of the root element (#app by default).
52
+ // Feel free to remove this `catch` if you don't need it.
53
+ if (document.getElementById("app")) {
54
+ throw error
55
+ } else {
56
+ console.error(
57
+ "Missing root element.\n\n" +
58
+ "If you see this error, it probably means you loaded Inertia.js on non-Inertia pages.\n" +
59
+ 'Consider moving <%= vite_javascript_tag "inertia" %> to the Inertia-specific layout instead.',
60
+ )
61
+ }
35
62
  })
63
+
@@ -18,7 +18,15 @@
18
18
  "strict": true,
19
19
  "noUnusedLocals": true,
20
20
  "noUnusedParameters": true,
21
- "noFallthroughCasesInSwitch": true
21
+ "noFallthroughCasesInSwitch": true,
22
+
23
+ /* Aliases */
24
+ "baseUrl": ".",
25
+ "paths": {
26
+ "@/*": ["<%= js_destination_path %>/*"],
27
+ "~/*": ["<%= js_destination_path %>/*"]
28
+ }
22
29
  },
30
+
23
31
  "include": ["<%= js_destination_path %>/**/*.ts", "<%= js_destination_path %>/**/*.tsx", "<%= js_destination_path %>/**/*.vue"]
24
32
  }
@@ -0,0 +1,8 @@
1
+ import type { SharedProps } from '@/types'
2
+
3
+ declare module '@inertiajs/core' {
4
+ export interface InertiaConfig {
5
+ sharedPageProps: SharedProps
6
+ errorValueType: string[]
7
+ }
8
+ }
@@ -0,0 +1,8 @@
1
+ export type Flash = {
2
+ notice?: string
3
+ alert?: string
4
+ }
5
+
6
+ export type SharedProps = {
7
+ flash: Flash
8
+ }
@@ -55,6 +55,10 @@ module Inertia
55
55
  attribute = attributes.find { |attr| attr.name == name }
56
56
  attribute&.attachments?
57
57
  end
58
+
59
+ def parent_controller
60
+ defined?(InertiaController) ? 'InertiaController' : 'ApplicationController'
61
+ end
58
62
  end
59
63
  end
60
64
  end
@@ -1,17 +1,19 @@
1
1
  <% module_namespacing do -%>
2
- class <%= controller_class_name %>Controller < ApplicationController
2
+ class <%= controller_class_name %>Controller < <%= parent_controller %>
3
3
  before_action :set_<%= singular_table_name %>, only: %i[ show edit update destroy ]
4
4
 
5
5
  <% if regular_class_path.any? -%>
6
6
  wrap_parameters :<%= singular_table_name %>
7
7
 
8
8
  <% end -%>
9
+ <% if parent_controller != 'InertiaController' -%>
9
10
  inertia_share flash: -> { flash.to_hash }
10
11
 
12
+ <% end -%>
11
13
  # GET <%= route_url %>
12
14
  def index
13
15
  @<%= plural_table_name %> = <%= orm_class.all(class_name) %>
14
- render inertia: '<%= "#{inertia_base_path}/Index" %>', props: {
16
+ render inertia: {
15
17
  <%= plural_table_name %>: @<%= plural_table_name %>.map do |<%= singular_table_name %>|
16
18
  <%= "serialize_#{singular_table_name}" %>(<%= singular_table_name %>)
17
19
  end
@@ -20,7 +22,7 @@ class <%= controller_class_name %>Controller < ApplicationController
20
22
 
21
23
  # GET <%= route_url %>/1
22
24
  def show
23
- render inertia: '<%= "#{inertia_base_path}/Show" %>', props: {
25
+ render inertia: {
24
26
  <%= singular_table_name %>: <%= "serialize_#{singular_table_name}" %>(@<%= singular_table_name %>)
25
27
  }
26
28
  end
@@ -28,14 +30,14 @@ class <%= controller_class_name %>Controller < ApplicationController
28
30
  # GET <%= route_url %>/new
29
31
  def new
30
32
  @<%= singular_table_name %> = <%= orm_class.build(class_name) %>
31
- render inertia: '<%= "#{inertia_base_path}/New" %>', props: {
33
+ render inertia: {
32
34
  <%= singular_table_name %>: <%= "serialize_#{singular_table_name}" %>(@<%= singular_table_name %>)
33
35
  }
34
36
  end
35
37
 
36
38
  # GET <%= route_url %>/1/edit
37
39
  def edit
38
- render inertia: '<%= "#{inertia_base_path}/Edit" %>', props: {
40
+ render inertia: {
39
41
  <%= singular_table_name %>: <%= "serialize_#{singular_table_name}" %>(@<%= singular_table_name %>)
40
42
  }
41
43
  end
@@ -1,5 +1,5 @@
1
1
  import { Head, Link } from '@inertiajs/react'
2
- import Form from './Form'
2
+ import Form from './form'
3
3
 
4
4
  export default function Edit({ <%= singular_table_name %> }) {
5
5
  return (
@@ -10,16 +10,13 @@ export default function Edit({ <%= singular_table_name %> }) {
10
10
 
11
11
  <Form
12
12
  <%= singular_table_name %>={<%= singular_table_name %>}
13
- onSubmit={(form) => {
14
- form.transform((data) => ({ <%= singular_table_name %>: data }))
13
+ action={`<%= js_resource_path %>`}
15
14
  <% if attributes.any?(&:attachments?) -%>
16
- form.post(`<%= js_resource_path %>`, {
17
- headers: { 'X-HTTP-METHOD-OVERRIDE': 'put' },
18
- })
15
+ method="post"
16
+ headers={{ 'X-HTTP-METHOD-OVERRIDE': 'patch' }}
19
17
  <% else -%>
20
- form.patch(`<%= js_resource_path %>`)
18
+ method="patch"
21
19
  <% end -%>
22
- }}
23
20
  submitText="Update <%= human_name %>"
24
21
  />
25
22
 
@@ -1,6 +1,7 @@
1
1
  import { Head, Link } from '@inertiajs/react'
2
- import Form from './Form'
3
- import { <%= inertia_model_type %> } from './types'
2
+
3
+ import Form from './form'
4
+ import type { <%= inertia_model_type %> } from './types'
4
5
 
5
6
  interface EditProps {
6
7
  <%= singular_table_name %>: <%= inertia_model_type %>
@@ -15,16 +16,13 @@ export default function Edit({ <%= singular_table_name %> }: EditProps) {
15
16
 
16
17
  <Form
17
18
  <%= singular_table_name %>={<%= singular_table_name %>}
18
- onSubmit={(form) => {
19
- form.transform((data) => ({ <%= singular_table_name %>: data }))
19
+ action={`<%= js_resource_path %>`}
20
20
  <% if attributes.any?(&:attachments?) -%>
21
- form.post(`<%= js_resource_path %>`, {
22
- headers: { 'X-HTTP-METHOD-OVERRIDE': 'put' },
23
- })
21
+ method="post"
22
+ headers={{ 'X-HTTP-METHOD-OVERRIDE': 'patch' }}
24
23
  <% else -%>
25
- form.patch(`<%= js_resource_path %>`)
24
+ method="patch"
26
25
  <% end -%>
27
- }}
28
26
  submitText="Update <%= human_name %>"
29
27
  />
30
28
 
@@ -0,0 +1,94 @@
1
+ import { Form as InertiaForm } from '@inertiajs/react'
2
+
3
+ export default function Form({ <%= singular_table_name %>, submitText, ...formProps }) {
4
+ return (
5
+ <InertiaForm
6
+ transform={data => ({ <%= singular_table_name %>: data })}
7
+ {...formProps}
8
+ >
9
+ {({ errors, processing }) => (
10
+ <>
11
+ <% attributes.each do |attribute| -%>
12
+ <% if attribute.password_digest? -%>
13
+ <div>
14
+ <label style={{ display: 'block' }} htmlFor="password">
15
+ Password
16
+ </label>
17
+ <input
18
+ type="password"
19
+ name="password"
20
+ id="password"
21
+ />
22
+ {errors.password && (
23
+ <div style={{ color: 'red' }}>{errors.password.join(', ')}</div>
24
+ )}
25
+ </div>
26
+
27
+ <div>
28
+ <label style={{ display: 'block' }} htmlFor="password_confirmation">
29
+ Password confirmation
30
+ </label>
31
+ <input
32
+ type="password"
33
+ name="password_confirmation"
34
+ id="password_confirmation"
35
+ />
36
+ {errors.password_confirmation && (
37
+ <div style={{ color: 'red' }}>{errors.password_confirmation.join(', ')}</div>
38
+ )}
39
+ </div>
40
+ <% else -%>
41
+ <div>
42
+ <label style={{ display: 'block' }} htmlFor="<%= attribute.singular_name %>">
43
+ <%= attribute.human_name %>
44
+ </label>
45
+ <% if input_type(attribute) == "text_area" -%>
46
+ <textarea
47
+ name="<%= attribute.singular_name %>"
48
+ id="<%= attribute.singular_name %>"
49
+ defaultValue={<%= singular_table_name %>.<%= attribute.column_name %>}
50
+ />
51
+ <% elsif attribute.attachment? -%>
52
+ <input
53
+ type="file"
54
+ name="<%= attribute.singular_name %>"
55
+ id="<%= attribute.singular_name %>"
56
+ />
57
+ <% elsif attribute.attachments? -%>
58
+ <input
59
+ type="file"
60
+ multiple
61
+ name="<%= attribute.singular_name %>[]"
62
+ id="<%= attribute.singular_name %>"
63
+ />
64
+ <% elsif input_type(attribute) == "checkbox" -%>
65
+ <input
66
+ type="<%= input_type(attribute) %>"
67
+ name="<%= attribute.singular_name %>"
68
+ id="<%= attribute.singular_name %>"
69
+ defaultChecked={<%= singular_table_name %>.<%= attribute.column_name %>}
70
+ />
71
+ <% else -%>
72
+ <input
73
+ type="<%= input_type(attribute) %>"
74
+ name="<%= attribute.singular_name %>"
75
+ id="<%= attribute.singular_name %>"
76
+ defaultValue={<%= singular_table_name %>.<%= attribute.column_name %>}
77
+ />
78
+ <% end -%>
79
+ {errors.<%= attribute.column_name %> && (
80
+ <div style={{ color: 'red' }}>{errors.<%= attribute.column_name %>.join(', ')}</div>
81
+ )}
82
+ </div>
83
+ <% end -%>
84
+ <% end -%>
85
+ <div>
86
+ <button type="submit" disabled={processing}>
87
+ {submitText}
88
+ </button>
89
+ </div>
90
+ </>
91
+ )}
92
+ </InertiaForm>
93
+ )
94
+ }