tolaria 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +66 -0
- data/.yardopts +4 -0
- data/CNAME +1 -0
- data/CONTRIBUTING.md +32 -0
- data/Gemfile +2 -0
- data/LICENSE.md +9 -0
- data/README.md +538 -0
- data/Rakefile +52 -0
- data/app/assets/fonts/admin/fontawesome.eot +0 -0
- data/app/assets/fonts/admin/fontawesome.svg +565 -0
- data/app/assets/fonts/admin/fontawesome.ttf +0 -0
- data/app/assets/fonts/admin/fontawesome.woff +0 -0
- data/app/assets/fonts/admin/fontawesome.woff2 +0 -0
- data/app/assets/images/admin/columbia_banner.png +0 -0
- data/app/assets/images/admin/favicon.ico +0 -0
- data/app/assets/images/admin/noise.png +0 -0
- data/app/assets/images/admin/select_arrows.svg +1 -0
- data/app/assets/javascripts/admin/admin.js +4 -0
- data/app/assets/javascripts/admin/base.js +12 -0
- data/app/assets/javascripts/admin/lib/backbone.js +1888 -0
- data/app/assets/javascripts/admin/lib/jquery.chosen.js +1272 -0
- data/app/assets/javascripts/admin/lib/jquery.js +10361 -0
- data/app/assets/javascripts/admin/lib/jquery.selection.js +352 -0
- data/app/assets/javascripts/admin/lib/moment.js +3103 -0
- data/app/assets/javascripts/admin/lib/no.js +6 -0
- data/app/assets/javascripts/admin/lib/underscore.js +1570 -0
- data/app/assets/javascripts/admin/models/composer_buttons.js +45 -0
- data/app/assets/javascripts/admin/models/rails_meta.js +4 -0
- data/app/assets/javascripts/admin/views/field_with_errors.js +19 -0
- data/app/assets/javascripts/admin/views/fields/attachment_field.js +32 -0
- data/app/assets/javascripts/admin/views/fields/has_many.js +64 -0
- data/app/assets/javascripts/admin/views/fields/image_association_select.js +31 -0
- data/app/assets/javascripts/admin/views/fields/markdown_composer.js +167 -0
- data/app/assets/javascripts/admin/views/fields/searchable_select.js +70 -0
- data/app/assets/javascripts/admin/views/fields/slug_field.js +38 -0
- data/app/assets/javascripts/admin/views/fields/swatch_field.js +55 -0
- data/app/assets/javascripts/admin/views/fields/timestamp_field.js +80 -0
- data/app/assets/javascripts/admin/views/flash_message.js +18 -0
- data/app/assets/javascripts/admin/views/form_orchestrator.js +41 -0
- data/app/assets/javascripts/admin/views/navigation.js +20 -0
- data/app/assets/javascripts/admin/views/resource_form.js +18 -0
- data/app/assets/javascripts/admin/views/search_form.js +20 -0
- data/app/assets/javascripts/admin/views/sessions.js +109 -0
- data/app/assets/javascripts/admin/views/virtual_form.js +47 -0
- data/app/assets/stylesheets/admin/_base.scss +5 -0
- data/app/assets/stylesheets/admin/_reset.scss +149 -0
- data/app/assets/stylesheets/admin/_root.scss +63 -0
- data/app/assets/stylesheets/admin/admin.scss +4 -0
- data/app/assets/stylesheets/admin/components/_blank_slate.scss +44 -0
- data/app/assets/stylesheets/admin/components/_buttons.scss +82 -0
- data/app/assets/stylesheets/admin/components/_flash_message.scss +64 -0
- data/app/assets/stylesheets/admin/components/_footer.scss +9 -0
- data/app/assets/stylesheets/admin/components/_header.scss +107 -0
- data/app/assets/stylesheets/admin/components/_index_table.scss +120 -0
- data/app/assets/stylesheets/admin/components/_main.scss +68 -0
- data/app/assets/stylesheets/admin/components/_markdown_body.scss +109 -0
- data/app/assets/stylesheets/admin/components/_navigation.scss +110 -0
- data/app/assets/stylesheets/admin/components/_pagination.scss +36 -0
- data/app/assets/stylesheets/admin/components/_pill.scss +11 -0
- data/app/assets/stylesheets/admin/components/_resource_form.scss +222 -0
- data/app/assets/stylesheets/admin/components/_search_form.scss +36 -0
- data/app/assets/stylesheets/admin/components/_sessions.scss +152 -0
- data/app/assets/stylesheets/admin/components/_show_table.scss +67 -0
- data/app/assets/stylesheets/admin/components/forms/_attachment_field.scss +59 -0
- data/app/assets/stylesheets/admin/components/forms/_chosen.scss +478 -0
- data/app/assets/stylesheets/admin/components/forms/_image_association_select.scss +20 -0
- data/app/assets/stylesheets/admin/components/forms/_markdown_composer.scss +149 -0
- data/app/assets/stylesheets/admin/components/forms/_nested_fields.scss +63 -0
- data/app/assets/stylesheets/admin/components/forms/_searchable_select.scss +8 -0
- data/app/assets/stylesheets/admin/components/forms/_slug_field.scss +20 -0
- data/app/assets/stylesheets/admin/components/forms/_swatch_field.scss +47 -0
- data/app/assets/stylesheets/admin/components/forms/_timestamp_field.scss +15 -0
- data/app/assets/stylesheets/admin/components/help_link.scss +6 -0
- data/app/assets/stylesheets/admin/mixins/_clearfix.scss +18 -0
- data/app/assets/stylesheets/admin/mixins/_min_max_width.scss +11 -0
- data/app/assets/stylesheets/admin/mixins/_rgbb.scss +7 -0
- data/app/assets/stylesheets/admin/mixins/_visuallyhidden.scss +33 -0
- data/app/assets/stylesheets/admin/settings/_animations.scss +21 -0
- data/app/assets/stylesheets/admin/settings/_breakpoints.scss +2 -0
- data/app/assets/stylesheets/admin/settings/_colors.scss +32 -0
- data/app/assets/stylesheets/admin/settings/_fonts.scss +31 -0
- data/app/assets/stylesheets/admin/settings/_icons.scss +1658 -0
- data/app/controllers/admin/admin_controller.rb +21 -0
- data/app/controllers/admin/sessions_controller.rb +112 -0
- data/app/controllers/tolaria/resource_controller.rb +132 -0
- data/app/controllers/tolaria/tolaria_controller.rb +40 -0
- data/app/helpers/admin/table_helper.rb +175 -0
- data/app/helpers/admin/view_helper.rb +76 -0
- data/app/mailers/passcode_mailer.rb +11 -0
- data/app/models/administrator.rb +146 -0
- data/app/views/admin/administrators/_form.html.erb +16 -0
- data/app/views/admin/administrators/_index.html.erb +20 -0
- data/app/views/admin/administrators/_search.html.erb +5 -0
- data/app/views/admin/administrators/_show.html.erb +14 -0
- data/app/views/admin/help/help_link.html.erb +16 -0
- data/app/views/admin/session/form.html.erb +52 -0
- data/app/views/admin/shared/_flash_messages.html.erb +42 -0
- data/app/views/admin/shared/_footer.html.erb +8 -0
- data/app/views/admin/shared/_head.html.erb +11 -0
- data/app/views/admin/shared/_header.html.erb +43 -0
- data/app/views/admin/shared/_navigation.html.erb +47 -0
- data/app/views/admin/shared/_skiplinks.html.erb +0 -0
- data/app/views/admin/shared/forms/_attachment_field.html.erb +17 -0
- data/app/views/admin/shared/forms/_has_many.html.erb +14 -0
- data/app/views/admin/shared/forms/_has_many_header.html.erb +19 -0
- data/app/views/admin/shared/forms/_image_association_select.html.erb +6 -0
- data/app/views/admin/shared/forms/_image_field.html.erb +19 -0
- data/app/views/admin/shared/forms/_markdown_composer.html.erb +29 -0
- data/app/views/admin/shared/forms/_searchable_select.html.erb +3 -0
- data/app/views/admin/shared/forms/_slug_field.html.erb +9 -0
- data/app/views/admin/shared/forms/_swatch_field.html.erb +4 -0
- data/app/views/admin/shared/forms/_timestamp_field.html.erb +19 -0
- data/app/views/admin/tolaria_resource/_form_buttons.html.erb +10 -0
- data/app/views/admin/tolaria_resource/_index_table.html.erb +73 -0
- data/app/views/admin/tolaria_resource/_search_form.html.erb +32 -0
- data/app/views/admin/tolaria_resource/_show_buttons.html.erb +13 -0
- data/app/views/admin/tolaria_resource/edit.html.erb +34 -0
- data/app/views/admin/tolaria_resource/index.html.erb +36 -0
- data/app/views/admin/tolaria_resource/new.html.erb +1 -0
- data/app/views/admin/tolaria_resource/show.html.erb +52 -0
- data/app/views/kaminari/admin/_first_page.html.erb +9 -0
- data/app/views/kaminari/admin/_last_page.html.erb +9 -0
- data/app/views/kaminari/admin/_next_page.html.erb +9 -0
- data/app/views/kaminari/admin/_page.html.erb +17 -0
- data/app/views/kaminari/admin/_paginator.html.erb +21 -0
- data/app/views/kaminari/admin/_prev_page.html.erb +9 -0
- data/app/views/layouts/admin/admin.html.erb +21 -0
- data/app/views/layouts/admin/sessions.html.erb +12 -0
- data/app/views/passcode_mailer/passcode.text.erb +5 -0
- data/lib/generators/tolaria/install/install_generator.rb +21 -0
- data/lib/generators/tolaria/install/templates/administrators_migration.rb +31 -0
- data/lib/generators/tolaria/install/templates/tolaria_initializer.rb +93 -0
- data/lib/tasks/admin.rake +32 -0
- data/lib/tolaria.rb +27 -0
- data/lib/tolaria/active_record.rb +55 -0
- data/lib/tolaria/admin.rb +4 -0
- data/lib/tolaria/categories.rb +21 -0
- data/lib/tolaria/config.rb +40 -0
- data/lib/tolaria/default_config.rb +74 -0
- data/lib/tolaria/engine.rb +23 -0
- data/lib/tolaria/form_buildable.rb +203 -0
- data/lib/tolaria/help_links.rb +78 -0
- data/lib/tolaria/introspection.rb +13 -0
- data/lib/tolaria/manage.rb +57 -0
- data/lib/tolaria/managed_class.rb +90 -0
- data/lib/tolaria/markdown.rb +28 -0
- data/lib/tolaria/random_tokens.rb +16 -0
- data/lib/tolaria/reload.rb +21 -0
- data/lib/tolaria/routes.rb +33 -0
- data/lib/tolaria/version.rb +13 -0
- data/test/demo/Rakefile +4 -0
- data/test/demo/app/assets/javascripts/application.js +1 -0
- data/test/demo/app/assets/stylesheets/application.scss +1 -0
- data/test/demo/app/controllers/application_controller.rb +5 -0
- data/test/demo/app/controllers/concerns/.keep +0 -0
- data/test/demo/app/controllers/homepage_controller.rb +4 -0
- data/test/demo/app/helpers/application_helper.rb +2 -0
- data/test/demo/app/mailers/.keep +0 -0
- data/test/demo/app/models/.keep +0 -0
- data/test/demo/app/models/blog_post.rb +43 -0
- data/test/demo/app/models/footnote.rb +5 -0
- data/test/demo/app/models/image.rb +19 -0
- data/test/demo/app/models/legal_page.rb +24 -0
- data/test/demo/app/models/miscellany.rb +12 -0
- data/test/demo/app/models/topic.rb +22 -0
- data/test/demo/app/models/video.rb +16 -0
- data/test/demo/app/views/admin/blog_posts/_form.html.erb +48 -0
- data/test/demo/app/views/admin/blog_posts/_search.html.erb +5 -0
- data/test/demo/app/views/admin/help/markdown-help.md +95 -0
- data/test/demo/app/views/admin/images/_form.html.erb +26 -0
- data/test/demo/app/views/admin/legal_pages/_form.html.erb +15 -0
- data/test/demo/app/views/admin/topics/_form.html.erb +3 -0
- data/test/demo/app/views/admin/videos/_form.html.erb +11 -0
- data/test/demo/app/views/homepage/homepage.html.erb +3 -0
- data/test/demo/app/views/layouts/application.html.erb +14 -0
- data/test/demo/bin/bundle +3 -0
- data/test/demo/bin/rails +4 -0
- data/test/demo/bin/rake +4 -0
- data/test/demo/bin/setup +29 -0
- data/test/demo/config.ru +4 -0
- data/test/demo/config/application.rb +26 -0
- data/test/demo/config/boot.rb +4 -0
- data/test/demo/config/database.yml +18 -0
- data/test/demo/config/environment.rb +3 -0
- data/test/demo/config/environments/development.rb +43 -0
- data/test/demo/config/environments/test.rb +44 -0
- data/test/demo/config/initializers/assets.rb +11 -0
- data/test/demo/config/initializers/cookies_serializer.rb +2 -0
- data/test/demo/config/initializers/filter_parameter_logging.rb +3 -0
- data/test/demo/config/initializers/inflections.rb +17 -0
- data/test/demo/config/initializers/markdown.rb +44 -0
- data/test/demo/config/initializers/secret_token.rb +2 -0
- data/test/demo/config/initializers/session_store.rb +2 -0
- data/test/demo/config/initializers/tolaria.rb +17 -0
- data/test/demo/config/initializers/wrap_parameters.rb +14 -0
- data/test/demo/config/routes.rb +4 -0
- data/test/demo/db/migrate/20150601202901_create_administrators.rb +31 -0
- data/test/demo/db/migrate/20150603204006_add_testing_models.rb +27 -0
- data/test/demo/db/migrate/20150609232013_create_footnotes.rb +10 -0
- data/test/demo/db/migrate/20150610135235_create_additional_demo_objects.rb +50 -0
- data/test/demo/db/schema.rb +112 -0
- data/test/demo/log/.keep +0 -0
- data/test/demo/public/404.html +67 -0
- data/test/demo/public/422.html +67 -0
- data/test/demo/public/500.html +66 -0
- data/test/demo/public/favicon.ico +0 -0
- data/test/integration/help_link_test.rb +73 -0
- data/test/integration/interface_test.rb +63 -0
- data/test/integration/router_test.rb +73 -0
- data/test/integration/session_test.rb +88 -0
- data/test/test_helper.rb +58 -0
- data/test/unit/configuration_test.rb +21 -0
- data/test/unit/managed_classes_test.rb +54 -0
- data/test/unit/markdown_test.rb +12 -0
- data/test/unit/menu_test.rb +32 -0
- data/test/unit/random_tokens_test.rb +13 -0
- data/tolaria.gemspec +35 -0
- 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
|
data/test/demo/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
// Empty on purpose
|
@@ -0,0 +1 @@
|
|
1
|
+
// Empty on purpose
|
File without changes
|
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,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,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 %>
|