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.
- 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 %>
|