semantic-administrate 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Rakefile +32 -0
- data/app/assets/fonts/administrate/semantic-ui/icons.eot +0 -0
- data/app/assets/fonts/administrate/semantic-ui/icons.otf +0 -0
- data/app/assets/fonts/administrate/semantic-ui/icons.svg +2671 -0
- data/app/assets/fonts/administrate/semantic-ui/icons.ttf +0 -0
- data/app/assets/fonts/administrate/semantic-ui/icons.woff +0 -0
- data/app/assets/fonts/administrate/semantic-ui/icons.woff2 +0 -0
- data/app/assets/images/administrate/semantic-ui/flags.png +0 -0
- data/app/assets/javascripts/administrate/application.js +7 -0
- data/app/assets/javascripts/administrate/components/date_time_picker.js +6 -0
- data/app/assets/javascripts/administrate/components/has_many_form.js +3 -0
- data/app/assets/javascripts/administrate/components/table.js +23 -0
- data/app/assets/javascripts/administrate/vendor/semantic-ui.js +22943 -0
- data/app/assets/stylesheets/administrate/application.scss +27 -0
- data/app/assets/stylesheets/administrate/base/_forms.scss +106 -0
- data/app/assets/stylesheets/administrate/base/_layout.scss +10 -0
- data/app/assets/stylesheets/administrate/base/_lists.scss +19 -0
- data/app/assets/stylesheets/administrate/base/_typography.scss +48 -0
- data/app/assets/stylesheets/administrate/components/_app-container.scss +27 -0
- data/app/assets/stylesheets/administrate/components/_attributes.scss +34 -0
- data/app/assets/stylesheets/administrate/components/_buttons.scss +43 -0
- data/app/assets/stylesheets/administrate/components/_cells.scss +59 -0
- data/app/assets/stylesheets/administrate/components/_field-unit.scss +36 -0
- data/app/assets/stylesheets/administrate/components/_flashes.scss +28 -0
- data/app/assets/stylesheets/administrate/components/_form-actions.scss +3 -0
- data/app/assets/stylesheets/administrate/components/_main-content.scss +42 -0
- data/app/assets/stylesheets/administrate/components/_pagination.scss +18 -0
- data/app/assets/stylesheets/administrate/components/_search.scss +45 -0
- data/app/assets/stylesheets/administrate/components/nav-drawer.scss +156 -0
- data/app/assets/stylesheets/administrate/library/_clearfix.scss +7 -0
- data/app/assets/stylesheets/administrate/library/_data-label.scss +8 -0
- data/app/assets/stylesheets/administrate/library/_variables.scss +65 -0
- data/app/assets/stylesheets/administrate/vendor/semantic-ui.scss +37123 -0
- data/app/assets/stylesheets/docs.scss +93 -0
- data/app/controllers/administrate/application_controller.rb +162 -0
- data/app/helpers/administrate/application_helper.rb +51 -0
- data/app/views/administrate/application/_collection.html.erb +92 -0
- data/app/views/administrate/application/_flashes.html.erb +20 -0
- data/app/views/administrate/application/_form.html.erb +42 -0
- data/app/views/administrate/application/_icons.erb +13 -0
- data/app/views/administrate/application/_javascript.html.erb +21 -0
- data/app/views/administrate/application/_navigation.html.erb +19 -0
- data/app/views/administrate/application/_navigation_extra_links.html.erb +13 -0
- data/app/views/administrate/application/_navigation_footer.html.erb +44 -0
- data/app/views/administrate/application/_navigation_links.html.erb +16 -0
- data/app/views/administrate/application/_search.html.erb +25 -0
- data/app/views/administrate/application/_stylesheet.html.erb +14 -0
- data/app/views/administrate/application/edit.html.erb +36 -0
- data/app/views/administrate/application/index.html.erb +63 -0
- data/app/views/administrate/application/new.html.erb +32 -0
- data/app/views/administrate/application/show.html.erb +49 -0
- data/app/views/fields/belongs_to/_form.html.erb +26 -0
- data/app/views/fields/belongs_to/_index.html.erb +27 -0
- data/app/views/fields/belongs_to/_show.html.erb +27 -0
- data/app/views/fields/boolean/_form.html.erb +23 -0
- data/app/views/fields/boolean/_index.html.erb +19 -0
- data/app/views/fields/boolean/_show.html.erb +19 -0
- data/app/views/fields/date_time/_form.html.erb +24 -0
- data/app/views/fields/date_time/_index.html.erb +21 -0
- data/app/views/fields/date_time/_show.html.erb +21 -0
- data/app/views/fields/email/_form.html.erb +23 -0
- data/app/views/fields/email/_index.html.erb +18 -0
- data/app/views/fields/email/_show.html.erb +18 -0
- data/app/views/fields/has_many/_form.html.erb +29 -0
- data/app/views/fields/has_many/_index.html.erb +19 -0
- data/app/views/fields/has_many/_show.html.erb +35 -0
- data/app/views/fields/has_one/_form.html.erb +28 -0
- data/app/views/fields/has_one/_index.html.erb +23 -0
- data/app/views/fields/has_one/_show.html.erb +40 -0
- data/app/views/fields/number/_form.html.erb +23 -0
- data/app/views/fields/number/_index.html.erb +19 -0
- data/app/views/fields/number/_show.html.erb +19 -0
- data/app/views/fields/polymorphic/_form.html.erb +32 -0
- data/app/views/fields/polymorphic/_index.html.erb +24 -0
- data/app/views/fields/polymorphic/_show.html.erb +28 -0
- data/app/views/fields/select/_form.html.erb +31 -0
- data/app/views/fields/select/_index.html.erb +16 -0
- data/app/views/fields/select/_show.html.erb +16 -0
- data/app/views/fields/string/_form.html.erb +23 -0
- data/app/views/fields/string/_index.html.erb +18 -0
- data/app/views/fields/string/_show.html.erb +18 -0
- data/app/views/fields/text/_form.html.erb +22 -0
- data/app/views/fields/text/_index.html.erb +18 -0
- data/app/views/fields/text/_show.html.erb +19 -0
- data/app/views/layouts/administrate/application.html.erb +43 -0
- data/config/i18n-tasks.yml +18 -0
- data/config/locales/administrate.ar.yml +26 -0
- data/config/locales/administrate.bs.yml +25 -0
- data/config/locales/administrate.ca.yml +26 -0
- data/config/locales/administrate.da.yml +26 -0
- data/config/locales/administrate.de.yml +26 -0
- data/config/locales/administrate.en.yml +26 -0
- data/config/locales/administrate.es.yml +26 -0
- data/config/locales/administrate.fr.yml +26 -0
- data/config/locales/administrate.it.yml +26 -0
- data/config/locales/administrate.ja.yml +26 -0
- data/config/locales/administrate.ko.yml +26 -0
- data/config/locales/administrate.nl.yml +26 -0
- data/config/locales/administrate.pl.yml +26 -0
- data/config/locales/administrate.pt-BR.yml +27 -0
- data/config/locales/administrate.pt.yml +27 -0
- data/config/locales/administrate.ru.yml +26 -0
- data/config/locales/administrate.sv.yml +26 -0
- data/config/locales/administrate.uk.yml +26 -0
- data/config/locales/administrate.vi.yml +26 -0
- data/config/locales/administrate.zh-CN.yml +26 -0
- data/config/locales/administrate.zh-TW.yml +26 -0
- data/config/routes.rb +2 -0
- data/config/unicorn.rb +30 -0
- data/docs/adding_custom_field_types.md +79 -0
- data/docs/authentication.md +61 -0
- data/docs/customizing_attribute_partials.md +53 -0
- data/docs/customizing_controller_actions.md +42 -0
- data/docs/customizing_dashboards.md +202 -0
- data/docs/customizing_page_views.md +78 -0
- data/docs/getting_started.md +115 -0
- data/lib/administrate.rb +4 -0
- data/lib/administrate/base_dashboard.rb +72 -0
- data/lib/administrate/engine.rb +44 -0
- data/lib/administrate/field/associative.rb +33 -0
- data/lib/administrate/field/base.rb +54 -0
- data/lib/administrate/field/belongs_to.rb +36 -0
- data/lib/administrate/field/boolean.rb +15 -0
- data/lib/administrate/field/date_time.rb +21 -0
- data/lib/administrate/field/deferred.rb +35 -0
- data/lib/administrate/field/email.rb +11 -0
- data/lib/administrate/field/has_many.rb +87 -0
- data/lib/administrate/field/has_one.rb +27 -0
- data/lib/administrate/field/number.rb +35 -0
- data/lib/administrate/field/polymorphic.rb +51 -0
- data/lib/administrate/field/select.rb +21 -0
- data/lib/administrate/field/string.rb +21 -0
- data/lib/administrate/field/text.rb +21 -0
- data/lib/administrate/generator_helpers.rb +13 -0
- data/lib/administrate/namespace.rb +31 -0
- data/lib/administrate/namespace/resource.rb +28 -0
- data/lib/administrate/order.rb +45 -0
- data/lib/administrate/page.rb +4 -0
- data/lib/administrate/page/base.rb +35 -0
- data/lib/administrate/page/collection.rb +33 -0
- data/lib/administrate/page/form.rb +28 -0
- data/lib/administrate/page/show.rb +24 -0
- data/lib/administrate/resource_resolver.rb +43 -0
- data/lib/administrate/search.rb +47 -0
- data/lib/administrate/version.rb +3 -0
- data/lib/administrate/view_generator.rb +36 -0
- data/lib/generators/administrate/assets/assets_generator.rb +12 -0
- data/lib/generators/administrate/assets/javascripts_generator.rb +17 -0
- data/lib/generators/administrate/assets/stylesheets_generator.rb +17 -0
- data/lib/generators/administrate/dashboard/USAGE +9 -0
- data/lib/generators/administrate/dashboard/dashboard_generator.rb +141 -0
- data/lib/generators/administrate/dashboard/templates/controller.rb.erb +21 -0
- data/lib/generators/administrate/dashboard/templates/dashboard.rb.erb +56 -0
- data/lib/generators/administrate/field/field_generator.rb +31 -0
- data/lib/generators/administrate/field/templates/_form.html.erb +6 -0
- data/lib/generators/administrate/field/templates/_index.html.erb +1 -0
- data/lib/generators/administrate/field/templates/_show.html.erb +1 -0
- data/lib/generators/administrate/field/templates/field_object.rb.erb +7 -0
- data/lib/generators/administrate/install/install_generator.rb +49 -0
- data/lib/generators/administrate/install/templates/application_controller.rb.erb +21 -0
- data/lib/generators/administrate/routes/routes_generator.rb +91 -0
- data/lib/generators/administrate/routes/templates/routes.rb.erb +5 -0
- data/lib/generators/administrate/views/edit_generator.rb +16 -0
- data/lib/generators/administrate/views/field_generator.rb +50 -0
- data/lib/generators/administrate/views/form_generator.rb +15 -0
- data/lib/generators/administrate/views/index_generator.rb +16 -0
- data/lib/generators/administrate/views/layout_generator.rb +23 -0
- data/lib/generators/administrate/views/navigation_generator.rb +15 -0
- data/lib/generators/administrate/views/new_generator.rb +16 -0
- data/lib/generators/administrate/views/show_generator.rb +15 -0
- data/lib/generators/administrate/views/views_generator.rb +14 -0
- data/lib/tasks/administrate_tasks.rake +4 -0
- metadata +388 -0
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative "base"
|
2
|
+
|
3
|
+
module Administrate
|
4
|
+
module Field
|
5
|
+
class DateTime < Base
|
6
|
+
def date
|
7
|
+
I18n.localize(data.to_date, format: format)
|
8
|
+
end
|
9
|
+
|
10
|
+
def datetime
|
11
|
+
I18n.localize(data, format: format, default: data)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def format
|
17
|
+
options.fetch(:format, :default)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require "active_support/core_ext/module/delegation"
|
2
|
+
|
3
|
+
module Administrate
|
4
|
+
module Field
|
5
|
+
class Deferred
|
6
|
+
def initialize(deferred_class, options = {})
|
7
|
+
@deferred_class = deferred_class
|
8
|
+
@options = options
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_reader :deferred_class, :options
|
12
|
+
|
13
|
+
def new(*args)
|
14
|
+
new_options = args.last.respond_to?(:merge) ? args.pop : {}
|
15
|
+
deferred_class.new(*args, options.merge(new_options))
|
16
|
+
end
|
17
|
+
|
18
|
+
def ==(other)
|
19
|
+
other.respond_to?(:deferred_class) &&
|
20
|
+
deferred_class == other.deferred_class &&
|
21
|
+
options == other.options
|
22
|
+
end
|
23
|
+
|
24
|
+
def searchable?
|
25
|
+
options.fetch(:searchable, deferred_class.searchable?)
|
26
|
+
end
|
27
|
+
|
28
|
+
def permitted_attribute(attr)
|
29
|
+
options.fetch(:foreign_key, deferred_class.permitted_attribute(attr))
|
30
|
+
end
|
31
|
+
|
32
|
+
delegate :html_class, to: :deferred_class
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require_relative "associative"
|
2
|
+
require "administrate/page/collection"
|
3
|
+
require "administrate/order"
|
4
|
+
|
5
|
+
module Administrate
|
6
|
+
module Field
|
7
|
+
class HasMany < Associative
|
8
|
+
DEFAULT_LIMIT = 5
|
9
|
+
|
10
|
+
def self.permitted_attribute(attribute)
|
11
|
+
{ "#{attribute.to_s.singularize}_ids".to_sym => [] }
|
12
|
+
end
|
13
|
+
|
14
|
+
def associated_collection
|
15
|
+
Administrate::Page::Collection.new(associated_dashboard)
|
16
|
+
end
|
17
|
+
|
18
|
+
def attribute_key
|
19
|
+
permitted_attribute.keys.first
|
20
|
+
end
|
21
|
+
|
22
|
+
def associated_resource_options
|
23
|
+
candidate_resources.map do |resource|
|
24
|
+
[display_candidate_resource(resource), resource.send(primary_key)]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def selected_options
|
29
|
+
return if data.empty?
|
30
|
+
|
31
|
+
data.map { |object| object.send(primary_key) }
|
32
|
+
end
|
33
|
+
|
34
|
+
def limit
|
35
|
+
options.fetch(:limit, DEFAULT_LIMIT)
|
36
|
+
end
|
37
|
+
|
38
|
+
def permitted_attribute
|
39
|
+
self.class.permitted_attribute(attribute)
|
40
|
+
end
|
41
|
+
|
42
|
+
def resources(page = 1)
|
43
|
+
resources = order.apply(data).page(page).per(limit)
|
44
|
+
includes.any? ? resources.includes(*includes) : resources
|
45
|
+
end
|
46
|
+
|
47
|
+
def more_than_limit?
|
48
|
+
data.count(:all) > limit
|
49
|
+
end
|
50
|
+
|
51
|
+
def data
|
52
|
+
@data ||= associated_class.none
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def includes
|
58
|
+
associated_dashboard.association_includes
|
59
|
+
end
|
60
|
+
|
61
|
+
def candidate_resources
|
62
|
+
if options.key?(:includes)
|
63
|
+
includes = options.fetch(:includes)
|
64
|
+
associated_class.includes(*includes).all
|
65
|
+
else
|
66
|
+
associated_class.all
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def display_candidate_resource(resource)
|
71
|
+
associated_dashboard.display_resource(resource)
|
72
|
+
end
|
73
|
+
|
74
|
+
def order
|
75
|
+
@_order ||= Administrate::Order.new(sort_by, direction)
|
76
|
+
end
|
77
|
+
|
78
|
+
def sort_by
|
79
|
+
options[:sort_by]
|
80
|
+
end
|
81
|
+
|
82
|
+
def direction
|
83
|
+
options[:direction]
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require_relative "associative"
|
2
|
+
|
3
|
+
module Administrate
|
4
|
+
module Field
|
5
|
+
class HasOne < Associative
|
6
|
+
def initialize(attribute, data, page, options = {})
|
7
|
+
resolver = Administrate::ResourceResolver.new("admin/#{attribute}")
|
8
|
+
@nested_form = Administrate::Page::Form.new(
|
9
|
+
resolver.dashboard_class.new,
|
10
|
+
data || resolver.resource_class.new,
|
11
|
+
)
|
12
|
+
|
13
|
+
super
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.permitted_attribute(attr)
|
17
|
+
related_dashboard_attributes =
|
18
|
+
Administrate::ResourceResolver.new("admin/#{attr}").
|
19
|
+
dashboard_class.new.permitted_attributes + [:id]
|
20
|
+
|
21
|
+
{ "#{attr}_attributes": related_dashboard_attributes }
|
22
|
+
end
|
23
|
+
|
24
|
+
attr_reader :nested_form
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require_relative "base"
|
2
|
+
|
3
|
+
module Administrate
|
4
|
+
module Field
|
5
|
+
class Number < Field::Base
|
6
|
+
def to_s
|
7
|
+
data.nil? ? "-" : format_string % value
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def format_string
|
13
|
+
prefix + "%.#{decimals}f" + suffix
|
14
|
+
end
|
15
|
+
|
16
|
+
def prefix
|
17
|
+
options[:prefix].to_s
|
18
|
+
end
|
19
|
+
|
20
|
+
def suffix
|
21
|
+
options[:suffix].to_s
|
22
|
+
end
|
23
|
+
|
24
|
+
def decimals
|
25
|
+
_left, right = data.to_s.split(".")
|
26
|
+
default = right.nil? ? 0 : right.size
|
27
|
+
options.fetch(:decimals, default)
|
28
|
+
end
|
29
|
+
|
30
|
+
def value
|
31
|
+
data * options.fetch(:multiplier, 1)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require_relative "associative"
|
2
|
+
|
3
|
+
module Administrate
|
4
|
+
module Field
|
5
|
+
class Polymorphic < BelongsTo
|
6
|
+
def associated_resource_grouped_options
|
7
|
+
classes.map do |klass|
|
8
|
+
[klass.to_s, candidate_resources_for(klass).map do |resource|
|
9
|
+
[display_candidate_resource(resource), resource.to_global_id]
|
10
|
+
end]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.permitted_attribute(attr)
|
15
|
+
{ attr => %i{type value} }
|
16
|
+
end
|
17
|
+
|
18
|
+
def permitted_attribute
|
19
|
+
{ attribute => %i{type value} }
|
20
|
+
end
|
21
|
+
|
22
|
+
def selected_global_id
|
23
|
+
data ? data.to_global_id : nil
|
24
|
+
end
|
25
|
+
|
26
|
+
protected
|
27
|
+
|
28
|
+
def associated_dashboard(klass = data.class)
|
29
|
+
"#{klass.name}Dashboard".constantize.new
|
30
|
+
end
|
31
|
+
|
32
|
+
def classes
|
33
|
+
options.fetch(:classes) || []
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def order
|
39
|
+
@_order ||= options.delete(:order)
|
40
|
+
end
|
41
|
+
|
42
|
+
def candidate_resources_for(klass)
|
43
|
+
order ? klass.order(order) : klass.all
|
44
|
+
end
|
45
|
+
|
46
|
+
def display_candidate_resource(resource)
|
47
|
+
associated_dashboard(resource.class).display_resource(resource)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative "base"
|
2
|
+
|
3
|
+
module Administrate
|
4
|
+
module Field
|
5
|
+
class Select < Field::Base
|
6
|
+
def self.searchable?
|
7
|
+
true
|
8
|
+
end
|
9
|
+
|
10
|
+
def selectable_options
|
11
|
+
collection
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def collection
|
17
|
+
@collection ||= options.fetch(:collection, [])
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative "base"
|
2
|
+
|
3
|
+
module Administrate
|
4
|
+
module Field
|
5
|
+
class String < Field::Base
|
6
|
+
def self.searchable?
|
7
|
+
true
|
8
|
+
end
|
9
|
+
|
10
|
+
def truncate
|
11
|
+
data.to_s[0...truncation_length]
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def truncation_length
|
17
|
+
options.fetch(:truncate, 50)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative "base"
|
2
|
+
|
3
|
+
module Administrate
|
4
|
+
module Field
|
5
|
+
class Text < Administrate::Field::Base
|
6
|
+
def self.searchable?
|
7
|
+
false
|
8
|
+
end
|
9
|
+
|
10
|
+
def truncate
|
11
|
+
data.to_s[0...truncation_length]
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def truncation_length
|
17
|
+
options.fetch(:truncate, 50)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Administrate
|
2
|
+
class Namespace
|
3
|
+
def initialize(namespace)
|
4
|
+
@namespace = namespace
|
5
|
+
end
|
6
|
+
|
7
|
+
def resources
|
8
|
+
@resources ||= routes.map(&:first).uniq.map do |path|
|
9
|
+
Resource.new(namespace, path)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def routes
|
14
|
+
@routes ||= all_routes.select do |controller, _action|
|
15
|
+
controller.starts_with?(namespace.to_s)
|
16
|
+
end.map do |controller, action|
|
17
|
+
[controller.gsub(/^#{namespace}\//, ""), action]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
attr_reader :namespace
|
24
|
+
|
25
|
+
def all_routes
|
26
|
+
Rails.application.routes.routes.map do |route|
|
27
|
+
route.defaults.values_at(:controller, :action).map(&:to_s)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Administrate
|
2
|
+
class Namespace
|
3
|
+
class Resource
|
4
|
+
attr_reader :namespace, :resource
|
5
|
+
|
6
|
+
def initialize(namespace, resource)
|
7
|
+
@namespace = namespace
|
8
|
+
@resource = resource
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_s
|
12
|
+
name.to_s
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_sym
|
16
|
+
name
|
17
|
+
end
|
18
|
+
|
19
|
+
def name
|
20
|
+
resource.to_s.gsub(/^#{namespace}\//, "").to_sym
|
21
|
+
end
|
22
|
+
|
23
|
+
def path
|
24
|
+
name.to_s.gsub("/", "_")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Administrate
|
2
|
+
class Order
|
3
|
+
def initialize(attribute = nil, direction = nil)
|
4
|
+
@attribute = attribute
|
5
|
+
@direction = direction || :asc
|
6
|
+
end
|
7
|
+
|
8
|
+
def apply(relation)
|
9
|
+
if relation.columns_hash.keys.include?(attribute.to_s)
|
10
|
+
relation.order("#{attribute} #{direction}")
|
11
|
+
else
|
12
|
+
relation
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def ordered_by?(attr)
|
17
|
+
attr.to_s == attribute.to_s
|
18
|
+
end
|
19
|
+
|
20
|
+
def order_params_for(attr)
|
21
|
+
{
|
22
|
+
order: attr,
|
23
|
+
direction: reversed_direction_param_for(attr)
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
attr_reader :direction
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
attr_reader :attribute
|
32
|
+
|
33
|
+
def reversed_direction_param_for(attr)
|
34
|
+
if ordered_by?(attr)
|
35
|
+
opposite_direction
|
36
|
+
else
|
37
|
+
:asc
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def opposite_direction
|
42
|
+
direction.to_sym == :asc ? :desc : :asc
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|