tolaria 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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 %>