tb_core 1.0.2 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/README.md +89 -0
- data/app/assets/javascripts/{spud/admin → admin}/application.js +1 -7
- data/app/assets/javascripts/admin/dashboard.js +9 -0
- data/app/assets/javascripts/admin/split_pane.js +138 -0
- data/app/assets/javascripts/admin/users.js +84 -0
- data/app/assets/stylesheets/{spud/admin/application.css → admin/application.css.scss} +14 -104
- data/app/assets/stylesheets/admin/login.css.scss +49 -0
- data/app/assets/stylesheets/admin/split_pane.css.scss +126 -0
- data/app/assets/stylesheets/admin/users.css.scss +9 -0
- data/app/controllers/{spud/admin → admin}/application_controller.rb +29 -30
- data/app/controllers/admin/dashboard_controller.rb +23 -0
- data/app/controllers/admin/password_resets_controller.rb +51 -0
- data/app/controllers/admin/roles_controller.rb +58 -0
- data/app/controllers/admin/settings_controller.rb +19 -0
- data/app/controllers/admin/setup_controller.rb +24 -0
- data/app/controllers/{spud/admin → admin}/user_sessions_controller.rb +8 -8
- data/app/controllers/admin/users_controller.rb +69 -0
- data/app/controllers/password_resets_controller.rb +52 -0
- data/app/controllers/sitemaps_controller.rb +8 -0
- data/app/controllers/spud/application_controller.rb +6 -20
- data/app/controllers/user_sessions_controller.rb +26 -0
- data/app/helpers/{spud/admin → admin}/application_helper.rb +1 -1
- data/app/helpers/admin/roles_helper.rb +2 -0
- data/app/helpers/spud/application_helper.rb +0 -7
- data/app/mailers/core_mailer.rb +9 -0
- data/app/models/spud_permission.rb +33 -0
- data/app/models/spud_role.rb +32 -0
- data/app/models/spud_role_permission.rb +9 -0
- data/app/models/spud_user.rb +79 -24
- data/app/models/spud_user_setting.rb +3 -3
- data/app/views/{spud/admin → admin}/dashboard/index.html.erb +1 -4
- data/app/views/admin/password_resets/index.html.erb +10 -0
- data/app/views/admin/password_resets/show.html.erb +15 -0
- data/app/views/admin/roles/_form.html.erb +33 -0
- data/app/views/admin/roles/edit.html.erb +2 -0
- data/app/views/admin/roles/index.html.erb +29 -0
- data/app/views/admin/roles/new.html.erb +2 -0
- data/app/views/{spud/admin → admin}/settings/edit.html.erb +6 -1
- data/app/views/admin/setup/new.html.erb +44 -0
- data/app/views/admin/user_sessions/new.html.erb +17 -0
- data/app/views/{spud/admin → admin}/users/_form.html.erb +20 -20
- data/app/views/admin/users/_index.html.erb +15 -0
- data/app/views/admin/users/edit.html.erb +3 -0
- data/app/views/admin/users/index.html.erb +34 -0
- data/app/views/admin/users/new.html.erb +3 -0
- data/app/views/admin/users/show.html.erb +28 -0
- data/app/views/layouts/admin/application.html.erb +68 -0
- data/app/views/layouts/{spud/admin → admin}/detail.html.erb +2 -2
- data/app/views/layouts/admin/login.html.erb +27 -0
- data/app/views/password_resets/index.html.erb +11 -0
- data/app/views/password_resets/show.html.erb +26 -0
- data/app/views/user_sessions/new.html.erb +25 -0
- data/config/routes.rb +22 -15
- data/db/migrate/20130620143010_create_spud_roles.rb +10 -0
- data/db/migrate/20130620143941_create_spud_permissions.rb +10 -0
- data/db/migrate/20130620151132_create_spud_role_permissions.rb +11 -0
- data/db/migrate/20130620163144_drop_spud_admin_permissions.rb +15 -0
- data/db/seeds.rb +3 -0
- data/lib/spud_core/belongs_to_app.rb +35 -48
- data/lib/spud_core/configuration.rb +5 -10
- data/lib/spud_core/engine.rb +31 -6
- data/lib/spud_core/exceptions.rb +7 -0
- data/lib/spud_core/searchable.rb +9 -9
- data/lib/spud_core/version.rb +3 -3
- data/spec/controllers/{spud/admin → admin}/application_controller_spec.rb +10 -6
- data/spec/controllers/{spud/admin → admin}/dashboard_controller_spec.rb +17 -29
- data/spec/controllers/{spud/admin → admin}/password_reset_controller_spec.rb +5 -5
- data/spec/controllers/admin/settings_controller_spec.rb +30 -0
- data/spec/controllers/admin/setup_controller_spec.rb +39 -0
- data/spec/controllers/admin/user_sessions_controller_spec.rb +52 -0
- data/spec/controllers/{spud/admin → admin}/users_controller_spec.rb +19 -35
- data/spec/controllers/{spud/sitemap_controllers_spec.rb → sitemap_controllers_spec.rb} +1 -1
- data/spec/dummy/config/database.yml +2 -2
- data/spec/dummy/db/schema.rb +23 -5
- data/spec/dummy/log/test.log +36118 -0
- data/spec/helpers/spud/admin/application_helper_spec.rb +1 -1
- data/spec/models/spud_role_spec.rb +46 -0
- data/spec/models/spud_user_spec.rb +0 -1
- metadata +101 -97
- data/README.markdown +0 -60
- data/app/assets/images/back_disabled.jpg +0 -0
- data/app/assets/images/back_enabled.jpg +0 -0
- data/app/assets/images/favicon.ico +0 -0
- data/app/assets/images/forward_disabled.jpg +0 -0
- data/app/assets/images/forward_enabled.jpg +0 -0
- data/app/assets/images/sort_asc.png +0 -0
- data/app/assets/images/sort_asc_disabled.png +0 -0
- data/app/assets/images/sort_both.png +0 -0
- data/app/assets/images/sort_desc.png +0 -0
- data/app/assets/images/sort_desc_disabled.png +0 -0
- data/app/assets/images/spud/admin/flick/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/app/assets/images/spud/admin/flick/ui-bg_flat_0_eeeeee_40x100.png +0 -0
- data/app/assets/images/spud/admin/flick/ui-bg_flat_55_ffffff_40x100.png +0 -0
- data/app/assets/images/spud/admin/flick/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/app/assets/images/spud/admin/flick/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/app/assets/images/spud/admin/flick/ui-bg_highlight-soft_100_f6f6f6_1x100.png +0 -0
- data/app/assets/images/spud/admin/flick/ui-bg_highlight-soft_25_0073ea_1x100.png +0 -0
- data/app/assets/images/spud/admin/flick/ui-bg_highlight-soft_50_dddddd_1x100.png +0 -0
- data/app/assets/images/spud/admin/flick/ui-icons_0073ea_256x240.png +0 -0
- data/app/assets/images/spud/admin/flick/ui-icons_454545_256x240.png +0 -0
- data/app/assets/images/spud/admin/flick/ui-icons_666666_256x240.png +0 -0
- data/app/assets/images/spud/admin/flick/ui-icons_ff0084_256x240.png +0 -0
- data/app/assets/images/spud/admin/flick/ui-icons_ffffff_256x240.png +0 -0
- data/app/assets/images/spud/admin/spud_logo.png +0 -0
- data/app/assets/images/spud/admin/spud_logo@2x.png +0 -0
- data/app/assets/javascripts/spud/admin/dashboard.js +0 -80
- data/app/assets/javascripts/spud/admin/jquery.dataTables.min.js +0 -151
- data/app/assets/stylesheets/spud/forms.css +0 -108
- data/app/assets/stylesheets/spud/login/application.css +0 -302
- data/app/assets/stylesheets/spud/login.css +0 -58
- data/app/assets/stylesheets/spud/setup.css +0 -4
- data/app/assets/stylesheets/spud/sitemaps.css +0 -4
- data/app/assets/stylesheets/spud/user_sessions.css +0 -4
- data/app/assets/stylesheets/spud/users.css +0 -4
- data/app/controllers/spud/admin/dashboard_controller.rb +0 -34
- data/app/controllers/spud/admin/password_resets_controller.rb +0 -52
- data/app/controllers/spud/admin/settings_controller.rb +0 -27
- data/app/controllers/spud/admin/users_controller.rb +0 -109
- data/app/controllers/spud/setup_controller.rb +0 -21
- data/app/controllers/spud/sitemaps_controller.rb +0 -8
- data/app/helpers/spud/password_resets_helper.rb +0 -2
- data/app/mailers/spud/core_mailer.rb +0 -12
- data/app/models/spud_admin_permission.rb +0 -5
- data/app/views/layouts/spud/admin/application.html.erb +0 -73
- data/app/views/layouts/spud/login/application.html.erb +0 -17
- data/app/views/layouts/spud/setup.html.erb +0 -47
- data/app/views/spud/admin/password_resets/index.html.erb +0 -14
- data/app/views/spud/admin/password_resets/show.html.erb +0 -25
- data/app/views/spud/admin/user_sessions/new.html.erb +0 -27
- data/app/views/spud/admin/users/_edit.html.erb +0 -14
- data/app/views/spud/admin/users/_new.html.erb +0 -15
- data/app/views/spud/admin/users/edit.html.erb +0 -3
- data/app/views/spud/admin/users/index.html.erb +0 -42
- data/app/views/spud/admin/users/new.html.erb +0 -3
- data/app/views/spud/admin/users/show.html.erb +0 -12
- data/app/views/spud/setup/index.html.erb +0 -43
- data/spec/controllers/spud/admin/settings_controller_spec.rb +0 -55
- data/spec/controllers/spud/admin/user_sessions_controller_spec.rb +0 -51
- data/spec/controllers/spud/setup_controller_spec.rb +0 -56
- /data/app/assets/images/{spud/admin → admin}/down_arrow.gif +0 -0
- /data/app/assets/images/{spud/admin → admin}/up_arrow.gif +0 -0
- /data/app/assets/images/{spud/admin → admin}/users_thumb.png +0 -0
- /data/app/assets/javascripts/{spud/admin → admin}/date_picker.js +0 -0
- /data/app/assets/javascripts/{spud/admin → admin}/editor.js +0 -0
- /data/app/assets/javascripts/{spud/admin → admin}/preinit.js +0 -0
- /data/app/assets/javascripts/{spud/password_resets.js → admin/roles.js} +0 -0
- /data/app/assets/stylesheets/{spud/admin → admin}/jquery-ui.css +0 -0
- /data/app/assets/stylesheets/{spud/password_resets.css → admin/roles.css} +0 -0
- /data/app/views/{spud/admin → admin}/settings/_form.html.erb +0 -0
- /data/app/views/{spud/core_mailer → core_mailer}/forgot_password_notification.html.erb +0 -0
- /data/app/views/{spud/core_mailer → core_mailer}/forgot_password_notification.text.erb +0 -0
- /data/app/views/{spud/sitemaps → sitemaps}/show.xml.builder +0 -0
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZjlmZmMzMTQ5NGI5MWM2MDRjMDdkMzkxNzJiYWFiODE4MjRiYjA0YQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ODI3MTc1Y2FjZmNkMTFjOTkxZmEzN2ZiZGRmNWJmYzAwOWNiOWJlYw==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MzlmNjE1YjA3N2ZmOGIzYjgwOTIzYjIwNmM2YjY3NDcyNmQ2ZGMxN2M4NjM2
|
10
|
+
MDk0N2Y5YjMyMjdkMjY0MWE0Y2MwZDJhNmM0NTU3OWNlYWUwYjY2YjY5ZDgw
|
11
|
+
NDZjMjgxNjBhYWViZjVhMzk1NzBkOGZjN2E5NTYxODZkMTBiY2E=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NWQwMWEyZTcxODBiOTQyZjI2NjhjNjA0Mzg0YmJiMWY5ODBjNTllNzExOGRl
|
14
|
+
ZjZlNTU1NjY1MjhlNGE5ZTVjMWY5MTcyZmJkYjA0OGJmYzIyM2UxNTBlYjdh
|
15
|
+
MTIyYzkyOWM4ZGNkZWI0Y2FiODliOGI5YzVlZDJjZWQ5OTMxYTE=
|
data/README.md
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
Twice Baked Core
|
2
|
+
================
|
3
|
+
|
4
|
+
TB Core is the base Twice Baked engine that provides user authentication, roles, and an admin dashboard upon which CRUD apps can be built. Use TB Core to power content-managed websites or as a quick-and-simple way to add a backend to your existing data models.
|
5
|
+
|
6
|
+
Installation/Usage
|
7
|
+
------------------
|
8
|
+
|
9
|
+
1. In your Gemfile add the following
|
10
|
+
|
11
|
+
gem 'tb_core'
|
12
|
+
|
13
|
+
2. Run bundle install
|
14
|
+
3. Copy in database migrations to your new rails project
|
15
|
+
|
16
|
+
bundle exec rake tb_core:install:migrations
|
17
|
+
rake db:migrate
|
18
|
+
|
19
|
+
4. run a rails server instance and point your browser to /admin
|
20
|
+
|
21
|
+
|
22
|
+
Adding Apps to the Dashboard
|
23
|
+
----------------------------
|
24
|
+
|
25
|
+
Admin apps can be added via the `Spud::Core.config.admin_applications` array. We recommend you perform this action in either an initializer or within your `application.rb` file.
|
26
|
+
|
27
|
+
Spud::Core.config.admin_applications += [{
|
28
|
+
:name => "Clients",
|
29
|
+
:thumbnail => "spud/admin/clients.png",
|
30
|
+
:url => "/admin/clients"
|
31
|
+
}]
|
32
|
+
|
33
|
+
Build out your RESTful controller and views like you normally would in any Rails app. Extend your controller from `Admin::ApplicationController` in order to inherit the default admin behaviors, and look at the core admin controllers for example implementations.
|
34
|
+
|
35
|
+
Roles & Permissions
|
36
|
+
-------------------
|
37
|
+
|
38
|
+
A user can be assigned to a role, which itself has one or more permissions. These permissions serve two distinct purposes: Determining what dashboard apps a user has access to (if any), and being used within your application logic to establish fine-grained user abilities.
|
39
|
+
|
40
|
+
Checking permissions is easy. Each permission has a `tag` which is a unique, namespaced identifier. Use the `has_permission?` and `has_any_permission?` methods on the user object to check for their existence. Keep in mind that these calls will always return true for users who have the `super_admin` flag set.
|
41
|
+
|
42
|
+
if !@spud_user.has_permission?('my_website.clients.my_clients')
|
43
|
+
redirect_to root_path, :notice => 'Permission Denied!'
|
44
|
+
end
|
45
|
+
|
46
|
+
Permissions are created one of two ways:
|
47
|
+
|
48
|
+
1. Every dashboard app automatically generates a "Full Access" permission, with a tag of `admin.(app name).full_access`.
|
49
|
+
2. You as the developer may append custom permissions to the `Spud::Core.permissions` array.
|
50
|
+
|
51
|
+
Create custom permissions whenever you need to permit an action that falls outside of the standard "full access to an app" use case; For example, turning on/off the ability for a user to upload an avatar.
|
52
|
+
|
53
|
+
// application.rb
|
54
|
+
Spud::Core.permissions += [
|
55
|
+
{:tag => 'my_website.profile.avatar', :name => 'Upload an avatar to my profile'}
|
56
|
+
]
|
57
|
+
// some_view.html.erb
|
58
|
+
<% if current_user.has_permission?('my_website.profile.avatar') %>
|
59
|
+
<%= link_to 'Upload Avatar', upload_avatar_path %>
|
60
|
+
<% end %>
|
61
|
+
|
62
|
+
Finally, custom permissions may optionally be tied to one or more dashboard apps. A user who has the permission shown below would have access to the the Clients and Projects dashboard apps. After that is is up to you to code your view and controller logic in accorance to what permissions the user has.
|
63
|
+
|
64
|
+
// application.rb
|
65
|
+
Spud::Core.permissions += [{
|
66
|
+
:tag => 'my_website.projects.project_management',
|
67
|
+
:name => 'Manage clients and projects, but cannot delete them or view private info',
|
68
|
+
:apps => [:clients, :projects]
|
69
|
+
}]
|
70
|
+
|
71
|
+
Testing
|
72
|
+
-----------------
|
73
|
+
|
74
|
+
Twice Baked uses RSpec for testing. Get the tests running with a few short commands:
|
75
|
+
|
76
|
+
1. Create and migrate the databases:
|
77
|
+
|
78
|
+
rake db:create
|
79
|
+
rake db:migrate
|
80
|
+
|
81
|
+
2. Load the schema in to the test database:
|
82
|
+
|
83
|
+
rake app:db:test:prepare
|
84
|
+
|
85
|
+
3. Run the tests with RSpec
|
86
|
+
|
87
|
+
rspec spec
|
88
|
+
|
89
|
+
After the tests have completed the current code coverage stats is available by opening `/coverage/index.html` in a browser.
|
@@ -1,9 +1,8 @@
|
|
1
1
|
//= require jquery
|
2
2
|
//= require jquery_ujs
|
3
|
-
//= require
|
3
|
+
//= require admin/preinit
|
4
4
|
//= require tiny_mce/jquery.tinymce.js
|
5
5
|
//= require tiny_mce/tiny_mce_src.js
|
6
|
-
//= require spud/admin/jquery.dataTables.min
|
7
6
|
//= require bootstrap/js/bootstrap
|
8
7
|
//= require datepicker/js/bootstrap-datepicker
|
9
8
|
//= require jquery-ui/js/jquery-ui-1.9.1.custom
|
@@ -25,11 +24,6 @@ $(document).ready(function() {
|
|
25
24
|
|
26
25
|
spud.admin.editor.init();
|
27
26
|
|
28
|
-
// $('#user_table').dataTable({
|
29
|
-
// "bJQueryUI": true,
|
30
|
-
// "sPaginationType": "full_numbers"
|
31
|
-
// });
|
32
|
-
|
33
27
|
$("#modal_window .modal-footer .form-submit").bind('click', function() {
|
34
28
|
$("#modal_window .modal-body form").submit();
|
35
29
|
});
|
@@ -0,0 +1,138 @@
|
|
1
|
+
spud.admin.SplitPane = (function(){
|
2
|
+
|
3
|
+
function SplitPane(selector){
|
4
|
+
var container = this.container = $(selector);
|
5
|
+
this.rightPane = container.find('.split-pane-right');
|
6
|
+
this.leftPane = container.find('.split-pane-left');
|
7
|
+
this.contentArea = container.find('.split-pane-right-content');
|
8
|
+
this._listUrl = window.location.pathname;
|
9
|
+
container.on('click', '.split-pane-item', this, clickedItem);
|
10
|
+
container.on('click', '.pagination a', this, clickedPageLink);
|
11
|
+
container.on('submit', '.split-pane-search-form', this, submittedSearchForm);
|
12
|
+
container.on('click', '.split-pane-search-clear-btn', this, clickedClearSearch);
|
13
|
+
container.find('.split-pane-search-clear-btn').hide();
|
14
|
+
this.triggerFirstItem();
|
15
|
+
}
|
16
|
+
|
17
|
+
// Event Handlers
|
18
|
+
/////////////////
|
19
|
+
|
20
|
+
var clickedItem = function(e){
|
21
|
+
var splitPane = e.data;
|
22
|
+
item = $(this);
|
23
|
+
splitPane.setActiveItem(item);
|
24
|
+
url = item.attr('data-url');
|
25
|
+
title = item.attr('data-title') || '';
|
26
|
+
$.ajax(url, {
|
27
|
+
dataType:'html',
|
28
|
+
success:function(html){
|
29
|
+
splitPane.setContentAreaHtml(html);
|
30
|
+
splitPane.setToolbarTitle(title);
|
31
|
+
}
|
32
|
+
});
|
33
|
+
};
|
34
|
+
|
35
|
+
var clickedPageLink = function(e){
|
36
|
+
e.preventDefault();
|
37
|
+
var splitPane = e.data;
|
38
|
+
var url = $(this).attr('href');
|
39
|
+
splitPane.refreshList(url, function(){
|
40
|
+
splitPane.triggerFirstItem();
|
41
|
+
});
|
42
|
+
};
|
43
|
+
|
44
|
+
var clickedClearSearch = function(e){
|
45
|
+
e.preventDefault();
|
46
|
+
var splitPane = e.data;
|
47
|
+
$('.split-pane-search-form input').val('');
|
48
|
+
var btn = $(this);
|
49
|
+
btn.hide();
|
50
|
+
splitPane.refreshList(btn.attr('href'));
|
51
|
+
};
|
52
|
+
|
53
|
+
var submittedSearchForm = function(e){
|
54
|
+
e.preventDefault();
|
55
|
+
var splitPane = e.data;
|
56
|
+
splitPane.container.find('.split-pane-search-clear-btn').show();
|
57
|
+
var form = $(this);
|
58
|
+
var url = form.attr('action') + '?' + form.serialize();
|
59
|
+
splitPane.refreshList(url);
|
60
|
+
};
|
61
|
+
|
62
|
+
// Instance Methods
|
63
|
+
///////////////////
|
64
|
+
|
65
|
+
SplitPane.prototype.refreshList = function(url, callback){
|
66
|
+
if(typeof(url) != 'undefined'){
|
67
|
+
this._listUrl = url;
|
68
|
+
}
|
69
|
+
var activeId = this.getActiveItem().attr('data-id');
|
70
|
+
var self = this;
|
71
|
+
$.ajax(this._listUrl, {
|
72
|
+
success:function(html){
|
73
|
+
self.setLeftSideHtml(html);
|
74
|
+
var originalItem = self.leftPane.find('[data-id='+activeId+']');
|
75
|
+
if(originalItem.length){
|
76
|
+
self.setActiveItem(originalItem);
|
77
|
+
}
|
78
|
+
if(typeof(callback) == 'function'){
|
79
|
+
callback.call(self);
|
80
|
+
}
|
81
|
+
}
|
82
|
+
});
|
83
|
+
};
|
84
|
+
|
85
|
+
SplitPane.prototype.setActiveItem = function(item){
|
86
|
+
this.deselectActiveItem();
|
87
|
+
item.addClass('split-pane-item-selected');
|
88
|
+
};
|
89
|
+
|
90
|
+
SplitPane.prototype.getActiveItem = function(){
|
91
|
+
return this.container.find('.split-pane-item-selected');
|
92
|
+
};
|
93
|
+
|
94
|
+
SplitPane.prototype.deselectActiveItem = function(){
|
95
|
+
this.getActiveItem().removeClass('split-pane-item-selected');
|
96
|
+
};
|
97
|
+
|
98
|
+
SplitPane.prototype.triggerFirstItem = function(){
|
99
|
+
this.container.find('.split-pane-item').first().click();
|
100
|
+
};
|
101
|
+
|
102
|
+
SplitPane.prototype.setToolbarTitle = function(title){
|
103
|
+
if(typeof(title) == 'undefined'){
|
104
|
+
title = '';
|
105
|
+
}
|
106
|
+
this.container.find('.split-pane-toolbar-title').text(title);
|
107
|
+
};
|
108
|
+
|
109
|
+
SplitPane.prototype.setContentAreaHtml = function(html){
|
110
|
+
this.contentArea.html(html);
|
111
|
+
this.rightPane.scrollTop(0);
|
112
|
+
};
|
113
|
+
|
114
|
+
SplitPane.prototype.getContentAreaHtml = function(){
|
115
|
+
return this.contentArea.html();
|
116
|
+
};
|
117
|
+
|
118
|
+
SplitPane.prototype.removeCurrentlySelectedItem = function(){
|
119
|
+
var activeItem = this.getActiveItem();
|
120
|
+
var sibling = activeItem.next();
|
121
|
+
if(!sibling){
|
122
|
+
sibling = activeItem.prev();
|
123
|
+
}
|
124
|
+
this.getActiveItem().remove();
|
125
|
+
if(sibling){
|
126
|
+
sibling.click();
|
127
|
+
}
|
128
|
+
else{
|
129
|
+
this.setContentAreaHtml('');
|
130
|
+
}
|
131
|
+
};
|
132
|
+
|
133
|
+
SplitPane.prototype.setLeftSideHtml = function(html){
|
134
|
+
this.leftPane.html(html);
|
135
|
+
};
|
136
|
+
|
137
|
+
return SplitPane;
|
138
|
+
})();
|
@@ -0,0 +1,84 @@
|
|
1
|
+
(function(){
|
2
|
+
|
3
|
+
var splitPane;
|
4
|
+
|
5
|
+
spud.admin.users = {
|
6
|
+
index: function(){
|
7
|
+
splitPane = new spud.admin.SplitPane('.admin-users-split-pane');
|
8
|
+
$('.admin-user-add-btn').on('click', true, clickedAddEditUser);
|
9
|
+
$('.admin-users-split-pane').on('click', '.admin-user-edit-btn', clickedAddEditUser);
|
10
|
+
$('.admin-users-split-pane').on('click', '.admin-user-edit-cancel-btn', clickedCancelAddEditUser);
|
11
|
+
$('.admin-users-split-pane').on('click', '.admin-user-delete-btn', clickedDeleteUser);
|
12
|
+
$('.admin-users-split-pane').on('submit', '.admin-user-form', submittedUserForm);
|
13
|
+
$('body').on('click', '.split-pane-refresh-btn', clickedRefreshButton);
|
14
|
+
}
|
15
|
+
};
|
16
|
+
|
17
|
+
var _userHtmlCache;
|
18
|
+
var _previouslySelected;
|
19
|
+
|
20
|
+
var clickedAddEditUser = function(e){
|
21
|
+
e.preventDefault();
|
22
|
+
_previouslySelected = splitPane.getActiveItem();
|
23
|
+
_userHtmlCache = splitPane.getContentAreaHtml();
|
24
|
+
var isAdd = e.data;
|
25
|
+
if(isAdd){
|
26
|
+
splitPane.deselectActiveItem();
|
27
|
+
}
|
28
|
+
var title = $(this).attr('title');
|
29
|
+
var url = $(this).attr('href');
|
30
|
+
$.ajax(url, {
|
31
|
+
dataType:'html',
|
32
|
+
success:function(html){
|
33
|
+
splitPane.setContentAreaHtml(html);
|
34
|
+
splitPane.setToolbarTitle(title);
|
35
|
+
}
|
36
|
+
});
|
37
|
+
};
|
38
|
+
|
39
|
+
var clickedCancelAddEditUser = function(e){
|
40
|
+
e.preventDefault();
|
41
|
+
splitPane.setContentAreaHtml(_userHtmlCache);
|
42
|
+
splitPane.setActiveItem(_previouslySelected);
|
43
|
+
splitPane.setToolbarTitle('');
|
44
|
+
};
|
45
|
+
|
46
|
+
var clickedDeleteUser = function(e){
|
47
|
+
e.preventDefault();
|
48
|
+
var url = $(this).attr('href');
|
49
|
+
$.ajax(url, {
|
50
|
+
dataType:'json',
|
51
|
+
type:'post',
|
52
|
+
data: {_method:'delete'},
|
53
|
+
success:function(html){
|
54
|
+
splitPane.removeCurrentlySelectedItem();
|
55
|
+
splitPane.setToolbarTitle('');
|
56
|
+
}
|
57
|
+
});
|
58
|
+
};
|
59
|
+
|
60
|
+
var submittedUserForm = function(e){
|
61
|
+
e.preventDefault();
|
62
|
+
var form = $(this);
|
63
|
+
var url = form.attr('action');
|
64
|
+
$.ajax(url, {
|
65
|
+
dataType:'html',
|
66
|
+
type: 'post',
|
67
|
+
data: form.serialize(),
|
68
|
+
success:function(html, textStatus, jqXHR){
|
69
|
+
splitPane.setContentAreaHtml(html);
|
70
|
+
splitPane.refreshList();
|
71
|
+
},
|
72
|
+
error:function(jqXHR, textStatus, errorThrown){
|
73
|
+
splitPane.setContentAreaHtml(jqXHR.responseText);
|
74
|
+
}
|
75
|
+
});
|
76
|
+
};
|
77
|
+
|
78
|
+
var clickedRefreshButton = function(e){
|
79
|
+
e.preventDefault();
|
80
|
+
splitPane.refreshList();
|
81
|
+
};
|
82
|
+
|
83
|
+
})();
|
84
|
+
|
@@ -1,10 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
1
|
+
//= require bootstrap/css/bootstrap
|
2
|
+
//= require datepicker/css/datepicker
|
3
|
+
//= require jquery-ui/css/flick/jquery-ui-1.9.1.custom
|
4
|
+
//= require codemirror
|
5
|
+
//= require_self
|
6
|
+
//= require admin/login
|
7
|
+
//= require admin/users
|
8
|
+
//= require admin/split_pane
|
8
9
|
|
9
10
|
body {
|
10
11
|
background:#eee;
|
@@ -135,26 +136,26 @@ div.admin_application:hover {
|
|
135
136
|
height:125px;
|
136
137
|
}
|
137
138
|
|
138
|
-
|
139
|
+
.detail_wrapper {
|
139
140
|
background:#fff;
|
140
141
|
width:960px;
|
141
142
|
min-height:300px;
|
142
143
|
border-radius:10px;
|
143
144
|
margin:15px auto 0px auto;
|
144
145
|
}
|
145
|
-
|
146
|
+
.detail_wrapper h2{
|
146
147
|
display:block;
|
147
148
|
line-height:50px;
|
148
149
|
color:#333;
|
149
150
|
}
|
150
|
-
|
151
|
+
.detail_wrapper .thumb_wrapper {
|
151
152
|
display:block;
|
152
153
|
width:50px;
|
153
154
|
height:50px;
|
154
155
|
float:left;
|
155
156
|
margin:0 10px 10px 10px;
|
156
157
|
}
|
157
|
-
|
158
|
+
.detail_wrapper h2 img {
|
158
159
|
|
159
160
|
width:100px;
|
160
161
|
|
@@ -192,35 +193,6 @@ div.admin_application:hover {
|
|
192
193
|
#detail_main {
|
193
194
|
padding-left:5px;
|
194
195
|
}
|
195
|
-
.dataTables_length {
|
196
|
-
float:left;
|
197
|
-
line-height:22px;
|
198
|
-
font-size:12px;
|
199
|
-
margin-left:5px;
|
200
|
-
}
|
201
|
-
.dataTables_filter {
|
202
|
-
float:right;
|
203
|
-
}
|
204
|
-
.dataTables_info {
|
205
|
-
float:left;
|
206
|
-
line-height:22px;
|
207
|
-
font-size:12px;
|
208
|
-
margin-left:5px;
|
209
|
-
}
|
210
|
-
.dataTables_paginate {
|
211
|
-
float:right;
|
212
|
-
}
|
213
|
-
.dataTables_paginate .ui-button {
|
214
|
-
padding:2px 5px;
|
215
|
-
|
216
|
-
margin:0 5px;
|
217
|
-
}
|
218
|
-
.data-table .css_right {
|
219
|
-
position:absolute;
|
220
|
-
right:0;
|
221
|
-
top:1px;
|
222
|
-
}
|
223
|
-
|
224
196
|
|
225
197
|
|
226
198
|
div.field_with_errors {
|
@@ -233,7 +205,6 @@ div.field_with_errors {
|
|
233
205
|
}
|
234
206
|
div.field_with_errors label {
|
235
207
|
color:#F00;
|
236
|
-
/*background: url(/images/icons/error.png) top left no-repeat;*/
|
237
208
|
}
|
238
209
|
|
239
210
|
|
@@ -287,11 +258,11 @@ div.field_with_errors label {
|
|
287
258
|
}
|
288
259
|
|
289
260
|
.admin-table th .asc {
|
290
|
-
background-image: url(
|
261
|
+
background-image: image-url("admin/up_arrow.gif");
|
291
262
|
}
|
292
263
|
|
293
264
|
.admin-table th .desc {
|
294
|
-
background-image: url(
|
265
|
+
background-image: image-url("admin/down_arrow.gif");
|
295
266
|
}
|
296
267
|
|
297
268
|
|
@@ -359,27 +330,6 @@ form h2 {
|
|
359
330
|
height:20px;
|
360
331
|
}
|
361
332
|
|
362
|
-
/*Flash Styles*/
|
363
|
-
div.flash {
|
364
|
-
padding:10px;
|
365
|
-
}
|
366
|
-
div.flash.notice {
|
367
|
-
background:#99ff99;
|
368
|
-
}
|
369
|
-
div.flash.warning {
|
370
|
-
background:#FFFACD;
|
371
|
-
}
|
372
|
-
div.flash.error {
|
373
|
-
background:#ff9999;
|
374
|
-
}
|
375
|
-
div.flash h2 {
|
376
|
-
color:white !important;
|
377
|
-
font-size:14px !important;
|
378
|
-
}
|
379
|
-
div.flash ul {
|
380
|
-
color:white !important;
|
381
|
-
font-size:12px !important;
|
382
|
-
}
|
383
333
|
form input.full-width {
|
384
334
|
display: block;
|
385
335
|
width: 99%;
|
@@ -394,46 +344,6 @@ form input.full-width {
|
|
394
344
|
float: right;
|
395
345
|
}
|
396
346
|
|
397
|
-
#dashboard-editmode {
|
398
|
-
clear:both;
|
399
|
-
background:#ccc;
|
400
|
-
padding:10px;
|
401
|
-
text-align:center;
|
402
|
-
display:none;
|
403
|
-
}
|
404
|
-
/*Jiggle Animation*/
|
405
|
-
.jiggly {
|
406
|
-
-webkit-animation: jiggle 0.2s infinite;
|
407
|
-
-moz-animation-duration: 0.2s;
|
408
|
-
-moz-animation-name: jiggle;
|
409
|
-
-moz-animation-iteration-count: infinite;
|
410
|
-
-webkit-transform: rotate(-1deg);
|
411
|
-
-moz-transform: rotate(-1deg);
|
412
|
-
}
|
413
|
-
|
414
|
-
.time_select select {
|
415
|
-
width:auto;
|
416
|
-
}
|
417
|
-
|
418
|
-
@-moz-keyframes jiggle {
|
419
|
-
0% {
|
420
|
-
-moz-transform: rotate(-1deg);
|
421
|
-
}
|
422
|
-
50% {
|
423
|
-
-moz-transform: rotate(1deg);
|
424
|
-
}
|
425
|
-
}
|
426
|
-
|
427
|
-
@-webkit-keyframes jiggle {
|
428
|
-
0% {
|
429
|
-
-webkit-transform: rotate(-1deg);
|
430
|
-
}
|
431
|
-
50% {
|
432
|
-
-webkit-transform: rotate(1deg);
|
433
|
-
}
|
434
|
-
}
|
435
|
-
|
436
|
-
|
437
347
|
/*Retina CSS*/
|
438
348
|
@media only screen and (-webkit-min-device-pixel-ratio: 1.5),
|
439
349
|
only screen and (-o-min-device-pixel-ratio: 3/2),
|
@@ -0,0 +1,49 @@
|
|
1
|
+
#content_wrapper {
|
2
|
+
position: relative;
|
3
|
+
width: 100%;
|
4
|
+
height: 100%;
|
5
|
+
}
|
6
|
+
.login-form {
|
7
|
+
width: 460px;
|
8
|
+
margin: 75px auto 0;
|
9
|
+
padding: 0px;
|
10
|
+
color:#000;
|
11
|
+
background: #fff;
|
12
|
+
-webkit-border-radius: 10px;
|
13
|
+
-moz-border-radius: 10px;
|
14
|
+
border-radius:10px;
|
15
|
+
box-shadow: 2px 2px 10px #777;
|
16
|
+
overflow-x: hidden;
|
17
|
+
overflow-y: hidden;
|
18
|
+
}
|
19
|
+
.login-form h1 {
|
20
|
+
font-size: 28px;
|
21
|
+
margin: 0 0 20px;
|
22
|
+
padding: 10px;
|
23
|
+
background:rgb(199,90,0);
|
24
|
+
background-image: linear-gradient(top, rgb(199,90,0) 5%, rgb(179,72,0) 53%);
|
25
|
+
background-image: -o-linear-gradient(top, rgb(199,90,0) 5%, rgb(179,72,0) 53%);
|
26
|
+
background-image: -moz-linear-gradient(top, rgb(199,90,0) 5%, rgb(179,72,0) 53%);
|
27
|
+
background-image: -webkit-linear-gradient(top, rgb(199,90,0) 5%, rgb(179,72,0) 53%);
|
28
|
+
background-image: -ms-linear-gradient(top, rgb(199,90,0) 5%, rgb(179,72,0) 53%);
|
29
|
+
background-image: -webkit-gradient(
|
30
|
+
linear,
|
31
|
+
left top,
|
32
|
+
left bottom,
|
33
|
+
color-stop(0.05, rgb(199,90,0)),
|
34
|
+
color-stop(0.53, rgb(179,72,0))
|
35
|
+
);
|
36
|
+
color: #fff;
|
37
|
+
}
|
38
|
+
.login-form .alert{
|
39
|
+
margin: 0 10px;
|
40
|
+
}
|
41
|
+
.login-form form {
|
42
|
+
margin: 20px;
|
43
|
+
}
|
44
|
+
.login-form .field-group {
|
45
|
+
margin: 0 0 15px;
|
46
|
+
}
|
47
|
+
.login-form label {
|
48
|
+
margin: 0 0 5px;
|
49
|
+
}
|