mini-max-mod 0.0.1

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 (213) hide show
  1. checksums.yaml +7 -0
  2. data/administrate-1.0.0/Rakefile +30 -0
  3. data/administrate-1.0.0/app/assets/builds/administrate/application.css +2614 -0
  4. data/administrate-1.0.0/app/assets/builds/administrate/application.css.map +1 -0
  5. data/administrate-1.0.0/app/assets/builds/administrate/application.js +31661 -0
  6. data/administrate-1.0.0/app/assets/builds/administrate/application.js.map +7 -0
  7. data/administrate-1.0.0/app/assets/builds/administrate-internal/docs.css +102 -0
  8. data/administrate-1.0.0/app/assets/builds/administrate-internal/docs.css.map +1 -0
  9. data/administrate-1.0.0/app/assets/config/administrate_manifest.js +2 -0
  10. data/administrate-1.0.0/app/assets/javascripts/administrate/add_jquery.js +4 -0
  11. data/administrate-1.0.0/app/assets/javascripts/administrate/application.js +9 -0
  12. data/administrate-1.0.0/app/assets/javascripts/administrate/controllers/application.js +9 -0
  13. data/administrate-1.0.0/app/assets/javascripts/administrate/controllers/index.js +9 -0
  14. data/administrate-1.0.0/app/assets/javascripts/administrate/controllers/select_controller.js +25 -0
  15. data/administrate-1.0.0/app/assets/javascripts/administrate/controllers/table_controller.js +23 -0
  16. data/administrate-1.0.0/app/assets/javascripts/administrate/controllers/tooltip_controller.js +24 -0
  17. data/administrate-1.0.0/app/assets/javascripts/administrate/vendor/css-anchor-positioning.js +9310 -0
  18. data/administrate-1.0.0/app/assets/stylesheets/administrate/application.scss +29 -0
  19. data/administrate-1.0.0/app/assets/stylesheets/administrate/base/_forms.scss +107 -0
  20. data/administrate-1.0.0/app/assets/stylesheets/administrate/base/_layout.scss +25 -0
  21. data/administrate-1.0.0/app/assets/stylesheets/administrate/base/_lists.scss +19 -0
  22. data/administrate-1.0.0/app/assets/stylesheets/administrate/base/_tables.scss +58 -0
  23. data/administrate-1.0.0/app/assets/stylesheets/administrate/base/_typography.scss +59 -0
  24. data/administrate-1.0.0/app/assets/stylesheets/administrate/components/_app-container.scss +9 -0
  25. data/administrate-1.0.0/app/assets/stylesheets/administrate/components/_attributes.scss +28 -0
  26. data/administrate-1.0.0/app/assets/stylesheets/administrate/components/_buttons.scss +88 -0
  27. data/administrate-1.0.0/app/assets/stylesheets/administrate/components/_cells.scss +54 -0
  28. data/administrate-1.0.0/app/assets/stylesheets/administrate/components/_field-unit.scss +56 -0
  29. data/administrate-1.0.0/app/assets/stylesheets/administrate/components/_flashes.scss +20 -0
  30. data/administrate-1.0.0/app/assets/stylesheets/administrate/components/_form-actions.scss +3 -0
  31. data/administrate-1.0.0/app/assets/stylesheets/administrate/components/_main-content.scss +30 -0
  32. data/administrate-1.0.0/app/assets/stylesheets/administrate/components/_navigation.scss +32 -0
  33. data/administrate-1.0.0/app/assets/stylesheets/administrate/components/_pagination.scss +18 -0
  34. data/administrate-1.0.0/app/assets/stylesheets/administrate/components/_search.scss +87 -0
  35. data/administrate-1.0.0/app/assets/stylesheets/administrate/library/_clearfix.scss +7 -0
  36. data/administrate-1.0.0/app/assets/stylesheets/administrate/library/_data-label.scss +8 -0
  37. data/administrate-1.0.0/app/assets/stylesheets/administrate/library/_variables.scss +69 -0
  38. data/administrate-1.0.0/app/assets/stylesheets/administrate/reset/_normalize.scss +453 -0
  39. data/administrate-1.0.0/app/assets/stylesheets/administrate-internal/docs.scss +95 -0
  40. data/administrate-1.0.0/app/controllers/administrate/application_controller.rb +279 -0
  41. data/administrate-1.0.0/app/controllers/concerns/administrate/punditize.rb +52 -0
  42. data/administrate-1.0.0/app/helpers/administrate/application_helper.rb +101 -0
  43. data/administrate-1.0.0/app/views/administrate/application/_collection.html.erb +102 -0
  44. data/administrate-1.0.0/app/views/administrate/application/_collection_header_actions.html.erb +4 -0
  45. data/administrate-1.0.0/app/views/administrate/application/_collection_item_actions.html.erb +17 -0
  46. data/administrate-1.0.0/app/views/administrate/application/_flashes.html.erb +21 -0
  47. data/administrate-1.0.0/app/views/administrate/application/_form.html.erb +60 -0
  48. data/administrate-1.0.0/app/views/administrate/application/_icons.html.erb +21 -0
  49. data/administrate-1.0.0/app/views/administrate/application/_index_header.html.erb +51 -0
  50. data/administrate-1.0.0/app/views/administrate/application/_javascript.html.erb +21 -0
  51. data/administrate-1.0.0/app/views/administrate/application/_navigation.html.erb +20 -0
  52. data/administrate-1.0.0/app/views/administrate/application/_pagination.html.erb +1 -0
  53. data/administrate-1.0.0/app/views/administrate/application/_search.html.erb +25 -0
  54. data/administrate-1.0.0/app/views/administrate/application/_stylesheet.html.erb +14 -0
  55. data/administrate-1.0.0/app/views/administrate/application/edit.html.erb +48 -0
  56. data/administrate-1.0.0/app/views/administrate/application/index.html.erb +55 -0
  57. data/administrate-1.0.0/app/views/administrate/application/new.html.erb +49 -0
  58. data/administrate-1.0.0/app/views/administrate/application/show.html.erb +77 -0
  59. data/administrate-1.0.0/app/views/fields/belongs_to/_form.html.erb +27 -0
  60. data/administrate-1.0.0/app/views/fields/belongs_to/_index.html.erb +27 -0
  61. data/administrate-1.0.0/app/views/fields/belongs_to/_show.html.erb +27 -0
  62. data/administrate-1.0.0/app/views/fields/boolean/_form.html.erb +23 -0
  63. data/administrate-1.0.0/app/views/fields/boolean/_index.html.erb +19 -0
  64. data/administrate-1.0.0/app/views/fields/boolean/_show.html.erb +19 -0
  65. data/administrate-1.0.0/app/views/fields/date/_form.html.erb +22 -0
  66. data/administrate-1.0.0/app/views/fields/date/_index.html.erb +21 -0
  67. data/administrate-1.0.0/app/views/fields/date/_show.html.erb +21 -0
  68. data/administrate-1.0.0/app/views/fields/date_time/_form.html.erb +22 -0
  69. data/administrate-1.0.0/app/views/fields/date_time/_index.html.erb +21 -0
  70. data/administrate-1.0.0/app/views/fields/date_time/_show.html.erb +21 -0
  71. data/administrate-1.0.0/app/views/fields/email/_form.html.erb +23 -0
  72. data/administrate-1.0.0/app/views/fields/email/_index.html.erb +18 -0
  73. data/administrate-1.0.0/app/views/fields/email/_show.html.erb +18 -0
  74. data/administrate-1.0.0/app/views/fields/has_many/_form.html.erb +29 -0
  75. data/administrate-1.0.0/app/views/fields/has_many/_index.html.erb +19 -0
  76. data/administrate-1.0.0/app/views/fields/has_many/_show.html.erb +39 -0
  77. data/administrate-1.0.0/app/views/fields/has_one/_form.html.erb +44 -0
  78. data/administrate-1.0.0/app/views/fields/has_one/_index.html.erb +24 -0
  79. data/administrate-1.0.0/app/views/fields/has_one/_show.html.erb +47 -0
  80. data/administrate-1.0.0/app/views/fields/number/_form.html.erb +23 -0
  81. data/administrate-1.0.0/app/views/fields/number/_index.html.erb +19 -0
  82. data/administrate-1.0.0/app/views/fields/number/_show.html.erb +19 -0
  83. data/administrate-1.0.0/app/views/fields/password/_form.html.erb +23 -0
  84. data/administrate-1.0.0/app/views/fields/password/_index.html.erb +18 -0
  85. data/administrate-1.0.0/app/views/fields/password/_show.html.erb +18 -0
  86. data/administrate-1.0.0/app/views/fields/polymorphic/_form.html.erb +29 -0
  87. data/administrate-1.0.0/app/views/fields/polymorphic/_index.html.erb +25 -0
  88. data/administrate-1.0.0/app/views/fields/polymorphic/_show.html.erb +28 -0
  89. data/administrate-1.0.0/app/views/fields/rich_text/_form.html.erb +22 -0
  90. data/administrate-1.0.0/app/views/fields/rich_text/_index.html.erb +18 -0
  91. data/administrate-1.0.0/app/views/fields/rich_text/_show.html.erb +18 -0
  92. data/administrate-1.0.0/app/views/fields/select/_form.html.erb +33 -0
  93. data/administrate-1.0.0/app/views/fields/select/_index.html.erb +16 -0
  94. data/administrate-1.0.0/app/views/fields/select/_show.html.erb +16 -0
  95. data/administrate-1.0.0/app/views/fields/string/_form.html.erb +23 -0
  96. data/administrate-1.0.0/app/views/fields/string/_index.html.erb +18 -0
  97. data/administrate-1.0.0/app/views/fields/string/_show.html.erb +18 -0
  98. data/administrate-1.0.0/app/views/fields/text/_form.html.erb +22 -0
  99. data/administrate-1.0.0/app/views/fields/text/_index.html.erb +18 -0
  100. data/administrate-1.0.0/app/views/fields/text/_show.html.erb +18 -0
  101. data/administrate-1.0.0/app/views/fields/time/_form.html.erb +22 -0
  102. data/administrate-1.0.0/app/views/fields/time/_index.html.erb +19 -0
  103. data/administrate-1.0.0/app/views/fields/time/_show.html.erb +19 -0
  104. data/administrate-1.0.0/app/views/fields/url/_form.html.erb +23 -0
  105. data/administrate-1.0.0/app/views/fields/url/_index.html.erb +20 -0
  106. data/administrate-1.0.0/app/views/fields/url/_show.html.erb +20 -0
  107. data/administrate-1.0.0/app/views/layouts/administrate/application.html.erb +41 -0
  108. data/administrate-1.0.0/config/locales/administrate.ar.yml +30 -0
  109. data/administrate-1.0.0/config/locales/administrate.bs.yml +29 -0
  110. data/administrate-1.0.0/config/locales/administrate.ca.yml +30 -0
  111. data/administrate-1.0.0/config/locales/administrate.da.yml +30 -0
  112. data/administrate-1.0.0/config/locales/administrate.de.yml +30 -0
  113. data/administrate-1.0.0/config/locales/administrate.en.yml +30 -0
  114. data/administrate-1.0.0/config/locales/administrate.es.yml +30 -0
  115. data/administrate-1.0.0/config/locales/administrate.fi.yml +30 -0
  116. data/administrate-1.0.0/config/locales/administrate.fr.yml +30 -0
  117. data/administrate-1.0.0/config/locales/administrate.id.yml +30 -0
  118. data/administrate-1.0.0/config/locales/administrate.it.yml +30 -0
  119. data/administrate-1.0.0/config/locales/administrate.ja.yml +30 -0
  120. data/administrate-1.0.0/config/locales/administrate.ko.yml +30 -0
  121. data/administrate-1.0.0/config/locales/administrate.nl.yml +30 -0
  122. data/administrate-1.0.0/config/locales/administrate.pl.yml +30 -0
  123. data/administrate-1.0.0/config/locales/administrate.pt-BR.yml +31 -0
  124. data/administrate-1.0.0/config/locales/administrate.pt.yml +31 -0
  125. data/administrate-1.0.0/config/locales/administrate.ru.yml +30 -0
  126. data/administrate-1.0.0/config/locales/administrate.sl.yml +30 -0
  127. data/administrate-1.0.0/config/locales/administrate.sq.yml +30 -0
  128. data/administrate-1.0.0/config/locales/administrate.sv.yml +30 -0
  129. data/administrate-1.0.0/config/locales/administrate.tr.yml +30 -0
  130. data/administrate-1.0.0/config/locales/administrate.uk.yml +30 -0
  131. data/administrate-1.0.0/config/locales/administrate.vi.yml +30 -0
  132. data/administrate-1.0.0/config/locales/administrate.zh-CN.yml +30 -0
  133. data/administrate-1.0.0/config/locales/administrate.zh-TW.yml +30 -0
  134. data/administrate-1.0.0/docs/adding_controllers_without_related_model.md +52 -0
  135. data/administrate-1.0.0/docs/adding_custom_field_types.md +81 -0
  136. data/administrate-1.0.0/docs/authentication.md +63 -0
  137. data/administrate-1.0.0/docs/authorization.md +94 -0
  138. data/administrate-1.0.0/docs/customizing_attribute_partials.md +56 -0
  139. data/administrate-1.0.0/docs/customizing_controller_actions.md +109 -0
  140. data/administrate-1.0.0/docs/customizing_dashboards.md +641 -0
  141. data/administrate-1.0.0/docs/customizing_page_views.md +143 -0
  142. data/administrate-1.0.0/docs/extending_administrate.md +27 -0
  143. data/administrate-1.0.0/docs/getting_started.md +150 -0
  144. data/administrate-1.0.0/docs/guides/customising_search.md +149 -0
  145. data/administrate-1.0.0/docs/guides/hiding_dashboards_from_sidebar.md +21 -0
  146. data/administrate-1.0.0/docs/guides/scoping_has_many_relations.md +27 -0
  147. data/administrate-1.0.0/docs/guides/switching_templates_with_view_variants.md +45 -0
  148. data/administrate-1.0.0/docs/guides.md +8 -0
  149. data/administrate-1.0.0/docs/migrating-to-v1.md +34 -0
  150. data/administrate-1.0.0/docs/rails_api.md +45 -0
  151. data/administrate-1.0.0/lib/administrate/base_dashboard.rb +145 -0
  152. data/administrate-1.0.0/lib/administrate/custom_dashboard.rb +15 -0
  153. data/administrate-1.0.0/lib/administrate/engine.rb +52 -0
  154. data/administrate-1.0.0/lib/administrate/field/associative.rb +72 -0
  155. data/administrate-1.0.0/lib/administrate/field/base.rb +119 -0
  156. data/administrate-1.0.0/lib/administrate/field/belongs_to.rb +55 -0
  157. data/administrate-1.0.0/lib/administrate/field/boolean.rb +15 -0
  158. data/administrate-1.0.0/lib/administrate/field/date.rb +24 -0
  159. data/administrate-1.0.0/lib/administrate/field/date_time.rb +31 -0
  160. data/administrate-1.0.0/lib/administrate/field/deferred.rb +59 -0
  161. data/administrate-1.0.0/lib/administrate/field/email.rb +11 -0
  162. data/administrate-1.0.0/lib/administrate/field/has_many.rb +140 -0
  163. data/administrate-1.0.0/lib/administrate/field/has_one.rb +55 -0
  164. data/administrate-1.0.0/lib/administrate/field/number.rb +46 -0
  165. data/administrate-1.0.0/lib/administrate/field/password.rb +29 -0
  166. data/administrate-1.0.0/lib/administrate/field/polymorphic.rb +52 -0
  167. data/administrate-1.0.0/lib/administrate/field/rich_text.rb +21 -0
  168. data/administrate-1.0.0/lib/administrate/field/select.rb +44 -0
  169. data/administrate-1.0.0/lib/administrate/field/string.rb +21 -0
  170. data/administrate-1.0.0/lib/administrate/field/text.rb +21 -0
  171. data/administrate-1.0.0/lib/administrate/field/time.rb +20 -0
  172. data/administrate-1.0.0/lib/administrate/field/url.rb +25 -0
  173. data/administrate-1.0.0/lib/administrate/generator_helpers.rb +13 -0
  174. data/administrate-1.0.0/lib/administrate/namespace/resource.rb +28 -0
  175. data/administrate-1.0.0/lib/administrate/namespace.rb +35 -0
  176. data/administrate-1.0.0/lib/administrate/not_authorized_error.rb +20 -0
  177. data/administrate-1.0.0/lib/administrate/order.rb +150 -0
  178. data/administrate-1.0.0/lib/administrate/page/base.rb +40 -0
  179. data/administrate-1.0.0/lib/administrate/page/collection.rb +38 -0
  180. data/administrate-1.0.0/lib/administrate/page/form.rb +36 -0
  181. data/administrate-1.0.0/lib/administrate/page/show.rb +32 -0
  182. data/administrate-1.0.0/lib/administrate/page.rb +4 -0
  183. data/administrate-1.0.0/lib/administrate/resource_resolver.rb +44 -0
  184. data/administrate-1.0.0/lib/administrate/search.rb +167 -0
  185. data/administrate-1.0.0/lib/administrate/version.rb +3 -0
  186. data/administrate-1.0.0/lib/administrate/view_generator.rb +48 -0
  187. data/administrate-1.0.0/lib/administrate.rb +8 -0
  188. data/administrate-1.0.0/lib/generators/administrate/dashboard/USAGE +9 -0
  189. data/administrate-1.0.0/lib/generators/administrate/dashboard/dashboard_generator.rb +168 -0
  190. data/administrate-1.0.0/lib/generators/administrate/dashboard/templates/controller.rb.erb +46 -0
  191. data/administrate-1.0.0/lib/generators/administrate/dashboard/templates/dashboard.rb.erb +68 -0
  192. data/administrate-1.0.0/lib/generators/administrate/field/field_generator.rb +31 -0
  193. data/administrate-1.0.0/lib/generators/administrate/field/templates/_form.html.erb +6 -0
  194. data/administrate-1.0.0/lib/generators/administrate/field/templates/_index.html.erb +1 -0
  195. data/administrate-1.0.0/lib/generators/administrate/field/templates/_show.html.erb +1 -0
  196. data/administrate-1.0.0/lib/generators/administrate/field/templates/field_object.rb.erb +7 -0
  197. data/administrate-1.0.0/lib/generators/administrate/install/install_generator.rb +91 -0
  198. data/administrate-1.0.0/lib/generators/administrate/install/templates/application_controller.rb.erb +21 -0
  199. data/administrate-1.0.0/lib/generators/administrate/routes/routes_generator.rb +96 -0
  200. data/administrate-1.0.0/lib/generators/administrate/routes/templates/routes.rb.erb +5 -0
  201. data/administrate-1.0.0/lib/generators/administrate/test_record.rb +21 -0
  202. data/administrate-1.0.0/lib/generators/administrate/views/edit_generator.rb +16 -0
  203. data/administrate-1.0.0/lib/generators/administrate/views/field_generator.rb +50 -0
  204. data/administrate-1.0.0/lib/generators/administrate/views/form_generator.rb +15 -0
  205. data/administrate-1.0.0/lib/generators/administrate/views/index_generator.rb +21 -0
  206. data/administrate-1.0.0/lib/generators/administrate/views/layout_generator.rb +24 -0
  207. data/administrate-1.0.0/lib/generators/administrate/views/navigation_generator.rb +15 -0
  208. data/administrate-1.0.0/lib/generators/administrate/views/new_generator.rb +16 -0
  209. data/administrate-1.0.0/lib/generators/administrate/views/show_generator.rb +15 -0
  210. data/administrate-1.0.0/lib/generators/administrate/views/views_generator.rb +15 -0
  211. data/administrate-1.0.0/lib/tasks/administrate_tasks.rake +4 -0
  212. data/mini-max-mod.gemspec +12 -0
  213. metadata +252 -0
@@ -0,0 +1,168 @@
1
+ require "rails/generators/named_base"
2
+
3
+ module Administrate
4
+ module Generators
5
+ class DashboardGenerator < Rails::Generators::NamedBase
6
+ ATTRIBUTE_TYPE_MAPPING = {
7
+ boolean: "Field::Boolean",
8
+ date: "Field::Date",
9
+ datetime: "Field::DateTime",
10
+ enum: "Field::Select",
11
+ float: "Field::Number",
12
+ integer: "Field::Number",
13
+ time: "Field::Time",
14
+ text: "Field::Text",
15
+ string: "Field::String",
16
+ uuid: "Field::String"
17
+ }
18
+
19
+ ATTRIBUTE_OPTIONS_MAPPING = {
20
+ # procs must be defined in one line!
21
+ enum: {searchable: false,
22
+ collection: ->(field) { field.resource.class.send(field.attribute.to_s.pluralize).keys }},
23
+ float: {decimals: 2}
24
+ }
25
+
26
+ DEFAULT_FIELD_TYPE = "Field::String.with_options(searchable: false)"
27
+ COLLECTION_ATTRIBUTE_LIMIT = 4
28
+ READ_ONLY_ATTRIBUTES = %w[id created_at updated_at]
29
+
30
+ class_option(
31
+ :namespace,
32
+ type: :string,
33
+ desc: "Namespace where the admin dashboards live",
34
+ default: "admin"
35
+ )
36
+
37
+ source_root File.expand_path("../templates", __FILE__)
38
+
39
+ def create_dashboard_definition
40
+ scope = regular_class_path.join("/")
41
+
42
+ template(
43
+ "dashboard.rb.erb",
44
+ Rails.root.join("app/dashboards/#{scope}/#{file_name}_dashboard.rb")
45
+ )
46
+ end
47
+
48
+ def create_resource_controller
49
+ scope = "#{namespace}/#{regular_class_path.join("/")}"
50
+ destination = Rails.root.join(
51
+ "app/controllers/#{scope}/#{file_name.pluralize}_controller.rb"
52
+ )
53
+
54
+ template("controller.rb.erb", destination)
55
+ end
56
+
57
+ private
58
+
59
+ def namespace
60
+ options[:namespace]
61
+ end
62
+
63
+ def attributes
64
+ attrs = (
65
+ klass.reflections.keys +
66
+ klass.columns.map(&:name) -
67
+ redundant_attributes
68
+ )
69
+
70
+ primary_key = attrs.delete(klass.primary_key)
71
+ created_at = attrs.delete("created_at")
72
+ updated_at = attrs.delete("updated_at")
73
+
74
+ [
75
+ primary_key,
76
+ *attrs.sort,
77
+ created_at,
78
+ updated_at
79
+ ].compact
80
+ end
81
+
82
+ def form_attributes
83
+ attributes - READ_ONLY_ATTRIBUTES
84
+ end
85
+
86
+ def redundant_attributes
87
+ klass.reflections.keys.flat_map do |relationship|
88
+ redundant_attributes_for(relationship)
89
+ end.compact
90
+ end
91
+
92
+ def redundant_attributes_for(relationship)
93
+ case association_type(relationship)
94
+ when "Field::Polymorphic"
95
+ [relationship + "_id", relationship + "_type"]
96
+ when "Field::BelongsTo"
97
+ relationship + "_id"
98
+ end
99
+ end
100
+
101
+ def field_type(attribute)
102
+ type = column_type_for_attribute(attribute.to_s)
103
+
104
+ if type
105
+ ATTRIBUTE_TYPE_MAPPING.fetch(type, DEFAULT_FIELD_TYPE) +
106
+ options_string(ATTRIBUTE_OPTIONS_MAPPING.fetch(type, {}))
107
+ else
108
+ association_type(attribute)
109
+ end
110
+ end
111
+
112
+ def column_type_for_attribute(attr)
113
+ if enum_column?(attr)
114
+ :enum
115
+ else
116
+ column_types(attr)
117
+ end
118
+ end
119
+
120
+ def enum_column?(attr)
121
+ klass.respond_to?(:defined_enums) &&
122
+ klass.defined_enums.key?(attr)
123
+ end
124
+
125
+ def column_types(attr)
126
+ klass.columns.find { |column| column.name == attr }.try(:type)
127
+ end
128
+
129
+ def association_type(attribute)
130
+ relationship = klass.reflections[attribute.to_s]
131
+ if relationship.has_one?
132
+ "Field::HasOne"
133
+ elsif relationship.collection?
134
+ "Field::HasMany"
135
+ elsif relationship.polymorphic?
136
+ "Field::Polymorphic"
137
+ else
138
+ "Field::BelongsTo"
139
+ end
140
+ end
141
+
142
+ def klass
143
+ @klass ||= Object.const_get(class_name)
144
+ end
145
+
146
+ def options_string(options)
147
+ if options.any?
148
+ ".with_options(#{inspect_hash_as_ruby(options)})"
149
+ else
150
+ ""
151
+ end
152
+ end
153
+
154
+ def inspect_hash_as_ruby(hash)
155
+ hash.map do |key, value|
156
+ v_str = value.respond_to?(:call) ? proc_string(value) : value.inspect
157
+ "#{key}: #{v_str}"
158
+ end.join(", ")
159
+ end
160
+
161
+ def proc_string(value)
162
+ source = value.source_location
163
+ proc_string = IO.readlines(source.first)[source.second - 1]
164
+ proc_string[/->[^}]*} | (lambda|proc).*end/x]
165
+ end
166
+ end
167
+ end
168
+ end
@@ -0,0 +1,46 @@
1
+ module <%= namespace.to_s.camelize %>
2
+ class <%= class_name.pluralize %>Controller < <%= namespace.to_s.camelize %>::ApplicationController
3
+ # Overwrite any of the RESTful controller actions to implement custom behavior
4
+ # For example, you may want to send an email after a foo is updated.
5
+ #
6
+ # def update
7
+ # super
8
+ # send_foo_updated_email(requested_resource)
9
+ # end
10
+
11
+ # Override this method to specify custom lookup behavior.
12
+ # This will be used to set the resource for the `show`, `edit`, and `update`
13
+ # actions.
14
+ #
15
+ # def find_resource(param)
16
+ # Foo.find_by!(slug: param)
17
+ # end
18
+
19
+ # The result of this lookup will be available as `requested_resource`
20
+
21
+ # Override this if you have certain roles that require a subset
22
+ # this will be used to set the records shown on the `index` action.
23
+ #
24
+ # def scoped_resource
25
+ # if current_user.super_admin?
26
+ # resource_class
27
+ # else
28
+ # resource_class.with_less_stuff
29
+ # end
30
+ # end
31
+
32
+ # Override `resource_params` if you want to transform the submitted
33
+ # data before it's persisted. For example, the following would turn all
34
+ # empty values into nil values. It uses other APIs such as `resource_class`
35
+ # and `dashboard`:
36
+ #
37
+ # def resource_params
38
+ # params.require(resource_class.model_name.param_key).
39
+ # permit(dashboard.permitted_attributes(action_name)).
40
+ # transform_values { |value| value == "" ? nil : value }
41
+ # end
42
+
43
+ # See https://administrate-demo.herokuapp.com/customizing_controller_actions
44
+ # for more information
45
+ end
46
+ end
@@ -0,0 +1,68 @@
1
+ require "administrate/base_dashboard"
2
+
3
+ class <%= class_name %>Dashboard < Administrate::BaseDashboard
4
+ # ATTRIBUTE_TYPES
5
+ # a hash that describes the type of each of the model's fields.
6
+ #
7
+ # Each different type represents an Administrate::Field object,
8
+ # which determines how the attribute is displayed
9
+ # on pages throughout the dashboard.
10
+ ATTRIBUTE_TYPES = {
11
+ <% attributes.each do |attr| -%>
12
+ <%= attr %>: <%= field_type(attr) %>,
13
+ <% end -%>
14
+ }.freeze
15
+
16
+ # COLLECTION_ATTRIBUTES
17
+ # an array of attributes that will be displayed on the model's index page.
18
+ #
19
+ # By default, it's limited to four items to reduce clutter on index pages.
20
+ # Feel free to add, remove, or rearrange items.
21
+ COLLECTION_ATTRIBUTES = %i[
22
+ <%=
23
+ attributes.first(COLLECTION_ATTRIBUTE_LIMIT).map do |attr|
24
+ " #{attr}"
25
+ end.join("\n")
26
+ %>
27
+ ].freeze
28
+
29
+ # SHOW_PAGE_ATTRIBUTES
30
+ # an array of attributes that will be displayed on the model's show page.
31
+ SHOW_PAGE_ATTRIBUTES = %i[
32
+ <%=
33
+ attributes.map do |attr|
34
+ " #{attr}"
35
+ end.join("\n")
36
+ %>
37
+ ].freeze
38
+
39
+ # FORM_ATTRIBUTES
40
+ # an array of attributes that will be displayed
41
+ # on the model's form (`new` and `edit`) pages.
42
+ FORM_ATTRIBUTES = %i[
43
+ <%=
44
+ form_attributes.map do |attr|
45
+ " #{attr}"
46
+ end.join("\n")
47
+ %>
48
+ ].freeze
49
+
50
+ # COLLECTION_FILTERS
51
+ # a hash that defines filters that can be used while searching via the search
52
+ # field of the dashboard.
53
+ #
54
+ # For example to add an option to search for open resources by typing "open:"
55
+ # in the search field:
56
+ #
57
+ # COLLECTION_FILTERS = {
58
+ # open: ->(resources) { resources.where(open: true) }
59
+ # }.freeze
60
+ COLLECTION_FILTERS = {}.freeze
61
+
62
+ # Overwrite this method to customize how <%= file_name.pluralize.humanize.downcase %> are displayed
63
+ # across all pages of the admin dashboard.
64
+ #
65
+ # def display_resource(<%= file_name %>)
66
+ # "<%= class_name %> ##{<%= file_name %>.id}"
67
+ # end
68
+ end
@@ -0,0 +1,31 @@
1
+ module Administrate
2
+ module Generators
3
+ class FieldGenerator < Rails::Generators::NamedBase
4
+ source_root File.expand_path("../templates", __FILE__)
5
+
6
+ def template_field_object
7
+ template(
8
+ "field_object.rb.erb",
9
+ "app/fields/#{file_name}_field.rb"
10
+ )
11
+ end
12
+
13
+ def copy_partials
14
+ copy_partial(:show)
15
+ copy_partial(:index)
16
+ copy_partial(:form)
17
+ end
18
+
19
+ private
20
+
21
+ def copy_partial(partial_name)
22
+ partial = "_#{partial_name}.html.erb"
23
+
24
+ copy_file(
25
+ partial,
26
+ "app/views/fields/#{file_name}_field/#{partial}"
27
+ )
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,6 @@
1
+ <div class="field-unit__label">
2
+ <%= f.label field.attribute %>
3
+ </div>
4
+ <div class="field-unit__field">
5
+ <%= f.text_field field.attribute %>
6
+ </div>
@@ -0,0 +1,7 @@
1
+ require "administrate/field/base"
2
+
3
+ class <%= class_name %>Field < Administrate::Field::Base
4
+ def to_s
5
+ data
6
+ end
7
+ end
@@ -0,0 +1,91 @@
1
+ if defined?(Zeitwerk)
2
+ Zeitwerk::Loader.eager_load_all
3
+ else
4
+ Rails.application.eager_load!
5
+ end
6
+
7
+ require "rails/generators/base"
8
+ require "administrate/generator_helpers"
9
+ require "administrate/namespace"
10
+
11
+ module Administrate
12
+ module Generators
13
+ class InstallGenerator < Rails::Generators::Base
14
+ include Administrate::GeneratorHelpers
15
+
16
+ source_root File.expand_path("../templates", __FILE__)
17
+
18
+ class_option(
19
+ :namespace,
20
+ type: :string,
21
+ desc: "Namespace where the admin dashboards will live",
22
+ default: "admin"
23
+ )
24
+
25
+ def run_routes_generator
26
+ if dashboard_resources.none?
27
+ call_generator("administrate:routes", "--namespace", namespace)
28
+ Rails.application.reload_routes!
29
+ end
30
+ end
31
+
32
+ def create_dashboard_controller
33
+ template(
34
+ "application_controller.rb.erb",
35
+ "app/controllers/#{namespace}/application_controller.rb"
36
+ )
37
+ end
38
+
39
+ def run_dashboard_generators
40
+ singular_dashboard_resources.each do |resource|
41
+ call_generator "administrate:dashboard", resource,
42
+ "--namespace", namespace
43
+ end
44
+ end
45
+
46
+ def model_check
47
+ if valid_dashboard_models.none?
48
+ puts "WARNING: Add models before installing Administrate."
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ def namespace
55
+ options[:namespace]
56
+ end
57
+
58
+ def singular_dashboard_resources
59
+ dashboard_resources.map(&:to_s).map(&:singularize)
60
+ end
61
+
62
+ def dashboard_resources
63
+ Administrate::Namespace.new(namespace).resources
64
+ end
65
+
66
+ def valid_dashboard_models
67
+ database_models - invalid_dashboard_models
68
+ end
69
+
70
+ def database_models
71
+ ActiveRecord::Base.descendants.reject(&:abstract_class?)
72
+ end
73
+
74
+ def invalid_dashboard_models
75
+ (models_without_tables + namespaced_models + unnamed_constants).uniq
76
+ end
77
+
78
+ def models_without_tables
79
+ database_models.reject(&:table_exists?)
80
+ end
81
+
82
+ def namespaced_models
83
+ database_models.select { |model| model.to_s.include?("::") }
84
+ end
85
+
86
+ def unnamed_constants
87
+ ActiveRecord::Base.descendants.reject { |d| d.name == d.to_s }
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,21 @@
1
+ # All Administrate controllers inherit from this
2
+ # `Administrate::ApplicationController`, making it the ideal place to put
3
+ # authentication logic or other before_actions.
4
+ #
5
+ # If you want to add pagination or other controller-level concerns,
6
+ # you're free to overwrite the RESTful controller actions.
7
+ module <%= namespace.camelize %>
8
+ class ApplicationController < Administrate::ApplicationController
9
+ before_action :authenticate_admin
10
+
11
+ def authenticate_admin
12
+ # TODO Add authentication logic here.
13
+ end
14
+
15
+ # Override this value to specify the number of elements to display at a time
16
+ # on index pages. Defaults to 20.
17
+ # def records_per_page
18
+ # params[:per_page] || 20
19
+ # end
20
+ end
21
+ end
@@ -0,0 +1,96 @@
1
+ if defined?(Zeitwerk)
2
+ Zeitwerk::Loader.eager_load_all
3
+ else
4
+ Rails.application.eager_load!
5
+ end
6
+
7
+ require "rails/generators/base"
8
+ require "administrate/generator_helpers"
9
+ require "administrate/namespace"
10
+ require "generators/administrate/test_record"
11
+
12
+ module Administrate
13
+ module Generators
14
+ class RoutesGenerator < Rails::Generators::Base
15
+ include Administrate::GeneratorHelpers
16
+
17
+ source_root File.expand_path("../templates", __FILE__)
18
+ class_option(
19
+ :namespace,
20
+ type: :string,
21
+ desc: "Namespace where the admin dashboards live",
22
+ default: "admin"
23
+ )
24
+
25
+ def insert_dashboard_routes
26
+ if valid_dashboard_models.any?
27
+ route(dashboard_routes)
28
+ end
29
+ end
30
+
31
+ def warn_about_invalid_models
32
+ invalid_dashboard_models.each do |model|
33
+ puts "WARNING: Unable to generate a dashboard for #{model}."
34
+ if namespaced_models.include?(model)
35
+ puts " - Administrate does not yet support namespaced models."
36
+ end
37
+ if models_without_tables.include?(model)
38
+ puts " - It is not connected to a database table."
39
+ puts " Make sure your database migrations are up to date."
40
+ end
41
+ end
42
+
43
+ unnamed_constants.each do |invalid_model|
44
+ puts "NOTICE: Skipping dynamically generated model #{invalid_model}."
45
+ end
46
+ end
47
+
48
+ private
49
+
50
+ def namespace
51
+ options[:namespace]
52
+ end
53
+
54
+ def dashboard_resources
55
+ valid_dashboard_models.map do |model|
56
+ model.to_s.pluralize.underscore
57
+ end
58
+ end
59
+
60
+ def valid_dashboard_models
61
+ database_models - invalid_dashboard_models
62
+ end
63
+
64
+ def database_models
65
+ ActiveRecord::Base.descendants
66
+ .reject(&:abstract_class?)
67
+ .reject { |k| k < Administrate::Generators::TestRecord }
68
+ .sort_by(&:to_s)
69
+ end
70
+
71
+ def invalid_dashboard_models
72
+ (models_without_tables + namespaced_models + unnamed_constants).uniq
73
+ end
74
+
75
+ def models_without_tables
76
+ database_models.reject(&:table_exists?)
77
+ end
78
+
79
+ def namespaced_models
80
+ database_models.select { |model| model.to_s.include?("::") }
81
+ end
82
+
83
+ def unnamed_constants
84
+ ActiveRecord::Base.descendants.reject { |d| d.name == d.to_s }
85
+ end
86
+
87
+ def dashboard_routes
88
+ ERB.new(File.read(routes_file_path)).result(binding)
89
+ end
90
+
91
+ def routes_file_path
92
+ File.expand_path(find_in_source_paths("routes.rb.erb"))
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,5 @@
1
+ namespace :<%= namespace %> do
2
+ <% dashboard_resources.each do |resource| %> resources :<%= resource %>
3
+ <%end%>
4
+ root to: "<%= dashboard_resources.first %>#index"
5
+ end
@@ -0,0 +1,21 @@
1
+ module Administrate
2
+ module Generators
3
+ # This class serves only to work around a strange behaviour in Rails 7
4
+ # with Ruby 3.
5
+ #
6
+ # After running the spec for DashboardGenerator, the fake models that
7
+ # it generates (eg: Foo, Shipment) linger around despite being removed
8
+ # explicitly. This causes RouteGenerator to take them into
9
+ # account and generate routes for them, which its spec doesn't expect,
10
+ # causing a spec failure.
11
+ #
12
+ # To avoid this, the spec for DashboardGenerator defines its fake models
13
+ # as children of TestRecord. Then RoutesGenerator explicitly filters
14
+ # child classes of TestRecord when figuring out what models exist.
15
+ #
16
+ # Discussion at https://github.com/thoughtbot/administrate/pull/2324
17
+ class TestRecord < ApplicationRecord
18
+ self.abstract_class = true
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,16 @@
1
+ require "administrate/view_generator"
2
+
3
+ module Administrate
4
+ module Generators
5
+ module Views
6
+ class EditGenerator < Administrate::ViewGenerator
7
+ source_root template_source_path
8
+
9
+ def copy_edit
10
+ copy_resource_template("edit")
11
+ copy_resource_template("_form")
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,50 @@
1
+ require "administrate/view_generator"
2
+
3
+ module Administrate
4
+ module Generators
5
+ module Views
6
+ class FieldGenerator < Administrate::ViewGenerator
7
+ def self.template_source_path
8
+ File.expand_path(
9
+ "../../../../../app/views/fields/",
10
+ __FILE__
11
+ )
12
+ end
13
+
14
+ source_root template_source_path
15
+
16
+ def copy_partials
17
+ resource_path = args.first.try(:underscore)
18
+
19
+ if resource_path == "all"
20
+ entries = Dir.entries(self.class.template_source_path)
21
+ field_types = entries.reject { |name| name[0] == "." }
22
+
23
+ field_types.each do |field_type|
24
+ copy_field_partials(field_type)
25
+ end
26
+ else
27
+ copy_field_partials(resource_path)
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ def copy_field_partials(resource_path)
34
+ copy_field_partial(resource_path, :index)
35
+ copy_field_partial(resource_path, :show)
36
+ copy_field_partial(resource_path, :form)
37
+ end
38
+
39
+ def copy_field_partial(resource_path, partial_name)
40
+ template_file = "#{resource_path}/_#{partial_name}.html.erb"
41
+
42
+ copy_file(
43
+ template_file,
44
+ "app/views/fields/#{template_file}"
45
+ )
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,15 @@
1
+ require "administrate/view_generator"
2
+
3
+ module Administrate
4
+ module Generators
5
+ module Views
6
+ class FormGenerator < Administrate::ViewGenerator
7
+ source_root template_source_path
8
+
9
+ def copy_form
10
+ copy_resource_template("_form")
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,21 @@
1
+ require "administrate/view_generator"
2
+
3
+ module Administrate
4
+ module Generators
5
+ module Views
6
+ class IndexGenerator < Administrate::ViewGenerator
7
+ source_root template_source_path
8
+
9
+ def copy_template
10
+ copy_resource_template("index")
11
+ copy_resource_template("_collection")
12
+ copy_resource_template("_collection_header_actions")
13
+ copy_resource_template("_collection_item_actions")
14
+ copy_resource_template("_index_header")
15
+ copy_resource_template("_pagination")
16
+ copy_resource_template("_search")
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end