inertia_rails 3.12.1 → 3.13.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 (160) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/lib/generators/inertia/controller/templates/controller.rb.tt +1 -1
  4. data/lib/generators/inertia/install/frameworks.yml +16 -36
  5. data/lib/generators/inertia/install/install_generator.rb +51 -8
  6. data/lib/generators/inertia/install/js_package_manager.rb +6 -6
  7. data/lib/generators/inertia/install/templates/controller.rb +2 -4
  8. data/lib/generators/inertia/install/templates/inertia_controller.rb +5 -0
  9. data/lib/generators/inertia/install/templates/react/InertiaExample.jsx +2 -2
  10. data/lib/generators/inertia/install/templates/react/InertiaExample.tsx +2 -2
  11. data/lib/generators/inertia/install/templates/react/inertia.jsx +65 -0
  12. data/lib/generators/inertia/install/templates/react/inertia.tsx +65 -0
  13. data/lib/generators/inertia/install/templates/react/tsconfig.app.json +7 -0
  14. data/lib/generators/inertia/install/templates/react/types/globals.d.ts +8 -0
  15. data/lib/generators/inertia/install/templates/react/types/index.ts +8 -0
  16. data/lib/generators/inertia/install/templates/svelte/InertiaExample.svelte +1 -1
  17. data/lib/generators/inertia/install/templates/svelte/InertiaExample.ts.svelte +1 -1
  18. data/lib/generators/inertia/install/templates/svelte/inertia.js +14 -3
  19. data/lib/generators/inertia/install/templates/svelte/{inertia.ts.tt → inertia.ts} +12 -2
  20. data/lib/generators/inertia/install/templates/svelte/tsconfig.json +8 -0
  21. data/lib/generators/inertia/install/templates/svelte/types/globals.d.ts +8 -0
  22. data/lib/generators/inertia/install/templates/svelte/types/index.ts +8 -0
  23. data/lib/generators/inertia/install/templates/tailwind/application.css +3 -3
  24. data/lib/generators/inertia/install/templates/vue/InertiaExample.ts.vue +1 -1
  25. data/lib/generators/inertia/install/templates/vue/InertiaExample.vue +1 -1
  26. data/lib/generators/inertia/install/templates/vue/inertia.js +30 -3
  27. data/lib/generators/inertia/install/templates/vue/inertia.ts +31 -3
  28. data/lib/generators/inertia/install/templates/vue/tsconfig.app.json +9 -1
  29. data/lib/generators/inertia/install/templates/vue/types/globals.d.ts +8 -0
  30. data/lib/generators/inertia/install/templates/vue/types/index.ts +8 -0
  31. data/lib/generators/inertia/scaffold_controller/scaffold_controller_generator.rb +4 -0
  32. data/lib/generators/inertia/scaffold_controller/templates/controller.rb.tt +7 -5
  33. data/lib/generators/inertia_templates/scaffold/templates/react/{Edit.jsx.tt → edit.jsx.tt} +5 -8
  34. data/lib/generators/inertia_templates/scaffold/templates/react/{Edit.tsx.tt → edit.tsx.tt} +7 -9
  35. data/lib/generators/inertia_templates/scaffold/templates/react/form.jsx.tt +94 -0
  36. data/lib/generators/inertia_templates/scaffold/templates/react/form.tsx.tt +109 -0
  37. data/lib/generators/inertia_templates/scaffold/templates/react/{Index.jsx.tt → index.jsx.tt} +1 -1
  38. data/lib/generators/inertia_templates/scaffold/templates/react/{Index.tsx.tt → index.tsx.tt} +1 -1
  39. data/lib/generators/inertia_templates/scaffold/templates/react/{New.jsx.tt → new.jsx.tt} +3 -5
  40. data/lib/generators/inertia_templates/scaffold/templates/react/{New.tsx.tt → new.tsx.tt} +5 -6
  41. data/lib/generators/inertia_templates/scaffold/templates/react/{Show.jsx.tt → show.jsx.tt} +1 -1
  42. data/lib/generators/inertia_templates/scaffold/templates/react/{Show.tsx.tt → show.tsx.tt} +1 -1
  43. data/lib/generators/inertia_templates/scaffold/templates/svelte/{Edit.svelte.tt → edit.svelte.tt} +9 -13
  44. data/lib/generators/inertia_templates/scaffold/templates/{svelte4/Edit.svelte.tt → svelte/edit.ts.svelte.tt} +11 -15
  45. data/lib/generators/inertia_templates/scaffold/templates/svelte/form.svelte.tt +96 -0
  46. data/lib/generators/inertia_templates/scaffold/templates/svelte/form.ts.svelte.tt +103 -0
  47. data/lib/generators/inertia_templates/scaffold/templates/svelte/{Index.svelte.tt → index.svelte.tt} +1 -1
  48. data/lib/generators/inertia_templates/scaffold/templates/svelte/{Index.ts.svelte.tt → index.ts.svelte.tt} +1 -1
  49. data/lib/generators/inertia_templates/scaffold/templates/svelte/{New.svelte.tt → new.svelte.tt} +4 -7
  50. data/lib/generators/inertia_templates/scaffold/templates/{svelte4/New.svelte.tt → svelte/new.ts.svelte.tt} +6 -9
  51. data/lib/generators/inertia_templates/scaffold/templates/svelte/{Show.svelte.tt → show.svelte.tt} +1 -1
  52. data/lib/generators/inertia_templates/scaffold/templates/svelte/{Show.ts.svelte.tt → show.ts.svelte.tt} +1 -1
  53. data/lib/generators/inertia_templates/scaffold/templates/vue/{Edit.ts.vue.tt → edit.ts.vue.tt} +11 -15
  54. data/lib/generators/inertia_templates/scaffold/templates/vue/{Edit.vue.tt → edit.vue.tt} +9 -13
  55. data/lib/generators/inertia_templates/scaffold/templates/vue/form.ts.vue.tt +102 -0
  56. data/lib/generators/inertia_templates/scaffold/templates/vue/form.vue.tt +98 -0
  57. data/lib/generators/inertia_templates/scaffold/templates/vue/{Index.ts.vue.tt → index.ts.vue.tt} +1 -1
  58. data/lib/generators/inertia_templates/scaffold/templates/vue/{Index.vue.tt → index.vue.tt} +1 -1
  59. data/lib/generators/inertia_templates/scaffold/templates/vue/{New.ts.vue.tt → new.ts.vue.tt} +6 -9
  60. data/lib/generators/inertia_templates/scaffold/templates/vue/{New.vue.tt → new.vue.tt} +4 -7
  61. data/lib/generators/inertia_templates/scaffold/templates/vue/{Show.ts.vue.tt → show.ts.vue.tt} +1 -1
  62. data/lib/generators/inertia_templates/scaffold/templates/vue/{Show.vue.tt → show.vue.tt} +1 -1
  63. data/lib/generators/inertia_tw_templates/scaffold/templates/react/{Edit.jsx.tt → edit.jsx.tt} +5 -8
  64. data/lib/generators/inertia_tw_templates/scaffold/templates/react/{Edit.tsx.tt → edit.tsx.tt} +6 -9
  65. data/lib/generators/inertia_tw_templates/scaffold/templates/react/form.jsx.tt +106 -0
  66. data/lib/generators/inertia_tw_templates/scaffold/templates/react/form.tsx.tt +122 -0
  67. data/lib/generators/inertia_tw_templates/scaffold/templates/react/{Index.jsx.tt → index.jsx.tt} +1 -1
  68. data/lib/generators/inertia_tw_templates/scaffold/templates/react/{Index.tsx.tt → index.tsx.tt} +1 -1
  69. data/lib/generators/inertia_tw_templates/scaffold/templates/react/{New.jsx.tt → new.jsx.tt} +3 -5
  70. data/lib/generators/inertia_tw_templates/scaffold/templates/react/{New.tsx.tt → new.tsx.tt} +4 -6
  71. data/lib/generators/inertia_tw_templates/scaffold/templates/react/{Show.jsx.tt → show.jsx.tt} +1 -1
  72. data/lib/generators/inertia_tw_templates/scaffold/templates/react/{Show.tsx.tt → show.tsx.tt} +1 -1
  73. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/{Edit.svelte.tt → edit.svelte.tt} +9 -13
  74. data/lib/generators/inertia_tw_templates/scaffold/templates/{svelte4/Edit.svelte.tt → svelte/edit.ts.svelte.tt} +11 -15
  75. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/form.svelte.tt +109 -0
  76. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/form.ts.svelte.tt +115 -0
  77. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/{Index.svelte.tt → index.svelte.tt} +1 -1
  78. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/{Index.ts.svelte.tt → index.ts.svelte.tt} +1 -1
  79. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/{New.svelte.tt → new.svelte.tt} +4 -6
  80. data/lib/generators/inertia_tw_templates/scaffold/templates/{svelte4/New.svelte.tt → svelte/new.ts.svelte.tt} +6 -9
  81. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/{Show.svelte.tt → show.svelte.tt} +1 -1
  82. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/{Show.ts.svelte.tt → show.ts.svelte.tt} +1 -1
  83. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/{Edit.ts.vue.tt → edit.ts.vue.tt} +10 -15
  84. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/{Edit.vue.tt → edit.vue.tt} +8 -13
  85. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/{Form.ts.vue.tt → form.ts.vue.tt} +19 -42
  86. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/{Form.vue.tt → form.vue.tt} +18 -38
  87. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/{Index.ts.vue.tt → index.ts.vue.tt} +1 -1
  88. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/{Index.vue.tt → index.vue.tt} +1 -1
  89. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/{New.ts.vue.tt → new.ts.vue.tt} +6 -9
  90. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/{New.vue.tt → new.vue.tt} +4 -7
  91. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/{Show.ts.vue.tt → show.ts.vue.tt} +1 -1
  92. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/{Show.vue.tt → show.vue.tt} +1 -1
  93. data/lib/inertia_rails/generators/controller_template_base.rb +1 -1
  94. data/lib/inertia_rails/generators/helper.rb +2 -3
  95. data/lib/inertia_rails/generators/scaffold_template_base.rb +3 -3
  96. data/lib/inertia_rails/version.rb +1 -1
  97. metadata +87 -116
  98. data/lib/generators/inertia/install/templates/react/inertia.js +0 -45
  99. data/lib/generators/inertia/install/templates/react/inertia.ts +0 -51
  100. data/lib/generators/inertia/install/templates/svelte4/InertiaExample.svelte +0 -116
  101. data/lib/generators/inertia/install/templates/svelte4/InertiaExample.ts.svelte +0 -116
  102. data/lib/generators/inertia/install/templates/svelte4/inertia.js +0 -43
  103. data/lib/generators/inertia/install/templates/svelte4/inertia.ts.tt +0 -44
  104. data/lib/generators/inertia/install/templates/svelte4/svelte.config.js +0 -7
  105. data/lib/generators/inertia/install/templates/svelte4/tsconfig.json +0 -21
  106. data/lib/generators/inertia/install/templates/svelte4/tsconfig.node.json +0 -12
  107. data/lib/generators/inertia/install/templates/svelte4/vite-env.d.ts +0 -2
  108. data/lib/generators/inertia_templates/controller/templates/svelte4/view.svelte.tt +0 -2
  109. data/lib/generators/inertia_templates/scaffold/templates/react/Form.jsx.tt +0 -111
  110. data/lib/generators/inertia_templates/scaffold/templates/react/Form.tsx.tt +0 -130
  111. data/lib/generators/inertia_templates/scaffold/templates/svelte/Edit.ts.svelte.tt +0 -37
  112. data/lib/generators/inertia_templates/scaffold/templates/svelte/Form.svelte.tt +0 -97
  113. data/lib/generators/inertia_templates/scaffold/templates/svelte/Form.ts.svelte.tt +0 -102
  114. data/lib/generators/inertia_templates/scaffold/templates/svelte/New.ts.svelte.tt +0 -30
  115. data/lib/generators/inertia_templates/scaffold/templates/svelte4/Edit.ts.svelte.tt +0 -38
  116. data/lib/generators/inertia_templates/scaffold/templates/svelte4/Form.svelte.tt +0 -96
  117. data/lib/generators/inertia_templates/scaffold/templates/svelte4/Form.ts.svelte.tt +0 -106
  118. data/lib/generators/inertia_templates/scaffold/templates/svelte4/Index.svelte.tt +0 -36
  119. data/lib/generators/inertia_templates/scaffold/templates/svelte4/Index.ts.svelte.tt +0 -37
  120. data/lib/generators/inertia_templates/scaffold/templates/svelte4/New.ts.svelte.tt +0 -31
  121. data/lib/generators/inertia_templates/scaffold/templates/svelte4/One.svelte.tt +0 -28
  122. data/lib/generators/inertia_templates/scaffold/templates/svelte4/One.ts.svelte.tt +0 -30
  123. data/lib/generators/inertia_templates/scaffold/templates/svelte4/Show.svelte.tt +0 -39
  124. data/lib/generators/inertia_templates/scaffold/templates/svelte4/Show.ts.svelte.tt +0 -40
  125. data/lib/generators/inertia_templates/scaffold/templates/svelte4/types.ts.tt +0 -19
  126. data/lib/generators/inertia_templates/scaffold/templates/vue/Form.ts.vue.tt +0 -101
  127. data/lib/generators/inertia_templates/scaffold/templates/vue/Form.vue.tt +0 -94
  128. data/lib/generators/inertia_tw_templates/controller/templates/svelte4/view.svelte.tt +0 -2
  129. data/lib/generators/inertia_tw_templates/scaffold/templates/react/Form.jsx.tt +0 -122
  130. data/lib/generators/inertia_tw_templates/scaffold/templates/react/Form.tsx.tt +0 -142
  131. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/Edit.ts.svelte.tt +0 -45
  132. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/Form.svelte.tt +0 -118
  133. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/Form.ts.svelte.tt +0 -123
  134. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/New.ts.svelte.tt +0 -33
  135. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/Edit.ts.svelte.tt +0 -46
  136. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/Form.svelte.tt +0 -120
  137. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/Form.ts.svelte.tt +0 -130
  138. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/Index.svelte.tt +0 -43
  139. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/Index.ts.svelte.tt +0 -44
  140. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/New.ts.svelte.tt +0 -34
  141. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/One.svelte.tt +0 -28
  142. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/One.ts.svelte.tt +0 -30
  143. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/Show.svelte.tt +0 -51
  144. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/Show.ts.svelte.tt +0 -52
  145. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/types.ts.tt +0 -19
  146. /data/lib/generators/inertia/install/templates/react/{vite-env.d.ts → types/vite-env.d.ts} +0 -0
  147. /data/lib/generators/inertia/install/templates/svelte/{vite-env.d.ts → types/vite-env.d.ts} +0 -0
  148. /data/lib/generators/inertia/install/templates/vue/{vite-env.d.ts → types/vite-env.d.ts} +0 -0
  149. /data/lib/generators/inertia_templates/scaffold/templates/react/{One.jsx.tt → one.jsx.tt} +0 -0
  150. /data/lib/generators/inertia_templates/scaffold/templates/react/{One.tsx.tt → one.tsx.tt} +0 -0
  151. /data/lib/generators/inertia_templates/scaffold/templates/svelte/{One.svelte.tt → one.svelte.tt} +0 -0
  152. /data/lib/generators/inertia_templates/scaffold/templates/svelte/{One.ts.svelte.tt → one.ts.svelte.tt} +0 -0
  153. /data/lib/generators/inertia_templates/scaffold/templates/vue/{One.ts.vue.tt → one.ts.vue.tt} +0 -0
  154. /data/lib/generators/inertia_templates/scaffold/templates/vue/{One.vue.tt → one.vue.tt} +0 -0
  155. /data/lib/generators/inertia_tw_templates/scaffold/templates/react/{One.jsx.tt → one.jsx.tt} +0 -0
  156. /data/lib/generators/inertia_tw_templates/scaffold/templates/react/{One.tsx.tt → one.tsx.tt} +0 -0
  157. /data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/{One.svelte.tt → one.svelte.tt} +0 -0
  158. /data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/{One.ts.svelte.tt → one.ts.svelte.tt} +0 -0
  159. /data/lib/generators/inertia_tw_templates/scaffold/templates/vue/{One.ts.vue.tt → one.ts.vue.tt} +0 -0
  160. /data/lib/generators/inertia_tw_templates/scaffold/templates/vue/{One.vue.tt → one.vue.tt} +0 -0
@@ -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 (
@@ -11,16 +11,13 @@ export default function Edit({ <%= singular_table_name %> }) {
11
11
 
12
12
  <Form
13
13
  <%= singular_table_name %>={<%= singular_table_name %>}
14
- onSubmit={(form) => {
15
- form.transform((data) => ({ <%= singular_table_name %>: data }))
14
+ action={`<%= js_resource_path %>`}
16
15
  <% if attributes.any?(&:attachments?) -%>
17
- form.post(`<%= js_resource_path %>`, {
18
- headers: { 'X-HTTP-METHOD-OVERRIDE': 'put' },
19
- })
16
+ method="post"
17
+ headers={{ 'X-HTTP-METHOD-OVERRIDE': 'patch' }}
20
18
  <% else -%>
21
- form.patch(`<%= js_resource_path %>`)
19
+ method="patch"
22
20
  <% end -%>
23
- }}
24
21
  submitText="Update <%= human_name %>"
25
22
  />
26
23
 
@@ -1,6 +1,6 @@
1
1
  import { Head, Link } from '@inertiajs/react'
2
- import Form from './Form'
3
- import { <%= inertia_model_type %> } from './types'
2
+ import Form from './form'
3
+ import type { <%= inertia_model_type %> } from './types'
4
4
 
5
5
  interface EditProps {
6
6
  <%= singular_table_name %>: <%= inertia_model_type %>
@@ -16,16 +16,13 @@ export default function Edit({ <%= singular_table_name %> }: EditProps) {
16
16
 
17
17
  <Form
18
18
  <%= singular_table_name %>={<%= singular_table_name %>}
19
- onSubmit={(form) => {
20
- form.transform((data) => ({ <%= singular_table_name %>: data }))
19
+ action={`<%= js_resource_path %>`}
21
20
  <% if attributes.any?(&:attachments?) -%>
22
- form.post(`<%= js_resource_path %>`, {
23
- headers: { 'X-HTTP-METHOD-OVERRIDE': 'put' },
24
- })
21
+ method="post"
22
+ headers={{ 'X-HTTP-METHOD-OVERRIDE': 'patch' }}
25
23
  <% else -%>
26
- form.patch(`<%= js_resource_path %>`)
24
+ method="patch"
27
25
  <% end -%>
28
- }}
29
26
  submitText="Update <%= human_name %>"
30
27
  />
31
28
 
@@ -0,0 +1,106 @@
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
+ className="contents"
8
+ {...formProps}
9
+ >
10
+ {({ errors, processing }) => (
11
+ <>
12
+ <% attributes.each do |attribute| -%>
13
+ <div className="my-5">
14
+ <% if attribute.password_digest? -%>
15
+ <label htmlFor="password">Password</label>
16
+ <input
17
+ type="password"
18
+ name="password"
19
+ id="password"
20
+ className="block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full"
21
+ />
22
+ {errors.password && (
23
+ <div className="text-red-500 px-3 py-2 font-medium">
24
+ {errors.password.join(', ')}
25
+ </div>
26
+ )}
27
+ </div>
28
+
29
+ <div className="my-5">
30
+ <label htmlFor="password_confirmation">Password confirmation</label>
31
+ <input
32
+ type="password"
33
+ name="password_confirmation"
34
+ id="password_confirmation"
35
+ className="block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full"
36
+ />
37
+ {errors.password_confirmation && (
38
+ <div className="text-red-500 px-3 py-2 font-medium">
39
+ {errors.password_confirmation.join(', ')}
40
+ </div>
41
+ )}
42
+ <% else -%>
43
+ <label htmlFor="<%= attribute.singular_name %>"><%= attribute.human_name %></label>
44
+ <% if input_type(attribute) == "text_area" -%>
45
+ <textarea
46
+ name="<%= attribute.singular_name %>"
47
+ id="<%= attribute.singular_name %>"
48
+ defaultValue={<%= singular_table_name %>.<%= attribute.column_name %>}
49
+ rows="4"
50
+ className="block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full"
51
+ />
52
+ <% elsif attribute.attachment? -%>
53
+ <input
54
+ type="file"
55
+ name="<%= attribute.singular_name %>"
56
+ id="<%= attribute.singular_name %>"
57
+ className="block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full"
58
+ />
59
+ <% elsif attribute.attachments? -%>
60
+ <input
61
+ type="file"
62
+ multiple
63
+ name="<%= attribute.singular_name %>[]"
64
+ id="<%= attribute.singular_name %>"
65
+ className="block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full"
66
+ />
67
+ <% elsif input_type(attribute) == "checkbox" -%>
68
+ <input
69
+ type="<%= input_type(attribute) %>"
70
+ name="<%= attribute.singular_name %>"
71
+ id="<%= attribute.singular_name %>"
72
+ defaultChecked={<%= singular_table_name %>.<%= attribute.column_name %>}
73
+ className="block mt-2 h-5 w-5"
74
+ />
75
+ <% else -%>
76
+ <input
77
+ type="<%= input_type(attribute) %>"
78
+ name="<%= attribute.singular_name %>"
79
+ id="<%= attribute.singular_name %>"
80
+ defaultValue={<%= singular_table_name %>.<%= attribute.column_name %>}
81
+ className="block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full"
82
+ />
83
+ <% end -%>
84
+ {errors.<%= attribute.column_name %> && (
85
+ <div className="text-red-500 px-3 py-2 font-medium">
86
+ {errors.<%= attribute.column_name %>.join(', ')}
87
+ </div>
88
+ )}
89
+ <% end -%>
90
+ </div>
91
+
92
+ <% end -%>
93
+ <div className="inline">
94
+ <button
95
+ type="submit"
96
+ disabled={processing}
97
+ className="rounded-lg py-3 px-5 bg-blue-600 text-white inline-block font-medium cursor-pointer"
98
+ >
99
+ {submitText}
100
+ </button>
101
+ </div>
102
+ </>
103
+ )}
104
+ </InertiaForm>
105
+ )
106
+ }
@@ -0,0 +1,122 @@
1
+ import { Form as InertiaForm } from '@inertiajs/react'
2
+ import { type ComponentProps } from 'react'
3
+
4
+ import { <%= inertia_model_type %> } from './types'
5
+
6
+ type FormProps = Omit<ComponentProps<typeof InertiaForm>, 'children'> & {
7
+ <%= singular_table_name %>: <%= inertia_model_type %>
8
+ submitText: string
9
+ }
10
+
11
+ export default function Form({ <%= singular_table_name %>, submitText, ...formProps }: FormProps) {
12
+ return (
13
+ <InertiaForm
14
+ transform={data => ({ <%= singular_table_name %>: data })}
15
+ className="contents"
16
+ {...formProps}
17
+ >
18
+ {({ errors, processing }) => (
19
+ <>
20
+ <% attributes.each do |attribute| -%>
21
+ <div className="my-5">
22
+ <% if attribute.password_digest? -%>
23
+ <label htmlFor="password">Password</label>
24
+ <input
25
+ type="password"
26
+ name="password"
27
+ id="password"
28
+ className="block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full"
29
+ />
30
+ {errors.password && (
31
+ <div className="text-red-500 px-3 py-2 font-medium">
32
+ {errors.password}
33
+ </div>
34
+ )}
35
+ </div>
36
+
37
+ <div className="my-5">
38
+ <label htmlFor="password_confirmation">Password confirmation</label>
39
+ <input
40
+ type="password"
41
+ name="password_confirmation"
42
+ id="password_confirmation"
43
+ className="block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full"
44
+ />
45
+ {errors.password_confirmation && (
46
+ <div className="text-red-500 px-3 py-2 font-medium">
47
+ {errors.password_confirmation}
48
+ </div>
49
+ )}
50
+ <% else -%>
51
+ <label htmlFor="<%= attribute.singular_name %>"><%= attribute.human_name %></label>
52
+ <% if input_type(attribute) == "text_area" -%>
53
+ <textarea
54
+ name="<%= attribute.singular_name %>"
55
+ id="<%= attribute.singular_name %>"
56
+ defaultValue={<%= singular_table_name %>.<%= attribute.column_name %>}
57
+ rows={4}
58
+ className="block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full"
59
+ />
60
+ <% elsif attribute.attachment? -%>
61
+ <input
62
+ type="file"
63
+ name="<%= attribute.singular_name %>"
64
+ id="<%= attribute.singular_name %>"
65
+ className="block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full"
66
+ />
67
+ <% elsif attribute.attachments? -%>
68
+ <input
69
+ type="file"
70
+ multiple
71
+ name="<%= attribute.singular_name %>[]"
72
+ id="<%= attribute.singular_name %>"
73
+ className="block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full"
74
+ />
75
+ <% elsif input_type(attribute) == "checkbox" -%>
76
+ <input
77
+ type="<%= input_type(attribute) %>"
78
+ name="<%= attribute.singular_name %>"
79
+ id="<%= attribute.singular_name %>"
80
+ defaultChecked={<%= singular_table_name %>.<%= attribute.column_name %>}
81
+ className="block mt-2 h-5 w-5"
82
+ />
83
+ <% elsif input_type(attribute) == "number" -%>
84
+ <input
85
+ type="<%= input_type(attribute) %>"
86
+ name="<%= attribute.singular_name %>"
87
+ id="<%= attribute.singular_name %>"
88
+ defaultValue={<%= singular_table_name %>.<%= attribute.column_name %>}
89
+ className="block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full"
90
+ />
91
+ <% else -%>
92
+ <input
93
+ type="<%= input_type(attribute) %>"
94
+ name="<%= attribute.singular_name %>"
95
+ id="<%= attribute.singular_name %>"
96
+ defaultValue={<%= singular_table_name %>.<%= attribute.column_name %>}
97
+ className="block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full"
98
+ />
99
+ <% end -%>
100
+ {errors.<%= attribute.column_name %> && (
101
+ <div className="text-red-500 px-3 py-2 font-medium">
102
+ {errors.<%= attribute.column_name %>}
103
+ </div>
104
+ )}
105
+ <% end -%>
106
+ </div>
107
+
108
+ <% end -%>
109
+ <div className="inline">
110
+ <button
111
+ type="submit"
112
+ disabled={processing}
113
+ className="rounded-lg py-3 px-5 bg-blue-600 text-white inline-block font-medium cursor-pointer"
114
+ >
115
+ {submitText}
116
+ </button>
117
+ </div>
118
+ </>
119
+ )}
120
+ </InertiaForm>
121
+ )
122
+ }
@@ -1,6 +1,6 @@
1
1
  import { Head, Link } from '@inertiajs/react'
2
2
  import { Fragment } from 'react'
3
- import <%= inertia_component_name %> from './<%= inertia_component_name %>'
3
+ import <%= inertia_component_name %> from './<%= singular_name %>'
4
4
 
5
5
  export default function Index({ <%= plural_table_name %>, flash }) {
6
6
  return (
@@ -1,6 +1,6 @@
1
1
  import { Head, Link } from '@inertiajs/react'
2
2
  import { Fragment } from 'react'
3
- import <%= inertia_component_name %> from './<%= inertia_component_name %>'
3
+ import <%= inertia_component_name %> from './<%= singular_name %>'
4
4
  import { <%= inertia_model_type %> } from './types'
5
5
 
6
6
  interface IndexProps {
@@ -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 New({ <%= singular_table_name %> }) {
5
5
  return (
@@ -11,10 +11,8 @@ export default function New({ <%= singular_table_name %> }) {
11
11
 
12
12
  <Form
13
13
  <%= singular_table_name %>={<%= singular_table_name %>}
14
- onSubmit={(form) => {
15
- form.transform((data) => ({ <%= singular_table_name %>: data }))
16
- form.post('<%= js_resources_path %>')
17
- }}
14
+ method="post"
15
+ action="<%= js_resources_path %>"
18
16
  submitText="Create <%= human_name %>"
19
17
  />
20
18
 
@@ -1,6 +1,6 @@
1
1
  import { Head, Link } from '@inertiajs/react'
2
- import Form from './Form'
3
- import { <%= inertia_model_type %> } from './types'
2
+ import Form from './form'
3
+ import type { <%= inertia_model_type %> } from './types'
4
4
 
5
5
  interface NewProps {
6
6
  <%= singular_table_name %>: <%= inertia_model_type %>
@@ -16,10 +16,8 @@ export default function New({ <%= singular_table_name %> }: NewProps) {
16
16
 
17
17
  <Form
18
18
  <%= singular_table_name %>={<%= singular_table_name %>}
19
- onSubmit={(form) => {
20
- form.transform((data) => ({ <%= singular_table_name %>: data }))
21
- form.post('<%= js_resources_path %>')
22
- }}
19
+ method="post"
20
+ action="<%= js_resources_path %>"
23
21
  submitText="Create <%= human_name %>"
24
22
  />
25
23
 
@@ -1,5 +1,5 @@
1
1
  import { Head, Link } from '@inertiajs/react'
2
- import <%= inertia_component_name %> from './<%= inertia_component_name %>'
2
+ import <%= inertia_component_name %> from './<%= singular_name %>'
3
3
 
4
4
  export default function Show({ <%= singular_table_name %>, flash }) {
5
5
  return (
@@ -1,5 +1,5 @@
1
1
  import { Head, Link } from '@inertiajs/react'
2
- import <%= inertia_component_name %> from './<%= inertia_component_name %>'
2
+ import <%= inertia_component_name %> from './<%= singular_name %>'
3
3
  import { <%= inertia_model_type %> } from './types'
4
4
 
5
5
  interface ShowProps {
@@ -1,19 +1,9 @@
1
1
  <script>
2
2
  import { Link } from '@inertiajs/svelte'
3
- import Form from './Form.svelte'
4
3
 
5
- let { <%= singular_table_name %> } = $props()
4
+ import Form from './form.svelte'
6
5
 
7
- const handleSubmit = ({ form }) => {
8
- form.transform((data) => ({ <%= singular_table_name %>: data }))
9
- <% if attributes.any?(&:attachments?) -%>
10
- form.post(`<%= js_resource_path %>`, {
11
- headers: { 'X-HTTP-METHOD-OVERRIDE': 'put' },
12
- })
13
- <% else -%>
14
- form.patch(`<%= js_resource_path %>`)
15
- <% end -%>
16
- }
6
+ let { <%= singular_table_name %> } = $props()
17
7
  </script>
18
8
 
19
9
  <svelte:head>
@@ -26,7 +16,13 @@
26
16
  <Form
27
17
  {<%= singular_table_name %>}
28
18
  submitText="Update <%= human_name %>"
29
- onSubmit={handleSubmit}
19
+ action={`<%= js_resource_path %>`}
20
+ <% if attributes.any?(&:attachments?) -%>
21
+ method="post"
22
+ headers={{ 'X-HTTP-METHOD-OVERRIDE': 'patch' }}
23
+ <% else -%>
24
+ method="patch"
25
+ <% end -%>
30
26
  />
31
27
 
32
28
  <Link
@@ -1,20 +1,10 @@
1
- <script>
1
+ <script lang="ts">
2
2
  import { Link } from '@inertiajs/svelte'
3
- import Form from './Form.svelte'
4
3
 
5
- export let <%= singular_table_name %>
4
+ import type { <%= inertia_model_type %> } from './types'
5
+ import Form from './form.svelte'
6
6
 
7
- const handleSubmit = (e) => {
8
- const { form } = e.detail
9
- form.transform((data) => ({ <%= singular_table_name %>: data }))
10
- <% if attributes.any?(&:attachments?) -%>
11
- form.post(`<%= js_resource_path %>`, {
12
- headers: { 'X-HTTP-METHOD-OVERRIDE': 'put' },
13
- })
14
- <% else -%>
15
- form.patch(`<%= js_resource_path %>`)
16
- <% end -%>
17
- }
7
+ let { <%= singular_table_name %> } = $props<{ <%= singular_table_name %>: <%= inertia_model_type %> }>()
18
8
  </script>
19
9
 
20
10
  <svelte:head>
@@ -27,7 +17,13 @@
27
17
  <Form
28
18
  {<%= singular_table_name %>}
29
19
  submitText="Update <%= human_name %>"
30
- on:submit={handleSubmit}
20
+ action={`<%= js_resource_path %>`}
21
+ <% if attributes.any?(&:attachments?) -%>
22
+ method="post"
23
+ headers={{ 'X-HTTP-METHOD-OVERRIDE': 'patch' }}
24
+ <% else -%>
25
+ method="patch"
26
+ <% end -%>
31
27
  />
32
28
 
33
29
  <Link
@@ -0,0 +1,109 @@
1
+ <script>
2
+ import { Form } from '@inertiajs/svelte'
3
+
4
+ let { <%= singular_table_name %>, submitText, ...restProps } = $props()
5
+ </script>
6
+
7
+ <Form
8
+ class="contents"
9
+ transform={(data) => ({ <%= singular_table_name %>: data })}
10
+ {...restProps}
11
+ >
12
+ {#snippet children({
13
+ errors,
14
+ processing,
15
+ })}
16
+ <% attributes.each do |attribute| -%>
17
+ <% if attribute.password_digest? -%>
18
+ <div class="my-5">
19
+ <label for="password">Password</label>
20
+ <input
21
+ type="password"
22
+ name="password"
23
+ id="password"
24
+ class="block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full"
25
+ />
26
+ {#if errors.password}
27
+ <div class="text-red-500 px-3 py-2 font-medium">
28
+ {errors.password.join(', ')}
29
+ </div>
30
+ {/if}
31
+ </div>
32
+
33
+ <div class="my-5">
34
+ <label for="password_confirmation">Password confirmation</label>
35
+ <input
36
+ type="password"
37
+ name="password_confirmation"
38
+ id="password_confirmation"
39
+ class="block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full"
40
+ />
41
+ {#if errors.password_confirmation}
42
+ <div class="text-red-500 px-3 py-2 font-medium">
43
+ {errors.password_confirmation.join(', ')}
44
+ </div>
45
+ {/if}
46
+ </div>
47
+ <% else -%>
48
+ <div class="my-5">
49
+ <label for="<%= attribute.singular_name %>"><%= attribute.human_name %></label>
50
+ <% if input_type(attribute) == "text_area" -%>
51
+ <textarea
52
+ name="<%= attribute.singular_name %>"
53
+ id="<%= attribute.singular_name %>"
54
+ defaultValue={<%= singular_table_name %>.<%= attribute.column_name %> ?? ''}
55
+ rows="4"
56
+ class="block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full"
57
+ ></textarea>
58
+ <% elsif attribute.attachment? -%>
59
+ <input
60
+ type="file"
61
+ name="<%= attribute.singular_name %>"
62
+ id="<%= attribute.singular_name %>"
63
+ class="block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full"
64
+ />
65
+ <% elsif attribute.attachments? -%>
66
+ <input
67
+ type="file"
68
+ multiple
69
+ name="<%= attribute.singular_name %>[]"
70
+ id="<%= attribute.singular_name %>"
71
+ class="block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full"
72
+ />
73
+ <% elsif input_type(attribute) == "checkbox" -%>
74
+ <input
75
+ type="<%= input_type(attribute) %>"
76
+ name="<%= attribute.singular_name %>"
77
+ id="<%= attribute.singular_name %>"
78
+ defaultChecked={<%= singular_table_name %>.<%= attribute.column_name %>}
79
+ class="block mt-2 h-5 w-5"
80
+ />
81
+ <% else -%>
82
+ <input
83
+ type="<%= input_type(attribute) %>"
84
+ name="<%= attribute.singular_name %>"
85
+ id="<%= attribute.singular_name %>"
86
+ defaultValue={<%= singular_table_name %>.<%= attribute.column_name %> ?? ''}
87
+ class="block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full"
88
+ />
89
+ <% end -%>
90
+ {#if errors.<%= attribute.column_name %>}
91
+ <div class="text-red-500 px-3 py-2 font-medium">
92
+ {errors.<%= attribute.column_name %>.join(', ')}
93
+ </div>
94
+ {/if}
95
+ </div>
96
+ <% end -%>
97
+
98
+ <% end -%>
99
+ <div class="inline">
100
+ <button
101
+ type="submit"
102
+ disabled={processing}
103
+ class="rounded-lg py-3 px-5 bg-blue-600 text-white inline-block font-medium cursor-pointer"
104
+ >
105
+ {submitText}
106
+ </button>
107
+ </div>
108
+ {/snippet}
109
+ </Form>
@@ -0,0 +1,115 @@
1
+ <script lang="ts">
2
+ import { type FormComponentSlotProps } from "@inertiajs/core"
3
+ import { Form } from '@inertiajs/svelte'
4
+ import type { ComponentProps } from 'svelte'
5
+
6
+ import type { <%= inertia_model_type %> } from './types'
7
+
8
+ let { <%= singular_table_name %>, submitText, ...restProps } = $props<{
9
+ <%= singular_table_name %>: <%= inertia_model_type %>
10
+ submitText: string
11
+ } & ComponentProps<Form>>()
12
+ </script>
13
+
14
+ <Form
15
+ transform={(data) => ({ <%= singular_table_name %>: data })}
16
+ {...restProps}
17
+ >
18
+ {#snippet children({
19
+ errors,
20
+ processing,
21
+ }: FormComponentSlotProps)}
22
+ <% attributes.each do |attribute| -%>
23
+ <% if attribute.password_digest? -%>
24
+ <div class="my-5">
25
+ <label for="password">Password</label>
26
+ <input
27
+ type="password"
28
+ name="password"
29
+ id="password"
30
+ class="block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full"
31
+ />
32
+ {#if errors.password}
33
+ <div class="text-red-500 px-3 py-2 font-medium">
34
+ {errors.password}
35
+ </div>
36
+ {/if}
37
+ </div>
38
+
39
+ <div class="my-5">
40
+ <label for="password_confirmation">Password confirmation</label>
41
+ <input
42
+ type="password"
43
+ name="password_confirmation"
44
+ id="password_confirmation"
45
+ class="block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full"
46
+ />
47
+ {#if errors.password_confirmation}
48
+ <div class="text-red-500 px-3 py-2 font-medium">
49
+ {errors.password_confirmation}
50
+ </div>
51
+ {/if}
52
+ </div>
53
+ <% else -%>
54
+ <div class="my-5">
55
+ <label for="<%= attribute.singular_name %>"><%= attribute.human_name %></label>
56
+ <% if input_type(attribute) == "text_area" -%>
57
+ <textarea
58
+ name="<%= attribute.singular_name %>"
59
+ id="<%= attribute.singular_name %>"
60
+ defaultValue={<%= singular_table_name %>.<%= attribute.column_name %> ?? ''}
61
+ rows="4"
62
+ class="block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full"
63
+ ></textarea>
64
+ <% elsif attribute.attachment? -%>
65
+ <input
66
+ type="file"
67
+ name="<%= attribute.singular_name %>"
68
+ id="<%= attribute.singular_name %>"
69
+ class="block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full"
70
+ />
71
+ <% elsif attribute.attachments? -%>
72
+ <input
73
+ type="file"
74
+ multiple
75
+ name="<%= attribute.singular_name %>[]"
76
+ id="<%= attribute.singular_name %>"
77
+ class="block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full"
78
+ />
79
+ <% elsif input_type(attribute) == "checkbox" -%>
80
+ <input
81
+ type="<%= input_type(attribute) %>"
82
+ name="<%= attribute.singular_name %>"
83
+ id="<%= attribute.singular_name %>"
84
+ defaultChecked={<%= singular_table_name %>.<%= attribute.column_name %>}
85
+ class="block mt-2 h-5 w-5"
86
+ />
87
+ <% else -%>
88
+ <input
89
+ type="<%= input_type(attribute) %>"
90
+ name="<%= attribute.singular_name %>"
91
+ id="<%= attribute.singular_name %>"
92
+ defaultValue={<%= singular_table_name %>.<%= attribute.column_name %> ?? ''}
93
+ class="block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full"
94
+ />
95
+ <% end -%>
96
+ {#if errors.<%= attribute.column_name %>}
97
+ <div class="text-red-500 px-3 py-2 font-medium">
98
+ {errors.<%= attribute.column_name %>}
99
+ </div>
100
+ {/if}
101
+ </div>
102
+ <% end -%>
103
+
104
+ <% end -%>
105
+ <div class="inline">
106
+ <button
107
+ type="submit"
108
+ disabled={processing}
109
+ class="rounded-lg py-3 px-5 bg-blue-600 text-white inline-block font-medium cursor-pointer"
110
+ >
111
+ {submitText}
112
+ </button>
113
+ </div>
114
+ {/snippet}
115
+ </Form>