From b0f5721819ed37382fd64fbf960cd2c44a158329 Mon Sep 17 00:00:00 2001 From: Skylar Ittner Date: Sat, 27 May 2017 23:55:19 -0600 Subject: [PATCH] Add manager management system --- action.php | 29 ++++++++++++++- lang/en_us.php | 11 ++++++ lang/messages.php | 8 +++++ lib/getmanagetable.php | 80 +++++++++++++++++++++++++++++++++++++++++ pages.php | 28 +++++++++++++++ pages/addmanager.php | 38 ++++++++++++++++++++ pages/delmanager.php | 58 ++++++++++++++++++++++++++++++ pages/deluser.php | 4 +++ pages/home.php | 22 ++++++------ pages/managers.php | 52 +++++++++++++++++++++++++++ static/js/addmanager.js | 47 ++++++++++++++++++++++++ static/js/managers.js | 47 ++++++++++++++++++++++++ 12 files changed, 412 insertions(+), 12 deletions(-) create mode 100644 lib/getmanagetable.php create mode 100644 pages/addmanager.php create mode 100644 pages/delmanager.php create mode 100644 pages/managers.php create mode 100644 static/js/addmanager.js create mode 100644 static/js/managers.js diff --git a/action.php b/action.php index c2e5c84..ce5fee3 100644 --- a/action.php +++ b/action.php @@ -68,7 +68,7 @@ switch ($VARS['action']) { } else { $olddata = $database->select('accounts', '*', ['uid' => $VARS['id']])[0]; $database->update('accounts', $data, ['uid' => $VARS['id']]); - insertAuthLog(17, $_SESSION['uid'], "OLD: " . $olddata['username'] . ", " . $olddata['realname'] . ", " . $olddata['email'] . ", " . $olddata['acctstatus'] . "; NEW: " . $data['username'] . ", " . $data['realname'] . ", " . $data['email'] . ", " . $data['acctstatus']); + insertAuthLog(18, $_SESSION['uid'], "OLD: " . $olddata['username'] . ", " . $olddata['realname'] . ", " . $olddata['email'] . ", " . $olddata['acctstatus'] . "; NEW: " . $data['username'] . ", " . $data['realname'] . ", " . $data['email'] . ", " . $data['acctstatus']); } returnToSender("user_saved"); @@ -85,6 +85,33 @@ switch ($VARS['action']) { $database->delete('authlog'); insertAuthLog(15, $_SESSION['uid'], lang2("removed n entries", ['n' => $rows], false)); returnToSender("log_cleared"); + case "addmanager": + if (!$database->has('accounts', ['username' => $VARS['manager']])) { + returnToSender("invalid_userid"); + } + if (!$database->has('accounts', ['username' => $VARS['employee']])) { + returnToSender("invalid_userid"); + } + $manageruid = $database->select('accounts', 'uid', ['username' => $VARS['manager']])[0]; + $employeeuid = $database->select('accounts', 'uid', ['username' => $VARS['employee']])[0]; + $database->insert('managers', ['managerid' => $manageruid, 'employeeid' => $employeeuid]); + returnToSender("relationship_added"); + case "delmanager": + if (!$database->has('managers', ['managerid' => $VARS['mid']])) { + returnToSender("invalid_userid"); + } + if (!$database->has('managers', ['employeeid' => $VARS['eid']])) { + returnToSender("invalid_userid"); + } + $database->delete('managers', ['AND' => ['managerid' => $VARS['mid'], 'employeeid' => $VARS['eid']]]); + returnToSender("relationship_deleted"); + case "autocomplete_user": + header("Content-Type: application/json"); + if (is_empty($VARS['q']) || strlen($VARS['q']) < 3) { + exit(json_encode([])); + } + $data = $database->select('accounts', ['uid', 'username', 'realname (name)'], ["OR" => ['username[~]' => $VARS['q'], 'realname[~]' => $VARS['q']], "LIMIT" => 10]); + exit(json_encode($data)); case "signout": session_destroy(); header('Location: index.php'); diff --git a/lang/en_us.php b/lang/en_us.php index b270412..68c111c 100644 --- a/lang/en_us.php +++ b/lang/en_us.php @@ -61,4 +61,15 @@ define("STRINGS", [ "really clear log" => "Are you sure you want to purge the security log? This action cannot be reversed.", "log cleared" => "Security log cleared.", "removed n entries" => "Removed {n} entries", + "security log entries" => "Security Log Entries", + "view security log" => "View Security Log", + "managers" => "Managers", + "manager" => "Manager", + "employee" => "Employee", + "delete relationship" => "Delete Relationship", + "really delete relationship" => "Are you sure you want to remove this manager-employee relationship? This action cannot be reversed.", + "relationship deleted" => "Relationship deleted.", + "edit relationship" => "Edit Relationship", + "adding relationship" => "Adding Relationship", + "relationship added" => "Relationship added." ]); \ No newline at end of file diff --git a/lang/messages.php b/lang/messages.php index a064b8c..d79dff6 100644 --- a/lang/messages.php +++ b/lang/messages.php @@ -32,5 +32,13 @@ define("MESSAGES", [ "log_cleared" => [ "string" => "log cleared", "type" => "success" + ], + "relationship_added" => [ + "string" => "relationship added", + "type" => "success" + ], + "relationship_deleted" => [ + "string" => "relationship deleted", + "type" => "success" ] ]); diff --git a/lib/getmanagetable.php b/lib/getmanagetable.php new file mode 100644 index 0000000..a6b8404 --- /dev/null +++ b/lib/getmanagetable.php @@ -0,0 +1,80 @@ +count('managers'); +$filter = false; + +// sort +$order = null; +$sortby = "DESC"; +if ($VARS['order'][0]['dir'] == 'asc') { + $sortby = "ASC"; +} +switch ($VARS['order'][0]['column']) { + case 2: + $order = ["managername" => $sortby]; + break; + case 3: + $order = ["employeename" => $sortby]; + break; +} + +// search +if (!is_empty($VARS['search']['value'])) { + $filter = true; + $wherenolimit = [ + "OR" => [ + "manager.username[~]" => $VARS['search']['value'], + "employee.username[~]" => $VARS['search']['value'], + "manager.realname[~]" => $VARS['search']['value'], + "employee.realname[~]" => $VARS['search']['value'] + ] + ]; + $where = $wherenolimit; + $where["LIMIT"] = [$VARS['start'], $VARS['length']]; +} else { + $where = ["LIMIT" => [$VARS['start'], $VARS['length']]]; +} +if (!is_null($order)) { + $where["ORDER"] = $order; +} + + +$managers = $database->select('managers', [ + "[>]accounts (manager)" => ['managerid' => 'uid'], + "[>]accounts (employee)" => ['employeeid' => 'uid'] + ], [ + 'managerid', + 'employeeid', + 'manager.username (manageruser)', + 'employee.username (employeeuser)', + 'manager.realname (managername)', + 'employee.realname (employeename)', + ], $where); + + +$out['status'] = "OK"; +if ($filter) { + $recordsFiltered = $database->count('managers', [ + "[>]accounts (manager)" => ['managerid' => 'uid'], + "[>]accounts (employee)" => ['employeeid' => 'uid'] + ], 'managerid', $wherenolimit); +} else { + $recordsFiltered = $out['recordsTotal']; +} +$out['recordsFiltered'] = $recordsFiltered; +for ($i = 0; $i < count($managers); $i++) { + $managers[$i]["delbtn"] = ' ' . lang("delete", false) . ''; +} +$out['managers'] = $managers; + +echo json_encode($out); diff --git a/pages.php b/pages.php index 6547af2..c5a2ae0 100644 --- a/pages.php +++ b/pages.php @@ -48,6 +48,34 @@ define("PAGES", [ "title" => "clear log", "navbar" => false ], + "managers" => [ + "title" => "managers", + "navbar" => true, + "icon" => "id-card-o", + "styles" => [ + "static/css/datatables.min.css", + "static/css/tables.css" + ], + "scripts" => [ + "static/js/datatables.min.js", + "static/js/managers.js" + ], + ], + "addmanager" => [ + "title" => "new relationship", + "navbar" => false, + "styles" => [ + "static/css/easy-autocomplete.min.css" + ], + "scripts" => [ + "static/js/jquery.easy-autocomplete.min.js", + "static/js/addmanager.js" + ] + ], + "delmanager" => [ + "title" => "delete manager", + "navbar" => false + ], "404" => [ "title" => "404 error" ] diff --git a/pages/addmanager.php b/pages/addmanager.php new file mode 100644 index 0000000..2606d6f --- /dev/null +++ b/pages/addmanager.php @@ -0,0 +1,38 @@ + + +
+
+
+

+ +

+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + + + + +
+
\ No newline at end of file diff --git a/pages/delmanager.php b/pages/delmanager.php new file mode 100644 index 0000000..556a1eb --- /dev/null +++ b/pages/delmanager.php @@ -0,0 +1,58 @@ +has('managers', ['managerid' => $VARS['mid']])) { + header('Location: app.php?page=managers&msg=user_not_exists'); + die(); +} +if (!$database->has('managers', ['employeeid' => $VARS['eid']])) { + header('Location: app.php?page=managers&msg=user_not_exists'); + die(); +} +?> +
+
+
+
+

+ +

+
+
+
+

+

+ select('managers', [ + "[>]accounts (manager)" => ['managerid' => 'uid'], + "[>]accounts (employee)" => ['employeeid' => 'uid'] + ], [ + 'manager.username (manageruser)', + 'employee.username (employeeuser)', + 'manager.realname (managername)', + 'employee.realname (employeename)' + ], ['AND' => ['managerid' => $VARS['mid'], 'employeeid' => $VARS['eid']]])[0]; + ?> +
+
+ () +
+
+ () +
+
+
+
+ +
+
+
\ No newline at end of file diff --git a/pages/deluser.php b/pages/deluser.php index acb7ed7..d9192d6 100644 --- a/pages/deluser.php +++ b/pages/deluser.php @@ -1,4 +1,8 @@ has('accounts', ['uid' => $VARS['id']])) { $userdata = $database->select('accounts', ['[>]accttypes' => ['accttype' => 'typeid']], [ diff --git a/pages/home.php b/pages/home.php index 8428667..6c3d2d6 100644 --- a/pages/home.php +++ b/pages/home.php @@ -15,17 +15,6 @@ redirectifnotloggedin(); -
-
-
-
-

count('accounts', ['acctstatus' => 1]); ?>

-
- -
-
@@ -37,4 +26,15 @@ redirectifnotloggedin();
+
+
+
+
+

count('authlog'); ?>

+
+ +
+
\ No newline at end of file diff --git a/pages/managers.php b/pages/managers.php new file mode 100644 index 0000000..d9de9a3 --- /dev/null +++ b/pages/managers.php @@ -0,0 +1,52 @@ + +
+ +
+ + + + + + + + + + + select('managers', [ + "[>]accounts (manager)" => ['managerid' => 'uid'], + "[>]accounts (employee)" => ['employeeid' => 'uid'] + ], [ + 'managerid', + 'employeeid', + 'manager.username (manageruser)', + 'employee.username (employeeuser)', + 'manager.realname (managername)', + 'employee.realname (employeename)', + ]); + foreach ($managers as $m) { + ?> + + + + + + + + + + + + + + + +
+ + () ()
\ No newline at end of file diff --git a/static/js/addmanager.js b/static/js/addmanager.js new file mode 100644 index 0000000..4c4c3a2 --- /dev/null +++ b/static/js/addmanager.js @@ -0,0 +1,47 @@ +$("#manager").easyAutocomplete({ + url: "action.php", + ajaxSettings: { + dataType: "json", + method: "GET", + data: { + action: "autocomplete_user" + } + }, + preparePostData: function (data) { + data.q = $("#manager").val(); + return data; + }, + getValue: function (element) { + return element.username; + }, + template: { + type: "custom", + method: function (value, item) { + return item.name + " " + item.username + ""; + } + } +}); + +$("#employee").easyAutocomplete({ + url: "action.php", + ajaxSettings: { + dataType: "json", + method: "GET", + data: { + action: "autocomplete_user" + } + }, + preparePostData: function (data) { + data.q = $("#employee").val(); + return data; + }, + getValue: function (element) { + return element.username; + }, + template: { + type: "custom", + method: function (value, item) { + return item.name + " " + item.username + ""; + } + } +}); \ No newline at end of file diff --git a/static/js/managers.js b/static/js/managers.js new file mode 100644 index 0000000..ce547fc --- /dev/null +++ b/static/js/managers.js @@ -0,0 +1,47 @@ +$('#managertable').DataTable({ + responsive: { + details: { + display: $.fn.dataTable.Responsive.display.modal({ + header: function (row) { + var data = row.data(); + return " " + data[2]; + } + }), + renderer: $.fn.dataTable.Responsive.renderer.tableAll({ + tableClass: 'table' + }), + type: "column" + } + }, + columnDefs: [ + { + targets: 0, + className: 'control', + orderable: false + }, + { + targets: 1, + orderable: false + } + ], + order: [ + [2, 'asc'] + ], + serverSide: true, + ajax: { + url: "lib/getmanagetable.php", + dataFilter: function (data) { + var json = jQuery.parseJSON(data); + json.data = []; + json.managers.forEach(function (row) { + json.data.push([ + "", + row.delbtn, + row.managername + " (" + row.manageruser + ")", + row.employeename + " (" + row.employeeuser + ")" + ]); + }); + return JSON.stringify(json); + } + } +}); \ No newline at end of file