aerogel-admin 1.4.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (126) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +13 -0
  6. data/Rakefile +1 -0
  7. data/aerogel-admin.gemspec +31 -0
  8. data/app/helpers/admin.rb +54 -0
  9. data/app/helpers/decorators.rb +29 -0
  10. data/app/helpers/icons.rb +11 -0
  11. data/app/helpers/table_builder.rb +8 -0
  12. data/app/helpers/tabs_builder.rb +7 -0
  13. data/app/routes/admin.rb +37 -0
  14. data/app/routes/users.rb +71 -0
  15. data/app/routes/users_access.rb +54 -0
  16. data/app/routes/users_roles.rb +53 -0
  17. data/assets/fonts/aerogel-icons.css +28 -0
  18. data/assets/fonts/aerogel-icons.eot +0 -0
  19. data/assets/fonts/aerogel-icons.svg +11 -0
  20. data/assets/fonts/aerogel-icons.ttf +0 -0
  21. data/assets/fonts/aerogel-icons.woff +0 -0
  22. data/assets/javascripts/.gitkeep +0 -0
  23. data/assets/javascripts/controllers/admin-modal.js.coffee +7 -0
  24. data/assets/javascripts/controllers/admin-modal/admin-modal-form-buttons.js.coffee +56 -0
  25. data/assets/javascripts/controllers/admin.js.coffee +13 -0
  26. data/assets/javascripts/controllers/admin/selectize-inputs.js.coffee +7 -0
  27. data/assets/javascripts/controllers/admin/top-menu-shadow.js.coffee +9 -0
  28. data/assets/javascripts/utils/ajax-spinner.js.coffee +26 -0
  29. data/assets/javascripts/utils/ajax-watcher.js.coffee +18 -0
  30. data/assets/javascripts/utils/bootstrap-modal-reload.js.coffee +8 -0
  31. data/assets/javascripts/utils/form-data-async.js.coffee +27 -0
  32. data/assets/javascripts/utils/i18n.js.coffee +27 -0
  33. data/assets/javascripts/utils/on-future-elements.js.coffee +15 -0
  34. data/assets/stylesheets/admin/bootstrap-settings.css.scss +33 -0
  35. data/assets/stylesheets/admin/global.css.scss +61 -0
  36. data/assets/stylesheets/admin/styles/ajax-indicator.css.scss +26 -0
  37. data/assets/stylesheets/admin/styles/bootstrap-modal.css.scss +24 -0
  38. data/assets/stylesheets/admin/styles/language-selector.css.scss +5 -0
  39. data/assets/stylesheets/admin/styles/page-header.css.scss +7 -0
  40. data/assets/stylesheets/admin/styles/sticky-footer-navbar.css.scss +34 -0
  41. data/assets/stylesheets/admin/styles/table.css.scss +3 -0
  42. data/assets/stylesheets/admin/styles/top-menu.css.scss +3 -0
  43. data/assets/stylesheets/admin/utils/center-absolutely.css.scss +5 -0
  44. data/assets/stylesheets/controllers/admin.css.scss +14 -0
  45. data/assets/vendor/bootstrap-datetimepicker.css.scss +1 -0
  46. data/assets/vendor/bootstrap-datetimepicker.js.coffee +1 -0
  47. data/assets/vendor/bootstrap-datetimepicker/bootstrap-datetimepicker.min.css +5 -0
  48. data/assets/vendor/bootstrap-datetimepicker/bootstrap-datetimepicker.min.js +1 -0
  49. data/assets/vendor/bootstrap-datetimepicker/bootstrap-datetimepicker.ru.js +163 -0
  50. data/assets/vendor/moment.js.coffee +1 -0
  51. data/assets/vendor/momentjs/moment-with-langs.min.js +9 -0
  52. data/assets/vendor/selectize.css.scss +2 -0
  53. data/assets/vendor/selectize.js.coffee +1 -0
  54. data/assets/vendor/selectize/selectize.bootstrap3.css +385 -0
  55. data/assets/vendor/selectize/selectize.css +311 -0
  56. data/assets/vendor/selectize/selectize.default.css +381 -0
  57. data/assets/vendor/selectize/selectize.js +3345 -0
  58. data/assets/vendor/smart-list-table.css.scss +42 -0
  59. data/assets/vendor/smart-list-table.js.coffee +1 -0
  60. data/assets/vendor/smart-list-table/smart-list-table-row.js.coffee +63 -0
  61. data/assets/vendor/smart-list-table/smart-list-table.css.scss +54 -0
  62. data/assets/vendor/smart-list-table/smart-list-table.js.coffee +133 -0
  63. data/assets/vendor/smart-tree-table.css.scss +42 -0
  64. data/assets/vendor/smart-tree-table.js.coffee +1 -0
  65. data/assets/vendor/smart-tree-table/smart-tree-table-drag-n-drop.js.coffee +190 -0
  66. data/assets/vendor/smart-tree-table/smart-tree-table-row.js.coffee +78 -0
  67. data/assets/vendor/smart-tree-table/smart-tree-table.css.scss +54 -0
  68. data/assets/vendor/smart-tree-table/smart-tree-table.js.coffee +267 -0
  69. data/assets/vendor/spin.js +353 -0
  70. data/config/README.md +3 -0
  71. data/config/development/.keep +0 -0
  72. data/config/production/.keep +0 -0
  73. data/db/model/README.md +1 -0
  74. data/db/model/admin/user_new_form.rb +40 -0
  75. data/db/model/user.rb +26 -0
  76. data/db/seed/01_admin_roles.seed +8 -0
  77. data/db/seed/02_admin_access.seed +24 -0
  78. data/db/seed/development/.keep +0 -0
  79. data/db/seed/development/20_users.seed +45 -0
  80. data/db/seed/development/admin_users.seed +38 -0
  81. data/db/seed/production/.keep +0 -0
  82. data/lib/aerogel/admin.rb +25 -0
  83. data/lib/aerogel/admin/core.rb +14 -0
  84. data/lib/aerogel/admin/menu.rb +38 -0
  85. data/lib/aerogel/admin/table_builder.rb +100 -0
  86. data/lib/aerogel/admin/tabs_builder.rb +69 -0
  87. data/lib/aerogel/admin/version.rb +5 -0
  88. data/locales/actions.en.yml +27 -0
  89. data/locales/actions.ru.yml +28 -0
  90. data/locales/admin.en.yml +14 -0
  91. data/locales/admin.ru.yml +14 -0
  92. data/locales/models.en.yml +8 -0
  93. data/locales/models.ru.yml +8 -0
  94. data/locales/views.en.yml +46 -0
  95. data/locales/views.ru.yml +46 -0
  96. data/public/README.md +1 -0
  97. data/rake/README.md +3 -0
  98. data/views/admin/index.html.erb +3 -0
  99. data/views/admin/table_builder/standard/_table_column.html.erb +3 -0
  100. data/views/admin/table_builder/standard/_table_row.html.erb +7 -0
  101. data/views/admin/table_builder/standard/table.html.erb +10 -0
  102. data/views/admin/tabs_builder/standard/_tab.html.erb +3 -0
  103. data/views/admin/tabs_builder/standard/tabs.html.erb +3 -0
  104. data/views/admin/users/_tabs.html.erb +8 -0
  105. data/views/admin/users/access/delete.html.erb +12 -0
  106. data/views/admin/users/access/edit.html.erb +9 -0
  107. data/views/admin/users/access/index.html.erb +23 -0
  108. data/views/admin/users/access/new.html.erb +9 -0
  109. data/views/admin/users/delete.html.erb +12 -0
  110. data/views/admin/users/edit.html.erb +46 -0
  111. data/views/admin/users/index.html.erb +31 -0
  112. data/views/admin/users/new.html.erb +11 -0
  113. data/views/admin/users/roles/delete.html.erb +12 -0
  114. data/views/admin/users/roles/edit.html.erb +9 -0
  115. data/views/admin/users/roles/index.html.erb +21 -0
  116. data/views/admin/users/roles/new.html.erb +7 -0
  117. data/views/form_builder/standard/field_multiselect.erb +14 -0
  118. data/views/form_builder/standard/field_select.erb +17 -0
  119. data/views/layouts/admin.html.erb +63 -0
  120. data/views/layouts/admin/_ajax_indicator.html.erb +4 -0
  121. data/views/layouts/admin/_alerts.html.erb +22 -0
  122. data/views/layouts/admin/_menu.html.erb +50 -0
  123. data/views/layouts/admin/_menu_item.html.erb +5 -0
  124. data/views/layouts/admin/_modals.html.erb +8 -0
  125. data/views/layouts/admin/modal.html.erb +38 -0
  126. metadata +280 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: bc0ccafb5b79a5c1d23aa8b96b8c55337f5b397d
4
+ data.tar.gz: 0ab68d3e63d9db24776da846dc77595dc2bd1927
5
+ SHA512:
6
+ metadata.gz: 5149fb9f86505ebcab497404144cf784ae13a11639e89cfdaf4739092780d4f36e8d68b1d6720e4ee2cc7c93a8cd5fd504c3e92a0d293f027eea4ecc1e8850e7
7
+ data.tar.gz: 07471fb38a1cec4ee74b3a78b49be48a74ac948ce7765bfcfde88c382b50f7cffd805311f8d76f392e59e9ddee9acda91bb94d4d6205e881b5647c939958f227
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in aerogel-module123.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Alex Kukushkin
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,13 @@
1
+ # Aerogel::Admin
2
+
3
+ An admin panel for aerogel CMS.
4
+
5
+ ## Usage
6
+
7
+ In your application's config.ru:
8
+ ```ruby
9
+ require 'aerogel/core'
10
+ require 'aerogel/admin'
11
+
12
+ run Aerogel::Application.load
13
+ ```
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'aerogel/admin/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "aerogel-admin"
8
+ spec.version = Aerogel::Admin::VERSION
9
+ spec.authors = ["Alex Kukushkin"]
10
+ spec.email = ["alex@kukushk.in"]
11
+ spec.description = %q{Admin panel for aerogel CMS}
12
+ spec.summary = %q{Admin panel for aerogel CMS}
13
+ spec.homepage = "https://github.com/kukushkin/aerogel-admin"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "aerogel-core", "~> 1.4"
22
+ spec.add_dependency "aerogel-forms"
23
+ spec.add_dependency "aerogel-users", "~> 1.4"
24
+ spec.add_dependency "aerogel-media", "~> 1.4"
25
+ spec.add_dependency "aerogel-bootstrap"
26
+ spec.add_dependency "aerogel-font_awesome"
27
+
28
+
29
+ spec.add_development_dependency "bundler", "~> 1.3"
30
+ spec.add_development_dependency "rake"
31
+ end
@@ -0,0 +1,54 @@
1
+ #
2
+ # Admin helpers
3
+ #
4
+
5
+ # Defines a menu item
6
+ #
7
+ def admin_menu( url, opts = {} )
8
+ Aerogel::Admin::Menu::Item.create url, opts
9
+ end
10
+
11
+ # Returns list of menu items ordered by priority
12
+ #
13
+ def admin_menu_items
14
+ Aerogel::Admin::Menu.instance.items.sort_by( &:priority )
15
+ end
16
+
17
+ # Renders a link to open a modal window with remote content.
18
+ #
19
+ def link_to_modal( url, *args, &block )
20
+ opts = (String === args.first) ? args[1] : args[0]
21
+ opts = {
22
+ href: url,
23
+ 'data-toggle' => 'modal',
24
+ 'data-target' => '#adminModal'
25
+ }.deep_merge( opts || {} )
26
+ if String === args.first
27
+ args[1] = opts
28
+ else
29
+ args[0] = opts
30
+ end
31
+ tag :a, *args, &block
32
+ end
33
+
34
+ # Renders a link to open a modal window with remote content,
35
+ # if this operation is allowed.
36
+ # Renders a plain text otherwise.
37
+ #
38
+ def link_to_modal_if_can( url, text, opts = {} )
39
+ if can? url
40
+ link_to_modal url, text, opts
41
+ else
42
+ text
43
+ end
44
+ end
45
+
46
+ # Creates a <button ...>...</button> tag.
47
+ #
48
+ def button_to( url, text = url, opts = {} )
49
+ opts = {
50
+ class: "btn btn-default",
51
+ href: url
52
+ }.deep_merge opts
53
+ tag :a, text, opts
54
+ end
@@ -0,0 +1,29 @@
1
+ # Renders UserEmail.confirmed attribute as icon
2
+ #
3
+ def user_email_confirmed_as_icon( email )
4
+ email.confirmed ?
5
+ icon( "glyphicon-ok-sign", title: t.aerogel.admin.decorators.confirmed, style: "color: green" ) :
6
+ icon( "glyphicon-question-sign", title: t.aerogel.admin.decorators.not_confirmed )
7
+ end
8
+
9
+ # Renders UserEmail.confirmed attribute as label
10
+ #
11
+ def user_email_confirmed_as_label( email )
12
+ email.confirmed ?
13
+ "<span class='label label-success'>#{t.aerogel.admin.decorators.confirmed}</span>" :
14
+ "<span class='label label-default'>#{t.aerogel.admin.decorators.not_confirmed}</span>"
15
+ end
16
+
17
+ # Renders Authentication provier as icon.
18
+ #
19
+ def auth_provider_as_icon( provider_key )
20
+ provider = Aerogel::Auth.providers[provider_key]
21
+ icon provider[:icon], title: provider[:name]
22
+ end
23
+
24
+ # Renders Authentication provier as icon.
25
+ #
26
+ def auth_provider_as_text( provider_key )
27
+ provider = Aerogel::Auth.providers[provider_key]
28
+ provider[:name]
29
+ end
@@ -0,0 +1,11 @@
1
+ # Icon for delete actions.
2
+ #
3
+ def icon_delete
4
+ icon "fa-times", title: t.aerogel.admin.actions.delete, style: "color:#e02327"
5
+ end
6
+
7
+ # Icon for warning notices and actions.
8
+ #
9
+ def icon_warning
10
+ icon "fa-warning", style: "color:#e7cb2d"
11
+ end
@@ -0,0 +1,8 @@
1
+
2
+ # Table builder.
3
+ #
4
+ #
5
+ def table( object, options = {}, &block )
6
+ Aerogel::Admin::TableBuilder.new( object, options, &block ).render
7
+ end
8
+
@@ -0,0 +1,7 @@
1
+
2
+ # Tabs builder.
3
+ #
4
+ #
5
+ def tabs( options = {}, &block )
6
+ Aerogel::Admin::TabsBuilder.new( options, &block ).render
7
+ end
@@ -0,0 +1,37 @@
1
+ namespace "/admin" do
2
+
3
+ # admin_menu "/admin/lorem", label: 'Lorem'
4
+
5
+ before do
6
+ if request.xhr?
7
+ layout "admin/modal"
8
+ else
9
+ layout "admin"
10
+ end
11
+
12
+ on_access_denied do |path|
13
+ redirect "/user/login?on_success=#{path}" unless current_user?
14
+ redirect "/admin/" if can? "/admin/"
15
+ end
16
+
17
+ end
18
+
19
+ get "/" do
20
+ flash.now[:notice] = "Welcome, admin!"
21
+ pass
22
+ end
23
+
24
+ get "/lorem" do
25
+ view "lorem"
26
+ end
27
+
28
+ #
29
+ # Common User controller routes
30
+ #
31
+ route :get, :post, ['/', '/:action'] do
32
+ action = params[:action] || 'index'
33
+ view "admin/#{action}"
34
+ end
35
+
36
+
37
+ end
@@ -0,0 +1,71 @@
1
+ namespace "/admin/users" do
2
+
3
+ admin_menu "/admin/users/", icon: 'fa-users', label: :'aerogel.admin.panes.users', priority: 90
4
+
5
+ get "/" do
6
+ pass
7
+ end
8
+
9
+ get "/new" do
10
+ @admin_user_new_form = ::Admin::UserNewForm.new
11
+ pass
12
+ end
13
+
14
+ post "/new" do
15
+ @admin_user_new_form = ::Admin::UserNewForm.new( params[:admin_user_new_form] )
16
+ pass unless @admin_user_new_form.valid?
17
+ user = User.create_from_admin_user_new_form @admin_user_new_form
18
+ unless user.save
19
+ flash[:error] = t.aerogel.db.errors.failed_to_save name: User.model_name.human,
20
+ errors: user.errors.full_messages.join(", ")
21
+ pass
22
+ end
23
+ user.request_activation!
24
+ email 'user/account_activation', user
25
+ authentication = user.request_password_reset! @admin_user_new_form.email
26
+ email 'user/password_reset', authentication
27
+ redirect '/admin/users/', notice: t.aerogel.admin.actions.users.created( name: h( user.full_name ) )
28
+ end
29
+
30
+ get "/:id/edit" do
31
+ @user = User.find( params[:id] ) or halt 404
32
+ pass
33
+ end
34
+
35
+ post "/:id/edit" do
36
+ @user = User.find( params[:id] ) or halt 404
37
+ if @user.update_attributes params[:user].except( :emails, :authentications )
38
+ redirect '/admin/users/', notice: t.aerogel.admin.actions.users.updated( name: h( @user.full_name ) )
39
+ end
40
+ flash.now[:error] = t.aerogel.db.errors.failed_to_save( name: h( @user.full_name ),
41
+ errors: @user.errors.full_messages.join(", ")
42
+ )
43
+ pass
44
+ end
45
+
46
+ get "/:id/delete" do
47
+ @user = User.find( params[:id] ) or halt 404
48
+ pass
49
+ end
50
+
51
+ post "/:id/delete" do
52
+ @user = User.find( params[:id] ) or halt 404
53
+ if current_user == @user
54
+ redirect '/admin/users/', error: t.aerogel.admin.actions.users.failed_to_delete_self
55
+ else
56
+ @user.destroy
57
+ redirect '/admin/users/', notice: t.aerogel.admin.actions.users.deleted( name: h(@user.full_name) )
58
+ end
59
+ pass
60
+ end
61
+
62
+ #
63
+ # Common User controller routes
64
+ #
65
+ route :get, :post, ['/', '/:action', '/:id/:action'] do
66
+ action = params[:action] || 'index'
67
+ pass if params[:id] and [:roles, :access].include? params[:id].to_sym
68
+ view "admin/users/#{action}"
69
+ end
70
+
71
+ end
@@ -0,0 +1,54 @@
1
+ namespace "/admin/users/access" do
2
+
3
+
4
+ get "/" do
5
+ pass
6
+ end
7
+
8
+ get "/new" do
9
+ @access = Access.new
10
+ pass
11
+ end
12
+
13
+ post "/new" do
14
+ @access = Access.new( params[:access] )
15
+ pass unless @access.save
16
+ redirect '/admin/users/access/', notice: t.aerogel.admin.actions.users_access.created( name: @access.path )
17
+ end
18
+
19
+ get "/:id/edit" do
20
+ @access = Access.find( params[:id] ) or halt 404
21
+ pass
22
+ end
23
+
24
+ post "/:id/edit" do
25
+ @access = Access.find( params[:id] ) or halt 404
26
+ if @access.update_attributes params[:access].except( :path_matcher )
27
+ redirect '/admin/users/access/', notice: t.aerogel.admin.actions.users_access.updated( name: @access.path )
28
+ end
29
+ flash.now[:error] = t.aerogel.db.errors.failed_to_save name: Access.model_name.human,
30
+ errors: @access.errors.full_messages.join(", ")
31
+ pass
32
+ end
33
+
34
+ get "/:id/delete" do
35
+ @access = Access.find( params[:id] ) or halt 404
36
+ pass
37
+ end
38
+
39
+ post "/:id/delete" do
40
+ @access = Access.find( params[:id] ) or halt 404
41
+ @access.destroy
42
+ redirect '/admin/users/access/', notice: t.aerogel.admin.actions.users_access.deleted( name: @access.path )
43
+ pass
44
+ end
45
+
46
+ #
47
+ # Common User/Access controller routes
48
+ #
49
+ route :get, :post, ['/', '/:action', '/:id/:action'] do
50
+ action = params[:action] || 'index'
51
+ view "admin/users/access/#{action}"
52
+ end
53
+
54
+ end
@@ -0,0 +1,53 @@
1
+ namespace "/admin/users/roles" do
2
+
3
+ get "/" do
4
+ pass
5
+ end
6
+
7
+ get "/new" do
8
+ @role = Role.new
9
+ pass
10
+ end
11
+
12
+ post "/new" do
13
+ @role = Role.new( params[:role] )
14
+ pass unless @role.save
15
+ redirect '/admin/users/roles/', notice: t.aerogel.admin.actions.users_roles.created( name: @role.name )
16
+ end
17
+
18
+ get "/:id/edit" do
19
+ @role = Role.find( params[:id] ) or halt 404
20
+ pass
21
+ end
22
+
23
+ post "/:id/edit" do
24
+ @role = Role.find( params[:id] ) or halt 404
25
+ if @role.update_attributes params[:role]
26
+ redirect '/admin/users/roles/', notice: t.aerogel.admin.actions.users_roles.updated( name: @role.name )
27
+ end
28
+ flash.now[:error] = t.aerogel.db.errors.failed_to_save name: Role.model_name.human,
29
+ errors: @role.errors.full_messages.join(", ")
30
+ pass
31
+ end
32
+
33
+ get "/:id/delete" do
34
+ @role = Role.find( params[:id] ) or halt 404
35
+ pass
36
+ end
37
+
38
+ post "/:id/delete" do
39
+ @role = Role.find( params[:id] ) or halt 404
40
+ @role.destroy
41
+ redirect '/admin/users/roles/', notice: t.aerogel.admin.actions.users_roles.deleted( name: @role.name )
42
+ pass
43
+ end
44
+
45
+ #
46
+ # Common User/Roles controller routes
47
+ #
48
+ route :get, :post, ['/', '/:action', '/:id/:action'] do
49
+ action = params[:action] || 'index'
50
+ view "admin/users/roles/#{action}"
51
+ end
52
+
53
+ end
@@ -0,0 +1,28 @@
1
+ @font-face {
2
+ font-family: 'aerogel-icons';
3
+ src:asset-url('aerogel-icons.eot?dmxr4k');
4
+ src:asset-url('aerogel-icons.eot?#iefixdmxr4k') format('embedded-opentype'),
5
+ asset-url('aerogel-icons.woff?dmxr4k') format('woff'),
6
+ asset-url('aerogel-icons.ttf?dmxr4k') format('truetype'),
7
+ asset-url('aerogel-icons.svg?dmxr4k#aerogel-icons') format('svg');
8
+ font-weight: normal;
9
+ font-style: normal;
10
+ }
11
+
12
+ [class^="aerogel-"], [class*=" aerogel-"] {
13
+ font-family: 'aerogel-icons';
14
+ speak: none;
15
+ font-style: normal;
16
+ font-weight: normal;
17
+ font-variant: normal;
18
+ text-transform: none;
19
+ line-height: 1;
20
+
21
+ /* Better Font Rendering =========== */
22
+ -webkit-font-smoothing: antialiased;
23
+ -moz-osx-font-smoothing: grayscale;
24
+ }
25
+
26
+ .aerogel-logo:before {
27
+ content: "\e001";
28
+ }