semantic-administrate 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (174) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +32 -0
  3. data/app/assets/fonts/administrate/semantic-ui/icons.eot +0 -0
  4. data/app/assets/fonts/administrate/semantic-ui/icons.otf +0 -0
  5. data/app/assets/fonts/administrate/semantic-ui/icons.svg +2671 -0
  6. data/app/assets/fonts/administrate/semantic-ui/icons.ttf +0 -0
  7. data/app/assets/fonts/administrate/semantic-ui/icons.woff +0 -0
  8. data/app/assets/fonts/administrate/semantic-ui/icons.woff2 +0 -0
  9. data/app/assets/images/administrate/semantic-ui/flags.png +0 -0
  10. data/app/assets/javascripts/administrate/application.js +7 -0
  11. data/app/assets/javascripts/administrate/components/date_time_picker.js +6 -0
  12. data/app/assets/javascripts/administrate/components/has_many_form.js +3 -0
  13. data/app/assets/javascripts/administrate/components/table.js +23 -0
  14. data/app/assets/javascripts/administrate/vendor/semantic-ui.js +22943 -0
  15. data/app/assets/stylesheets/administrate/application.scss +27 -0
  16. data/app/assets/stylesheets/administrate/base/_forms.scss +106 -0
  17. data/app/assets/stylesheets/administrate/base/_layout.scss +10 -0
  18. data/app/assets/stylesheets/administrate/base/_lists.scss +19 -0
  19. data/app/assets/stylesheets/administrate/base/_typography.scss +48 -0
  20. data/app/assets/stylesheets/administrate/components/_app-container.scss +27 -0
  21. data/app/assets/stylesheets/administrate/components/_attributes.scss +34 -0
  22. data/app/assets/stylesheets/administrate/components/_buttons.scss +43 -0
  23. data/app/assets/stylesheets/administrate/components/_cells.scss +59 -0
  24. data/app/assets/stylesheets/administrate/components/_field-unit.scss +36 -0
  25. data/app/assets/stylesheets/administrate/components/_flashes.scss +28 -0
  26. data/app/assets/stylesheets/administrate/components/_form-actions.scss +3 -0
  27. data/app/assets/stylesheets/administrate/components/_main-content.scss +42 -0
  28. data/app/assets/stylesheets/administrate/components/_pagination.scss +18 -0
  29. data/app/assets/stylesheets/administrate/components/_search.scss +45 -0
  30. data/app/assets/stylesheets/administrate/components/nav-drawer.scss +156 -0
  31. data/app/assets/stylesheets/administrate/library/_clearfix.scss +7 -0
  32. data/app/assets/stylesheets/administrate/library/_data-label.scss +8 -0
  33. data/app/assets/stylesheets/administrate/library/_variables.scss +65 -0
  34. data/app/assets/stylesheets/administrate/vendor/semantic-ui.scss +37123 -0
  35. data/app/assets/stylesheets/docs.scss +93 -0
  36. data/app/controllers/administrate/application_controller.rb +162 -0
  37. data/app/helpers/administrate/application_helper.rb +51 -0
  38. data/app/views/administrate/application/_collection.html.erb +92 -0
  39. data/app/views/administrate/application/_flashes.html.erb +20 -0
  40. data/app/views/administrate/application/_form.html.erb +42 -0
  41. data/app/views/administrate/application/_icons.erb +13 -0
  42. data/app/views/administrate/application/_javascript.html.erb +21 -0
  43. data/app/views/administrate/application/_navigation.html.erb +19 -0
  44. data/app/views/administrate/application/_navigation_extra_links.html.erb +13 -0
  45. data/app/views/administrate/application/_navigation_footer.html.erb +44 -0
  46. data/app/views/administrate/application/_navigation_links.html.erb +16 -0
  47. data/app/views/administrate/application/_search.html.erb +25 -0
  48. data/app/views/administrate/application/_stylesheet.html.erb +14 -0
  49. data/app/views/administrate/application/edit.html.erb +36 -0
  50. data/app/views/administrate/application/index.html.erb +63 -0
  51. data/app/views/administrate/application/new.html.erb +32 -0
  52. data/app/views/administrate/application/show.html.erb +49 -0
  53. data/app/views/fields/belongs_to/_form.html.erb +26 -0
  54. data/app/views/fields/belongs_to/_index.html.erb +27 -0
  55. data/app/views/fields/belongs_to/_show.html.erb +27 -0
  56. data/app/views/fields/boolean/_form.html.erb +23 -0
  57. data/app/views/fields/boolean/_index.html.erb +19 -0
  58. data/app/views/fields/boolean/_show.html.erb +19 -0
  59. data/app/views/fields/date_time/_form.html.erb +24 -0
  60. data/app/views/fields/date_time/_index.html.erb +21 -0
  61. data/app/views/fields/date_time/_show.html.erb +21 -0
  62. data/app/views/fields/email/_form.html.erb +23 -0
  63. data/app/views/fields/email/_index.html.erb +18 -0
  64. data/app/views/fields/email/_show.html.erb +18 -0
  65. data/app/views/fields/has_many/_form.html.erb +29 -0
  66. data/app/views/fields/has_many/_index.html.erb +19 -0
  67. data/app/views/fields/has_many/_show.html.erb +35 -0
  68. data/app/views/fields/has_one/_form.html.erb +28 -0
  69. data/app/views/fields/has_one/_index.html.erb +23 -0
  70. data/app/views/fields/has_one/_show.html.erb +40 -0
  71. data/app/views/fields/number/_form.html.erb +23 -0
  72. data/app/views/fields/number/_index.html.erb +19 -0
  73. data/app/views/fields/number/_show.html.erb +19 -0
  74. data/app/views/fields/polymorphic/_form.html.erb +32 -0
  75. data/app/views/fields/polymorphic/_index.html.erb +24 -0
  76. data/app/views/fields/polymorphic/_show.html.erb +28 -0
  77. data/app/views/fields/select/_form.html.erb +31 -0
  78. data/app/views/fields/select/_index.html.erb +16 -0
  79. data/app/views/fields/select/_show.html.erb +16 -0
  80. data/app/views/fields/string/_form.html.erb +23 -0
  81. data/app/views/fields/string/_index.html.erb +18 -0
  82. data/app/views/fields/string/_show.html.erb +18 -0
  83. data/app/views/fields/text/_form.html.erb +22 -0
  84. data/app/views/fields/text/_index.html.erb +18 -0
  85. data/app/views/fields/text/_show.html.erb +19 -0
  86. data/app/views/layouts/administrate/application.html.erb +43 -0
  87. data/config/i18n-tasks.yml +18 -0
  88. data/config/locales/administrate.ar.yml +26 -0
  89. data/config/locales/administrate.bs.yml +25 -0
  90. data/config/locales/administrate.ca.yml +26 -0
  91. data/config/locales/administrate.da.yml +26 -0
  92. data/config/locales/administrate.de.yml +26 -0
  93. data/config/locales/administrate.en.yml +26 -0
  94. data/config/locales/administrate.es.yml +26 -0
  95. data/config/locales/administrate.fr.yml +26 -0
  96. data/config/locales/administrate.it.yml +26 -0
  97. data/config/locales/administrate.ja.yml +26 -0
  98. data/config/locales/administrate.ko.yml +26 -0
  99. data/config/locales/administrate.nl.yml +26 -0
  100. data/config/locales/administrate.pl.yml +26 -0
  101. data/config/locales/administrate.pt-BR.yml +27 -0
  102. data/config/locales/administrate.pt.yml +27 -0
  103. data/config/locales/administrate.ru.yml +26 -0
  104. data/config/locales/administrate.sv.yml +26 -0
  105. data/config/locales/administrate.uk.yml +26 -0
  106. data/config/locales/administrate.vi.yml +26 -0
  107. data/config/locales/administrate.zh-CN.yml +26 -0
  108. data/config/locales/administrate.zh-TW.yml +26 -0
  109. data/config/routes.rb +2 -0
  110. data/config/unicorn.rb +30 -0
  111. data/docs/adding_custom_field_types.md +79 -0
  112. data/docs/authentication.md +61 -0
  113. data/docs/customizing_attribute_partials.md +53 -0
  114. data/docs/customizing_controller_actions.md +42 -0
  115. data/docs/customizing_dashboards.md +202 -0
  116. data/docs/customizing_page_views.md +78 -0
  117. data/docs/getting_started.md +115 -0
  118. data/lib/administrate.rb +4 -0
  119. data/lib/administrate/base_dashboard.rb +72 -0
  120. data/lib/administrate/engine.rb +44 -0
  121. data/lib/administrate/field/associative.rb +33 -0
  122. data/lib/administrate/field/base.rb +54 -0
  123. data/lib/administrate/field/belongs_to.rb +36 -0
  124. data/lib/administrate/field/boolean.rb +15 -0
  125. data/lib/administrate/field/date_time.rb +21 -0
  126. data/lib/administrate/field/deferred.rb +35 -0
  127. data/lib/administrate/field/email.rb +11 -0
  128. data/lib/administrate/field/has_many.rb +87 -0
  129. data/lib/administrate/field/has_one.rb +27 -0
  130. data/lib/administrate/field/number.rb +35 -0
  131. data/lib/administrate/field/polymorphic.rb +51 -0
  132. data/lib/administrate/field/select.rb +21 -0
  133. data/lib/administrate/field/string.rb +21 -0
  134. data/lib/administrate/field/text.rb +21 -0
  135. data/lib/administrate/generator_helpers.rb +13 -0
  136. data/lib/administrate/namespace.rb +31 -0
  137. data/lib/administrate/namespace/resource.rb +28 -0
  138. data/lib/administrate/order.rb +45 -0
  139. data/lib/administrate/page.rb +4 -0
  140. data/lib/administrate/page/base.rb +35 -0
  141. data/lib/administrate/page/collection.rb +33 -0
  142. data/lib/administrate/page/form.rb +28 -0
  143. data/lib/administrate/page/show.rb +24 -0
  144. data/lib/administrate/resource_resolver.rb +43 -0
  145. data/lib/administrate/search.rb +47 -0
  146. data/lib/administrate/version.rb +3 -0
  147. data/lib/administrate/view_generator.rb +36 -0
  148. data/lib/generators/administrate/assets/assets_generator.rb +12 -0
  149. data/lib/generators/administrate/assets/javascripts_generator.rb +17 -0
  150. data/lib/generators/administrate/assets/stylesheets_generator.rb +17 -0
  151. data/lib/generators/administrate/dashboard/USAGE +9 -0
  152. data/lib/generators/administrate/dashboard/dashboard_generator.rb +141 -0
  153. data/lib/generators/administrate/dashboard/templates/controller.rb.erb +21 -0
  154. data/lib/generators/administrate/dashboard/templates/dashboard.rb.erb +56 -0
  155. data/lib/generators/administrate/field/field_generator.rb +31 -0
  156. data/lib/generators/administrate/field/templates/_form.html.erb +6 -0
  157. data/lib/generators/administrate/field/templates/_index.html.erb +1 -0
  158. data/lib/generators/administrate/field/templates/_show.html.erb +1 -0
  159. data/lib/generators/administrate/field/templates/field_object.rb.erb +7 -0
  160. data/lib/generators/administrate/install/install_generator.rb +49 -0
  161. data/lib/generators/administrate/install/templates/application_controller.rb.erb +21 -0
  162. data/lib/generators/administrate/routes/routes_generator.rb +91 -0
  163. data/lib/generators/administrate/routes/templates/routes.rb.erb +5 -0
  164. data/lib/generators/administrate/views/edit_generator.rb +16 -0
  165. data/lib/generators/administrate/views/field_generator.rb +50 -0
  166. data/lib/generators/administrate/views/form_generator.rb +15 -0
  167. data/lib/generators/administrate/views/index_generator.rb +16 -0
  168. data/lib/generators/administrate/views/layout_generator.rb +23 -0
  169. data/lib/generators/administrate/views/navigation_generator.rb +15 -0
  170. data/lib/generators/administrate/views/new_generator.rb +16 -0
  171. data/lib/generators/administrate/views/show_generator.rb +15 -0
  172. data/lib/generators/administrate/views/views_generator.rb +14 -0
  173. data/lib/tasks/administrate_tasks.rake +4 -0
  174. metadata +388 -0
@@ -0,0 +1,15 @@
1
+ require_relative "base"
2
+
3
+ module Administrate
4
+ module Field
5
+ class Boolean < Base
6
+ def to_s
7
+ if data.nil?
8
+ "-"
9
+ else
10
+ data.to_s
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -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,11 @@
1
+ require_relative "base"
2
+
3
+ module Administrate
4
+ module Field
5
+ class Email < Field::Base
6
+ def self.searchable?
7
+ true
8
+ end
9
+ end
10
+ end
11
+ 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,13 @@
1
+ module Administrate
2
+ module GeneratorHelpers
3
+ def call_generator(generator, *args)
4
+ Rails::Generators.invoke(generator, args, generator_options)
5
+ end
6
+
7
+ private
8
+
9
+ def generator_options
10
+ { behavior: behavior }
11
+ end
12
+ end
13
+ 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