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,9 @@
1
+ <%# Link to the "First" page
2
+ - available local variables
3
+ url: url to the first page
4
+ current_page: a page object for the currently displayed page
5
+ total_pages: total number of pages
6
+ per_page: number of items to fetch per page
7
+ remote: data-remote
8
+ -%>
9
+ <li><%= link_to "First", url, class:"button -page-first" %></li>
@@ -0,0 +1,9 @@
1
+ <%# Link to the "Last" page
2
+ - available local variables
3
+ url: url to the last page
4
+ current_page: a page object for the currently displayed page
5
+ total_pages: total number of pages
6
+ per_page: number of items to fetch per page
7
+ remote: data-remote
8
+ -%>
9
+ <li><%= link_to "Last", url, class:"button -page-last" %></li>
@@ -0,0 +1,9 @@
1
+ <%# Link to the "Next" page
2
+ - available local variables
3
+ url: url to the next page
4
+ current_page: a page object for the currently displayed page
5
+ total_pages: total number of pages
6
+ per_page: number of items to fetch per page
7
+ remote: data-remote
8
+ -%>
9
+ <li><%= link_to "Next", url, class:"button -page-next" %></li>
@@ -0,0 +1,17 @@
1
+ <%# Link showing page number
2
+ - available local variables
3
+ page: a page object for "this" page
4
+ url: url to this page
5
+ current_page: a page object for the currently displayed page
6
+ total_pages: total number of pages
7
+ per_page: number of items to fetch per page
8
+ remote: data-remote
9
+ -%>
10
+ <li>
11
+ <% rel = "next" if page.next? %>
12
+ <% rel = "prev" if page.prev? %>
13
+ <%= link_to page, url, {
14
+ class: (page.current?? "button -primary -page-current" : "button -page"),
15
+ rel: rel,
16
+ } %>
17
+ </li>
@@ -0,0 +1,21 @@
1
+ <%# The container tag
2
+ - available local variables
3
+ current_page: a page object for the currently displayed page
4
+ total_pages: total number of pages
5
+ per_page: number of items to fetch per page
6
+ remote: data-remote
7
+ paginator: the paginator that renders the pagination tags inside
8
+ -%>
9
+ <%= paginator.render do -%>
10
+ <ol class="pagination">
11
+ <%= first_page_tag unless current_page.first? %>
12
+ <%= prev_page_tag unless current_page.first? %>
13
+ <% each_page do |page| -%>
14
+ <% if page.left_outer? || page.right_outer? || page.inside_window? -%>
15
+ <%= page_tag page %>
16
+ <% end -%>
17
+ <% end -%>
18
+ <%= next_page_tag unless current_page.last? %>
19
+ <%= last_page_tag unless current_page.last? %>
20
+ </ol>
21
+ <% end -%>
@@ -0,0 +1,9 @@
1
+ <%# Link to the "Previous" page
2
+ - available local variables
3
+ url: url to the previous page
4
+ current_page: a page object for the currently displayed page
5
+ total_pages: total number of pages
6
+ per_page: number of items to fetch per page
7
+ remote: data-remote
8
+ -%>
9
+ <li><%= link_to "Prev", url, class:"button -page-prev" %></li>
@@ -0,0 +1,21 @@
1
+ <!DOCTYPE html>
2
+ <html class="no-js">
3
+ <%= render "admin/shared/head" %>
4
+ <body class="admin">
5
+
6
+ <%= render "admin/shared/skiplinks" %>
7
+ <%= render "admin/shared/header" %>
8
+ <%= render "admin/shared/flash_messages" %>
9
+
10
+ <div class="application-container">
11
+ <%= render "admin/shared/navigation" %>
12
+ <div id="main" class="main" role="main">
13
+ <%= yield %>
14
+ </div>
15
+ </div>
16
+
17
+ <%= render "admin/shared/footer" %>
18
+ <%= javascript_include_tag "admin/admin" %>
19
+
20
+ </body>
21
+ </html>
@@ -0,0 +1,12 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <%= render "admin/shared/head" %>
4
+ <body class="admin-session">
5
+ <%= render "admin/shared/skiplinks" %>
6
+ <div class="header-stripe">
7
+ <div class="header-stripe-inner"></div>
8
+ </div>
9
+ <%= yield %>
10
+ <%= javascript_include_tag "admin/admin" %>
11
+ </body>
12
+ </html>
@@ -0,0 +1,5 @@
1
+ <%= @passcode %> is your passcode for the <%= Tolaria.config.company_name %> admin system.
2
+
3
+ Enter this passcode on the sign-in form to continue.
4
+
5
+ This passcode is only good for one use. You can delete this email after you sign in.
@@ -0,0 +1,21 @@
1
+ require "rails/generators/migration"
2
+
3
+ module Tolaria
4
+ class InstallGenerator < ::Rails::Generators::Base
5
+ include Rails::Generators::Migration
6
+ source_root File.expand_path("../templates", __FILE__)
7
+
8
+ def install
9
+ copy_file "tolaria_initializer.rb", "config/initializers/tolaria.rb"
10
+ migration_template "administrators_migration.rb", "db/migrate/create_administrators.rb"
11
+ end
12
+
13
+ def self.next_migration_number(dirname)
14
+ if ActiveRecord::Base.timestamped_migrations
15
+ Time.current.utc.strftime("%Y%m%d%H%M%S")
16
+ else
17
+ "%.3d" % (current_migration_number(dirname) + 1)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,31 @@
1
+ class CreateAdministrators < ActiveRecord::Migration
2
+ def change
3
+
4
+ create_table :administrators, force:true do |t|
5
+
6
+ t.timestamps null:false
7
+
8
+ # The email used to log into this account
9
+ t.string :email, null:false, index:true
10
+
11
+ # Visible information about this account
12
+ t.string :name, null:false
13
+ t.string :organization, null:false
14
+
15
+ # Passcode and authentication system fields
16
+
17
+ t.string :passcode, limit:60, null:false
18
+ t.datetime :passcode_expires_at, null:false
19
+
20
+ t.string :auth_token, limit:32, null:false, index:true
21
+
22
+ t.datetime :account_unlocks_at, null:false
23
+ t.integer :lockout_strikes, null:false, default:0
24
+
25
+ t.integer :total_strikes, null:false, default:0
26
+ t.integer :sessions_created, null:false, default:0
27
+
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,93 @@
1
+ # Configuration for Tolaria, the admin framework for making people happy.
2
+
3
+ Tolaria.configure do |config|
4
+
5
+ # The name of the company or group using this admin interface.
6
+ # Used in system navigation, HTML page titles, and the copyright line.
7
+ config.company_name = "Company Name"
8
+
9
+ # Tolaria sends authentication emails. Set the value of the From header here.
10
+ # This is NOT a trivial choice, you might have to get this address
11
+ # whitelisted by your target companies.
12
+ config.from_address = "Rails <tolaria@example.org>"
13
+
14
+ # Redirect the administrator to this route by default when logging in
15
+ # or when no other redirect makes sense.
16
+ config.default_redirect = :admin_administrators
17
+
18
+ # You can assign models to a category to group them on the navigation menu.
19
+ # Add/modify categories by changing the array below.
20
+ # Categories will be in the same order in the menu as they are here.
21
+ config.menu_categories = [
22
+ # "Syndication",
23
+ # "Pages",
24
+ "Settings",
25
+ ]
26
+
27
+ # Tolaria does not come bundled with a Markdown processing strategy.
28
+ # You must provide a string that names a Ruby constant that can process Markdown.
29
+ # The constant must respond to render(document), returning a string of HTML.
30
+ # For example: if you provide "MyMarkDownRenderer", Tolaria will
31
+ # call MyMarkdownRenderer.render(document)
32
+ # If you leave this setting nil, Tolaria will assume that you do not
33
+ # plan to use the markdown_composer form field.
34
+ config.markdown_renderer = nil
35
+
36
+ # You can provide documentation links in the interface header by
37
+ # configuring them below. Add hashes to the array, with these keys:
38
+ #
39
+ # To render a Markdown file, provide a `:title`, the URL fragment `:slug`
40
+ # and a `:markdown_file` path to your Markdown document. The system
41
+ # will automatically draw a route to this view for you and present your file,
42
+ # using the renderer configured in config.markdown_renderer
43
+ #
44
+ # To link to an arbitrary route or URL, provide a `:title` and a `:link_to`.
45
+ # Examples below:
46
+ #
47
+ # config.help_links << {
48
+ # title: "Markdown Reference",
49
+ # slug: "markdown-reference",
50
+ # markdown_file: "/path/to/your/file.md",
51
+ # }
52
+ #
53
+ # config.help_links << {
54
+ # title: "Style Guide",
55
+ # link_to: "http://example.org/styleguide",
56
+ # }
57
+
58
+ # Tolaria attempts to convert model instances to a pretty “display”
59
+ # string for presenting in forms, titles, and listings.
60
+ # You can define `admin_name` on your model to set the string yourself,
61
+ # or you can append your own preferred methods to the front
62
+ # of Tolaria’s list like so:
63
+ # config.display_name_methods.unshift(:method_name)
64
+
65
+ # The number of items on each page when paginating models.
66
+ # Raising this too high might make page loading very slow.
67
+ # config.page_size = 15
68
+
69
+ # ---------------------------------------------------------------------------
70
+ # Change the following passcode and account paranoia settings with caution.
71
+ # Defaults are shown in comments.
72
+ # ---------------------------------------------------------------------------
73
+
74
+ # The length of time, in seconds, that emailed passcodes should be valid.
75
+ # It is STRONGLY RECOMMENDED that you keep this under 30 minutes.
76
+ # config.passcode_lifespan = 10.minutes
77
+
78
+ # The number of times an administrator can flunk their passcode challenge
79
+ # or request a token before Tolaria rate-limits/locks their account.
80
+ # config.lockout_threshold = 10
81
+
82
+ # The length of time that an administrator’s account is disabled after
83
+ # they trip the lockout threshold. There is no unlock strategy besides time.
84
+ # For emergencies, you can manually call unlock_account! on the relevant administrator.
85
+ # config.lockout_duration = 1.hour
86
+
87
+ # The cost factor for bcrypt. Raising this number will increase the
88
+ # wall clock time bcrypt takes to hash a passphrase.
89
+ # It is VERY DANGEROUS to set this below 10 for production code.
90
+ # Use 1 in test mode to speed up your test suite.
91
+ # config.bcrypt_cost = Rails.env.test?? 1 : 13
92
+
93
+ end
@@ -0,0 +1,32 @@
1
+ namespace :admin do
2
+
3
+ desc "Add a new Tolaria Administrator from the command line"
4
+ task :create => :environment do
5
+
6
+ @administrator = Administrator.new
7
+
8
+ STDOUT.puts "Enter the new administrator’s credentials. All fields are required."
9
+
10
+ STDOUT.print "Email address: "
11
+ @administrator.email = STDIN.gets.chomp
12
+
13
+ STDOUT.print "Full name: "
14
+ @administrator.name = STDIN.gets.chomp
15
+
16
+ STDOUT.print "Organization: "
17
+ @administrator.organization = STDIN.gets.chomp
18
+
19
+ if @administrator.save
20
+ STDOUT.puts %{The administrator "#{@administrator.name}" <#{@administrator.email}> was successfully created.}
21
+ exit(true)
22
+ else
23
+ STDOUT.puts "Your changes couldn’t be saved:"
24
+ @administrator.errors.full_messages.each do |message|
25
+ STDOUT.puts message
26
+ end
27
+ exit(false)
28
+ end
29
+
30
+ end
31
+
32
+ end
@@ -0,0 +1,27 @@
1
+ require "securerandom"
2
+ require "digest/md5"
3
+
4
+ require "rails"
5
+ require "sass"
6
+ require "sass-rails"
7
+ require "bcrypt"
8
+ require "kaminari"
9
+ require "ransack"
10
+
11
+ require "tolaria/version"
12
+ require "tolaria/engine"
13
+ require "tolaria/config"
14
+ require "tolaria/default_config"
15
+ require "tolaria/random_tokens"
16
+ require "tolaria/admin"
17
+
18
+ require "tolaria/reload"
19
+ require "tolaria/managed_class"
20
+ require "tolaria/manage"
21
+ require "tolaria/active_record"
22
+ require "tolaria/help_links"
23
+ require "tolaria/routes"
24
+ require "tolaria/introspection"
25
+ require "tolaria/categories"
26
+ require "tolaria/markdown"
27
+ require "tolaria/form_buildable"
@@ -0,0 +1,55 @@
1
+ # Adds a new DSL method to ActiveRecord model definition, allowing the
2
+ # developer to configure a model to manage with Tolaria.
3
+ # The developer passes a hash of configuration options which are
4
+ # forwarded as keyword arguments to Tolaria.manage
5
+
6
+ class ActiveRecord::Base
7
+
8
+ # Register a model with Tolaria and allow administrators to manage it
9
+ # in the admin interface. Accepts one named parameter, +using+
10
+ # which should be a Hash of options below.
11
+ #
12
+ # #### Options
13
+ #
14
+ # - `:category` - The navigation category to use for this resource.
15
+ # Should be one of the configured labels in Tolaria.config.menu_categories.
16
+ # The default is `"Settings"`.
17
+ # - `:priority` - The priority for this item in its menu category.
18
+ # Items with lower priority are sorted first.
19
+ # The default is 10.
20
+ # - `:icon` - The Font Awesome icon to use for this model.
21
+ # Should be one of the names on the Font Awesome site at
22
+ # http://fortawesome.github.io/Font-Awesome/icons/
23
+ # The default is `"file-o"`.
24
+ # - `:permitted_params` - A array of parameter names to pass to
25
+ # `params.permit()` for this model/form.
26
+ # The default is an empty array. You will need to set this option to
27
+ # match the fields you included on your admin form.
28
+ # - `:default_order` - The default `order()` for sorting this
29
+ # model when no other sorting is happening.
30
+ # The default is `"id DESC"`.
31
+ # - `:paginated` - If `true`, Tolaria will apply the default
32
+ # pagination controls/system to the model. Set to `false` to disable.
33
+ # The default is `true`.
34
+ # - `:allowed_actions` - The router actions to draw for this model.
35
+ # Only set this value yourself if you are overriding or forbidding some
36
+ # route construction.
37
+ # Tolaria will pass this array as the `only:` option to the router.
38
+ # The default includes all CRUD actions:
39
+ # `[:index, :show, :new, :create, :edit, :update, :destroy]`
40
+ def self.manage_with_tolaria(using:{})
41
+ @tolaria_management_options = using
42
+ if Tolaria.safe_management
43
+ generate_tolaria_bindings!
44
+ end
45
+ end
46
+
47
+ # Instructs Tolaria to start managing the model and create the correct controllers.
48
+ # You shouldn't call this method directly.
49
+ def self.generate_tolaria_bindings!
50
+ if @tolaria_management_options.present?
51
+ Tolaria.manage(self, **@tolaria_management_options)
52
+ end
53
+ end
54
+
55
+ end
@@ -0,0 +1,4 @@
1
+ # This module empty, but it holds the administration controllers
2
+ # that Tolaria will dynamically create.
3
+ module Admin
4
+ end
@@ -0,0 +1,21 @@
1
+ module Tolaria
2
+
3
+ # Returns the developer-configured categories for constructing
4
+ # the nav menu, in addition to any unexpected categories from
5
+ # configured managed classes.
6
+ def self.categories
7
+ (self.config.menu_categories + self.managed_classes.collect(&:category)).uniq
8
+ end
9
+
10
+ # Returns all of the managed classes for the given +category+,
11
+ # sorted by their priority
12
+ def self.classes_for_category(category)
13
+ classes = Tolaria.managed_classes.select do |managed_class|
14
+ managed_class.category == category
15
+ end
16
+ classes.sort_by do |klass|
17
+ [klass.priority, klass.model_name.human]
18
+ end
19
+ end
20
+
21
+ end
@@ -0,0 +1,40 @@
1
+ module Tolaria
2
+
3
+ # Tolaria’s config is a class so that an exception is raised
4
+ # if you try to configure a key that doesn't exist. See default_config.rb
5
+ class Configuration
6
+ attr_accessor :bcrypt_cost
7
+ attr_accessor :company_name
8
+ attr_accessor :default_redirect
9
+ attr_accessor :display_name_methods
10
+ attr_accessor :from_address
11
+ attr_accessor :help_links
12
+ attr_accessor :lockout_duration
13
+ attr_accessor :lockout_threshold
14
+ attr_accessor :markdown_renderer
15
+ attr_accessor :menu_categories
16
+ attr_accessor :page_size
17
+ attr_accessor :passcode_lifespan
18
+ attr_accessor :permitted_params
19
+ end
20
+
21
+ # Returns Tolaria’s configuration as an object
22
+ def self.config
23
+ if block_given?
24
+ raise ArgumentError, "You passed a block to Tolaria.config but such a block will be ignored. Did you mean to call Tolaria.configure instead?"
25
+ end
26
+ @configuration ||= Tolaria::Configuration.new
27
+ end
28
+
29
+ # Configure Tolaria, block-style. Use something similar to:
30
+ #
31
+ # Tolaria.configure do |config|
32
+ # # Assign to config properties here
33
+ # end
34
+ #
35
+ def self.configure(&block)
36
+ yield @configuration ||= Tolaria::Configuration.new
37
+ end
38
+
39
+ end
40
+