Skip to content

Commit c119c9a

Browse files
feat(users): Adds ability to view all users and admins (#216)
* feat(users): Adds ability to view all users and admins refactor(admins): Moves hard-coded strings to en.yml * style(users): Removes whitespace for style Co-authored-by: Peter Kos <pkos91@icloud.com>
1 parent 1a31861 commit c119c9a

File tree

20 files changed

+302
-208
lines changed

20 files changed

+302
-208
lines changed

app/assets/javascripts/manage/lib/setupDataTables.js

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,23 @@ var setupDataTables = function () {
1717
});
1818

1919
$('.datatable.users').DataTable({
20+
order: [5, 'desc'],
21+
columns: [
22+
{ orderable: true, data: 'id', visible: false },
23+
{ orderable: true, data: 'email' },
24+
{ orderable: true, data: 'role' },
25+
{ orderable: false, data: 'questionnaire'},
26+
{ orderable: true, data: 'active' },
27+
{ orderable: true, data: 'created_at' },
28+
{ orderable: true, data: 'current_sign_in_at', visible: false },
29+
{ orderable: true, data: 'last_sign_in_at', visible: false },
30+
{ orderable: true, data: 'current_sign_in_ip', visible: false },
31+
{ orderable: true, data: 'last_sign_in_ip', visible: false },
32+
{ orderable: true, data: 'sign_in_count', visible: false },
33+
],
34+
});
35+
36+
$('.datatable.admins').DataTable({
2037
order: [1, 'asc'],
2138
columns: [
2239
{ orderable: true, data: 'id', visible: false },
@@ -29,7 +46,7 @@ var setupDataTables = function () {
2946
{ orderable: true, data: 'last_sign_in_at', visible: false },
3047
{ orderable: true, data: 'current_sign_in_ip', visible: false },
3148
{ orderable: true, data: 'last_sign_in_ip', visible: false },
32-
{ orderable: true, data: 'sign_in_count', visible: false },
49+
{ orderable: true, data: 'sign_in_count', visible: true },
3350
],
3451
});
3552

app/controllers/manage/questionnaires_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ def convert_to_admin
9393
user = @questionnaire.user
9494
@questionnaire.destroy
9595
user.update_attributes(role: :admin)
96-
redirect_to edit_manage_admin_path(user)
96+
redirect_to edit_manage_user_path(user)
9797
end
9898

9999
def destroy

app/controllers/manage/admins_controller.rb renamed to app/controllers/manage/users_controller.rb

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
class Manage::AdminsController < Manage::ApplicationController
1+
class Manage::UsersController < Manage::ApplicationController
2+
before_action :require_full_admin
23
before_action :find_user, only: [:show, :edit, :update, :destroy]
34

45
respond_to :html, :json
@@ -7,43 +8,34 @@ def index
78
respond_with(:manage, User.where(role: [:admin, :admin_limited_access, :event_tracking]))
89
end
910

10-
def datatable
11-
render json: AdminDatatable.new(params, view_context: view_context)
11+
def user_datatable
12+
render json: UserDatatable.new(params, view_context: view_context)
1213
end
1314

14-
def show
15-
respond_with(:manage, @user)
15+
def admin_datatable
16+
render json: AdminDatatable.new(params, view_context: view_context)
1617
end
1718

18-
def new
19-
@user = ::User.new
19+
def show
2020
respond_with(:manage, @user)
2121
end
2222

2323
def edit
2424
end
2525

26-
def create
27-
@user = ::User.new(user_params.merge(password: Devise.friendly_token.first(10)))
28-
if @user.save
29-
@user.send_reset_password_instructions
30-
flash[:notice] = "Created account for #{@user.email} and sent email with link to set a password"
31-
end
32-
respond_with(:manage, @user, location: manage_admins_path)
33-
end
34-
3526
def update
3627
@user.update_attributes(user_params)
37-
respond_with(:manage, @user, location: manage_admins_path)
28+
respond_with(:manage, @user, location: manage_users_path)
3829
end
3930

4031
def destroy
32+
if @user.questionnaire.present?
33+
@user.questionnaire.destroy
34+
end
4135
@user.destroy
42-
respond_with(:manage, @user, location: manage_admins_path)
36+
respond_with(:manage, @user, location: manage_users_path)
4337
end
4438

45-
private
46-
4739
def user_params
4840
params.require(:user).permit(
4941
:email, :password, :password_confirmation, :remember_me, :role, :is_active, :receive_weekly_report

app/datatables/admin_datatable.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
class AdminDatatable < ApplicationDatatable
2-
def_delegators :@view, :link_to, :manage_admin_path, :bold, :display_datetime
2+
def_delegators :@view, :link_to, :manage_user_path, :bold, :display_datetime
33

44
def view_columns
55
@view_columns ||= {
@@ -23,7 +23,7 @@ def data
2323
records.map do |record|
2424
{
2525
id: record.id,
26-
email: link_to(bold(record.email), manage_admin_path(record)),
26+
email: link_to(bold(record.email), manage_user_path(record)),
2727
role: record.role.titleize,
2828
active: record.is_active ? '<span class="badge badge-secondary">Active</span>'.html_safe : '<span class="badge badge-danger">Inactive<span>'.html_safe,
2929
receive_weekly_report: yes_no_display(record.receive_weekly_report),

app/datatables/user_datatable.rb

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
class UserDatatable < ApplicationDatatable
2+
def_delegators :@view, :link_to, :manage_user_path, :manage_questionnaire_path, :bold, :display_datetime
3+
4+
def view_columns
5+
@view_columns ||= {
6+
id: { source: "User.id" },
7+
email: { source: "User.email" },
8+
role: { source: "User.role", searchable: false },
9+
active: { source: "User.is_active", searchable: false },
10+
created_at: { source: "User.created_at", searchable: false },
11+
current_sign_in_at: { source: "User.current_sign_in_at", searchable: false },
12+
last_sign_in_at: { source: "User.last_sign_in_at", searchable: false },
13+
current_sign_in_ip: { source: "User.current_sign_in_ip" },
14+
last_sign_in_ip: { source: "User.last_sign_in_ip" },
15+
sign_in_count: { source: "User.sign_in_count", searchable: false },
16+
}
17+
end
18+
19+
private
20+
21+
def data
22+
records.map do |record|
23+
{
24+
id: record.id,
25+
email: link_to(bold(record.email), manage_user_path(record)),
26+
role: record.role.titleize,
27+
questionnaire: record.questionnaire.present? ? link_to(bold("View &raquo;".html_safe), manage_questionnaire_path(record.questionnaire.id)) : 'None',
28+
active: record.is_active ? '<span class="badge badge-secondary">Active</span>'.html_safe : '<span class="badge badge-danger">Inactive<span>'.html_safe,
29+
created_at: display_datetime(record.created_at),
30+
current_sign_in_at: display_datetime(record.current_sign_in_at),
31+
last_sign_in_at: display_datetime(record.last_sign_in_at),
32+
current_sign_in_ip: record.current_sign_in_ip == "::1" ? "127.0.0.1" : record.current_sign_in_ip,
33+
last_sign_in_ip: record.last_sign_in_ip == "::1" ? "127.0.0.1" : record.last_sign_in_ip,
34+
sign_in_count: record.sign_in_count,
35+
}
36+
end
37+
end
38+
39+
def get_raw_records
40+
User.all
41+
end
42+
end

app/views/layouts/manage/application.html.haml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,11 @@
3838
= active_link_to manage_checkins_path, class: "nav-link" do
3939
.fa.fa-drivers-license-o.fa-fw.icon-space-r-half
4040
Check-in
41-
%li.nav-item
42-
= active_link_to manage_admins_path, class: "nav-link" do
43-
.fa.fa-users.fa-fw.icon-space-r-half
44-
Admins
41+
- if current_user.admin?
42+
%li.nav-item
43+
= active_link_to manage_users_path, class: "nav-link" do
44+
.fa.fa-users.fa-fw.icon-space-r-half
45+
= t(:title, scope: 'pages.manage.users')
4546
%li.nav-item
4647
= active_link_to manage_messages_path, class: "nav-link" do
4748
.fa.fa-bullhorn.fa-fw.icon-space-r-half

app/views/manage/admins/_form.html.haml

Lines changed: 0 additions & 19 deletions
This file was deleted.

app/views/manage/admins/edit.html.haml

Lines changed: 0 additions & 7 deletions
This file was deleted.

app/views/manage/admins/index.html.haml

Lines changed: 0 additions & 19 deletions
This file was deleted.

app/views/manage/admins/new.html.haml

Lines changed: 0 additions & 7 deletions
This file was deleted.

app/views/manage/admins/show.html.haml

Lines changed: 0 additions & 61 deletions
This file was deleted.

app/views/manage/trackable_events/show.html.haml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
= link_to @trackable_event.trackable_tag.name, manage_trackable_tag_path(@trackable_event.trackable_tag)
1212
%p
1313
%b User:
14-
= link_to @trackable_event.user.email, manage_admin_path(@trackable_event.user)
14+
= link_to @trackable_event.user.email, manage_user_path(@trackable_event.user)
1515

1616
= link_to 'Edit', edit_manage_trackable_event_path(@trackable_event)
1717
\|
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
.form-container
2+
= bs_horizontal_simple_form_for @user, url: url_for(action: "update", controller: "users"), html: { "data-validate" => "form" } do |f|
3+
4+
- if f.error_notification.present?
5+
#disclaimer
6+
= f.error_notification
7+
8+
.form-inputs
9+
= f.input :email, input_html: { "data-validate" => "presence" }, required: true
10+
= f.input :role, collection: User.roles.to_a.collect{|c| [c[0].titleize, c[0]]}, include_blank: false
11+
= f.input :is_active, collection: [[t(:active, scope: "pages.manage.users.edit.form"), true], [t(:inactive, scope: "pages.manage.users.edit.form"), false]], as: :radio_buttons
12+
= f.input :receive_weekly_report, collection: [[t(:yes, scope: "pages.manage.users.edit.form"), true], [t(:no, scope: "pages.manage.users.edit.form"), false]], as: :radio_buttons
13+
14+
.center
15+
= f.button :submit, value: ( t(:save, scope: "pages.manage.users.edit.form") ), class: 'btn-primary'

app/views/manage/users/edit.html.haml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
= render "layouts/manage/page_title", title: t(:title, scope: "pages.manage.users.edit", user_email: @user.email), subtitle: @user.email do
2+
.btn-group
3+
= link_to t(:cancel, scope: "pages.manage.users.edit"), manage_user_path(@user), class: 'btn btn-sm btn-outline-secondary'
4+
= link_to t(:delete, scope: "pages.manage.users.edit"), manage_user_path(@user), method: :delete, data: { confirm: "Are you sure? #{@user.email} will be permanently deleted. This action is irreversible." }, class: 'btn btn-sm btn-outline-secondary'
5+
6+
= render 'form'
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
= render "layouts/manage/page_title", title: t(:title, scope: 'pages.manage.users')
2+
3+
.row
4+
.col
5+
%h5.dashboard-container-title
6+
= t(:users, scope: 'pages.manage.users')
7+
%table.users.datatable.table.table-striped.table-hover{ "data-source" => user_datatable_manage_users_path(format: :json) }
8+
%thead
9+
%tr
10+
%th= t(:id, scope: 'pages.manage.users.table')
11+
%th= t(:email, scope: 'pages.manage.users.table')
12+
%th= t(:role, scope: 'pages.manage.users.table')
13+
%th= t(:questionnaire, scope: 'pages.manage.users.table')
14+
%th= t(:login_access, scope: 'pages.manage.users.table')
15+
%th= t(:registered_on, scope: 'pages.manage.users.table')
16+
%th= t(:signed_in_on, scope: 'pages.manage.users.table')
17+
%th= t(:previous_signed_in_on, scope: 'pages.manage.users.table')
18+
%th= t(:signed_in_ip, scope: 'pages.manage.users.table')
19+
%th= t(:previous_signed_in_ip, scope: 'pages.manage.users.table')
20+
%th= t(:sign_in_count, scope: 'pages.manage.users.table')
21+
%tbody
22+
23+
.row
24+
.col
25+
%h5.dashboard-container-title
26+
= t(:staff, scope: 'pages.manage.users', hackathon_name: HackathonConfig['name'])
27+
%table.admins.datatable.table.table-striped.table-hover{ "data-source" => admin_datatable_manage_users_path(format: :json) }
28+
%thead
29+
%tr
30+
%th= t(:id, scope: 'pages.manage.users.table')
31+
%th= t(:email, scope: 'pages.manage.users.table')
32+
%th= t(:role, scope: 'pages.manage.users.table')
33+
%th= t(:login_access, scope: 'pages.manage.users.table')
34+
%th= t(:weekly_report, scope: 'pages.manage.users.table')
35+
%th= t(:registered_on, scope: 'pages.manage.users.table')
36+
%th= t(:signed_in_on, scope: 'pages.manage.users.table')
37+
%th= t(:previous_signed_in_on, scope: 'pages.manage.users.table')
38+
%th= t(:signed_in_ip, scope: 'pages.manage.users.table')
39+
%th= t(:previous_signed_in_ip, scope: 'pages.manage.users.table')
40+
%th= t(:sign_in_count, scope: 'pages.manage.users.table')
41+
%tbody

0 commit comments

Comments
 (0)