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,150 @@
1
+ module Administrate
2
+ class Order
3
+ def initialize(attribute = nil, direction = nil, sorting_column: nil)
4
+ @attribute = attribute
5
+ @direction = sanitize_direction(direction)
6
+ @sorting_column = sorting_column || attribute
7
+ end
8
+
9
+ def apply(relation)
10
+ return order_by_association(relation) unless
11
+ reflect_association(relation).nil?
12
+
13
+ order = relation.arel_table[sorting_column].public_send(direction)
14
+
15
+ return relation.reorder(order) if
16
+ column_exist?(relation, sorting_column)
17
+
18
+ relation
19
+ end
20
+
21
+ def ordered_by?(attr)
22
+ attr.to_s == attribute.to_s
23
+ end
24
+
25
+ def order_params_for(attr)
26
+ {
27
+ order: attr,
28
+ direction: reversed_direction_param_for(attr)
29
+ }
30
+ end
31
+
32
+ attr_reader :direction
33
+
34
+ private
35
+
36
+ attr_reader :attribute, :sorting_column
37
+
38
+ def sanitize_direction(direction)
39
+ %w[asc desc].include?(direction.to_s) ? direction.to_sym : :asc
40
+ end
41
+
42
+ def reversed_direction_param_for(attr)
43
+ if ordered_by?(attr)
44
+ opposite_direction
45
+ else
46
+ :asc
47
+ end
48
+ end
49
+
50
+ def opposite_direction
51
+ (direction == :asc) ? :desc : :asc
52
+ end
53
+
54
+ def order_by_association(relation)
55
+ case relation_type(relation)
56
+ when :has_many
57
+ order_by_count(relation)
58
+ when :belongs_to
59
+ order_by_belongs_to(relation)
60
+ when :has_one
61
+ order_by_has_one(relation)
62
+ else
63
+ relation
64
+ end
65
+ end
66
+
67
+ def order_by_count(relation)
68
+ klass = reflect_association(relation).klass
69
+ query = klass.arel_table[klass.primary_key].count.public_send(direction)
70
+ relation
71
+ .left_joins(attribute.to_sym)
72
+ .group(:id)
73
+ .reorder(query)
74
+ end
75
+
76
+ def order_by_belongs_to(relation)
77
+ if ordering_by_association_column?(relation)
78
+ order_by_association_attribute(relation)
79
+ else
80
+ order_by_id(relation)
81
+ end
82
+ end
83
+
84
+ def order_by_has_one(relation)
85
+ if ordering_by_association_column?(relation)
86
+ order_by_association_attribute(relation)
87
+ else
88
+ order_by_association_id(relation)
89
+ end
90
+ end
91
+
92
+ def order_by_id(relation)
93
+ relation.reorder(order_by_id_query(relation))
94
+ end
95
+
96
+ def ordering_by_association_column?(relation)
97
+ (attribute != sorting_column) &&
98
+ column_exist?(
99
+ reflect_association(relation).klass, sorting_column.to_sym
100
+ )
101
+ end
102
+
103
+ def column_exist?(table, column_name)
104
+ table.columns_hash.key?(column_name.to_s)
105
+ end
106
+
107
+ def order_by_id_query(relation)
108
+ relation.arel_table[association_foreign_key(relation)].public_send(direction)
109
+ end
110
+
111
+ def order_by_association_id(relation)
112
+ order_by_association_column(relation, association_primary_key(relation))
113
+ end
114
+
115
+ def order_by_association_attribute(relation)
116
+ order_by_association_column(relation, sorting_column)
117
+ end
118
+
119
+ def order_by_association_column(relation, column_name)
120
+ relation.joins(
121
+ attribute.to_sym
122
+ ).reorder(order_by_association_column_query(relation, column_name))
123
+ end
124
+
125
+ def order_by_association_column_query(relation, column)
126
+ table = Arel::Table.new(association_table_name(relation))
127
+ table[column].public_send(direction)
128
+ end
129
+
130
+ def relation_type(relation)
131
+ reflect_association(relation).macro
132
+ end
133
+
134
+ def reflect_association(relation)
135
+ relation.klass.reflect_on_association(attribute.to_s)
136
+ end
137
+
138
+ def association_foreign_key(relation)
139
+ reflect_association(relation).foreign_key
140
+ end
141
+
142
+ def association_primary_key(relation)
143
+ reflect_association(relation).association_primary_key
144
+ end
145
+
146
+ def association_table_name(relation)
147
+ reflect_association(relation).table_name
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,40 @@
1
+ module Administrate
2
+ module Page
3
+ class Base
4
+ def initialize(dashboard, options = {})
5
+ @dashboard = dashboard
6
+ @options = options
7
+ end
8
+
9
+ def resource_name
10
+ @resource_name ||=
11
+ dashboard.class.to_s.scan(/(.+)Dashboard/).first.first.underscore
12
+ end
13
+
14
+ def resource_path
15
+ @resource_path ||= resource_name.tr("/", "_")
16
+ end
17
+
18
+ def collection_includes
19
+ dashboard.try(:collection_includes) || []
20
+ end
21
+
22
+ def item_includes
23
+ dashboard.try(:item_includes) || []
24
+ end
25
+
26
+ def item_associations
27
+ dashboard.try(:item_associations) || []
28
+ end
29
+
30
+ private
31
+
32
+ def attribute_field(dashboard, resource, attribute_name, page)
33
+ field = dashboard.attribute_type_for(attribute_name)
34
+ field.new(attribute_name, nil, page, resource: resource)
35
+ end
36
+
37
+ attr_reader :dashboard, :options
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,38 @@
1
+ require_relative "base"
2
+
3
+ module Administrate
4
+ module Page
5
+ class Collection < Page::Base
6
+ def attribute_names
7
+ options.fetch(:collection_attributes, nil) ||
8
+ dashboard.collection_attributes
9
+ end
10
+
11
+ def attributes_for(resource)
12
+ attribute_names.map do |attr_name|
13
+ attribute_field(dashboard, resource, attr_name, :index)
14
+ end
15
+ end
16
+
17
+ def attribute_types
18
+ dashboard.attribute_types_for(attribute_names)
19
+ end
20
+
21
+ def ordered_html_class(attr)
22
+ ordered_by?(attr) && order.direction
23
+ end
24
+
25
+ delegate :ordered_by?, to: :order
26
+
27
+ def order_params_for(attr, key: resource_name)
28
+ {key => order.order_params_for(attr)}
29
+ end
30
+
31
+ private
32
+
33
+ def order
34
+ options[:order] || Order.new
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,36 @@
1
+ require_relative "base"
2
+
3
+ module Administrate
4
+ module Page
5
+ class Form < Page::Base
6
+ def initialize(dashboard, resource)
7
+ super(dashboard)
8
+ @resource = resource
9
+ end
10
+
11
+ attr_reader :resource
12
+
13
+ def attributes(action = nil)
14
+ attributes = dashboard.form_attributes(action)
15
+
16
+ if attributes.is_a? Array
17
+ attributes = {"" => attributes}
18
+ end
19
+
20
+ attributes.transform_values do |attrs|
21
+ attrs.map do |attribute|
22
+ attribute_field(dashboard, resource, attribute, :form)
23
+ end
24
+ end
25
+ end
26
+
27
+ def page_title
28
+ dashboard.display_resource(resource)
29
+ end
30
+
31
+ private
32
+
33
+ attr_reader :dashboard
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,32 @@
1
+ require_relative "base"
2
+
3
+ module Administrate
4
+ module Page
5
+ class Show < Page::Base
6
+ def initialize(dashboard, resource)
7
+ super(dashboard)
8
+ @resource = resource
9
+ end
10
+
11
+ attr_reader :resource
12
+
13
+ def page_title
14
+ dashboard.display_resource(resource)
15
+ end
16
+
17
+ def attributes
18
+ attributes = dashboard.show_page_attributes
19
+
20
+ if attributes.is_a? Array
21
+ attributes = {"" => attributes}
22
+ end
23
+
24
+ attributes.transform_values do |attrs|
25
+ attrs.map do |attr_name|
26
+ attribute_field(dashboard, resource, attr_name, :show)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,4 @@
1
+ module Administrate
2
+ module Page
3
+ end
4
+ end
@@ -0,0 +1,44 @@
1
+ module Administrate
2
+ class ResourceResolver
3
+ def initialize(controller_path)
4
+ @controller_path = controller_path
5
+ end
6
+
7
+ def dashboard_class
8
+ ActiveSupport::Inflector.constantize("#{resource_class_name}Dashboard")
9
+ end
10
+
11
+ def namespace
12
+ controller_path.split("/").first.to_sym
13
+ end
14
+
15
+ def resource_class
16
+ ActiveSupport::Inflector.constantize(resource_class_name)
17
+ end
18
+
19
+ def resource_name
20
+ model_path_parts.map(&:underscore).join("__").to_sym
21
+ end
22
+
23
+ def resource_title
24
+ resource_class.model_name.human
25
+ end
26
+
27
+ private
28
+
29
+ def resource_class_name
30
+ model_path_parts.join("::")
31
+ end
32
+
33
+ def model_path_parts
34
+ controller_path_parts.map(&:camelize)
35
+ end
36
+
37
+ def controller_path_parts
38
+ path_parts = controller_path.split("/")[1..]
39
+ path_parts << path_parts.pop.singularize
40
+ end
41
+
42
+ attr_reader :controller_path
43
+ end
44
+ end
@@ -0,0 +1,167 @@
1
+ require "active_support/core_ext/module/delegation"
2
+ require "active_support/core_ext/object/blank"
3
+
4
+ module Administrate
5
+ class Search
6
+ class Query
7
+ attr_reader :filters, :valid_filters
8
+
9
+ def blank?
10
+ terms.blank? && filters.empty?
11
+ end
12
+
13
+ def initialize(original_query, valid_filters = nil)
14
+ @original_query = original_query
15
+ @valid_filters = valid_filters
16
+ @filters, @terms = parse_query(original_query)
17
+ end
18
+
19
+ def original
20
+ @original_query
21
+ end
22
+
23
+ def terms
24
+ @terms.join(" ")
25
+ end
26
+
27
+ def to_s
28
+ original
29
+ end
30
+
31
+ private
32
+
33
+ def filter?(word)
34
+ valid_filters&.any? { |filter| word.match?(/^#{filter}:/) }
35
+ end
36
+
37
+ def parse_query(query)
38
+ filters = []
39
+ terms = []
40
+ query.to_s.split.each do |word|
41
+ if filter?(word)
42
+ filters << word
43
+ else
44
+ terms << word
45
+ end
46
+ end
47
+ [filters, terms]
48
+ end
49
+ end
50
+
51
+ def initialize(scoped_resource, dashboard, term)
52
+ @dashboard = dashboard
53
+ @scoped_resource = scoped_resource
54
+ @query = Query.new(term, valid_filters.keys)
55
+ end
56
+
57
+ def run
58
+ if query.blank?
59
+ @scoped_resource.all
60
+ else
61
+ results = search_results(@scoped_resource)
62
+ filter_results(results)
63
+ end
64
+ end
65
+
66
+ def valid_filters
67
+ if @dashboard.class.const_defined?(:COLLECTION_FILTERS)
68
+ @dashboard.class.const_get(:COLLECTION_FILTERS).stringify_keys
69
+ else
70
+ {}
71
+ end
72
+ end
73
+
74
+ private
75
+
76
+ def apply_filter(filter, filter_param, resources)
77
+ return resources unless filter
78
+ if filter.parameters.size == 1
79
+ filter.call(resources)
80
+ else
81
+ filter.call(resources, filter_param)
82
+ end
83
+ end
84
+
85
+ def filter_results(resources)
86
+ query.filters.each do |filter_query|
87
+ filter_name, filter_param = filter_query.split(":")
88
+ filter = valid_filters[filter_name]
89
+ resources = apply_filter(filter, filter_param, resources)
90
+ end
91
+ resources
92
+ end
93
+
94
+ def query_template
95
+ search_attributes.map do |attr|
96
+ table_name = query_table_name(attr)
97
+ searchable_fields(attr).map do |field|
98
+ column_name = column_to_query(field)
99
+ "LOWER(CAST(#{table_name}.#{column_name} AS CHAR(256))) LIKE ?"
100
+ end.join(" OR ")
101
+ end.join(" OR ")
102
+ end
103
+
104
+ def searchable_fields(attr)
105
+ return [attr] unless association_search?(attr)
106
+
107
+ attribute_types[attr].searchable_fields
108
+ end
109
+
110
+ def query_values
111
+ fields_count = search_attributes.sum do |attr|
112
+ searchable_fields(attr).count
113
+ end
114
+ ["%#{term.mb_chars.downcase}%"] * fields_count
115
+ end
116
+
117
+ def search_attributes
118
+ @dashboard.search_attributes
119
+ end
120
+
121
+ def search_results(resources)
122
+ resources
123
+ .left_joins(tables_to_join)
124
+ .where(query_template, *query_values)
125
+ end
126
+
127
+ def attribute_types
128
+ @dashboard.class.const_get(:ATTRIBUTE_TYPES)
129
+ end
130
+
131
+ def query_table_name(attr)
132
+ if association_search?(attr)
133
+ provided_class_name = attribute_types[attr].options[:class_name]
134
+ unquoted_table_name =
135
+ if provided_class_name
136
+ provided_class_name.constantize.table_name
137
+ else
138
+ @scoped_resource.reflect_on_association(attr).klass.table_name
139
+ end
140
+ ActiveRecord::Base.connection.quote_table_name(unquoted_table_name)
141
+ else
142
+ ActiveRecord::Base.connection
143
+ .quote_table_name(@scoped_resource.table_name)
144
+ end
145
+ end
146
+
147
+ def column_to_query(attr)
148
+ ActiveRecord::Base.connection.quote_column_name(attr)
149
+ end
150
+
151
+ def tables_to_join
152
+ attribute_types.keys.select do |attribute|
153
+ attribute_types[attribute].searchable? && association_search?(attribute)
154
+ end
155
+ end
156
+
157
+ def association_search?(attribute)
158
+ attribute_types[attribute].associative?
159
+ end
160
+
161
+ def term
162
+ query.terms
163
+ end
164
+
165
+ attr_reader :resolver, :query
166
+ end
167
+ end
@@ -0,0 +1,3 @@
1
+ module Administrate
2
+ VERSION = "1.0.0".freeze
3
+ end
@@ -0,0 +1,48 @@
1
+ require "rails/generators/base"
2
+ require "administrate/generator_helpers"
3
+ require "administrate/namespace"
4
+
5
+ module Administrate
6
+ class ViewGenerator < Rails::Generators::Base
7
+ include Administrate::GeneratorHelpers
8
+
9
+ class_option(
10
+ :namespace,
11
+ type: :string,
12
+ desc: "Namespace where the admin dashboards live",
13
+ default: "admin"
14
+ )
15
+
16
+ def self.template_source_path
17
+ File.expand_path(
18
+ "../../../app/views/administrate/application",
19
+ __FILE__
20
+ )
21
+ end
22
+
23
+ private
24
+
25
+ def namespace
26
+ options[:namespace]
27
+ end
28
+
29
+ def copy_resource_template(template_name)
30
+ template_file = "#{template_name}.html.erb"
31
+
32
+ copy_file(
33
+ template_file,
34
+ "app/views/#{namespace}/#{resource_path}/#{template_file}"
35
+ )
36
+ end
37
+
38
+ def resource_path
39
+ args.first.try(:underscore).try(:pluralize) || BaseResourcePath.new
40
+ end
41
+
42
+ class BaseResourcePath
43
+ def to_s
44
+ "application"
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,8 @@
1
+ require "administrate/engine"
2
+ require "administrate/version"
3
+
4
+ module Administrate
5
+ def self.deprecator
6
+ @deprecator ||= ActiveSupport::Deprecation.new(VERSION, "Administrate")
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ Description:
2
+ Generates a Dashboard object for a model,
3
+ pulling the attributes from database columns.
4
+
5
+ Example:
6
+ rails generate administrate:dashboard FooBar [--namespace admin]
7
+
8
+ This will create:
9
+ app/dashboards/foo_bar_dashboard.rb