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.
- checksums.yaml +7 -0
- data/administrate-1.0.0/Rakefile +30 -0
- data/administrate-1.0.0/app/assets/builds/administrate/application.css +2614 -0
- data/administrate-1.0.0/app/assets/builds/administrate/application.css.map +1 -0
- data/administrate-1.0.0/app/assets/builds/administrate/application.js +31661 -0
- data/administrate-1.0.0/app/assets/builds/administrate/application.js.map +7 -0
- data/administrate-1.0.0/app/assets/builds/administrate-internal/docs.css +102 -0
- data/administrate-1.0.0/app/assets/builds/administrate-internal/docs.css.map +1 -0
- data/administrate-1.0.0/app/assets/config/administrate_manifest.js +2 -0
- data/administrate-1.0.0/app/assets/javascripts/administrate/add_jquery.js +4 -0
- data/administrate-1.0.0/app/assets/javascripts/administrate/application.js +9 -0
- data/administrate-1.0.0/app/assets/javascripts/administrate/controllers/application.js +9 -0
- data/administrate-1.0.0/app/assets/javascripts/administrate/controllers/index.js +9 -0
- data/administrate-1.0.0/app/assets/javascripts/administrate/controllers/select_controller.js +25 -0
- data/administrate-1.0.0/app/assets/javascripts/administrate/controllers/table_controller.js +23 -0
- data/administrate-1.0.0/app/assets/javascripts/administrate/controllers/tooltip_controller.js +24 -0
- data/administrate-1.0.0/app/assets/javascripts/administrate/vendor/css-anchor-positioning.js +9310 -0
- data/administrate-1.0.0/app/assets/stylesheets/administrate/application.scss +29 -0
- data/administrate-1.0.0/app/assets/stylesheets/administrate/base/_forms.scss +107 -0
- data/administrate-1.0.0/app/assets/stylesheets/administrate/base/_layout.scss +25 -0
- data/administrate-1.0.0/app/assets/stylesheets/administrate/base/_lists.scss +19 -0
- data/administrate-1.0.0/app/assets/stylesheets/administrate/base/_tables.scss +58 -0
- data/administrate-1.0.0/app/assets/stylesheets/administrate/base/_typography.scss +59 -0
- data/administrate-1.0.0/app/assets/stylesheets/administrate/components/_app-container.scss +9 -0
- data/administrate-1.0.0/app/assets/stylesheets/administrate/components/_attributes.scss +28 -0
- data/administrate-1.0.0/app/assets/stylesheets/administrate/components/_buttons.scss +88 -0
- data/administrate-1.0.0/app/assets/stylesheets/administrate/components/_cells.scss +54 -0
- data/administrate-1.0.0/app/assets/stylesheets/administrate/components/_field-unit.scss +56 -0
- data/administrate-1.0.0/app/assets/stylesheets/administrate/components/_flashes.scss +20 -0
- data/administrate-1.0.0/app/assets/stylesheets/administrate/components/_form-actions.scss +3 -0
- data/administrate-1.0.0/app/assets/stylesheets/administrate/components/_main-content.scss +30 -0
- data/administrate-1.0.0/app/assets/stylesheets/administrate/components/_navigation.scss +32 -0
- data/administrate-1.0.0/app/assets/stylesheets/administrate/components/_pagination.scss +18 -0
- data/administrate-1.0.0/app/assets/stylesheets/administrate/components/_search.scss +87 -0
- data/administrate-1.0.0/app/assets/stylesheets/administrate/library/_clearfix.scss +7 -0
- data/administrate-1.0.0/app/assets/stylesheets/administrate/library/_data-label.scss +8 -0
- data/administrate-1.0.0/app/assets/stylesheets/administrate/library/_variables.scss +69 -0
- data/administrate-1.0.0/app/assets/stylesheets/administrate/reset/_normalize.scss +453 -0
- data/administrate-1.0.0/app/assets/stylesheets/administrate-internal/docs.scss +95 -0
- data/administrate-1.0.0/app/controllers/administrate/application_controller.rb +279 -0
- data/administrate-1.0.0/app/controllers/concerns/administrate/punditize.rb +52 -0
- data/administrate-1.0.0/app/helpers/administrate/application_helper.rb +101 -0
- data/administrate-1.0.0/app/views/administrate/application/_collection.html.erb +102 -0
- data/administrate-1.0.0/app/views/administrate/application/_collection_header_actions.html.erb +4 -0
- data/administrate-1.0.0/app/views/administrate/application/_collection_item_actions.html.erb +17 -0
- data/administrate-1.0.0/app/views/administrate/application/_flashes.html.erb +21 -0
- data/administrate-1.0.0/app/views/administrate/application/_form.html.erb +60 -0
- data/administrate-1.0.0/app/views/administrate/application/_icons.html.erb +21 -0
- data/administrate-1.0.0/app/views/administrate/application/_index_header.html.erb +51 -0
- data/administrate-1.0.0/app/views/administrate/application/_javascript.html.erb +21 -0
- data/administrate-1.0.0/app/views/administrate/application/_navigation.html.erb +20 -0
- data/administrate-1.0.0/app/views/administrate/application/_pagination.html.erb +1 -0
- data/administrate-1.0.0/app/views/administrate/application/_search.html.erb +25 -0
- data/administrate-1.0.0/app/views/administrate/application/_stylesheet.html.erb +14 -0
- data/administrate-1.0.0/app/views/administrate/application/edit.html.erb +48 -0
- data/administrate-1.0.0/app/views/administrate/application/index.html.erb +55 -0
- data/administrate-1.0.0/app/views/administrate/application/new.html.erb +49 -0
- data/administrate-1.0.0/app/views/administrate/application/show.html.erb +77 -0
- data/administrate-1.0.0/app/views/fields/belongs_to/_form.html.erb +27 -0
- data/administrate-1.0.0/app/views/fields/belongs_to/_index.html.erb +27 -0
- data/administrate-1.0.0/app/views/fields/belongs_to/_show.html.erb +27 -0
- data/administrate-1.0.0/app/views/fields/boolean/_form.html.erb +23 -0
- data/administrate-1.0.0/app/views/fields/boolean/_index.html.erb +19 -0
- data/administrate-1.0.0/app/views/fields/boolean/_show.html.erb +19 -0
- data/administrate-1.0.0/app/views/fields/date/_form.html.erb +22 -0
- data/administrate-1.0.0/app/views/fields/date/_index.html.erb +21 -0
- data/administrate-1.0.0/app/views/fields/date/_show.html.erb +21 -0
- data/administrate-1.0.0/app/views/fields/date_time/_form.html.erb +22 -0
- data/administrate-1.0.0/app/views/fields/date_time/_index.html.erb +21 -0
- data/administrate-1.0.0/app/views/fields/date_time/_show.html.erb +21 -0
- data/administrate-1.0.0/app/views/fields/email/_form.html.erb +23 -0
- data/administrate-1.0.0/app/views/fields/email/_index.html.erb +18 -0
- data/administrate-1.0.0/app/views/fields/email/_show.html.erb +18 -0
- data/administrate-1.0.0/app/views/fields/has_many/_form.html.erb +29 -0
- data/administrate-1.0.0/app/views/fields/has_many/_index.html.erb +19 -0
- data/administrate-1.0.0/app/views/fields/has_many/_show.html.erb +39 -0
- data/administrate-1.0.0/app/views/fields/has_one/_form.html.erb +44 -0
- data/administrate-1.0.0/app/views/fields/has_one/_index.html.erb +24 -0
- data/administrate-1.0.0/app/views/fields/has_one/_show.html.erb +47 -0
- data/administrate-1.0.0/app/views/fields/number/_form.html.erb +23 -0
- data/administrate-1.0.0/app/views/fields/number/_index.html.erb +19 -0
- data/administrate-1.0.0/app/views/fields/number/_show.html.erb +19 -0
- data/administrate-1.0.0/app/views/fields/password/_form.html.erb +23 -0
- data/administrate-1.0.0/app/views/fields/password/_index.html.erb +18 -0
- data/administrate-1.0.0/app/views/fields/password/_show.html.erb +18 -0
- data/administrate-1.0.0/app/views/fields/polymorphic/_form.html.erb +29 -0
- data/administrate-1.0.0/app/views/fields/polymorphic/_index.html.erb +25 -0
- data/administrate-1.0.0/app/views/fields/polymorphic/_show.html.erb +28 -0
- data/administrate-1.0.0/app/views/fields/rich_text/_form.html.erb +22 -0
- data/administrate-1.0.0/app/views/fields/rich_text/_index.html.erb +18 -0
- data/administrate-1.0.0/app/views/fields/rich_text/_show.html.erb +18 -0
- data/administrate-1.0.0/app/views/fields/select/_form.html.erb +33 -0
- data/administrate-1.0.0/app/views/fields/select/_index.html.erb +16 -0
- data/administrate-1.0.0/app/views/fields/select/_show.html.erb +16 -0
- data/administrate-1.0.0/app/views/fields/string/_form.html.erb +23 -0
- data/administrate-1.0.0/app/views/fields/string/_index.html.erb +18 -0
- data/administrate-1.0.0/app/views/fields/string/_show.html.erb +18 -0
- data/administrate-1.0.0/app/views/fields/text/_form.html.erb +22 -0
- data/administrate-1.0.0/app/views/fields/text/_index.html.erb +18 -0
- data/administrate-1.0.0/app/views/fields/text/_show.html.erb +18 -0
- data/administrate-1.0.0/app/views/fields/time/_form.html.erb +22 -0
- data/administrate-1.0.0/app/views/fields/time/_index.html.erb +19 -0
- data/administrate-1.0.0/app/views/fields/time/_show.html.erb +19 -0
- data/administrate-1.0.0/app/views/fields/url/_form.html.erb +23 -0
- data/administrate-1.0.0/app/views/fields/url/_index.html.erb +20 -0
- data/administrate-1.0.0/app/views/fields/url/_show.html.erb +20 -0
- data/administrate-1.0.0/app/views/layouts/administrate/application.html.erb +41 -0
- data/administrate-1.0.0/config/locales/administrate.ar.yml +30 -0
- data/administrate-1.0.0/config/locales/administrate.bs.yml +29 -0
- data/administrate-1.0.0/config/locales/administrate.ca.yml +30 -0
- data/administrate-1.0.0/config/locales/administrate.da.yml +30 -0
- data/administrate-1.0.0/config/locales/administrate.de.yml +30 -0
- data/administrate-1.0.0/config/locales/administrate.en.yml +30 -0
- data/administrate-1.0.0/config/locales/administrate.es.yml +30 -0
- data/administrate-1.0.0/config/locales/administrate.fi.yml +30 -0
- data/administrate-1.0.0/config/locales/administrate.fr.yml +30 -0
- data/administrate-1.0.0/config/locales/administrate.id.yml +30 -0
- data/administrate-1.0.0/config/locales/administrate.it.yml +30 -0
- data/administrate-1.0.0/config/locales/administrate.ja.yml +30 -0
- data/administrate-1.0.0/config/locales/administrate.ko.yml +30 -0
- data/administrate-1.0.0/config/locales/administrate.nl.yml +30 -0
- data/administrate-1.0.0/config/locales/administrate.pl.yml +30 -0
- data/administrate-1.0.0/config/locales/administrate.pt-BR.yml +31 -0
- data/administrate-1.0.0/config/locales/administrate.pt.yml +31 -0
- data/administrate-1.0.0/config/locales/administrate.ru.yml +30 -0
- data/administrate-1.0.0/config/locales/administrate.sl.yml +30 -0
- data/administrate-1.0.0/config/locales/administrate.sq.yml +30 -0
- data/administrate-1.0.0/config/locales/administrate.sv.yml +30 -0
- data/administrate-1.0.0/config/locales/administrate.tr.yml +30 -0
- data/administrate-1.0.0/config/locales/administrate.uk.yml +30 -0
- data/administrate-1.0.0/config/locales/administrate.vi.yml +30 -0
- data/administrate-1.0.0/config/locales/administrate.zh-CN.yml +30 -0
- data/administrate-1.0.0/config/locales/administrate.zh-TW.yml +30 -0
- data/administrate-1.0.0/docs/adding_controllers_without_related_model.md +52 -0
- data/administrate-1.0.0/docs/adding_custom_field_types.md +81 -0
- data/administrate-1.0.0/docs/authentication.md +63 -0
- data/administrate-1.0.0/docs/authorization.md +94 -0
- data/administrate-1.0.0/docs/customizing_attribute_partials.md +56 -0
- data/administrate-1.0.0/docs/customizing_controller_actions.md +109 -0
- data/administrate-1.0.0/docs/customizing_dashboards.md +641 -0
- data/administrate-1.0.0/docs/customizing_page_views.md +143 -0
- data/administrate-1.0.0/docs/extending_administrate.md +27 -0
- data/administrate-1.0.0/docs/getting_started.md +150 -0
- data/administrate-1.0.0/docs/guides/customising_search.md +149 -0
- data/administrate-1.0.0/docs/guides/hiding_dashboards_from_sidebar.md +21 -0
- data/administrate-1.0.0/docs/guides/scoping_has_many_relations.md +27 -0
- data/administrate-1.0.0/docs/guides/switching_templates_with_view_variants.md +45 -0
- data/administrate-1.0.0/docs/guides.md +8 -0
- data/administrate-1.0.0/docs/migrating-to-v1.md +34 -0
- data/administrate-1.0.0/docs/rails_api.md +45 -0
- data/administrate-1.0.0/lib/administrate/base_dashboard.rb +145 -0
- data/administrate-1.0.0/lib/administrate/custom_dashboard.rb +15 -0
- data/administrate-1.0.0/lib/administrate/engine.rb +52 -0
- data/administrate-1.0.0/lib/administrate/field/associative.rb +72 -0
- data/administrate-1.0.0/lib/administrate/field/base.rb +119 -0
- data/administrate-1.0.0/lib/administrate/field/belongs_to.rb +55 -0
- data/administrate-1.0.0/lib/administrate/field/boolean.rb +15 -0
- data/administrate-1.0.0/lib/administrate/field/date.rb +24 -0
- data/administrate-1.0.0/lib/administrate/field/date_time.rb +31 -0
- data/administrate-1.0.0/lib/administrate/field/deferred.rb +59 -0
- data/administrate-1.0.0/lib/administrate/field/email.rb +11 -0
- data/administrate-1.0.0/lib/administrate/field/has_many.rb +140 -0
- data/administrate-1.0.0/lib/administrate/field/has_one.rb +55 -0
- data/administrate-1.0.0/lib/administrate/field/number.rb +46 -0
- data/administrate-1.0.0/lib/administrate/field/password.rb +29 -0
- data/administrate-1.0.0/lib/administrate/field/polymorphic.rb +52 -0
- data/administrate-1.0.0/lib/administrate/field/rich_text.rb +21 -0
- data/administrate-1.0.0/lib/administrate/field/select.rb +44 -0
- data/administrate-1.0.0/lib/administrate/field/string.rb +21 -0
- data/administrate-1.0.0/lib/administrate/field/text.rb +21 -0
- data/administrate-1.0.0/lib/administrate/field/time.rb +20 -0
- data/administrate-1.0.0/lib/administrate/field/url.rb +25 -0
- data/administrate-1.0.0/lib/administrate/generator_helpers.rb +13 -0
- data/administrate-1.0.0/lib/administrate/namespace/resource.rb +28 -0
- data/administrate-1.0.0/lib/administrate/namespace.rb +35 -0
- data/administrate-1.0.0/lib/administrate/not_authorized_error.rb +20 -0
- data/administrate-1.0.0/lib/administrate/order.rb +150 -0
- data/administrate-1.0.0/lib/administrate/page/base.rb +40 -0
- data/administrate-1.0.0/lib/administrate/page/collection.rb +38 -0
- data/administrate-1.0.0/lib/administrate/page/form.rb +36 -0
- data/administrate-1.0.0/lib/administrate/page/show.rb +32 -0
- data/administrate-1.0.0/lib/administrate/page.rb +4 -0
- data/administrate-1.0.0/lib/administrate/resource_resolver.rb +44 -0
- data/administrate-1.0.0/lib/administrate/search.rb +167 -0
- data/administrate-1.0.0/lib/administrate/version.rb +3 -0
- data/administrate-1.0.0/lib/administrate/view_generator.rb +48 -0
- data/administrate-1.0.0/lib/administrate.rb +8 -0
- data/administrate-1.0.0/lib/generators/administrate/dashboard/USAGE +9 -0
- data/administrate-1.0.0/lib/generators/administrate/dashboard/dashboard_generator.rb +168 -0
- data/administrate-1.0.0/lib/generators/administrate/dashboard/templates/controller.rb.erb +46 -0
- data/administrate-1.0.0/lib/generators/administrate/dashboard/templates/dashboard.rb.erb +68 -0
- data/administrate-1.0.0/lib/generators/administrate/field/field_generator.rb +31 -0
- data/administrate-1.0.0/lib/generators/administrate/field/templates/_form.html.erb +6 -0
- data/administrate-1.0.0/lib/generators/administrate/field/templates/_index.html.erb +1 -0
- data/administrate-1.0.0/lib/generators/administrate/field/templates/_show.html.erb +1 -0
- data/administrate-1.0.0/lib/generators/administrate/field/templates/field_object.rb.erb +7 -0
- data/administrate-1.0.0/lib/generators/administrate/install/install_generator.rb +91 -0
- data/administrate-1.0.0/lib/generators/administrate/install/templates/application_controller.rb.erb +21 -0
- data/administrate-1.0.0/lib/generators/administrate/routes/routes_generator.rb +96 -0
- data/administrate-1.0.0/lib/generators/administrate/routes/templates/routes.rb.erb +5 -0
- data/administrate-1.0.0/lib/generators/administrate/test_record.rb +21 -0
- data/administrate-1.0.0/lib/generators/administrate/views/edit_generator.rb +16 -0
- data/administrate-1.0.0/lib/generators/administrate/views/field_generator.rb +50 -0
- data/administrate-1.0.0/lib/generators/administrate/views/form_generator.rb +15 -0
- data/administrate-1.0.0/lib/generators/administrate/views/index_generator.rb +21 -0
- data/administrate-1.0.0/lib/generators/administrate/views/layout_generator.rb +24 -0
- data/administrate-1.0.0/lib/generators/administrate/views/navigation_generator.rb +15 -0
- data/administrate-1.0.0/lib/generators/administrate/views/new_generator.rb +16 -0
- data/administrate-1.0.0/lib/generators/administrate/views/show_generator.rb +15 -0
- data/administrate-1.0.0/lib/generators/administrate/views/views_generator.rb +15 -0
- data/administrate-1.0.0/lib/tasks/administrate_tasks.rake +4 -0
- data/mini-max-mod.gemspec +12 -0
- 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 @@
|
|
|
1
|
+
<%= field.to_s %>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%= field.to_s %>
|
|
@@ -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
|
data/administrate-1.0.0/lib/generators/administrate/install/templates/application_controller.rb.erb
ADDED
|
@@ -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,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
|