semantic-administrate 0.1.0

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 (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