infold 0.1.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 (356) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +33 -0
  4. data/Rakefile +8 -0
  5. data/app/assets/builds/infold.css +17147 -0
  6. data/app/assets/builds/infold.css.map +7 -0
  7. data/app/assets/builds/infold.js +17202 -0
  8. data/app/assets/builds/infold.js.map +7 -0
  9. data/app/assets/config/infold_manifest.js +0 -0
  10. data/app/assets/stylesheets/infold.custom.css +76 -0
  11. data/app/assets/stylesheets/infold.custom.css.map +1 -0
  12. data/app/components/infold/input_fieldset_component.html.haml +14 -0
  13. data/app/components/infold/input_fieldset_component.rb +22 -0
  14. data/app/components/infold/radio_fieldset_component.html.haml +11 -0
  15. data/app/components/infold/radio_fieldset_component.rb +14 -0
  16. data/app/components/infold/select_fieldset_component.html.haml +7 -0
  17. data/app/components/infold/select_fieldset_component.rb +15 -0
  18. data/app/controllers/infold/app_view_forms_controller.rb +64 -0
  19. data/app/controllers/infold/app_view_shows_controller.rb +60 -0
  20. data/app/controllers/infold/application_controller.rb +17 -0
  21. data/app/controllers/infold/apps_controller.rb +68 -0
  22. data/app/controllers/infold/attachment_fields_controller.rb +59 -0
  23. data/app/controllers/infold/builds_controller.rb +21 -0
  24. data/app/controllers/infold/columns_controller.rb +89 -0
  25. data/app/controllers/infold/csv_columns_controller.rb +43 -0
  26. data/app/controllers/infold/form_associations_controller.rb +57 -0
  27. data/app/controllers/infold/menu_directories_controller.rb +19 -0
  28. data/app/controllers/infold/menus_controller.rb +35 -0
  29. data/app/controllers/infold/models_controller.rb +28 -0
  30. data/app/controllers/infold/pages_controller.rb +8 -0
  31. data/app/controllers/infold/search_conditions_controller.rb +63 -0
  32. data/app/controllers/infold/search_result_fields_controller.rb +62 -0
  33. data/app/controllers/infold/show_associations_controller.rb +54 -0
  34. data/app/controllers/infold/sync_dbs_controller.rb +13 -0
  35. data/app/decorators/infold/app_view_form_decorator.rb +56 -0
  36. data/app/decorators/infold/app_view_index_decorator.rb +53 -0
  37. data/app/decorators/infold/app_view_modal_decorator.rb +13 -0
  38. data/app/decorators/infold/app_view_show_decorator.rb +26 -0
  39. data/app/decorators/infold/attachment_field_decorator.rb +40 -0
  40. data/app/decorators/infold/build_decorator.rb +15 -0
  41. data/app/decorators/infold/column_display_decorator.rb +59 -0
  42. data/app/decorators/infold/csv_column_decorator.rb +5 -0
  43. data/app/decorators/infold/form_association_column_decorator.rb +5 -0
  44. data/app/decorators/infold/form_column_decorator.rb +57 -0
  45. data/app/decorators/infold/model_association_decorator.rb +39 -0
  46. data/app/decorators/infold/model_column_decorator.rb +201 -0
  47. data/app/decorators/infold/model_decorator.rb +27 -0
  48. data/app/decorators/infold/search_condition_decorator.rb +101 -0
  49. data/app/decorators/infold/search_result_column_decorator.rb +5 -0
  50. data/app/decorators/infold/show_association_column_decorator.rb +5 -0
  51. data/app/decorators/infold/show_association_decorator.rb +13 -0
  52. data/app/decorators/infold/show_field_decorator.rb +5 -0
  53. data/app/helpers/infold/application_helper.rb +29 -0
  54. data/app/javascript/admin.scss +5 -0
  55. data/app/javascript/controllers/application.js +9 -0
  56. data/app/javascript/controllers/attachment_field_controller.js +19 -0
  57. data/app/javascript/controllers/column_controller.js +20 -0
  58. data/app/javascript/controllers/flash_controller.js +10 -0
  59. data/app/javascript/controllers/index.js +32 -0
  60. data/app/javascript/controllers/menu_controller.js +26 -0
  61. data/app/javascript/controllers/menu_directory_controller.js +16 -0
  62. data/app/javascript/controllers/modal_controller.js +15 -0
  63. data/app/javascript/controllers/nested_form_controller.js +32 -0
  64. data/app/javascript/controllers/search_condition_controller.js +41 -0
  65. data/app/javascript/controllers/sortable_controller.js +19 -0
  66. data/app/javascript/infold.js +22 -0
  67. data/app/javascript/infold.scss +68 -0
  68. data/app/javascript/stylesheets/admin/common.scss +112 -0
  69. data/app/javascript/stylesheets/admin/form.scss +52 -0
  70. data/app/javascript/stylesheets/admin/index.scss +93 -0
  71. data/app/javascript/stylesheets/admin/modal.scss +37 -0
  72. data/app/javascript/stylesheets/admin/show.scss +16 -0
  73. data/app/jobs/infold/application_job.rb +4 -0
  74. data/app/mailers/infold/application_mailer.rb +6 -0
  75. data/app/models/concerns/infold/app_view_search_concern.rb +72 -0
  76. data/app/models/concerns/infold/form_column_concern.rb +63 -0
  77. data/app/models/infold/app.rb +41 -0
  78. data/app/models/infold/app_view.rb +27 -0
  79. data/app/models/infold/app_view_form.rb +43 -0
  80. data/app/models/infold/app_view_index.rb +36 -0
  81. data/app/models/infold/app_view_modal.rb +21 -0
  82. data/app/models/infold/app_view_show.rb +47 -0
  83. data/app/models/infold/application_record.rb +7 -0
  84. data/app/models/infold/attachment_field.rb +35 -0
  85. data/app/models/infold/build.rb +35 -0
  86. data/app/models/infold/csv_column.rb +9 -0
  87. data/app/models/infold/enum.rb +12 -0
  88. data/app/models/infold/form_association.rb +41 -0
  89. data/app/models/infold/form_association_attachment_field.rb +5 -0
  90. data/app/models/infold/form_association_column.rb +5 -0
  91. data/app/models/infold/form_association_field.rb +7 -0
  92. data/app/models/infold/form_attachment_field.rb +5 -0
  93. data/app/models/infold/form_column.rb +5 -0
  94. data/app/models/infold/form_field.rb +7 -0
  95. data/app/models/infold/menu_item.rb +45 -0
  96. data/app/models/infold/model.rb +40 -0
  97. data/app/models/infold/model_association.rb +51 -0
  98. data/app/models/infold/model_column.rb +127 -0
  99. data/app/models/infold/project.rb +29 -0
  100. data/app/models/infold/schema_rb.rb +177 -0
  101. data/app/models/infold/search_condition.rb +62 -0
  102. data/app/models/infold/search_result_attachment_field.rb +5 -0
  103. data/app/models/infold/search_result_column.rb +6 -0
  104. data/app/models/infold/search_result_field.rb +12 -0
  105. data/app/models/infold/show_association.rb +42 -0
  106. data/app/models/infold/show_association_attachment_field.rb +5 -0
  107. data/app/models/infold/show_association_column.rb +5 -0
  108. data/app/models/infold/show_association_field.rb +8 -0
  109. data/app/models/infold/show_attachment_field.rb +7 -0
  110. data/app/models/infold/show_column.rb +7 -0
  111. data/app/models/infold/show_field.rb +11 -0
  112. data/app/validators/infold/ruby_code_validator.rb +9 -0
  113. data/app/views/infold/app_view_forms/_bulk_form.html.haml +16 -0
  114. data/app/views/infold/app_view_forms/_tab.html.haml +12 -0
  115. data/app/views/infold/app_view_forms/show.html.haml +7 -0
  116. data/app/views/infold/app_view_shows/_bulk_form.html.haml +15 -0
  117. data/app/views/infold/app_view_shows/_tab.html.haml +12 -0
  118. data/app/views/infold/app_view_shows/show.html.haml +7 -0
  119. data/app/views/infold/app_view_shows/update.turbo_stream.haml +1 -0
  120. data/app/views/infold/application/_flash.html.haml +6 -0
  121. data/app/views/infold/apps/_form.html.haml +30 -0
  122. data/app/views/infold/apps/_page_header.html.haml +5 -0
  123. data/app/views/infold/apps/_tab.html.haml +13 -0
  124. data/app/views/infold/apps/create.turbo_stream.haml +3 -0
  125. data/app/views/infold/apps/edit.html.haml +6 -0
  126. data/app/views/infold/apps/new.html.haml +8 -0
  127. data/app/views/infold/apps/update.turbo_stream.haml +3 -0
  128. data/app/views/infold/associations/_form.html.haml +18 -0
  129. data/app/views/infold/associations/edit.html.haml +5 -0
  130. data/app/views/infold/attachment_fields/_form.html.haml +51 -0
  131. data/app/views/infold/attachment_fields/edit.html.haml +7 -0
  132. data/app/views/infold/attachment_fields/form.turbo_stream.haml +4 -0
  133. data/app/views/infold/attachment_fields/index.html.haml +28 -0
  134. data/app/views/infold/attachment_fields/new.html.haml +7 -0
  135. data/app/views/infold/builds/create.turbo_stream.haml +8 -0
  136. data/app/views/infold/builds/new.html.haml +23 -0
  137. data/app/views/infold/columns/_bulk_form.html.haml +18 -0
  138. data/app/views/infold/columns/_row.html.haml +26 -0
  139. data/app/views/infold/columns/_setting.html.haml +42 -0
  140. data/app/views/infold/columns/bulk.turbo_stream.haml +3 -0
  141. data/app/views/infold/columns/edit.html.haml +5 -0
  142. data/app/views/infold/columns/index.html.haml +9 -0
  143. data/app/views/infold/columns/update.turbo_stream.haml +8 -0
  144. data/app/views/infold/csv_columns/_bulk_form.html.haml +14 -0
  145. data/app/views/infold/csv_columns/_row.html.haml +10 -0
  146. data/app/views/infold/csv_columns/bulk.turbo_stream.haml +3 -0
  147. data/app/views/infold/csv_columns/index.html.haml +7 -0
  148. data/app/views/infold/enums/_form.html.haml +13 -0
  149. data/app/views/infold/enums/_index.html.haml +27 -0
  150. data/app/views/infold/enums/index.html.haml +5 -0
  151. data/app/views/infold/form_association_attachment_fields/_form.html.haml +13 -0
  152. data/app/views/infold/form_association_columns/_form.html.haml +20 -0
  153. data/app/views/infold/form_associations/_bulk_form.html.haml +16 -0
  154. data/app/views/infold/form_associations/_form.html.haml +19 -0
  155. data/app/views/infold/form_associations/show.html.haml +7 -0
  156. data/app/views/infold/form_associations/update.turbo_stream.haml +1 -0
  157. data/app/views/infold/form_attachment_fields/_form.html.haml +14 -0
  158. data/app/views/infold/form_columns/_form.html.haml +21 -0
  159. data/app/views/infold/menu_directories/_item.html.haml +20 -0
  160. data/app/views/infold/menu_directories/create.turbo_stream.haml +2 -0
  161. data/app/views/infold/menu_directories/destroy.turbo_stream.haml +5 -0
  162. data/app/views/infold/menus/_app.html.haml +10 -0
  163. data/app/views/infold/menus/_items.html.haml +7 -0
  164. data/app/views/infold/menus/edit.html.haml +23 -0
  165. data/app/views/infold/menus/update.turbo_stream.haml +3 -0
  166. data/app/views/infold/models/_form.html.haml +12 -0
  167. data/app/views/infold/models/_tab.html.haml +7 -0
  168. data/app/views/infold/models/edit.html.haml +9 -0
  169. data/app/views/infold/models/update.turbo_stream.haml +3 -0
  170. data/app/views/infold/search_conditions/_bulk_form.html.haml +24 -0
  171. data/app/views/infold/search_conditions/_column_options.html.haml +3 -0
  172. data/app/views/infold/search_conditions/_form_kind_options.html.haml +3 -0
  173. data/app/views/infold/search_conditions/_row.html.haml +31 -0
  174. data/app/views/infold/search_conditions/_sign_options.html.haml +3 -0
  175. data/app/views/infold/search_conditions/_tab.html.haml +12 -0
  176. data/app/views/infold/search_conditions/bulk.turbo_stream.haml +3 -0
  177. data/app/views/infold/search_conditions/index.html.haml +7 -0
  178. data/app/views/infold/search_conditions/refresh_columns.turbo_stream.haml +6 -0
  179. data/app/views/infold/search_conditions/refresh_form_kinds.turbo_stream.haml +4 -0
  180. data/app/views/infold/search_conditions/refresh_signs.turbo_stream.haml +2 -0
  181. data/app/views/infold/search_result_attachment_fields/_form.html.haml +12 -0
  182. data/app/views/infold/search_result_columns/_form.html.haml +12 -0
  183. data/app/views/infold/search_result_fields/_bulk_form.html.haml +23 -0
  184. data/app/views/infold/search_result_fields/_row.html.haml +12 -0
  185. data/app/views/infold/search_result_fields/bulk.turbo_stream.haml +3 -0
  186. data/app/views/infold/search_result_fields/index.html.haml +7 -0
  187. data/app/views/infold/show_association_attachment_fields/_form.html.haml +12 -0
  188. data/app/views/infold/show_association_columns/_form.html.haml +12 -0
  189. data/app/views/infold/show_associations/_bulk_form.html.haml +15 -0
  190. data/app/views/infold/show_associations/_form.html.haml +14 -0
  191. data/app/views/infold/show_associations/show.html.haml +7 -0
  192. data/app/views/infold/show_associations/update.turbo_stream.haml +1 -0
  193. data/app/views/infold/show_attachment_fields/_form.html.haml +12 -0
  194. data/app/views/infold/show_columns/_form.html.haml +12 -0
  195. data/app/views/infold/sync_dbs/create.turbo_stream.haml +1 -0
  196. data/app/views/infold/sync_dbs/show.html.haml +11 -0
  197. data/app/views/layouts/infold/application.html.haml +112 -0
  198. data/config/database.yml +11 -0
  199. data/config/initializers/infold_assets.rb +12 -0
  200. data/config/initializers/infold_locale.rb +1 -0
  201. data/config/locales/infold/ar/app/en.yml +6 -0
  202. data/config/locales/infold/ar/app/ja.yml +6 -0
  203. data/config/locales/infold/ar/app_view/en.yml +4 -0
  204. data/config/locales/infold/ar/app_view/ja.yml +4 -0
  205. data/config/locales/infold/ar/app_view_form/en.yml +10 -0
  206. data/config/locales/infold/ar/app_view_form/ja.yml +10 -0
  207. data/config/locales/infold/ar/app_view_index/en.yml +12 -0
  208. data/config/locales/infold/ar/app_view_index/ja.yml +12 -0
  209. data/config/locales/infold/ar/app_view_modal/en.yml +6 -0
  210. data/config/locales/infold/ar/app_view_modal/ja.yml +6 -0
  211. data/config/locales/infold/ar/app_view_show/en.yml +9 -0
  212. data/config/locales/infold/ar/app_view_show/ja.yml +9 -0
  213. data/config/locales/infold/ar/csv_column/en.yml +8 -0
  214. data/config/locales/infold/ar/csv_column/ja.yml +8 -0
  215. data/config/locales/infold/ar/form_association_column/ja.yml +15 -0
  216. data/config/locales/infold/ar/form_column/ja.yml +15 -0
  217. data/config/locales/infold/ar/menu_item/ja.yml +6 -0
  218. data/config/locales/infold/ar/model/ja.yml +11 -0
  219. data/config/locales/infold/ar/model_association/en.yml +6 -0
  220. data/config/locales/infold/ar/model_association/ja.yml +10 -0
  221. data/config/locales/infold/ar/model_column/en.yml +34 -0
  222. data/config/locales/infold/ar/model_column/ja.yml +34 -0
  223. data/config/locales/infold/ar/search_condition/en.yml +30 -0
  224. data/config/locales/infold/ar/search_condition/ja.yml +30 -0
  225. data/config/locales/infold/ar/search_result_field/en.yml +9 -0
  226. data/config/locales/infold/ar/search_result_field/ja.yml +9 -0
  227. data/config/locales/infold/en.yml +40 -0
  228. data/config/locales/infold/ja.yml +41 -0
  229. data/config/routes.rb +40 -0
  230. data/db/infold_test.sqlite3 +0 -0
  231. data/db/migrate/20220419050641_create_infold_projects.rb +9 -0
  232. data/db/migrate/20220419051049_create_infold_models.rb +15 -0
  233. data/db/migrate/20220419051601_create_infold_columns.rb +23 -0
  234. data/db/migrate/20220419051718_create_infold_attachment_fields.rb +15 -0
  235. data/db/migrate/20220419052017_create_infold_model_associations.rb +16 -0
  236. data/db/migrate/20220419052154_create_infold_apps.rb +10 -0
  237. data/db/migrate/20220419052320_create_infold_app_views.rb +14 -0
  238. data/db/migrate/20220419052450_create_infold_search_conditions.rb +14 -0
  239. data/db/migrate/20220419052707_create_infold_search_result_fields.rb +18 -0
  240. data/db/migrate/20220419053338_create_infold_show_fields.rb +18 -0
  241. data/db/migrate/20220419053425_create_infold_show_association_fields.rb +15 -0
  242. data/db/migrate/20220419060937_create_infold_form_fields.rb +19 -0
  243. data/db/migrate/20220419061148_create_infold_form_association_fields.rb +16 -0
  244. data/db/migrate/20220419061725_create_infold_enums.rb +16 -0
  245. data/db/migrate/20220419062020_create_infold_menu_items.rb +16 -0
  246. data/db/migrate/20220419062119_create_infold_csv_columns.rb +12 -0
  247. data/db/schema.rb +260 -0
  248. data/lib/generators/infold/app/app_generator.rb +134 -0
  249. data/lib/generators/infold/app/templates/controller.rb.tt +100 -0
  250. data/lib/generators/infold/app/templates/search_form.rb.tt +31 -0
  251. data/lib/generators/infold/app/templates/views/_association_fields.haml.tt +16 -0
  252. data/lib/generators/infold/app/templates/views/_detail.haml.tt +100 -0
  253. data/lib/generators/infold/app/templates/views/_detail_modal_wrapper.haml.tt +9 -0
  254. data/lib/generators/infold/app/templates/views/_form.haml.tt +66 -0
  255. data/lib/generators/infold/app/templates/views/_index_row.haml.tt +17 -0
  256. data/lib/generators/infold/app/templates/views/_show_operation.haml.tt +5 -0
  257. data/lib/generators/infold/app/templates/views/edit+turbo_frame.haml.tt +13 -0
  258. data/lib/generators/infold/app/templates/views/edit.haml.tt +10 -0
  259. data/lib/generators/infold/app/templates/views/form.turbo_stream.haml.tt +17 -0
  260. data/lib/generators/infold/app/templates/views/index+turbo_frame.haml.tt +43 -0
  261. data/lib/generators/infold/app/templates/views/index.csv.ruby.tt +18 -0
  262. data/lib/generators/infold/app/templates/views/index.haml.tt +49 -0
  263. data/lib/generators/infold/app/templates/views/new+turbo_frame.haml.tt +14 -0
  264. data/lib/generators/infold/app/templates/views/new.haml.tt +12 -0
  265. data/lib/generators/infold/app/templates/views/show+turbo_frame.haml.tt +4 -0
  266. data/lib/generators/infold/app/templates/views/show.haml.tt +9 -0
  267. data/lib/generators/infold/install/install_generator.rb +151 -0
  268. data/lib/generators/infold/install/templates/app/components/admin/enum_badge_component.html.haml +4 -0
  269. data/lib/generators/infold/install/templates/app/components/admin/enum_badge_component.rb +11 -0
  270. data/lib/generators/infold/install/templates/app/components/admin/form/checkbox_fieldset_component.html.haml +11 -0
  271. data/lib/generators/infold/install/templates/app/components/admin/form/checkbox_fieldset_component.rb +15 -0
  272. data/lib/generators/infold/install/templates/app/components/admin/form/datetime_fieldset_component.html.haml +20 -0
  273. data/lib/generators/infold/install/templates/app/components/admin/form/datetime_fieldset_component.rb +13 -0
  274. data/lib/generators/infold/install/templates/app/components/admin/form/file_upload_component.html.haml +12 -0
  275. data/lib/generators/infold/install/templates/app/components/admin/form/file_upload_component.rb +12 -0
  276. data/lib/generators/infold/install/templates/app/components/admin/form/input_fieldset_component.html.haml +14 -0
  277. data/lib/generators/infold/install/templates/app/components/admin/form/input_fieldset_component.rb +24 -0
  278. data/lib/generators/infold/install/templates/app/components/admin/form/radio_fieldset_component.html.haml +11 -0
  279. data/lib/generators/infold/install/templates/app/components/admin/form/radio_fieldset_component.rb +15 -0
  280. data/lib/generators/infold/install/templates/app/components/admin/form/relation_fieldset_component.html.haml +17 -0
  281. data/lib/generators/infold/install/templates/app/components/admin/form/relation_fieldset_component.rb +21 -0
  282. data/lib/generators/infold/install/templates/app/components/admin/form/select_fieldset_component.html.haml +7 -0
  283. data/lib/generators/infold/install/templates/app/components/admin/form/select_fieldset_component.rb +16 -0
  284. data/lib/generators/infold/install/templates/app/components/admin/form/switch_element_component.html.haml +4 -0
  285. data/lib/generators/infold/install/templates/app/components/admin/form/switch_element_component.rb +12 -0
  286. data/lib/generators/infold/install/templates/app/components/admin/remote_modal_component.html.haml +8 -0
  287. data/lib/generators/infold/install/templates/app/components/admin/remote_modal_component.rb +21 -0
  288. data/lib/generators/infold/install/templates/app/components/admin/sortable_th_component.html.haml +4 -0
  289. data/lib/generators/infold/install/templates/app/components/admin/sortable_th_component.rb +27 -0
  290. data/lib/generators/infold/install/templates/app/controllers/admin/admin_users/registrations_controller.rb +71 -0
  291. data/lib/generators/infold/install/templates/app/controllers/admin/admin_users/sessions_controller.rb +39 -0
  292. data/lib/generators/infold/install/templates/app/controllers/admin/admin_users_controller.rb +62 -0
  293. data/lib/generators/infold/install/templates/app/controllers/admin/base_controller.rb +17 -0
  294. data/lib/generators/infold/install/templates/app/controllers/admin/errors_controller.rb +8 -0
  295. data/lib/generators/infold/install/templates/app/controllers/admin/turbo_devise_controller.rb +21 -0
  296. data/lib/generators/infold/install/templates/app/controllers/concerns/admin/error_handlers.rb +40 -0
  297. data/lib/generators/infold/install/templates/app/forms/admin/search_form_base.rb +48 -0
  298. data/lib/generators/infold/install/templates/app/helpers/admin_helper.rb +37 -0
  299. data/lib/generators/infold/install/templates/app/models/concerns/admin/datetime_field_concern.rb +57 -0
  300. data/lib/generators/infold/install/templates/app/views/admin/admin_users/_detail.html.haml +14 -0
  301. data/lib/generators/infold/install/templates/app/views/admin/admin_users/_form.html.haml +6 -0
  302. data/lib/generators/infold/install/templates/app/views/admin/admin_users/_index_row.html.haml +9 -0
  303. data/lib/generators/infold/install/templates/app/views/admin/admin_users/_show_operation.html.haml +4 -0
  304. data/lib/generators/infold/install/templates/app/views/admin/admin_users/edit.html+turbo_frame.haml +11 -0
  305. data/lib/generators/infold/install/templates/app/views/admin/admin_users/edit.html.haml +10 -0
  306. data/lib/generators/infold/install/templates/app/views/admin/admin_users/form.turbo_stream.haml +4 -0
  307. data/lib/generators/infold/install/templates/app/views/admin/admin_users/index.html.haml +21 -0
  308. data/lib/generators/infold/install/templates/app/views/admin/admin_users/new.html+turbo_frame.haml +11 -0
  309. data/lib/generators/infold/install/templates/app/views/admin/admin_users/new.html.haml +10 -0
  310. data/lib/generators/infold/install/templates/app/views/admin/admin_users/registrations/edit.html.haml +15 -0
  311. data/lib/generators/infold/install/templates/app/views/admin/admin_users/sessions/new.html.haml +19 -0
  312. data/lib/generators/infold/install/templates/app/views/admin/admin_users/show.html+turbo_frame.haml +11 -0
  313. data/lib/generators/infold/install/templates/app/views/admin/admin_users/show.html.haml +8 -0
  314. data/lib/generators/infold/install/templates/app/views/admin/common/_flash.html.haml +6 -0
  315. data/lib/generators/infold/install/templates/app/views/admin/common/_header_menu.html.haml +0 -0
  316. data/lib/generators/infold/install/templates/app/views/admin/errors/bad_request.html.haml +11 -0
  317. data/lib/generators/infold/install/templates/app/views/admin/errors/forbidden.html.haml +11 -0
  318. data/lib/generators/infold/install/templates/app/views/admin/errors/internal_server_error.html.haml +11 -0
  319. data/lib/generators/infold/install/templates/app/views/admin/errors/not_found.html.haml +11 -0
  320. data/lib/generators/infold/install/templates/app/views/admin/kaminari/_first_page.html.haml +2 -0
  321. data/lib/generators/infold/install/templates/app/views/admin/kaminari/_gap.html.haml +2 -0
  322. data/lib/generators/infold/install/templates/app/views/admin/kaminari/_last_page.html.haml +2 -0
  323. data/lib/generators/infold/install/templates/app/views/admin/kaminari/_next_page.html.haml +2 -0
  324. data/lib/generators/infold/install/templates/app/views/admin/kaminari/_page.html.haml +6 -0
  325. data/lib/generators/infold/install/templates/app/views/admin/kaminari/_paginator.html.haml +12 -0
  326. data/lib/generators/infold/install/templates/app/views/admin/kaminari/_prev_page.html.haml +2 -0
  327. data/lib/generators/infold/install/templates/app/views/layouts/admin.haml.tt +49 -0
  328. data/lib/generators/infold/install/templates/config/locales/infold.en.yml +28 -0
  329. data/lib/generators/infold/install/templates/config/locales/infold.ja.yml +28 -0
  330. data/lib/generators/infold/install/templates/config/routes/admin.rb +13 -0
  331. data/lib/generators/infold/install/templates/javascript/admin/controllers/application.js +9 -0
  332. data/lib/generators/infold/install/templates/javascript/admin/controllers/datepicker_controller.js +8 -0
  333. data/lib/generators/infold/install/templates/javascript/admin/controllers/flash_controller.js +10 -0
  334. data/lib/generators/infold/install/templates/javascript/admin/controllers/index.js +26 -0
  335. data/lib/generators/infold/install/templates/javascript/admin/controllers/index_page_controller.js +33 -0
  336. data/lib/generators/infold/install/templates/javascript/admin/controllers/nested_form_controller.js +33 -0
  337. data/lib/generators/infold/install/templates/javascript/admin/controllers/relation_search_controller.js +21 -0
  338. data/lib/generators/infold/install/templates/javascript/admin/controllers/remote_modal_controller.js +37 -0
  339. data/lib/generators/infold/install/templates/javascript/admin/controllers/timepicker_controller.js +8 -0
  340. data/lib/generators/infold/install/templates/javascript/admin/stylesheets/custom.css +290 -0
  341. data/lib/generators/infold/install/templates/javascript/admin/stylesheets/custom.css.map +1 -0
  342. data/lib/generators/infold/install/templates/javascript/esbuild/admin.js +10 -0
  343. data/lib/generators/infold/install/templates/javascript/webpacker/admin.js +9 -0
  344. data/lib/generators/infold/model/model_generator.rb +50 -0
  345. data/lib/generators/infold/model/templates/decorator.rb.tt +10 -0
  346. data/lib/generators/infold/model/templates/model.rb.tt +59 -0
  347. data/lib/generators/infold/project/project_generator.rb +66 -0
  348. data/lib/generators/infold/project/templates/_header_menu.haml.tt +17 -0
  349. data/lib/generators/infold/project/templates/locales/form.yml.tt +11 -0
  350. data/lib/generators/infold/project/templates/locales/model.yml.tt +43 -0
  351. data/lib/generators/infold/project/templates/relation_fieldset_component.rb.tt +30 -0
  352. data/lib/infold/engine.rb +15 -0
  353. data/lib/infold/version.rb +3 -0
  354. data/lib/infold.rb +6 -0
  355. data/lib/tasks/infold_tasks.rake +125 -0
  356. metadata +556 -0
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Admin
4
+ class Form::RelationFieldsetComponent < ViewComponent::Base
5
+ def initialize(relation_kind,form,relation_field,id_field,name_field,required:false,label:true,size_sm:false,nested_form:false)
6
+ @relation_kind = relation_kind
7
+ @form = form
8
+ @relation_field = relation_field
9
+ @id_field = id_field
10
+ @name_field = name_field
11
+ @required = required
12
+ @label = label
13
+ @size_sm = size_sm
14
+ @turbo_frame_id = "relation_#{SecureRandom.hex(3)}#{nested_form ? '_NEW_RECORD' : ''}"
15
+ end
16
+
17
+ def search_path
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,7 @@
1
+ - if @label
2
+ .d-flex
3
+ = @form.label @field, class: 'form-label fw-bold'
4
+ = helpers.admin_required_badge(@required)
5
+ = @form.select(@field, @options, { include_blank: @blank, selected: @selected_value || @form.object.send(@field).to_s },
6
+ { class: "form-select #{helpers.admin_field_invalid?(@form,@field)}#{' form-select-sm' if @size_sm}" })
7
+ %div.invalid_message= @form.object.errors.full_messages_for(@field).join(',')
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Admin
4
+ class Form::SelectFieldsetComponent < ViewComponent::Base
5
+ def initialize(form,field,options,blank:true,selected_value:nil,required:false,label:true,size_sm:false)
6
+ @form = form
7
+ @field = field
8
+ @options = options
9
+ @blank = blank
10
+ @selected_value = selected_value
11
+ @required = required
12
+ @label = label
13
+ @size_sm = size_sm
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,4 @@
1
+ .form-check.form-switch
2
+ = @form.check_box(@field, class: "form-check-input #{helpers.admin_field_invalid?(@form,@field)}", include_hidden: @include_hidden)
3
+ = @form.label(@field, class: 'form-check-label fw-bold')
4
+ %div.invalid_message= @form.object.errors.full_messages_for(@field).join(',')
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Admin
4
+ class Form::SwitchElementComponent < ViewComponent::Base
5
+ def initialize(form, field, include_hidden: true)
6
+ @form = form
7
+ @field = field
8
+ @include_hidden = include_hidden
9
+ end
10
+
11
+ end
12
+ end
@@ -0,0 +1,8 @@
1
+ .modal{ data: { controller: 'remote-modal', bs_backdrop: @backdrop, optional_window: "#{optional_window?}" }, class: 'right_justified' }
2
+ .modal-dialog.modal_h100.modal-dialog-scrollable.rounded-0{ class: "#{modal_size}" }
3
+ .modal-content.rounded-0
4
+ .modal-header
5
+ = title
6
+ %button.btn-close{ type: "button", data: { bs_dismiss: "modal" }, 'aria-label' => "Close" }
7
+ = body
8
+ = footer
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Admin
4
+ class RemoteModalComponent < ViewComponent::Base
5
+ with_content_areas :title, :body, :footer
6
+
7
+ def initialize(backdrop: nil, size: nil, optional_window: false)
8
+ @backdrop = backdrop
9
+ @size = size
10
+ @optional_window = optional_window
11
+ end
12
+
13
+ def optional_window?
14
+ @optional_window
15
+ end
16
+
17
+ def modal_size
18
+ optional_window? ? 'modal-lg' : 'modal-xl'
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,4 @@
1
+ %th
2
+ %a.text-secondary.sortable{ data: { **dataset } }= @title
3
+ - if icon_class
4
+ %i{ class: icon_class }
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Admin
4
+ class SortableThComponent < ViewComponent::Base
5
+ def initialize(search, field, title)
6
+ @search = search
7
+ @field = field.to_s
8
+ @title = title
9
+ end
10
+
11
+ def dataset
12
+ sort_kind = 'desc'
13
+ sort_kind = 'asc' if @search.sort_field.to_s == @field && @search.sort_kind.to_s == 'desc'
14
+ {
15
+ action: 'index-page#sortChange',
16
+ sort_field: @field,
17
+ sort_kind: sort_kind
18
+ }
19
+ end
20
+
21
+ def icon_class
22
+ if @search.sort_field.to_s == @field
23
+ "ms-1 bi bi-chevron-#{@search.sort_kind.to_s == 'desc' ? 'down' : 'up'}"
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Admin
4
+ class AdminUsers::RegistrationsController < Devise::RegistrationsController
5
+ layout 'admin'
6
+
7
+ # before_action :configure_sign_up_params, only: [:create]
8
+ # before_action :configure_account_update_params, only: [:update]
9
+
10
+ # GET /resource/sign_up
11
+ def new
12
+ raise Forbidden
13
+ end
14
+
15
+ # POST /resource
16
+ def create
17
+ raise Forbidden
18
+ end
19
+
20
+ # GET /resource/edit
21
+ # def edit
22
+ # super
23
+ # end
24
+
25
+ # PUT /resource
26
+ # def update
27
+ # super
28
+ # end
29
+
30
+ # DELETE /resource
31
+ def destroy
32
+ raise Forbidden
33
+ end
34
+
35
+ # GET /resource/cancel
36
+ # Forces the session data which is usually expired after sign
37
+ # in to be expired now. This is useful if the user wants to
38
+ # cancel oauth signing in/up in the middle of the process,
39
+ # removing all OAuth session data.
40
+ # def cancel
41
+ # super
42
+ # end
43
+
44
+ protected
45
+
46
+ # If you have extra params to permit, append them to the sanitizer.
47
+ # def configure_sign_up_params
48
+ # devise_parameter_sanitizer.permit(:sign_up, keys: [:attribute])
49
+ # end
50
+
51
+ # If you have extra params to permit, append them to the sanitizer.
52
+ # def configure_account_update_params
53
+ # devise_parameter_sanitizer.permit(:account_update, keys: [:name])
54
+ # end
55
+
56
+ def update_resource(resource, params)
57
+ resource.password = params[:password] if params[:password].present?
58
+ resource.update_without_password(params)
59
+ end
60
+
61
+ # The path used after sign up.
62
+ def after_update_path_for(resource)
63
+ edit_admin_user_registration_path
64
+ end
65
+
66
+ # The path used after sign up for inactive accounts.
67
+ # def after_inactive_sign_up_path_for(resource)
68
+ # super(resource)
69
+ # end
70
+ end
71
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Admin
4
+ class AdminUsers::SessionsController < Devise::SessionsController
5
+ layout 'admin'
6
+
7
+ # before_action :configure_sign_in_params, only: [:create]
8
+
9
+ # GET /resource/sign_in
10
+ # def new
11
+ # super
12
+ # end
13
+
14
+ # POST /resource/sign_in
15
+ # def create
16
+ # super
17
+ # end
18
+
19
+ # DELETE /resource/sign_out
20
+ # def destroy
21
+ # super
22
+ # end
23
+
24
+ # protected
25
+
26
+ # If you have extra params to permit, append them to the sanitizer.
27
+ # def configure_sign_in_params
28
+ # devise_parameter_sanitizer.permit(:sign_in, keys: [:attribute])
29
+ # end
30
+
31
+ def after_sign_in_path_for(resources)
32
+ admin_root_path
33
+ end
34
+
35
+ def after_sign_out_path_for(resource)
36
+ new_admin_user_session_path
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,62 @@
1
+ module Admin
2
+ class AdminUsersController < BaseController
3
+ def index
4
+ @users = AdminUser.all
5
+ end
6
+
7
+ def show
8
+ @user = AdminUser.find(params[:id])
9
+ end
10
+
11
+ def new
12
+ @user = AdminUser.new
13
+ end
14
+
15
+ def create
16
+ @user = AdminUser.new
17
+ @user.assign_attributes(post_params)
18
+ @user.password = params[:admin_user][:password]
19
+ if @user.save
20
+ redirect_to admin_admin_users_path, flash: { notice: t('infold.flash.created') }
21
+ else
22
+ flash.now[:alert] = t('infold.flash.invalid')
23
+ render :form, status: :unprocessable_entity
24
+ end
25
+ end
26
+
27
+ def edit
28
+ @user = AdminUser.find(params[:id])
29
+ end
30
+
31
+ def update
32
+ @user = AdminUser.find(params[:id])
33
+ @user.assign_attributes(post_params)
34
+ @user.password = params[:admin_user][:password] if params[:admin_user][:password].present?
35
+ if @user.save
36
+ redirect_to admin_admin_users_path, flash: { notice: t('infold.flash.updated') }
37
+ else
38
+ flash.now[:alert] = t('infold.flash.invalid')
39
+ render :form, status: :unprocessable_entity
40
+ end
41
+ end
42
+
43
+ def destroy
44
+ @user = AdminUser.find(params[:id])
45
+ if @user.destroy
46
+ redirect_to admin_admin_users_path, status: :see_other, flash: { notice: t('infold.flash.destroyed') }
47
+ else
48
+ flash.now[:alert] = t('flash.invalid_destroy')
49
+ render :show, status: :unprocessable_entity
50
+ end
51
+ end
52
+
53
+ private
54
+
55
+ def post_params
56
+ params.require(:admin_user).permit(
57
+ :email,
58
+ :name,
59
+ )
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,17 @@
1
+ module Admin
2
+ class BaseController < ActionController::Base
3
+ class Forbidden < ActionController::ActionControllerError; end
4
+ include ErrorHandlers
5
+
6
+ layout 'admin'
7
+
8
+ before_action :turbo_frame_request_variant
9
+ before_action :authenticate_admin_user!
10
+
11
+ private
12
+
13
+ def turbo_frame_request_variant
14
+ request.variant = :turbo_frame if turbo_frame_request?
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,8 @@
1
+ module Admin
2
+ class ErrorsController < BaseController
3
+ def routing_error
4
+ raise ActionController::RoutingError,
5
+ "No routes matches #{request.path.inspect}"
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,21 @@
1
+ ### https://betterprogramming.pub/devise-auth-setup-in-rails-7-44240aaed4be
2
+ module Admin
3
+ class TurboDeviseController < BaseController
4
+ class Responder < ActionController::Responder
5
+ def to_turbo_stream
6
+ controller.render(options.merge(formats: :html))
7
+ rescue ActionView::MissingTemplate => error
8
+ if get?
9
+ raise error
10
+ elsif has_errors? && default_action
11
+ render rendering_options.merge(formats: :html, status: :unprocessable_entity)
12
+ else
13
+ redirect_to navigation_location
14
+ end
15
+ end
16
+ end
17
+
18
+ self.responder = Responder
19
+ respond_to :html, :turbo_stream
20
+ end
21
+ end
@@ -0,0 +1,40 @@
1
+ module Admin
2
+ module ErrorHandlers
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ rescue_from Exception, with: :rescue500
7
+ rescue_from ActionController::ParameterMissing, with: :rescue400
8
+ rescue_from BaseController::Forbidden, with: :rescue403
9
+ rescue_from ActionController::RoutingError, with: :rescue404
10
+ rescue_from ActiveRecord::RecordNotFound, with: :rescue404
11
+ end
12
+
13
+ private
14
+ def rescue400(e)
15
+ @exception = e
16
+ render '/admin/errors/bad_request', status: 400
17
+ end
18
+
19
+ def rescue403(e)
20
+ @exception = e
21
+ render '/admin/errors/forbidden', status: 403
22
+ end
23
+
24
+ def rescue404(e)
25
+ @exception = e
26
+ render '/admin/errors/not_found', status: 404
27
+ end
28
+
29
+ def rescue500(e)
30
+ @exception = e
31
+ logger.fatal e.message
32
+ logger.fatal e.backtrace.join("\n")
33
+ if Rails.env.production?
34
+ render '/admin/errors/admin_server_error', status: 500
35
+ else
36
+ raise e
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,48 @@
1
+ module Admin
2
+ class SearchFormBase
3
+ include ActiveModel::Model
4
+
5
+ attr_accessor :sort_field
6
+ attr_writer :sort_kind
7
+
8
+ class << self
9
+ def conditions=(value)
10
+ @conditions = value
11
+ end
12
+
13
+ def conditions
14
+ @conditions || []
15
+ end
16
+ end
17
+
18
+ def self.set_condition(*condition_names)
19
+ attr_accessor *condition_names
20
+
21
+ self.conditions += condition_names
22
+ end
23
+
24
+ def apply_conditions(records, page, limit, csv)
25
+ if csv
26
+ records = records.limit(1000)
27
+ else
28
+ limit ||= 50
29
+ limit = 200 if limit > 200
30
+ records = records.page(page).per(limit)
31
+ end
32
+ records = self.class.conditions.select{ |c| send(c).present? }.inject(records) do |_records, cond|
33
+ _records.send(cond, send(cond))
34
+ end
35
+ records
36
+ end
37
+
38
+ def apply_sort(records, primary_key)
39
+ records = records.order(sort_field => sort_kind) if sort_field.present?
40
+ records = records.order(primary_key.to_sym) unless sort_kind.to_s == primary_key.to_s
41
+ records
42
+ end
43
+
44
+ def sort_kind
45
+ @sort_kind.to_s.downcase == 'asc' ? 'asc' : 'desc'
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,37 @@
1
+ module AdminHelper
2
+ def admin_input_field_tag(form,field,form_kind: :text_field, datepicker: false, timepicker: false, placeholder: nil, data: {}, rows: nil, autocomplete: 'off', size_sm: false)
3
+ if datepicker
4
+ data[:controller] = 'datepicker'
5
+ elsif timepicker
6
+ data[:controller] = 'timepicker'
7
+ end
8
+ form.send(form_kind, field,
9
+ class: "form-control#{' form-control-sm' if size_sm}#{' datepicker' if datepicker}#{' timepicker' if timepicker}#{admin_field_invalid?(form,field)}",
10
+ placeholder: placeholder,
11
+ data: data,
12
+ rows: rows,
13
+ autocomplete: autocomplete)
14
+ end
15
+
16
+ def admin_required_badge(required=true)
17
+ "<div class=\"ms-1\"><span class=\"badge badge-sm bg-red-lt\">#{t('infold.required')}</span></div>".html_safe if required
18
+ end
19
+
20
+ def admin_field_invalid?(form,field)
21
+ errors = form.object&.errors
22
+ errors && errors[field].present? ? ' is-invalid' : nil
23
+ end
24
+
25
+ def admin_search_result_count(records)
26
+ return nil if records.blank?
27
+ "#{records.offset_value + 1} - #{records.offset_value + records.length} of #{records.total_count} in total"
28
+ end
29
+
30
+ def admin_turbo_stream_flash
31
+ turbo_stream.append "flashes", partial: "admin/common/flash"
32
+ end
33
+
34
+ def admin_optional_window?
35
+ params[:optional_window].to_s == 'true'
36
+ end
37
+ end
@@ -0,0 +1,57 @@
1
+ module Admin
2
+ module DatetimeFieldConcern
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ extend(ClassMethods)
7
+ end
8
+
9
+ module ClassMethods
10
+ def datetime_field(field_name)
11
+ attr_reader "#{field_name}_date", "#{field_name}_time"
12
+
13
+ define_method("#{field_name}_date=") do |val|
14
+ instance_variable_set("@#{field_name}_date", convert_date(val))
15
+ send("set_#{field_name}")
16
+ end
17
+
18
+ define_method("#{field_name}_time=") do |val|
19
+ instance_variable_set("@#{field_name}_time", convert_time(val))
20
+ send("set_#{field_name}")
21
+ end
22
+
23
+ define_method("set_#{field_name}") do
24
+ send("#{field_name}=", convert_datetime(instance_variable_get("@#{field_name}_date"), instance_variable_get("@#{field_name}_time")))
25
+ end
26
+
27
+ define_method("#{field_name}_date") do
28
+ instance_variable_get("@#{field_name}_date") || (send(field_name) ? I18n.l(send(field_name).to_date) : nil)
29
+ end
30
+
31
+ define_method("#{field_name}_time") do
32
+ instance_variable_get("@#{field_name}_time") || send(field_name)&.strftime('%R')
33
+ end
34
+
35
+ validates "#{field_name}_date", presence: true, if: -> { send("#{field_name}_time").present? }
36
+ validates "#{field_name}_time", presence: true, if: -> { send("#{field_name}_date").present? }
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ def convert_date(str)
43
+ str.presence && (Date.parse(str) rescue nil)
44
+ end
45
+
46
+ def convert_time(str)
47
+ str.presence && (Time.zone.parse("#{Time.zone.today.strftime('%F')} #{str}").strftime('%H:%M') rescue nil)
48
+ end
49
+
50
+ def convert_datetime(date, time)
51
+ return nil if date.blank? || time.blank?
52
+ datetime = Time.zone.local(Time.zone.today.year, Time.zone.today.month, Time.zone.today.day, 0)
53
+ datetime = datetime.change(year: date.year, month: date.month, day: date.day)
54
+ datetime.change(hour: time.split(':')[0].to_i, min: time.split(':')[1].to_i, sec: time.split(':')[2].to_i)
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,14 @@
1
+ .card
2
+ %ul.list-group.list-group-flush.list_show
3
+ %li.list-group-item
4
+ .row.gx-2
5
+ .col-md-3
6
+ %h5 ID
7
+ .col-md-9
8
+ = user.id
9
+ %li.list-group-item
10
+ .row.gx-2
11
+ .col-md-3
12
+ %h5 メールアドレス
13
+ .col-md-9
14
+ = user.email
@@ -0,0 +1,6 @@
1
+ .mb-3
2
+ = render Admin::Form::InputFieldsetComponent.new(form, :email, required: true, form_kind: :email_field)
3
+ .mb-3
4
+ - placeholder = form.object.persisted? ? 'Enter only when changing password' : 'Temporary password'
5
+ = render Admin::Form::InputFieldsetComponent.new(form, :password, placeholder: placeholder, form_kind: :password_field, autocomplete: 'new-password', required: !form.object.persisted?)
6
+
@@ -0,0 +1,9 @@
1
+ %tr
2
+ %td.tac
3
+ = link_to admin_admin_user_path(user), class: 'd-block', data: { turbo_frame: 'modal_main' } do
4
+ %i.bi.bi-file-text
5
+ %td
6
+ = user.email
7
+ %td.tac
8
+ = link_to edit_admin_admin_user_path(user), class: 'd-block', data: { turbo_frame: "modal_main" } do
9
+ %i.bi.bi-pencil-square
@@ -0,0 +1,4 @@
1
+ = link_to '編集', edit_admin_admin_user_path(user), class: 'btn btn-primary',
2
+ data: { turbo_frame: "modal_main" }
3
+ = link_to '削除', admin_admin_user_path(user), class: 'btn btn-danger ms-1',
4
+ data: { turbo_confirm: "削除してよろしいでしょうか?", turbo_method: :delete, turbo_frame: "_top" }
@@ -0,0 +1,11 @@
1
+ = turbo_frame_tag "modal_main" do
2
+ = form_with model: @user, url: admin_admin_user_path(@user) do |form|
3
+ = render Admin::RemoteModalComponent.new(backdrop: :static) do |modal|
4
+ = modal.with :title do
5
+ = "User / ##{@user.id}"
6
+ = modal.with :body do
7
+ .modal-body#form_body
8
+ = render "form", form: form
9
+ = modal.with :footer do
10
+ .modal-footer
11
+ = form.submit t('infold.operation.update'), class: 'btn btn-primary'
@@ -0,0 +1,10 @@
1
+ .container.py-3
2
+ = form_with model: @user, url: admin_admin_user_path(@user) do |form|
3
+ .card
4
+ .card-header
5
+ %h3.card-title
6
+ = "User / ##{@user.id}"
7
+ .card-body#form_body
8
+ = render "form", form: form
9
+ .card-footer.text-end
10
+ = form.submit t('infold.operation.update'), class: 'btn btn-primary'
@@ -0,0 +1,4 @@
1
+ = turbo_stream.update "form_body" do
2
+ = fields_for @user do |form|
3
+ = render "form", form: form
4
+ = admin_turbo_stream_flash
@@ -0,0 +1,21 @@
1
+ %nav.navbar.navbar-light
2
+ .container
3
+ %ol.breadcrumb
4
+ %li.breadcrumb-item.active User
5
+ .ms-auto
6
+ = link_to t('infold.operation.new'), new_admin_admin_user_path, class: 'btn btn-warning', data: { turbo_frame: "modal_main" }
7
+ .page-wrapper.pt-3
8
+ .container
9
+ - if @users.blank?
10
+ .alert= t('infold.no_data')
11
+ - else
12
+ .card
13
+ .table_wrapper.table-responsive
14
+ %table.table.table-bordered.table-hover.mb-0
15
+ %thead{ data: { index_page_target: 'thead' } }
16
+ %tr
17
+ %th.icon_cell
18
+ %th email
19
+ %th.icon_cell
20
+ %tbody
21
+ = render partial: "index_row", collection: @users, as: 'user'
@@ -0,0 +1,11 @@
1
+ = turbo_frame_tag "modal_main" do
2
+ = form_with model: @user, url: admin_admin_users_path do |form|
3
+ = render Admin::RemoteModalComponent.new(backdrop: :static) do |modal|
4
+ = modal.with :title do
5
+ = t('infold.operation.new')
6
+ = modal.with :body do
7
+ .modal-body#form_body
8
+ = render "form", form: form
9
+ = modal.with :footer do
10
+ .modal-footer
11
+ = form.submit t('infold.operation.create'), class: 'btn btn-primary'
@@ -0,0 +1,10 @@
1
+ .container.py-3
2
+ = form_with model: @user, url: admin_admin_users_path do |form|
3
+ .card
4
+ .card-header
5
+ %h3.card-title
6
+ = t('infold.operation.new')
7
+ .card-body#form_body
8
+ = render "form", form: form
9
+ .card-footer.text-end
10
+ = form.submit t('infold.operation.create'), class: 'btn btn-primary'