tolaria 1.0.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 (219) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +66 -0
  3. data/.yardopts +4 -0
  4. data/CNAME +1 -0
  5. data/CONTRIBUTING.md +32 -0
  6. data/Gemfile +2 -0
  7. data/LICENSE.md +9 -0
  8. data/README.md +538 -0
  9. data/Rakefile +52 -0
  10. data/app/assets/fonts/admin/fontawesome.eot +0 -0
  11. data/app/assets/fonts/admin/fontawesome.svg +565 -0
  12. data/app/assets/fonts/admin/fontawesome.ttf +0 -0
  13. data/app/assets/fonts/admin/fontawesome.woff +0 -0
  14. data/app/assets/fonts/admin/fontawesome.woff2 +0 -0
  15. data/app/assets/images/admin/columbia_banner.png +0 -0
  16. data/app/assets/images/admin/favicon.ico +0 -0
  17. data/app/assets/images/admin/noise.png +0 -0
  18. data/app/assets/images/admin/select_arrows.svg +1 -0
  19. data/app/assets/javascripts/admin/admin.js +4 -0
  20. data/app/assets/javascripts/admin/base.js +12 -0
  21. data/app/assets/javascripts/admin/lib/backbone.js +1888 -0
  22. data/app/assets/javascripts/admin/lib/jquery.chosen.js +1272 -0
  23. data/app/assets/javascripts/admin/lib/jquery.js +10361 -0
  24. data/app/assets/javascripts/admin/lib/jquery.selection.js +352 -0
  25. data/app/assets/javascripts/admin/lib/moment.js +3103 -0
  26. data/app/assets/javascripts/admin/lib/no.js +6 -0
  27. data/app/assets/javascripts/admin/lib/underscore.js +1570 -0
  28. data/app/assets/javascripts/admin/models/composer_buttons.js +45 -0
  29. data/app/assets/javascripts/admin/models/rails_meta.js +4 -0
  30. data/app/assets/javascripts/admin/views/field_with_errors.js +19 -0
  31. data/app/assets/javascripts/admin/views/fields/attachment_field.js +32 -0
  32. data/app/assets/javascripts/admin/views/fields/has_many.js +64 -0
  33. data/app/assets/javascripts/admin/views/fields/image_association_select.js +31 -0
  34. data/app/assets/javascripts/admin/views/fields/markdown_composer.js +167 -0
  35. data/app/assets/javascripts/admin/views/fields/searchable_select.js +70 -0
  36. data/app/assets/javascripts/admin/views/fields/slug_field.js +38 -0
  37. data/app/assets/javascripts/admin/views/fields/swatch_field.js +55 -0
  38. data/app/assets/javascripts/admin/views/fields/timestamp_field.js +80 -0
  39. data/app/assets/javascripts/admin/views/flash_message.js +18 -0
  40. data/app/assets/javascripts/admin/views/form_orchestrator.js +41 -0
  41. data/app/assets/javascripts/admin/views/navigation.js +20 -0
  42. data/app/assets/javascripts/admin/views/resource_form.js +18 -0
  43. data/app/assets/javascripts/admin/views/search_form.js +20 -0
  44. data/app/assets/javascripts/admin/views/sessions.js +109 -0
  45. data/app/assets/javascripts/admin/views/virtual_form.js +47 -0
  46. data/app/assets/stylesheets/admin/_base.scss +5 -0
  47. data/app/assets/stylesheets/admin/_reset.scss +149 -0
  48. data/app/assets/stylesheets/admin/_root.scss +63 -0
  49. data/app/assets/stylesheets/admin/admin.scss +4 -0
  50. data/app/assets/stylesheets/admin/components/_blank_slate.scss +44 -0
  51. data/app/assets/stylesheets/admin/components/_buttons.scss +82 -0
  52. data/app/assets/stylesheets/admin/components/_flash_message.scss +64 -0
  53. data/app/assets/stylesheets/admin/components/_footer.scss +9 -0
  54. data/app/assets/stylesheets/admin/components/_header.scss +107 -0
  55. data/app/assets/stylesheets/admin/components/_index_table.scss +120 -0
  56. data/app/assets/stylesheets/admin/components/_main.scss +68 -0
  57. data/app/assets/stylesheets/admin/components/_markdown_body.scss +109 -0
  58. data/app/assets/stylesheets/admin/components/_navigation.scss +110 -0
  59. data/app/assets/stylesheets/admin/components/_pagination.scss +36 -0
  60. data/app/assets/stylesheets/admin/components/_pill.scss +11 -0
  61. data/app/assets/stylesheets/admin/components/_resource_form.scss +222 -0
  62. data/app/assets/stylesheets/admin/components/_search_form.scss +36 -0
  63. data/app/assets/stylesheets/admin/components/_sessions.scss +152 -0
  64. data/app/assets/stylesheets/admin/components/_show_table.scss +67 -0
  65. data/app/assets/stylesheets/admin/components/forms/_attachment_field.scss +59 -0
  66. data/app/assets/stylesheets/admin/components/forms/_chosen.scss +478 -0
  67. data/app/assets/stylesheets/admin/components/forms/_image_association_select.scss +20 -0
  68. data/app/assets/stylesheets/admin/components/forms/_markdown_composer.scss +149 -0
  69. data/app/assets/stylesheets/admin/components/forms/_nested_fields.scss +63 -0
  70. data/app/assets/stylesheets/admin/components/forms/_searchable_select.scss +8 -0
  71. data/app/assets/stylesheets/admin/components/forms/_slug_field.scss +20 -0
  72. data/app/assets/stylesheets/admin/components/forms/_swatch_field.scss +47 -0
  73. data/app/assets/stylesheets/admin/components/forms/_timestamp_field.scss +15 -0
  74. data/app/assets/stylesheets/admin/components/help_link.scss +6 -0
  75. data/app/assets/stylesheets/admin/mixins/_clearfix.scss +18 -0
  76. data/app/assets/stylesheets/admin/mixins/_min_max_width.scss +11 -0
  77. data/app/assets/stylesheets/admin/mixins/_rgbb.scss +7 -0
  78. data/app/assets/stylesheets/admin/mixins/_visuallyhidden.scss +33 -0
  79. data/app/assets/stylesheets/admin/settings/_animations.scss +21 -0
  80. data/app/assets/stylesheets/admin/settings/_breakpoints.scss +2 -0
  81. data/app/assets/stylesheets/admin/settings/_colors.scss +32 -0
  82. data/app/assets/stylesheets/admin/settings/_fonts.scss +31 -0
  83. data/app/assets/stylesheets/admin/settings/_icons.scss +1658 -0
  84. data/app/controllers/admin/admin_controller.rb +21 -0
  85. data/app/controllers/admin/sessions_controller.rb +112 -0
  86. data/app/controllers/tolaria/resource_controller.rb +132 -0
  87. data/app/controllers/tolaria/tolaria_controller.rb +40 -0
  88. data/app/helpers/admin/table_helper.rb +175 -0
  89. data/app/helpers/admin/view_helper.rb +76 -0
  90. data/app/mailers/passcode_mailer.rb +11 -0
  91. data/app/models/administrator.rb +146 -0
  92. data/app/views/admin/administrators/_form.html.erb +16 -0
  93. data/app/views/admin/administrators/_index.html.erb +20 -0
  94. data/app/views/admin/administrators/_search.html.erb +5 -0
  95. data/app/views/admin/administrators/_show.html.erb +14 -0
  96. data/app/views/admin/help/help_link.html.erb +16 -0
  97. data/app/views/admin/session/form.html.erb +52 -0
  98. data/app/views/admin/shared/_flash_messages.html.erb +42 -0
  99. data/app/views/admin/shared/_footer.html.erb +8 -0
  100. data/app/views/admin/shared/_head.html.erb +11 -0
  101. data/app/views/admin/shared/_header.html.erb +43 -0
  102. data/app/views/admin/shared/_navigation.html.erb +47 -0
  103. data/app/views/admin/shared/_skiplinks.html.erb +0 -0
  104. data/app/views/admin/shared/forms/_attachment_field.html.erb +17 -0
  105. data/app/views/admin/shared/forms/_has_many.html.erb +14 -0
  106. data/app/views/admin/shared/forms/_has_many_header.html.erb +19 -0
  107. data/app/views/admin/shared/forms/_image_association_select.html.erb +6 -0
  108. data/app/views/admin/shared/forms/_image_field.html.erb +19 -0
  109. data/app/views/admin/shared/forms/_markdown_composer.html.erb +29 -0
  110. data/app/views/admin/shared/forms/_searchable_select.html.erb +3 -0
  111. data/app/views/admin/shared/forms/_slug_field.html.erb +9 -0
  112. data/app/views/admin/shared/forms/_swatch_field.html.erb +4 -0
  113. data/app/views/admin/shared/forms/_timestamp_field.html.erb +19 -0
  114. data/app/views/admin/tolaria_resource/_form_buttons.html.erb +10 -0
  115. data/app/views/admin/tolaria_resource/_index_table.html.erb +73 -0
  116. data/app/views/admin/tolaria_resource/_search_form.html.erb +32 -0
  117. data/app/views/admin/tolaria_resource/_show_buttons.html.erb +13 -0
  118. data/app/views/admin/tolaria_resource/edit.html.erb +34 -0
  119. data/app/views/admin/tolaria_resource/index.html.erb +36 -0
  120. data/app/views/admin/tolaria_resource/new.html.erb +1 -0
  121. data/app/views/admin/tolaria_resource/show.html.erb +52 -0
  122. data/app/views/kaminari/admin/_first_page.html.erb +9 -0
  123. data/app/views/kaminari/admin/_last_page.html.erb +9 -0
  124. data/app/views/kaminari/admin/_next_page.html.erb +9 -0
  125. data/app/views/kaminari/admin/_page.html.erb +17 -0
  126. data/app/views/kaminari/admin/_paginator.html.erb +21 -0
  127. data/app/views/kaminari/admin/_prev_page.html.erb +9 -0
  128. data/app/views/layouts/admin/admin.html.erb +21 -0
  129. data/app/views/layouts/admin/sessions.html.erb +12 -0
  130. data/app/views/passcode_mailer/passcode.text.erb +5 -0
  131. data/lib/generators/tolaria/install/install_generator.rb +21 -0
  132. data/lib/generators/tolaria/install/templates/administrators_migration.rb +31 -0
  133. data/lib/generators/tolaria/install/templates/tolaria_initializer.rb +93 -0
  134. data/lib/tasks/admin.rake +32 -0
  135. data/lib/tolaria.rb +27 -0
  136. data/lib/tolaria/active_record.rb +55 -0
  137. data/lib/tolaria/admin.rb +4 -0
  138. data/lib/tolaria/categories.rb +21 -0
  139. data/lib/tolaria/config.rb +40 -0
  140. data/lib/tolaria/default_config.rb +74 -0
  141. data/lib/tolaria/engine.rb +23 -0
  142. data/lib/tolaria/form_buildable.rb +203 -0
  143. data/lib/tolaria/help_links.rb +78 -0
  144. data/lib/tolaria/introspection.rb +13 -0
  145. data/lib/tolaria/manage.rb +57 -0
  146. data/lib/tolaria/managed_class.rb +90 -0
  147. data/lib/tolaria/markdown.rb +28 -0
  148. data/lib/tolaria/random_tokens.rb +16 -0
  149. data/lib/tolaria/reload.rb +21 -0
  150. data/lib/tolaria/routes.rb +33 -0
  151. data/lib/tolaria/version.rb +13 -0
  152. data/test/demo/Rakefile +4 -0
  153. data/test/demo/app/assets/javascripts/application.js +1 -0
  154. data/test/demo/app/assets/stylesheets/application.scss +1 -0
  155. data/test/demo/app/controllers/application_controller.rb +5 -0
  156. data/test/demo/app/controllers/concerns/.keep +0 -0
  157. data/test/demo/app/controllers/homepage_controller.rb +4 -0
  158. data/test/demo/app/helpers/application_helper.rb +2 -0
  159. data/test/demo/app/mailers/.keep +0 -0
  160. data/test/demo/app/models/.keep +0 -0
  161. data/test/demo/app/models/blog_post.rb +43 -0
  162. data/test/demo/app/models/footnote.rb +5 -0
  163. data/test/demo/app/models/image.rb +19 -0
  164. data/test/demo/app/models/legal_page.rb +24 -0
  165. data/test/demo/app/models/miscellany.rb +12 -0
  166. data/test/demo/app/models/topic.rb +22 -0
  167. data/test/demo/app/models/video.rb +16 -0
  168. data/test/demo/app/views/admin/blog_posts/_form.html.erb +48 -0
  169. data/test/demo/app/views/admin/blog_posts/_search.html.erb +5 -0
  170. data/test/demo/app/views/admin/help/markdown-help.md +95 -0
  171. data/test/demo/app/views/admin/images/_form.html.erb +26 -0
  172. data/test/demo/app/views/admin/legal_pages/_form.html.erb +15 -0
  173. data/test/demo/app/views/admin/topics/_form.html.erb +3 -0
  174. data/test/demo/app/views/admin/videos/_form.html.erb +11 -0
  175. data/test/demo/app/views/homepage/homepage.html.erb +3 -0
  176. data/test/demo/app/views/layouts/application.html.erb +14 -0
  177. data/test/demo/bin/bundle +3 -0
  178. data/test/demo/bin/rails +4 -0
  179. data/test/demo/bin/rake +4 -0
  180. data/test/demo/bin/setup +29 -0
  181. data/test/demo/config.ru +4 -0
  182. data/test/demo/config/application.rb +26 -0
  183. data/test/demo/config/boot.rb +4 -0
  184. data/test/demo/config/database.yml +18 -0
  185. data/test/demo/config/environment.rb +3 -0
  186. data/test/demo/config/environments/development.rb +43 -0
  187. data/test/demo/config/environments/test.rb +44 -0
  188. data/test/demo/config/initializers/assets.rb +11 -0
  189. data/test/demo/config/initializers/cookies_serializer.rb +2 -0
  190. data/test/demo/config/initializers/filter_parameter_logging.rb +3 -0
  191. data/test/demo/config/initializers/inflections.rb +17 -0
  192. data/test/demo/config/initializers/markdown.rb +44 -0
  193. data/test/demo/config/initializers/secret_token.rb +2 -0
  194. data/test/demo/config/initializers/session_store.rb +2 -0
  195. data/test/demo/config/initializers/tolaria.rb +17 -0
  196. data/test/demo/config/initializers/wrap_parameters.rb +14 -0
  197. data/test/demo/config/routes.rb +4 -0
  198. data/test/demo/db/migrate/20150601202901_create_administrators.rb +31 -0
  199. data/test/demo/db/migrate/20150603204006_add_testing_models.rb +27 -0
  200. data/test/demo/db/migrate/20150609232013_create_footnotes.rb +10 -0
  201. data/test/demo/db/migrate/20150610135235_create_additional_demo_objects.rb +50 -0
  202. data/test/demo/db/schema.rb +112 -0
  203. data/test/demo/log/.keep +0 -0
  204. data/test/demo/public/404.html +67 -0
  205. data/test/demo/public/422.html +67 -0
  206. data/test/demo/public/500.html +66 -0
  207. data/test/demo/public/favicon.ico +0 -0
  208. data/test/integration/help_link_test.rb +73 -0
  209. data/test/integration/interface_test.rb +63 -0
  210. data/test/integration/router_test.rb +73 -0
  211. data/test/integration/session_test.rb +88 -0
  212. data/test/test_helper.rb +58 -0
  213. data/test/unit/configuration_test.rb +21 -0
  214. data/test/unit/managed_classes_test.rb +54 -0
  215. data/test/unit/markdown_test.rb +12 -0
  216. data/test/unit/menu_test.rb +32 -0
  217. data/test/unit/random_tokens_test.rb +13 -0
  218. data/tolaria.gemspec +35 -0
  219. metadata +499 -0
@@ -0,0 +1,90 @@
1
+ # This class wraps an ActiveRecord::Base descendant
2
+ # and stores information that Tolaria needs to track about it
3
+
4
+ module Tolaria
5
+ class ManagedClass
6
+
7
+ # The ActiveRecord::Base model we’re managing
8
+ attr_accessor :klass
9
+
10
+ # The navigation category and order to use for this resource
11
+ attr_accessor :category
12
+
13
+ # Items are sorted with lowest priority first in the menu
14
+ attr_accessor :priority
15
+
16
+ # The FontAwesome icon to use for this resource
17
+ attr_accessor :icon
18
+
19
+ # An array of options to pass to `params.permit` for this model
20
+ attr_accessor :permitted_params
21
+
22
+ # The default sort order for this resource
23
+ attr_accessor :default_order
24
+
25
+ # Enable or disable automatic pagination for this model.
26
+ attr_accessor :paginated
27
+
28
+ # An auto-generated controller name for this resource in the Admin namespace
29
+ attr_accessor :controller_name
30
+
31
+ # An array of the route actions allowed on this resource.
32
+ # Tolaria will pass this array as the `only:` option to the router
33
+ attr_accessor :allowed_actions
34
+
35
+ # A stored symbol for the `params.permit` key for this resource
36
+ attr_accessor :param_key
37
+
38
+ # A factory method that registers a new model in Tolaria and configures
39
+ # its menu and param settings. Developers should use `ActiveRecord::Base.manage_with_tolaria`
40
+ def self.create(klass, icon:"file-o", permit_params:[], priority:10, category:"Settings", default_order:"id DESC", paginated:true, allowed_actions:%i[index show new create edit update destroy])
41
+
42
+ managed_class = self.new
43
+ managed_class.klass = klass
44
+
45
+ # Assign the passed in setting
46
+ managed_class.icon = icon.to_s.freeze
47
+ managed_class.priority = priority.to_i
48
+ managed_class.category = category.to_s.freeze
49
+ managed_class.default_order = default_order.to_s.freeze
50
+ managed_class.paginated = paginated.present?
51
+ managed_class.permitted_params = permit_params.freeze
52
+ managed_class.allowed_actions = allowed_actions.freeze
53
+
54
+ # Set auto-generated attributes
55
+ managed_class.controller_name = "#{managed_class.model_name.name.pluralize}Controller".freeze
56
+ managed_class.param_key = managed_class.model_name.singular.to_sym
57
+
58
+ return managed_class
59
+
60
+ end
61
+
62
+ # True if the given symbol is in the managed class's allowed_actions array.
63
+ def allows?(action)
64
+ self.allowed_actions.include?(action)
65
+ end
66
+
67
+ # True if this managed class should be paginated
68
+ def paginated?
69
+ self.paginated
70
+ end
71
+
72
+ # True if there are no resources in the database for this class
73
+ def no_resources?
74
+ self.klass.count.eql?(0)
75
+ end
76
+
77
+ # Defer to the ActiveRecord::Base model_name system for producing
78
+ # pleasant user-interface names for this resource
79
+ def model_name
80
+ self.klass.model_name
81
+ end
82
+
83
+ # Delegate model_name methods to model_name
84
+ delegate :route_key, to: :model_name
85
+ delegate :singular, to: :model_name
86
+ delegate :singular_route_key, to: :model_name
87
+ delegate :plural, to: :model_name
88
+
89
+ end
90
+ end
@@ -0,0 +1,28 @@
1
+ module Tolaria
2
+
3
+ # A class to contain a workflow for rendering Markdown.
4
+ # If no renderer has been configured, defer to simple_format.
5
+ class MarkdownRendererProxy
6
+
7
+ include ::ActionView::Helpers::TextHelper
8
+
9
+ # Calls the configured Markdown renderer, if none exists
10
+ # then uses simple_format to return more than nothing.
11
+ def render(document)
12
+ if Tolaria.config.markdown_renderer.nil?
13
+ return simple_format(document)
14
+ else
15
+ @markdown_renderer ||= Tolaria.config.markdown_renderer.constantize
16
+ return @markdown_renderer.render(document)
17
+ end
18
+ end
19
+
20
+ end
21
+
22
+ # Calls the configured Markdown renderer
23
+ def self.render_markdown(document)
24
+ @markdown_renderer ||= Tolaria::MarkdownRendererProxy.new
25
+ return @markdown_renderer.render(document)
26
+ end
27
+
28
+ end
@@ -0,0 +1,16 @@
1
+ module Tolaria
2
+ module RandomTokens
3
+
4
+ # Returns a 32-character random, alphanumeric string suitable for stronger
5
+ # tokens use like cookies and API keys
6
+ def self.auth_token
7
+ SecureRandom.base64(32).delete("+/=")[0..31]
8
+ end
9
+
10
+ # Returns a six-digit numeric code suitable for use as a one-time passphrase
11
+ def self.passcode
12
+ "%06d" % SecureRandom.random_number(1_000_000)
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,21 @@
1
+ module Tolaria
2
+
3
+ # To provide admin pane development magic, Tolaria has this method
4
+ # to force Rails to autoload/reload all model files.
5
+ def self.reload!
6
+
7
+ # Re/Initalize HelpLinks
8
+ self.initialize_help_links!
9
+
10
+ # Manage the models included with the engine
11
+ Administrator.generate_tolaria_bindings!
12
+
13
+ # Reference each ActiveRecord::Base model so Rails autoloads it or
14
+ # reloads changed files. Call generate_tolaria_bindings! on them.
15
+ Dir["#{Rails.root}/app/models/*.rb"].each do |file|
16
+ File.basename(file, ".rb").camelize.safe_constantize.try(:generate_tolaria_bindings!)
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,33 @@
1
+ module Tolaria
2
+
3
+ # The developer calls `Tolaria.draw_routes(self)` inside the
4
+ # router’s scope. Tolaria automatically adds routes for managed classes.
5
+ def self.draw_routes(router)
6
+
7
+ self.reload!
8
+
9
+ router.instance_exec(managed_classes) do |managed_classes|
10
+ namespace :admin do
11
+
12
+ # Create routes for AdminController
13
+ root to:"admin#root", as:"root"
14
+ get "help/:slug", to:"admin#help_link", as:"help_link"
15
+ post "api/markdown", to:"admin#markdown"
16
+
17
+ # Create routes for the authentication/passcode flow
18
+ get "signin", to:"sessions#new", as:"new_session"
19
+ post "signin/code", to:"sessions#request_code"
20
+ post "signin", to:"sessions#create"
21
+ delete "signout", to:"sessions#destroy", as:"destroy_session"
22
+
23
+ # Create routes for every managed class
24
+ managed_classes.each do |managed_class|
25
+ resources managed_class.plural, only:managed_class.allowed_actions
26
+ end
27
+
28
+ end
29
+ end
30
+
31
+ end
32
+
33
+ end
@@ -0,0 +1,13 @@
1
+ module Tolaria
2
+
3
+ # Returns Tolaria’s version number
4
+ def self.version
5
+ Gem::Version.new("1.0.0")
6
+ end
7
+
8
+ module VERSION
9
+ MAJOR, MINOR, TINY, PRE = Tolaria.version.segments
10
+ STRING = Tolaria.version.to_s
11
+ end
12
+
13
+ end
@@ -0,0 +1,4 @@
1
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
2
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
+ require File.expand_path("../config/application", __FILE__)
4
+ Rails.application.load_tasks
@@ -0,0 +1 @@
1
+ // Empty on purpose
@@ -0,0 +1 @@
1
+ // Empty on purpose
@@ -0,0 +1,5 @@
1
+ class ApplicationController < ActionController::Base
2
+ # Prevent CSRF attacks by raising an exception.
3
+ # For APIs, you may want to use :null_session instead.
4
+ protect_from_forgery with: :exception
5
+ end
@@ -0,0 +1,4 @@
1
+ class HomepageController < ApplicationController
2
+ def homepage
3
+ end
4
+ end
@@ -0,0 +1,2 @@
1
+ module ApplicationHelper
2
+ end
File without changes
File without changes
@@ -0,0 +1,43 @@
1
+ class BlogPost < ActiveRecord::Base
2
+
3
+ has_and_belongs_to_many :topics, join_table:"blog_post_topics"
4
+ has_many :footnotes
5
+ accepts_nested_attributes_for :footnotes, allow_destroy: true
6
+
7
+ validates_presence_of :title
8
+ validates_presence_of :summary
9
+ validates_presence_of :published_at
10
+ validates_presence_of :body
11
+
12
+ manage_with_tolaria using: {
13
+ icon: "pencil-square-o",
14
+ priority: 1,
15
+ default_order: "id DESC",
16
+ category: "Prose",
17
+ paginated: true,
18
+ permit_params: [
19
+ :title,
20
+ :summary,
21
+ :body,
22
+ :published_at,
23
+ :color,
24
+ :portrait,
25
+ :attachment,
26
+ topic_ids: [],
27
+ footnotes_attributes: [
28
+ :_destroy,
29
+ :id,
30
+ :url,
31
+ :description,
32
+ ]
33
+ ],
34
+ }
35
+
36
+ after_initialize :initalize_published_at!
37
+ def initalize_published_at!
38
+ self.published_at ||= Time.current
39
+ rescue ActiveModel::MissingAttributeError
40
+ # Swallow this exception
41
+ end
42
+
43
+ end
@@ -0,0 +1,5 @@
1
+ class Footnote < ActiveRecord::Base
2
+ belongs_to :blog_post
3
+ validates_presence_of :description
4
+ validates_presence_of :url
5
+ end
@@ -0,0 +1,19 @@
1
+ class Image < ActiveRecord::Base
2
+
3
+ validates_presence_of :title
4
+ validates_presence_of :attachment_address
5
+
6
+ manage_with_tolaria using: {
7
+ icon: :image,
8
+ priority: 1,
9
+ category: "Media",
10
+ permit_params: [
11
+ :title,
12
+ :alternate_text,
13
+ :credit,
14
+ :keywords,
15
+ :attachment_address,
16
+ ],
17
+ }
18
+
19
+ end
@@ -0,0 +1,24 @@
1
+ class LegalPage < ActiveRecord::Base
2
+
3
+ validates_presence_of :title
4
+ validates_presence_of :summary
5
+ validates_presence_of :slug
6
+
7
+ manage_with_tolaria using: {
8
+ icon: "gavel",
9
+ priority: 100,
10
+ category: "Prose",
11
+ permit_params: [
12
+ :title,
13
+ :slug,
14
+ :summary,
15
+ :body
16
+ ],
17
+ }
18
+
19
+ before_validation :set_slug!
20
+ def set_slug!
21
+ self.slug = self.slug.parameterize if self.slug.present?
22
+ end
23
+
24
+ end
@@ -0,0 +1,12 @@
1
+ class Miscellany < ActiveRecord::Base
2
+
3
+ manage_with_tolaria using:{
4
+ icon: "cogs",
5
+ category: "Settings",
6
+ allowed_actions: [:index, :show, :edit],
7
+ permit_params: [
8
+ :value
9
+ ],
10
+ }
11
+
12
+ end
@@ -0,0 +1,22 @@
1
+ class Topic < ActiveRecord::Base
2
+
3
+ has_and_belongs_to_many :blog_posts, join_table:"blog_post_topics"
4
+
5
+ validates_presence_of :label
6
+ validates_presence_of :slug
7
+
8
+ before_validation :set_slug!
9
+ def set_slug!
10
+ self.slug = self.label.parameterize if self.label.present?
11
+ end
12
+
13
+ manage_with_tolaria using:{
14
+ icon: :leaf,
15
+ category: "Prose",
16
+ permit_params: [
17
+ :label,
18
+ :slug,
19
+ ],
20
+ }
21
+
22
+ end
@@ -0,0 +1,16 @@
1
+ class Video < ActiveRecord::Base
2
+
3
+ validates_presence_of :title
4
+ validates_presence_of :youtube_id
5
+
6
+ manage_with_tolaria using:{
7
+ icon: "youtube-play",
8
+ category: "Media",
9
+ permit_params: [
10
+ :title,
11
+ :yotube_id,
12
+ :description,
13
+ ],
14
+ }
15
+
16
+ end
@@ -0,0 +1,48 @@
1
+ <%= f.label :title, "Post Title" %>
2
+ <%= f.slug_field :title, placeholder:"Post title", pattern:"/blog/255-*" %>
3
+ <%= f.hint "The title of this post. The title is featured prominently across the site and used to construct the page URL. A good title is both summarizing and enticing, much like a newspaper headline." %>
4
+
5
+ <%= f.label :published_at, "Publishing Date" %>
6
+ <%= f.timestamp_field :published_at %>
7
+ <%= f.hint %{
8
+ The date this post should be published.
9
+ Published posts with a date set in the future will be scheduled to appear on that date.
10
+ } %>
11
+
12
+ <%= f.label :title, "Topics" %>
13
+ <%= f.searchable_select :topic_ids, Topic.order("label ASC"), :id, :label, multiple:true, placeholder:"Select topics" %>
14
+ <%= f.hint "Chose some topics for this blog post" %>
15
+
16
+ <%= f.label :color, "Background Color" %>
17
+ <%= f.swatch_field :color, placeholder:"#CC0000" %>
18
+ <%= f.hint "Choose a background color for this campaign" %>
19
+
20
+ <%= f.label :summary %>
21
+ <%= f.text_area :summary, rows:3, placeholder:"Summary for search engines and social media" %>
22
+ <%= f.hint "Summarize this post in less than 300 characters. The summary is used for blog listings and the SEO/social metadata for the page." %>
23
+
24
+ <%= f.label :portrait, "Portrait" %>
25
+ <%= f.image_field :portrait, preview_url:"http://f.cl.ly/items/0H2g1v100l470l2c381A/slack-imgs.com.jpeg" %>
26
+ <%= f.hint "Attach a portrait of this author, at least 600×600 pixels in size. The subject should be centered." %>
27
+
28
+ <%= f.label :attachment, "File Download" %>
29
+ <%= f.attachment_field :attachment %>
30
+ <%= f.hint "Attach a portrait of this author, at least 600×600 pixels in size. The subject should be centered." %>
31
+
32
+ <%= f.label :body, "Body" %>
33
+ <%= f.markdown_composer :body %>
34
+ <%= f.hint "The body of this post. You can use Markdown!" %>
35
+
36
+ <%= f.has_many :footnotes do |ff| %>
37
+
38
+ <%= ff.has_many_header allow_destroy:true %>
39
+
40
+ <%= ff.label :description %>
41
+ <%= ff.text_field :description %>
42
+ <%= ff.hint "The name or other description of this reference" %>
43
+
44
+ <%= ff.label :url, "URL" %>
45
+ <%= ff.text_field :url, class:"monospace" %>
46
+ <%= ff.hint "A full URL to the source or reference material" %>
47
+
48
+ <% end %>