diff --git a/action.php b/action.php index e852c92..e319acd 100644 --- a/action.php +++ b/action.php @@ -20,13 +20,20 @@ if (account_has_permission($_SESSION['username'], "ADMIN") == FALSE) { * The message will be displayed by the app. * @param string $msg message ID (see lang/messages.php) * @param string $arg If set, replaces "{arg}" in the message string when displayed to the user. + * @param [key=>val] $additional Put the given key-value array in the URL */ -function returnToSender($msg, $arg = "") { +function returnToSender($msg, $arg = "", $additional = []) { global $VARS; + $add = ""; + if ($additional != []) { + foreach ($additional as $key => $val) { + $add .= "&" . urlencode($key) . "=" . urlencode($val); + } + } if ($arg == "") { - header("Location: app.php?page=" . urlencode($VARS['source']) . "&msg=" . $msg); + header("Location: app.php?page=" . urlencode($VARS['source']) . $add . "&msg=" . $msg); } else { - header("Location: app.php?page=" . urlencode($VARS['source']) . "&msg=$msg&arg=$arg"); + header("Location: app.php?page=" . urlencode($VARS['source']) . $add . "&msg=$msg&arg=$arg"); } die(); } @@ -101,6 +108,27 @@ switch ($VARS['action']) { $database->delete('authlog'); insertAuthLog(15, $_SESSION['uid'], lang2("removed n entries", ['n' => $rows], false)); returnToSender("log_cleared"); + case "editmanager": + require_once __DIR__ . "/lib/userinfo.php"; + if (!$database->has('accounts', ['username' => $VARS['manager']])) { + returnToSender("invalid_manager"); + } + $manager = getUserByUsername($VARS['manager'])['uid']; + $already_assigned = $database->select('managers', 'employeeid', ['managerid' => $manager]); + + foreach ($VARS['employees'] as $u) { + if (!user_exists($u)) { + returnToSender("user_not_exists", htmlentities($u)); + } + $uid = getUserByUsername($u)['uid']; + $database->insert('managers', ['employeeid' => $uid, 'managerid' => $manager]); + $already_assigned = array_diff($already_assigned, [$uid]); // Remove user from old list + } + foreach ($already_assigned as $uid) { + $database->delete('managers', ["AND" => ['employeeid' => $uid, 'managerid' => $manager]]); + } + returnToSender("manager_assigned", "", ["man" => $VARS['manager']]); + break; case "addmanager": if (!$database->has('accounts', ['username' => $VARS['manager']])) { returnToSender("invalid_userid"); diff --git a/lang/en_us.php b/lang/en_us.php index 644e471..181da61 100644 --- a/lang/en_us.php +++ b/lang/en_us.php @@ -87,5 +87,11 @@ define("STRINGS", [ "2fa removed" => "2-factor authentication removed.", "2fa" => "2FA", "show deleted" => "Show deleted", - "editing deleted account" => "You are editing an account marked as deleted. The account will be undeleted if you press Save." + "editing deleted account" => "You are editing an account marked as deleted. The account will be undeleted if you press Save.", + "manager assigned" => "Manager relationships saved.", + "manager does not exist" => "The selected manager username does not exist.", + "type to add a person" => "Type to add a person", + "employees" => "Employees", + "type to select a manager" => "Type to select a manager", + "select a manager to view or edit employees" => "Select a manager to view or edit the assigned employees." ]); \ No newline at end of file diff --git a/lang/messages.php b/lang/messages.php index 9e24716..98c933a 100644 --- a/lang/messages.php +++ b/lang/messages.php @@ -56,5 +56,13 @@ define("MESSAGES", [ "2fa_removed" => [ "string" => "2fa removed", "type" => "success" - ] + ], + "manager_assigned" => [ + "string" => "manager assigned", + "type" => "success" + ], + "invalid_manager" => [ + "string" => "manager does not exist", + "type" => "danger" + ], ]); diff --git a/pages.php b/pages.php index f96cfb5..0507136 100644 --- a/pages.php +++ b/pages.php @@ -52,30 +52,14 @@ define("PAGES", [ "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" + "static/js/managers.js" ] ], - "delmanager" => [ - "title" => "delete manager", - "navbar" => false - ], "permissions" => [ "title" => "permissions", "navbar" => true, diff --git a/pages/addmanager.php b/pages/addmanager.php deleted file mode 100644 index 2606d6f..0000000 --- a/pages/addmanager.php +++ /dev/null @@ -1,38 +0,0 @@ - - -
-
-
-

- -

-
-
-
-
-
- - -
-
-
-
- - -
-
-
-
- - - - - -
-
\ No newline at end of file diff --git a/pages/delmanager.php b/pages/delmanager.php deleted file mode 100644 index 556a1eb..0000000 --- a/pages/delmanager.php +++ /dev/null @@ -1,58 +0,0 @@ -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/managers.php b/pages/managers.php index b16a32e..4af9fa7 100644 --- a/pages/managers.php +++ b/pages/managers.php @@ -2,51 +2,66 @@ require_once __DIR__ . '/../required.php'; redirectifnotloggedin(); + + +$assigned = []; +$employees = false; +$user = ""; +if ($VARS['man'] && $database->has('accounts', ['username' => $VARS['man']])) { + $user = $VARS['man']; + require_once __DIR__ . "/../lib/userinfo.php"; + $uid = getUserByUsername($user)['uid']; + $assigned = $database->select('managers', ["[>]accounts" => ["employeeid" => "uid"]], 'username', ['managerid' => $uid]); + $employees = true; +} ?> -
- -
- - - - - - - - - - + + +
+
+
+
+
+ " /> +
+
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) { + if ($employees !== false) { ?> -
- - - - - +
+
+
+
+ " /> +
+
+ +
+
+
+
+ +
+
+
+ +
+
+
- - - - - - - - -
- - () ()
\ No newline at end of file + + + + + + + + + + \ No newline at end of file diff --git a/static/js/addmanager.js b/static/js/addmanager.js deleted file mode 100644 index 4c4c3a2..0000000 --- a/static/js/addmanager.js +++ /dev/null @@ -1,47 +0,0 @@ -$("#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 index ce547fc..63d3bde 100644 --- a/static/js/managers.js +++ b/static/js/managers.js @@ -1,47 +1,104 @@ -$('#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" +var empoptions = { + url: "action.php", + ajaxSettings: { + dataType: "json", + method: "GET", + data: { + action: "autocomplete_user" } }, - columnDefs: [ - { - targets: 0, - className: 'control', - orderable: false - }, - { - targets: 1, - orderable: false + preparePostData: function (data) { + data.q = $("#people-box").val(); + return data; + }, + getValue: function (element) { + return element.username; + }, + template: { + type: "custom", + method: function (value, item) { + return item.name + " " + item.username + ""; + } + }, + list: { + onClickEvent: function () { + var value = $("#people-box").getSelectedItemData().username; + addPerson(value); } - ], - 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); + } +}; + +$("#people-box").easyAutocomplete(empoptions); + +var manoptions = { + url: "action.php", + ajaxSettings: { + dataType: "json", + method: "GET", + data: { + action: "autocomplete_user" } + }, + preparePostData: function (data) { + data.q = $("#manager-box").val(); + return data; + }, + getValue: function (element) { + return element.username; + }, + template: { + type: "custom", + method: function (value, item) { + return item.name + " " + item.username + ""; + } + }, + list: { + onClickEvent: function () { + var value = $("#manager-box").getSelectedItemData().username; + document.location.href = "app.php?page=managers&man=" + value; + } + } +}; + +$("#manager-box").easyAutocomplete(manoptions); + +$("#people-box").keyup(function (event) { + if (event.keyCode == 13) { + $("#addpersonbtn").click(); + event.preventDefault(); + return false; + } +}); +$("#people-box").keydown(function (event) { + if (event.keyCode == 13) { + event.preventDefault(); + return false; + } +}); + +$("#addpersonbtn").click(function () { + addPerson($("#people-box").val()); +}); + +function addPerson(p) { + p = String.trim(p); + if (p == "") { + return false; + } + if ($("#peoplelist div[data-user=" + p + "]").length) { + $("#peoplelist .list-group-item[data-user=" + p + "]").animate({ + backgroundColor: "#ff0000", + }, 500, "linear", function () { + $("#peoplelist .list-group-item[data-user=" + p + "]").animate({ + backgroundColor: "#ffffff", + }, 500); + }); + return false; } -}); \ No newline at end of file + $('#peoplelist').append("
" + p + "
"); + $("#people-box").val(""); +} + +function removePerson(p) { + $("#peoplelist div[data-user=" + p + "]").remove(); +} \ No newline at end of file