usman 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +38 -0
- data/Rakefile +37 -0
- data/app/assets/config/usman_manifest.js +2 -0
- data/app/assets/javascripts/usman/application.js +13 -0
- data/app/assets/stylesheets/usman/application.css +15 -0
- data/app/controllers/usman/admin/base_controller.rb +24 -0
- data/app/controllers/usman/admin/dashboard_controller.rb +18 -0
- data/app/controllers/usman/admin/features_controller.rb +86 -0
- data/app/controllers/usman/admin/permissions_controller.rb +76 -0
- data/app/controllers/usman/admin/resource_controller.rb +11 -0
- data/app/controllers/usman/admin/users_controller.rb +117 -0
- data/app/controllers/usman/application_controller.rb +13 -0
- data/app/controllers/usman/sessions_controller.rb +84 -0
- data/app/helpers/usman/application_helper.rb +4 -0
- data/app/helpers/usman/authentication_helper.rb +120 -0
- data/app/jobs/usman/application_job.rb +4 -0
- data/app/mailers/usman/application_mailer.rb +6 -0
- data/app/models/feature.rb +112 -0
- data/app/models/image/base.rb +30 -0
- data/app/models/image/feature_image.rb +3 -0
- data/app/models/image/profile_picture.rb +3 -0
- data/app/models/permission.rb +28 -0
- data/app/models/user.rb +247 -0
- data/app/models/usman/application_record.rb +5 -0
- data/app/services/usman/authentication_service.rb +45 -0
- data/app/uploaders/feature_image_uploader.rb +14 -0
- data/app/uploaders/image_uploader.rb +90 -0
- data/app/uploaders/profile_picture_uploader.rb +14 -0
- data/app/views/layouts/kuppayam/_footer.html.erb +25 -0
- data/app/views/layouts/kuppayam/_header.html.erb +43 -0
- data/app/views/layouts/kuppayam/_navbar.html.erb +55 -0
- data/app/views/layouts/kuppayam/_sidebar.html.erb +78 -0
- data/app/views/usman/admin/dashboard/index.html.erb +52 -0
- data/app/views/usman/admin/features/_action_buttons.html.erb +11 -0
- data/app/views/usman/admin/features/_form.html.erb +19 -0
- data/app/views/usman/admin/features/_index.html.erb +79 -0
- data/app/views/usman/admin/features/_row.html.erb +55 -0
- data/app/views/usman/admin/features/_show.html.erb +48 -0
- data/app/views/usman/admin/features/create.js.erb +16 -0
- data/app/views/usman/admin/features/destroy.js.erb +16 -0
- data/app/views/usman/admin/features/edit.js.erb +7 -0
- data/app/views/usman/admin/features/index.html.erb +25 -0
- data/app/views/usman/admin/features/index.js.erb +8 -0
- data/app/views/usman/admin/features/new.js.erb +7 -0
- data/app/views/usman/admin/features/row.js.erb +10 -0
- data/app/views/usman/admin/features/show.js.erb +8 -0
- data/app/views/usman/admin/features/update.js.erb +16 -0
- data/app/views/usman/admin/permissions/_action_buttons.html.erb +11 -0
- data/app/views/usman/admin/permissions/_form.html.erb +70 -0
- data/app/views/usman/admin/permissions/_index.html.erb +56 -0
- data/app/views/usman/admin/permissions/_row.html.erb +27 -0
- data/app/views/usman/admin/permissions/_show.html.erb +48 -0
- data/app/views/usman/admin/permissions/create.js.erb +17 -0
- data/app/views/usman/admin/permissions/destroy.js.erb +16 -0
- data/app/views/usman/admin/permissions/edit.js.erb +7 -0
- data/app/views/usman/admin/permissions/index.html.erb +25 -0
- data/app/views/usman/admin/permissions/index.js.erb +8 -0
- data/app/views/usman/admin/permissions/new.js.erb +7 -0
- data/app/views/usman/admin/permissions/row.js.erb +10 -0
- data/app/views/usman/admin/permissions/show.js.erb +8 -0
- data/app/views/usman/admin/permissions/update.js.erb +16 -0
- data/app/views/usman/admin/users/_action_buttons.html.erb +11 -0
- data/app/views/usman/admin/users/_form.html.erb +36 -0
- data/app/views/usman/admin/users/_index.html.erb +120 -0
- data/app/views/usman/admin/users/_row.html.erb +92 -0
- data/app/views/usman/admin/users/_show.html.erb +132 -0
- data/app/views/usman/admin/users/create.js.erb +16 -0
- data/app/views/usman/admin/users/destroy.js.erb +16 -0
- data/app/views/usman/admin/users/edit.js.erb +7 -0
- data/app/views/usman/admin/users/index.html.erb +40 -0
- data/app/views/usman/admin/users/index.js.erb +8 -0
- data/app/views/usman/admin/users/new.js.erb +7 -0
- data/app/views/usman/admin/users/row.js.erb +10 -0
- data/app/views/usman/admin/users/show.js.erb +8 -0
- data/app/views/usman/admin/users/update.js.erb +16 -0
- data/app/views/usman/sessions/_form.html.erb +48 -0
- data/app/views/usman/sessions/_sign_in.js.erb +3 -0
- data/app/views/usman/sessions/sign_in.html.erb +63 -0
- data/config/locales/usman.en.yml +61 -0
- data/config/routes.rb +45 -0
- data/db/migrate/20131108102728_create_images.rb +12 -0
- data/db/migrate/20140402113213_create_users.rb +57 -0
- data/db/migrate/20140402113214_create_features.rb +24 -0
- data/lib/tasks/usman_tasks.rake +4 -0
- data/lib/usman/engine.rb +14 -0
- data/lib/usman/version.rb +3 -0
- data/lib/usman.rb +5 -0
- metadata +418 -0
@@ -0,0 +1,92 @@
|
|
1
|
+
<% edit_link = edit_admin_user_path(id: user.id) %>
|
2
|
+
<% delete_link = admin_user_path(id: user.id) %>
|
3
|
+
|
4
|
+
<tr id="tr_user_<%= user.id %>">
|
5
|
+
|
6
|
+
<!-- <td class="user-cb">
|
7
|
+
<input type="checkbox" class="cbr" name="users[]" value="1" checked />
|
8
|
+
</td> -->
|
9
|
+
|
10
|
+
<!-- <th scope="row" style="text-align: center;">
|
11
|
+
<%# if i < 0 %>
|
12
|
+
<i class="fa fa-check text-success"></i>
|
13
|
+
<%# else %>
|
14
|
+
<%#= i + 1 + (@per_page.to_i * (@current_page.to_i - 1)) %>
|
15
|
+
<%# end %>
|
16
|
+
</th> -->
|
17
|
+
|
18
|
+
<td class="user-image hidden-xs hidden-sm">
|
19
|
+
<a href="#">
|
20
|
+
<%= display_image(user, "profile_picture.image.small.url", width: "32", height: "auto", class: "img-circle", alt: user.display_name) %>
|
21
|
+
</a>
|
22
|
+
</td>
|
23
|
+
|
24
|
+
<td class="user-name"><%= link_to user.name, admin_user_path(user), remote: true %></td>
|
25
|
+
|
26
|
+
<td class="hidden-xs hidden-sm"><%= link_to user.username, "#" %></td>
|
27
|
+
|
28
|
+
<td class="hidden-xs hidden-sm"><%= link_to user.email, "#", class: "email" %></td>
|
29
|
+
|
30
|
+
<% if @current_user.is_super_admin? %>
|
31
|
+
<td class="hidden-xs hidden-sm">
|
32
|
+
<% if user.super_admin %>
|
33
|
+
<span class="mr-10 mt-5 label label-warning">Super Admin</span>
|
34
|
+
<% else %>
|
35
|
+
<span class="mr-10 mt-5 label label-default">Normal</span>
|
36
|
+
<% end %>
|
37
|
+
</td>
|
38
|
+
<% end %>
|
39
|
+
|
40
|
+
<td>
|
41
|
+
<% if user.pending? %>
|
42
|
+
<span class="ml-5 mt-5 label label-default">Pending</span>
|
43
|
+
<% elsif user.approved? %>
|
44
|
+
<span class="ml-5 mt-5 label label-success">Approved</span>
|
45
|
+
<% elsif user.suspended? %>
|
46
|
+
<span class="ml-5 mt-5 label label-danger">Suspended</span>
|
47
|
+
<% end %>
|
48
|
+
</td>
|
49
|
+
|
50
|
+
<td class="action-links" style="width:15%">
|
51
|
+
|
52
|
+
<%= link_to raw("<i class=\"linecons-pencil\"></i> Edit User"), edit_link, :remote=>true, class: "edit" %>
|
53
|
+
|
54
|
+
<%= link_to raw("<i class=\"linecons-trash\"></i> Delete"), delete_link, method: :delete, role: "menuitem", tabindex: "-1", data: { confirm: 'Are you sure?' }, :remote=>true, class: "delete" if @current_user != user %>
|
55
|
+
|
56
|
+
<% if @current_user.super_admin? %>
|
57
|
+
<%= link_to raw("<i class=\"linecons-paper-plane\"></i> Masquerade"), masquerade_admin_user_path(user), method: :put, data: { confirm: "Are you sure? Do you really want to logout current session and login as #{user.name}?" } %>
|
58
|
+
<% end %>
|
59
|
+
|
60
|
+
</td>
|
61
|
+
|
62
|
+
<td class="action-links" style="width:15%">
|
63
|
+
|
64
|
+
<% if @current_user.super_admin? %>
|
65
|
+
<% if user.super_admin? %>
|
66
|
+
<!-- Remove Super Admin -->
|
67
|
+
<%= link_to raw("<i class=\"fa fa-remove mr-5\"></i> Remove Super Admin"), remove_super_admin_admin_user_path(id: user.id), method: :put, :remote=>true, role: "menuitem", tabindex: "-1" %>
|
68
|
+
<% else %>
|
69
|
+
<!-- Make Super Admin -->
|
70
|
+
<%= link_to raw("<i class=\"fa fa-plus-square mr-5\"></i> Make Super Admin"), make_super_admin_admin_user_path(id: user.id), method: :put, remote: true, role: "menuitem", tabindex: "-1" %>
|
71
|
+
<% end %>
|
72
|
+
<% end %>
|
73
|
+
|
74
|
+
<% case user.status %>
|
75
|
+
<% when "approved" %>
|
76
|
+
<!-- Pending -->
|
77
|
+
<%= link_to raw("<i class=\"fa fa-circle mr-5\"></i> Mark as Pending"), update_status_admin_user_path(:id =>user.id, :status =>'pending'), :method =>'PUT', :remote=>true, role: "menuitem", tabindex: "-1", :class=>"user_status" %>
|
78
|
+
|
79
|
+
<!-- Suspend -->
|
80
|
+
<%= link_to raw("<i class=\"fa fa-edit mr-5\"></i> Suspend"), update_status_admin_user_path(:id =>user.id, :status =>'suspended'), :method =>'PUT', :remote=>true, role: "menuitem", tabindex: "-1", :class=>"user_status" %>
|
81
|
+
<% when "pending" %>
|
82
|
+
<!-- Approve -->
|
83
|
+
<%= link_to raw("<i class=\"fa fa-circle-o mr-5\"></i> Approve"), update_status_admin_user_path(:id =>user.id, :status =>'approved'), :method =>'PUT', :remote=>true, role: "menuitem", tabindex: "-1", :class=>"user_status" %>
|
84
|
+
<% when "suspended" %>
|
85
|
+
<!-- Approve -->
|
86
|
+
<%= link_to raw("<i class=\"fa fa-circle-o mr-5\"></i> Approve"), update_status_admin_user_path(:id =>user.id, :status =>'approved'), :method =>'PUT', :remote=>true, role: "menuitem", tabindex: "-1",:class=>"user_status" %>
|
87
|
+
<% end %>
|
88
|
+
|
89
|
+
</td>
|
90
|
+
|
91
|
+
</tr>
|
92
|
+
|
@@ -0,0 +1,132 @@
|
|
1
|
+
<% status_hash = {approved: "success", pending: "default", removed: "danger"} %>
|
2
|
+
|
3
|
+
<div class="media p-5 <%= status_hash[@user.status.to_sym] %>">
|
4
|
+
|
5
|
+
<div class="pull-left p-40" style="width:30%;">
|
6
|
+
<%= edit_image(@user, "profile_picture.image.large.url", upload_image_link(@user, :profile_picture)) %>
|
7
|
+
</div>
|
8
|
+
|
9
|
+
<div class="pull-left ml-10" style="width:65%;">
|
10
|
+
|
11
|
+
<h1><%= @user.name %></h1>
|
12
|
+
|
13
|
+
<span class="ml-5 mt-5 label label-<%= status_hash[@user.status.to_sym] %>"><%= @user.status.titleize %></span>
|
14
|
+
|
15
|
+
<% if @user.super_admin %>
|
16
|
+
<span class="mr-10 mt-5 label label-warning">Super Admin</span>
|
17
|
+
<% else %>
|
18
|
+
<span class="mr-10 mt-5 label label-default">Normal</span>
|
19
|
+
<% end %>
|
20
|
+
|
21
|
+
<%= clear_tag %>
|
22
|
+
|
23
|
+
<div class="table-responsive mt-30">
|
24
|
+
<table class="table table-striped table-condensed table-bordered">
|
25
|
+
<tbody>
|
26
|
+
|
27
|
+
<tr>
|
28
|
+
<th>Username</th><td><%= @user.username %></td>
|
29
|
+
<th>Email</th><td><%= @user.email %></td>
|
30
|
+
</tr>
|
31
|
+
|
32
|
+
<tr>
|
33
|
+
<th>Phone</th><td><%= @user.phone %></td>
|
34
|
+
<th>Designation</th><td><%= @user.designation %></td>
|
35
|
+
</tr>
|
36
|
+
|
37
|
+
<tr>
|
38
|
+
<th>Super Admim?</th><td><%= @user.super_admin %></td>
|
39
|
+
<th>Status</th><td><%= @user.status.titleize %></td>
|
40
|
+
</tr>
|
41
|
+
|
42
|
+
</tbody>
|
43
|
+
</table>
|
44
|
+
</div>
|
45
|
+
|
46
|
+
<%= clear_tag %>
|
47
|
+
</div>
|
48
|
+
|
49
|
+
</div>
|
50
|
+
|
51
|
+
<h4 class="mb-20">Technical Details</h4>
|
52
|
+
|
53
|
+
<div class="table-responsive">
|
54
|
+
<table class="table table-striped table-condensed table-bordered mb-30">
|
55
|
+
<tbody>
|
56
|
+
|
57
|
+
|
58
|
+
<tr>
|
59
|
+
<th style="width:20%;">Sign In Count</th><td style="width:30%;"><%= @user.sign_in_count %></td>
|
60
|
+
<th style="width:20%;">Remember User</th><td style="width:30%;"><%= @user.remember_created_at.strftime("%m/%d/%Y - %H:%M:%S") if @user.remember_created_at %></td>
|
61
|
+
</tr>
|
62
|
+
|
63
|
+
<tr>
|
64
|
+
<th>Current Sign In At</th><td><%= @user.current_sign_in_at.strftime("%m/%d/%Y - %H:%M:%S") if @user.current_sign_in_at %></td>
|
65
|
+
<th>Last Sign In At</th><td><%= @user.last_sign_in_at.strftime("%m/%d/%Y - %H:%M:%S") if @user.last_sign_in_at %></td>
|
66
|
+
</tr>
|
67
|
+
|
68
|
+
<tr>
|
69
|
+
<th>Current Sign In IP</th><td><%= @user.current_sign_in_ip %></td>
|
70
|
+
<th>Last Sign In IP</th><td><%= @user.last_sign_in_ip %></td>
|
71
|
+
</tr>
|
72
|
+
|
73
|
+
</tbody>
|
74
|
+
</table>
|
75
|
+
</div>
|
76
|
+
|
77
|
+
<div class="table-responsive">
|
78
|
+
<table class="table table-striped table-condensed table-bordered">
|
79
|
+
<tbody>
|
80
|
+
|
81
|
+
<tr>
|
82
|
+
<th style="width:20%;">Reset Password Token</th><td style="width:30%;"><%= @user.reset_password_token %></td>
|
83
|
+
<th style="width:20%;">Reset Password Sent At</th><td style="width:30%;"><%= @user.reset_password_sent_at.strftime("%m/%d/%Y - %H:%M:%S") if @user.reset_password_sent_at %></td>
|
84
|
+
</tr>
|
85
|
+
|
86
|
+
<tr>
|
87
|
+
<th>Locked At</th><td colspan="3"><%= @user.locked_at.strftime("%m/%d/%Y - %H:%M:%S") if @user.locked_at %></td>
|
88
|
+
</tr>
|
89
|
+
|
90
|
+
<tr>
|
91
|
+
<th>Failed Attempts</th><td><%= @user.failed_attempts %></td>
|
92
|
+
<th>Unlock Token</th><td><%= @user.unlock_token %></td>
|
93
|
+
</tr>
|
94
|
+
|
95
|
+
<tr>
|
96
|
+
<th>Confirmation Token</th><td><%= @user.confirmation_token %></td>
|
97
|
+
<th>Confirmation Token Sent At</th><td><%= @user.confirmed_at.strftime("%m/%d/%Y - %H:%M:%S") if @user.confirmed_at %></td>
|
98
|
+
</tr>
|
99
|
+
|
100
|
+
<tr>
|
101
|
+
<th>Confirmation Sent At</th><td><%= @user.confirmation_sent_at.strftime("%m/%d/%Y - %H:%M:%S") if @user.confirmation_sent_at %></td>
|
102
|
+
<th>Uncomfirmed Email</th><td><%= @user.unconfirmed_email %></td>
|
103
|
+
</tr>
|
104
|
+
|
105
|
+
<tr>
|
106
|
+
<th>Auth Token</th><td><%= @user.auth_token %></td>
|
107
|
+
<th>Token Created At</th><td><%= @user.token_created_at.strftime("%m/%d/%Y - %H:%M:%S") if @user.token_created_at %></td>
|
108
|
+
</tr>
|
109
|
+
|
110
|
+
<tr>
|
111
|
+
<th>Created At</th><td><%= @user.created_at.strftime("%m/%d/%Y - %H:%M:%S") if @user.created_at %></td>
|
112
|
+
<th>Updated At</th><td><%= @user.updated_at.strftime("%m/%d/%Y - %H:%M:%S") if @user.updated_at %></td>
|
113
|
+
</tr>
|
114
|
+
|
115
|
+
</tbody>
|
116
|
+
</table>
|
117
|
+
</div>
|
118
|
+
|
119
|
+
<div>
|
120
|
+
<%
|
121
|
+
edit_link = edit_admin_user_url(id: @user.id)
|
122
|
+
delete_link = admin_user_url(id: @user.id)
|
123
|
+
%>
|
124
|
+
|
125
|
+
<%= link_to raw("<i class=\"fa fa-close mr-5\"></i> <span>Cancel</span>"), "#", onclick: "closeLargeModal();", class: "btn btn-white pull-left" %>
|
126
|
+
|
127
|
+
<%= link_to raw("<i class=\"fa fa-trash mr-5\"></i> <span>Delete User</span>"), delete_link, method: :delete, :remote=>true, class: "btn btn-gray pull-right" %>
|
128
|
+
|
129
|
+
<%= link_to raw("<i class=\"fa fa-edit mr-5\"></i> Edit User"), edit_link, method: :get, :remote=>true, class: "btn btn-gray pull-right mr-10" %>
|
130
|
+
</div>
|
131
|
+
|
132
|
+
<%= clear_tag %>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<% if @user.errors.blank? %>
|
2
|
+
closeLargeModal();
|
3
|
+
$('#div_user_index table > tbody > tr:first').before("<%= escape_javascript(render(:partial=>'/usman/admin/users/row', locals: {user: @user})) %>")
|
4
|
+
$("#tr_user_<%= @user.id %>").css("background-color", "#fffddd");
|
5
|
+
<% else %>
|
6
|
+
// Show the form in the modal
|
7
|
+
heading = "Add a User";
|
8
|
+
bodyContent = "<%= escape_javascript(render(:partial=>'/usman/admin/users/form')) %>";
|
9
|
+
showLargeModal(heading, bodyContent);
|
10
|
+
var $div = $('<iframe id="iframe_user" name="iframe_user" width="100%" style="display:none"></iframe>').appendTo('body');
|
11
|
+
<%
|
12
|
+
text = "You have few errors. They have been highlighted."
|
13
|
+
error_message = content_tag(:div, text, class: "alert alert-danger")
|
14
|
+
%>
|
15
|
+
$("#user_form_error").html("<%= escape_javascript(error_message) %>");
|
16
|
+
<% end %>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<% if @destroyed %>
|
2
|
+
closeLargeModal();
|
3
|
+
$('#div_user_index').html("<%= escape_javascript(render(:partial=>'/usman/admin/users/index')) %>");
|
4
|
+
<% else %>
|
5
|
+
// Show the error in a modal
|
6
|
+
<%
|
7
|
+
text = User::DELETE_MESSAGE
|
8
|
+
error_message = content_tag(:div, text, class: 'alert alert-danger')
|
9
|
+
%>
|
10
|
+
heading = "Remove '<%= @user.name %>'";
|
11
|
+
bodyContent = "<%= escape_javascript(error_message) %>";
|
12
|
+
showLargeModal(heading, bodyContent);
|
13
|
+
var $div = $('<iframe id="iframe_user" name="iframe_user" width="100%" style="display:none"></iframe>').appendTo('body');
|
14
|
+
<% end %>
|
15
|
+
|
16
|
+
|
@@ -0,0 +1,7 @@
|
|
1
|
+
// Show the new form in the right box.
|
2
|
+
heading = "Edit '<%= raw @user.name_was %>'";
|
3
|
+
bodyContent = "<%= escape_javascript(render(:partial=>'/usman/admin/users/form')) %>";
|
4
|
+
showLargeModal(heading, bodyContent);
|
5
|
+
|
6
|
+
// When the image upload form is submitted, the server response will appear in this iframe -->
|
7
|
+
var $div = $('<iframe id="iframe_user" name="iframe_user" width="100%" style="display:none"></iframe>').appendTo('body');
|
@@ -0,0 +1,40 @@
|
|
1
|
+
<div class="row">
|
2
|
+
|
3
|
+
<div class="col-md-12">
|
4
|
+
<ul class="nav nav-tabs">
|
5
|
+
|
6
|
+
<%# Show Admin tab only for admins %>
|
7
|
+
<% if @current_user.is_super_admin? %>
|
8
|
+
<li class="<%= @super_admin == false ? 'active' : '' %>">
|
9
|
+
<%= link_to "Users", admin_users_path(sa: '0') %>
|
10
|
+
</li>
|
11
|
+
<li class="<%= @super_admin == true ? 'active' : '' %>">
|
12
|
+
<%= link_to "Administrators", admin_users_path(sa: '1') %>
|
13
|
+
</li>
|
14
|
+
<% else %>
|
15
|
+
<li class="active">
|
16
|
+
<%= link_to "Users", admin_users_path(sa: '0') %>
|
17
|
+
</li>
|
18
|
+
<% end %>
|
19
|
+
|
20
|
+
</ul>
|
21
|
+
|
22
|
+
<div class="tab-content">
|
23
|
+
<div class="tab-pane active">
|
24
|
+
|
25
|
+
<div id="div_user_action_buttons">
|
26
|
+
<%= render :partial=>"usman/admin/users/action_buttons" %>
|
27
|
+
</div>
|
28
|
+
<%= clear_tag(10) %>
|
29
|
+
|
30
|
+
<div id="div_user_index">
|
31
|
+
<%= render :partial=>"usman/admin/users/index" %>
|
32
|
+
</div>
|
33
|
+
<%= clear_tag(10) %>
|
34
|
+
|
35
|
+
</div>
|
36
|
+
</div>
|
37
|
+
|
38
|
+
</div>
|
39
|
+
|
40
|
+
</div>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
closeLargeModal();
|
2
|
+
<% if @users.any? %>
|
3
|
+
// Fill the right box with first enquiry details in the list
|
4
|
+
$('#div_user_index').html("<%= escape_javascript(render(:partial=>'/usman/admin/users/index')) %>");
|
5
|
+
<% else %>
|
6
|
+
var noResultsText = "<%= escape_javascript(theme_panel_message(I18n.translate('forms.no_results')))%>";
|
7
|
+
$('#div_user_index').html(noResultsText);
|
8
|
+
<% end %>
|
@@ -0,0 +1,7 @@
|
|
1
|
+
// Show the new form in the right box.
|
2
|
+
heading = "Add a User";
|
3
|
+
bodyContent = "<%= escape_javascript(render(:partial=>'/usman/admin/users/form')) %>";
|
4
|
+
showLargeModal(heading, bodyContent);
|
5
|
+
|
6
|
+
// When the image upload form is submitted, the server response will appear in this iframe -->
|
7
|
+
var $div = $('<iframe id="iframe_user" name="iframe_user" width="100%" style="display:none"></iframe>').appendTo('body');
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<% if @user.errors.blank? %>
|
2
|
+
<% status_hash = {approved: "success", pending: "default", suspeneded: "danger"} %>
|
3
|
+
$("#tr_user_<%= @user.id %>").replaceWith("<%= escape_javascript(render(:partial=>'/usman/admin/users/row', locals: {user: @user, i: -1})) %>")
|
4
|
+
// Close Modal
|
5
|
+
closeLargeModal();
|
6
|
+
<% else %>
|
7
|
+
// Populate Server Side Errors
|
8
|
+
errorMessages = <%= @user.errors.full_messages.to_json.html_safe %>;
|
9
|
+
populateServerSideErrors('user', errorMessages);
|
10
|
+
<% end %>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
// Show the new form in the right box.
|
2
|
+
heading = "<%= raw @user.name %>";
|
3
|
+
bodyContent = "<%= escape_javascript(render(:partial=>'/usman/admin/users/show')) %>";
|
4
|
+
closeLargeModal();
|
5
|
+
showLargeModal(heading, bodyContent);
|
6
|
+
|
7
|
+
// When the image upload form is submitted, the server response will appear in this iframe -->
|
8
|
+
var $div = $('<iframe id="iframe_user" name="iframe_user" width="100%" style="display:none"></iframe>').appendTo('body');
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<% if @user.errors.blank? %>
|
2
|
+
$('#tr_user_<%= @user.id %>').replaceWith("<%= escape_javascript(render(:partial=>'/usman/admin/users/row', locals: {user: @user})) %>");
|
3
|
+
$("#tr_user_<%= @user.id %>").css("background-color", "#fffddd");
|
4
|
+
closeLargeModal();
|
5
|
+
<% else %>
|
6
|
+
// Show the form in the modal
|
7
|
+
heading = "Edit '<%= raw @user.name_was %>'";
|
8
|
+
bodyContent = "<%= escape_javascript(render(:partial=>'/usman/admin/users/form')) %>";
|
9
|
+
showLargeModal(heading, bodyContent);
|
10
|
+
var $div = $('<iframe id="iframe_user" name="iframe_user" width="100%" style="display:none"></iframe>').appendTo('body');
|
11
|
+
<%
|
12
|
+
text = "You have few errors. They have been highlighted."
|
13
|
+
error_message = content_tag(:div, text, class: "alert alert-danger")
|
14
|
+
%>
|
15
|
+
$("#user_form_error").html("<%= escape_javascript(error_message) %>");
|
16
|
+
<% end %>
|
@@ -0,0 +1,48 @@
|
|
1
|
+
<%= form_tag create_session_path, :role=>"form", id: "form_sign_in", class: "login-form fade-in-effect" do %>
|
2
|
+
|
3
|
+
<%= hidden_field_tag :customer_app, params[:customer_app] if params[:customer_app] %>
|
4
|
+
|
5
|
+
<%= hidden_field_tag :redirect_back_url, params[:redirect_back_url] if params[:redirect_back_url] %>
|
6
|
+
|
7
|
+
<%= hidden_field_tag :requested_url, params[:requested_url] if params[:requested_url] %>
|
8
|
+
|
9
|
+
<div class="row pt-10">
|
10
|
+
<div class="col-sm-offset-3 col-sm-4">
|
11
|
+
<img src="/assets/kuppayam/logo.png" alt="" width="180" />
|
12
|
+
</div>
|
13
|
+
</div>
|
14
|
+
|
15
|
+
<div class="login-header text-center">
|
16
|
+
<p>Sign in to access the admin area!</p>
|
17
|
+
</div>
|
18
|
+
|
19
|
+
<div class="form-group">
|
20
|
+
<label class="control-label" for="login_handle">Email / Username</label>
|
21
|
+
<%= text_field_tag :email, params[:login_handle], :placeholder=> "Email / Username", :name => "login_handle", :class=>"form-control", autocomplete: "off" %>
|
22
|
+
</div>
|
23
|
+
|
24
|
+
<div class="form-group">
|
25
|
+
<label class="control-label" for="password">Password</label>
|
26
|
+
<%= password_field_tag :password, '', :placeholder=> "Password", :name => "password", :class=>"form-control", id: "password", autocomplete: "off" %>
|
27
|
+
</div>
|
28
|
+
|
29
|
+
<div class="form-group">
|
30
|
+
<button type="submit" class="btn btn-primary btn-block text-left">
|
31
|
+
<i class="fa-lock"></i>
|
32
|
+
Sign In
|
33
|
+
</button>
|
34
|
+
</div>
|
35
|
+
|
36
|
+
<!-- <div class="login-footer">
|
37
|
+
<%#= link_to 'Forgot your password?', forgot_password_form_path %>
|
38
|
+
|
39
|
+
<div class="info-links">
|
40
|
+
<a href="#">ToS</a> -
|
41
|
+
<a href="#">Privacy Policy</a>
|
42
|
+
</div>
|
43
|
+
|
44
|
+
</div> -->
|
45
|
+
|
46
|
+
<% end %>
|
47
|
+
|
48
|
+
|
@@ -0,0 +1,63 @@
|
|
1
|
+
<div class="login-container">
|
2
|
+
|
3
|
+
<div class="row">
|
4
|
+
|
5
|
+
<div class="col-sm-offset-3 col-sm-6">
|
6
|
+
|
7
|
+
<% if defined?(flash) %>
|
8
|
+
<!-- Errors container -->
|
9
|
+
<div class="errors-container">
|
10
|
+
<%= flash_message(false) -%>
|
11
|
+
</div>
|
12
|
+
<% end %>
|
13
|
+
|
14
|
+
<!-- Add class "fade-in-effect" for login form effect -->
|
15
|
+
<%= render partial: "usman/sessions/form" %>
|
16
|
+
|
17
|
+
</div>
|
18
|
+
|
19
|
+
</div>
|
20
|
+
|
21
|
+
</div>
|
22
|
+
|
23
|
+
<script type="text/javascript">
|
24
|
+
jQuery(document).ready(function($)
|
25
|
+
{
|
26
|
+
// Reveal Login form
|
27
|
+
setTimeout(function(){ $(".fade-in-effect").addClass('in'); }, 1);
|
28
|
+
|
29
|
+
// Validation and Ajax action
|
30
|
+
$("form#form_sign_in").validate({
|
31
|
+
rules: {
|
32
|
+
login_handle: {
|
33
|
+
required: true
|
34
|
+
},
|
35
|
+
|
36
|
+
password: {
|
37
|
+
required: true
|
38
|
+
}
|
39
|
+
},
|
40
|
+
|
41
|
+
messages: {
|
42
|
+
login_handle: {
|
43
|
+
required: 'Please enter your username or email.'
|
44
|
+
},
|
45
|
+
|
46
|
+
password: {
|
47
|
+
required: 'Please enter your password.'
|
48
|
+
}
|
49
|
+
},
|
50
|
+
|
51
|
+
// Form Processing via AJAX
|
52
|
+
submitHandler: function(form)
|
53
|
+
{
|
54
|
+
form.submit();
|
55
|
+
}
|
56
|
+
});
|
57
|
+
|
58
|
+
// Set Form focus
|
59
|
+
$("form#form_sign_in .form-group:has(.form-control):first .form-control").focus();
|
60
|
+
});
|
61
|
+
</script>
|
62
|
+
|
63
|
+
|
@@ -0,0 +1,61 @@
|
|
1
|
+
en:
|
2
|
+
response:
|
3
|
+
validation_error: "Sorry, there are errors with the information you provided. Please review the data you have entered."
|
4
|
+
failed_to_create_error: "Failed to create %{item}."
|
5
|
+
failed_to_update_error: "Failed to update %{item}."
|
6
|
+
failed_to_delete_error: "Failed to remove %{item}."
|
7
|
+
invalid_login_error: "Invalid username/email or password."
|
8
|
+
authentication_error: "Permission Denied: You don't have permission to perform this action"
|
9
|
+
created_successfully: "%{item} has been created successfully."
|
10
|
+
updated_successfully: "%{item} has been updated successfully."
|
11
|
+
removed_successfully: "%{item} has been removed successfully."
|
12
|
+
no_results_found: "No results found."
|
13
|
+
status:
|
14
|
+
internal_server_error: "500 - Something went wrong."
|
15
|
+
forbidden: "403 - Permission Denied! You don't have permission to perform this action."
|
16
|
+
not_found: "404 - Not Found: We don't have what you are looking for."
|
17
|
+
users:
|
18
|
+
masquerade: "You have successfully signed in as %{user}"
|
19
|
+
sign_in_back: "You have successfully signed in back as %{user}"
|
20
|
+
authentication:
|
21
|
+
error: "Error!"
|
22
|
+
success: "Success!"
|
23
|
+
login: "Sign in"
|
24
|
+
logout: "Sign out"
|
25
|
+
permission_denied:
|
26
|
+
heading: "Permission Denied"
|
27
|
+
message: "You don't have permission to perform this action"
|
28
|
+
session_expired:
|
29
|
+
heading: "Session Expired"
|
30
|
+
message: "Your session has been expired. Please sign in again"
|
31
|
+
invalid_token:
|
32
|
+
heading: "Invalid Token"
|
33
|
+
message: "You don't have permission to perform this action"
|
34
|
+
invalid_login:
|
35
|
+
heading: "Invalid Login"
|
36
|
+
message: "Invalid Username/Email or password."
|
37
|
+
user_is_pending:
|
38
|
+
heading: "Account Pending"
|
39
|
+
message: "Your account is not yet approved, please contact administrator to activate your account"
|
40
|
+
user_is_suspended:
|
41
|
+
heading: "Account Suspended"
|
42
|
+
message: "Your account is suspended, please contact administrator"
|
43
|
+
logged_in:
|
44
|
+
heading: "Signed In"
|
45
|
+
message: "You have successfully signed in"
|
46
|
+
logged_out:
|
47
|
+
heading: "Signed Out"
|
48
|
+
message: "You have successfully signed out"
|
49
|
+
forms:
|
50
|
+
add: "%{item} has been added successfully."
|
51
|
+
create: "%{item} has been created successfully."
|
52
|
+
save: "%{item} has been saved successfully."
|
53
|
+
update: "%{item} has been updated successfully."
|
54
|
+
delete: "%{item} has been deleted successfully."
|
55
|
+
remove: "%{item} has been removed successfully."
|
56
|
+
error: "Failed to create %{item}."
|
57
|
+
no_results: "No results found."
|
58
|
+
status:
|
59
|
+
internal_server_error: "500 Something went wrong."
|
60
|
+
forbidden: "403 Permission Denied! You don't have permission to perform this action."
|
61
|
+
not_found: "404 Not Found: We don't have what you are looking for."
|
data/config/routes.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
Usman::Engine.routes.draw do
|
2
|
+
|
3
|
+
root :to => 'sessions#sign_in'
|
4
|
+
|
5
|
+
# Sign In URLs for users
|
6
|
+
get '/sign_in', to: "sessions#sign_in", as: :sign_in
|
7
|
+
post '/create_session', to: "sessions#create_session", as: :create_session
|
8
|
+
get '/forgot_password_form', to: "sessions#forgot_password_form", as: :forgot_password_form
|
9
|
+
post '/forgot_password', to: "sessions#forgot_password", as: :forgot_password
|
10
|
+
get '/reset_password_form/:id', to: "sessions#reset_password_form", as: :reset_password_form
|
11
|
+
put '/reset_password_update/:id', to: "sessions#reset_password_update", as: :reset_password_update
|
12
|
+
|
13
|
+
# Logout Url
|
14
|
+
delete '/sign_out' , to: "sessions#sign_out", as: :sign_out
|
15
|
+
|
16
|
+
namespace :admin do
|
17
|
+
|
18
|
+
get '/dashboard', to: "dashboard#index", as: :dashboard
|
19
|
+
|
20
|
+
resources :users do
|
21
|
+
member do
|
22
|
+
put :masquerade, as: :masquerade
|
23
|
+
put :update_status, as: :update_status
|
24
|
+
put :make_super_admin, as: :make_super_admin
|
25
|
+
put :remove_super_admin, as: :remove_super_admin
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
resources :features do
|
30
|
+
member do
|
31
|
+
put :update_status, as: :update_status
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
resources :permissions
|
36
|
+
|
37
|
+
resources :images do
|
38
|
+
member do
|
39
|
+
put :crop
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class CreateImages < ActiveRecord::Migration[5.0]
|
2
|
+
def change
|
3
|
+
create_table :images do |t|
|
4
|
+
t.string :image
|
5
|
+
t.integer :imageable_id
|
6
|
+
t.string :imageable_type
|
7
|
+
t.timestamps
|
8
|
+
end
|
9
|
+
|
10
|
+
add_index(:images, [ :imageable_id, :imageable_type ])
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
class CreateUsers < ActiveRecord::Migration[5.0]
|
2
|
+
def change
|
3
|
+
create_table(:users) do |t|
|
4
|
+
|
5
|
+
## First Name, Last Name and Username
|
6
|
+
t.string :name, limit: 256
|
7
|
+
t.string :username, :null => false, :limit=>32
|
8
|
+
t.string :email, :null => false
|
9
|
+
t.string :phone, :null => true, :limit=>24
|
10
|
+
t.string :designation, :null => true, :limit=>56
|
11
|
+
|
12
|
+
t.boolean :super_admin, :null => true, default: false
|
13
|
+
|
14
|
+
t.string :status, :null => false, :default=>"pending", :limit=>16
|
15
|
+
|
16
|
+
## Password Digest
|
17
|
+
t.string :password_digest, :null => false
|
18
|
+
|
19
|
+
## Recoverable
|
20
|
+
t.string :reset_password_token
|
21
|
+
t.datetime :reset_password_sent_at
|
22
|
+
|
23
|
+
## Rememberable
|
24
|
+
t.datetime :remember_created_at
|
25
|
+
|
26
|
+
## Trackable
|
27
|
+
t.integer :sign_in_count, :default => 0
|
28
|
+
t.datetime :current_sign_in_at
|
29
|
+
t.datetime :last_sign_in_at
|
30
|
+
t.string :current_sign_in_ip
|
31
|
+
t.string :last_sign_in_ip
|
32
|
+
|
33
|
+
## Confirmable
|
34
|
+
t.string :confirmation_token
|
35
|
+
t.datetime :confirmed_at
|
36
|
+
t.datetime :confirmation_sent_at
|
37
|
+
t.string :unconfirmed_email # Only if using reconfirmable
|
38
|
+
|
39
|
+
## Lockable
|
40
|
+
t.integer :failed_attempts, :default => 0 # Only if lock strategy is :failed_attempts
|
41
|
+
t.string :unlock_token # Only if unlock strategy is :email or :both
|
42
|
+
t.datetime :locked_at
|
43
|
+
|
44
|
+
## Token authenticatable
|
45
|
+
t.string :auth_token
|
46
|
+
t.datetime :token_created_at, default: nil
|
47
|
+
|
48
|
+
t.timestamps
|
49
|
+
end
|
50
|
+
|
51
|
+
add_index :users, :email, :unique => true
|
52
|
+
add_index :users, :reset_password_token, :unique => true
|
53
|
+
add_index :users, :confirmation_token, :unique => true
|
54
|
+
add_index :users, :unlock_token, :unique => true
|
55
|
+
add_index :users, :auth_token, :unique => true
|
56
|
+
end
|
57
|
+
end
|