-
-
-
-
+// Actions Block (outside form for separate actions)
+if ($update_allowed_edit === 1){
+$view .= '
+
+
+
+
+ | '.($User_pw_reset ?? 'Reset Password').' |
+
+
+ |
+
';
+
+if ($is_blocked){
+$view .= '
+ | '.($User_unblock ?? 'Unblock User').' |
+
+
+ |
+
';
+}
+
+if ($delete_allowed === 1){
+$view .= '
+ | '.($general_delete ?? 'Delete User').' |
+
+
+ |
+
';
+}
+
+$view .= '
';
}
-$view .= '';
-
-//Output
+//OUTPUT
echo $view;
-template_footer()
-?>
\ No newline at end of file
+
+$js = 'var userEditMode = false;
+
+function toggleUserEdit() {
+ userEditMode = !userEditMode;
+ var editBtn = document.getElementById("editBtn");
+ var saveBtn = document.getElementById("saveBtn");
+ var viewElements = document.querySelectorAll(".view-mode");
+ var editElements = document.querySelectorAll(".edit-mode");
+ var viewRolesElements = document.querySelectorAll(".view-mode-roles");
+ var editRolesElements = document.querySelectorAll(".edit-mode-roles");
+ var i;
+ if (userEditMode) {
+ // Enter edit mode for user info AND roles
+ for (i = 0; i < viewElements.length; i++) { viewElements[i].style.display = "none"; }
+ for (i = 0; i < editElements.length; i++) { editElements[i].style.display = "inline"; }
+ for (i = 0; i < viewRolesElements.length; i++) { viewRolesElements[i].style.display = "none"; }
+ for (i = 0; i < editRolesElements.length; i++) { editRolesElements[i].style.display = "block"; }
+ editBtn.style.display = "none";
+ saveBtn.style.display = "inline-block";
+ } else {
+ // Exit edit mode
+ for (i = 0; i < viewElements.length; i++) { viewElements[i].style.display = "inline"; }
+ for (i = 0; i < editElements.length; i++) { editElements[i].style.display = "none"; }
+ for (i = 0; i < viewRolesElements.length; i++) { viewRolesElements[i].style.display = "block"; }
+ for (i = 0; i < editRolesElements.length; i++) { editRolesElements[i].style.display = "none"; }
+ editBtn.style.display = "inline-block";
+ saveBtn.style.display = "none";
+ }
+}';
+
+template_footer($js);
diff --git a/user_role.php b/user_role.php
new file mode 100644
index 0000000..86ed8ce
--- /dev/null
+++ b/user_role.php
@@ -0,0 +1,382 @@
+rowID;
+
+//CALL TO API FOR Role Permissions
+$api_url = '/v2/role_access_permissions/role_id='.$role_id;
+$permissions = ioServer($api_url,'');
+//Decode Payload
+if (!empty($permissions)){$permissions = json_decode($permissions);}else{$permissions = null;}
+
+//CALL TO API FOR All Access Elements (no paging)
+$api_url = '/v2/access_elements/all=';
+$all_access_elements = ioServer($api_url,'');
+//Decode Payload
+if (!empty($all_access_elements)){$all_access_elements = json_decode($all_access_elements);}else{$all_access_elements = null;}
+
+// Create lookup array for existing permissions
+$permission_lookup = [];
+if (!empty($permissions)){
+ foreach ($permissions as $perm){
+ $permission_lookup[$perm->access_id] = $perm;
+ }
+}
+
+//CALL TO API FOR User Role Assignments
+$api_url = '/v2/user_role_assignments/role_id='.$role_id;
+$assignments = ioServer($api_url,'');
+//Decode Payload
+if (!empty($assignments)){$assignments = json_decode($assignments);}else{$assignments = null;}
+
+//------------------------------
+// Handle POST for inline edit
+//------------------------------
+if (isset($_POST['save_permissions']) && $update_allowed_edit === 1) {
+ // Update role info (name, description, status)
+ $role_data = json_encode([
+ 'rowID' => $role_id,
+ 'name' => $_POST['name'] ?? '',
+ 'description' => $_POST['description'] ?? '',
+ 'is_active' => $_POST['is_active'] ?? 1
+ ], JSON_UNESCAPED_UNICODE);
+ ioServer('/v2/user_roles', $role_data);
+
+ // Process permission updates
+ $posted_permissions = $_POST['permissions'] ?? [];
+
+ // For each access element, update or create permission
+ foreach ($all_access_elements as $element) {
+ $access_id = $element->rowID;
+ $has_permission = isset($posted_permissions[$access_id]);
+ $existing_permission = $permission_lookup[$access_id] ?? null;
+
+ if ($has_permission) {
+ // Get CRUD values
+ $can_create = isset($posted_permissions[$access_id]['C']) ? 1 : 0;
+ $can_read = isset($posted_permissions[$access_id]['R']) ? 1 : 0;
+ $can_update = isset($posted_permissions[$access_id]['U']) ? 1 : 0;
+ $can_delete = isset($posted_permissions[$access_id]['D']) ? 1 : 0;
+
+ if ($existing_permission) {
+ // Update existing permission
+ $data = json_encode([
+ 'rowID' => $existing_permission->rowID,
+ 'role_id' => $role_id,
+ 'access_id' => $access_id,
+ 'can_create' => $can_create,
+ 'can_read' => $can_read,
+ 'can_update' => $can_update,
+ 'can_delete' => $can_delete
+ ], JSON_UNESCAPED_UNICODE);
+ } else {
+ // Insert new permission
+ $data = json_encode([
+ 'role_id' => $role_id,
+ 'access_id' => $access_id,
+ 'can_create' => $can_create,
+ 'can_read' => $can_read,
+ 'can_update' => $can_update,
+ 'can_delete' => $can_delete
+ ], JSON_UNESCAPED_UNICODE);
+ }
+ ioServer('/v2/role_access_permissions', $data);
+ } else {
+ // If no permission checkboxes selected but had existing permission, delete it
+ if ($existing_permission) {
+ $data = json_encode([
+ 'rowID' => $existing_permission->rowID,
+ 'delete' => 'delete'
+ ], JSON_UNESCAPED_UNICODE);
+ ioServer('/v2/role_access_permissions', $data);
+ }
+ }
+ }
+
+ // Redirect to refresh
+ header('Location: index.php?page=user_role&rowID='.$role_id.'&success_msg=2');
+ exit;
+}
+
+//------------------------------
+//Variables
+//------------------------------
+$status_text = ($responses->is_active == 1) ? ($enabled ?? 'Active') : ($disabled ?? 'Inactive');
+$status_class = ($responses->is_active == 1) ? 'id1' : 'id0';
+
+// Handle success messages
+if (isset($_GET['success_msg'])) {
+ if ($_GET['success_msg'] == 1) {
+ $success_msg = ($message_role_1 ?? 'Role created successfully');
+ }
+ if ($_GET['success_msg'] == 2) {
+ $success_msg = ($message_role_2 ?? 'Role updated successfully');
+ }
+ if ($_GET['success_msg'] == 3) {
+ $success_msg = ($message_role_3 ?? 'Role deleted successfully');
+ }
+}
+
+template_header(($user_role_title ?? 'User Role'), 'user_role', 'view');
+$view = '
+
+
'.($view_role_h2 ?? 'User Role').' - '.$responses->name.'
+
←
+';
+
+if ($update_allowed_edit === 1){
+ $view .= '
✏️';
+ $view .= '
';
+}
+
+$view .= '
';
+
+if (isset($success_msg)){
+ $view .= '
';
+}
+
+// Start form wrapper for edit mode
+$view .= '
+';
+
+//OUTPUT
+echo $view;
+
+$js = 'var permissionsEditMode = false;
+function togglePermissionsEdit() {
+ permissionsEditMode = !permissionsEditMode;
+ var editBtn = document.getElementById("editBtn");
+ var saveBtn = document.getElementById("saveBtn");
+ var viewElements = document.querySelectorAll(".view-mode");
+ var editElements = document.querySelectorAll(".edit-mode");
+ var editOnlyRows = document.querySelectorAll(".edit-only-row");
+ var i;
+ if (permissionsEditMode) {
+ for (i = 0; i < viewElements.length; i++) { viewElements[i].style.display = "none"; }
+ for (i = 0; i < editElements.length; i++) { editElements[i].style.display = "inline"; }
+ for (i = 0; i < editOnlyRows.length; i++) { editOnlyRows[i].style.display = "table-row"; }
+ editBtn.style.display = "none";
+ saveBtn.style.display = "inline-block";
+ } else {
+ for (i = 0; i < viewElements.length; i++) { viewElements[i].style.display = "inline"; }
+ for (i = 0; i < editElements.length; i++) { editElements[i].style.display = "none"; }
+ for (i = 0; i < editOnlyRows.length; i++) { editOnlyRows[i].style.display = "none"; }
+ editBtn.style.display = "inline-block";
+ saveBtn.style.display = "none";
+ }
+}
+function toggleColumn(type) {
+ var checkboxes = document.querySelectorAll("input[name$=\\"[" + type + "]\\"]");
+ var allChecked = true;
+ for (var i = 0; i < checkboxes.length; i++) {
+ if (!checkboxes[i].checked) {
+ allChecked = false;
+ break;
+ }
+ }
+ for (var i = 0; i < checkboxes.length; i++) {
+ checkboxes[i].checked = !allChecked;
+ }
+}';
+
+template_footer($js);
diff --git a/user_role_manage.php b/user_role_manage.php
new file mode 100644
index 0000000..ac55c05
--- /dev/null
+++ b/user_role_manage.php
@@ -0,0 +1,227 @@
+ '',
+ 'name' => '',
+ 'description' => '',
+ 'is_active' => 1,
+ 'created' => '',
+ 'createdby' => $_SESSION['username'],
+ 'updated' => '',
+ 'updatedby' => ''
+];
+
+$role_ID = $_GET['rowID'] ?? '';
+
+if ($role_ID !=''){
+ $url = 'index.php?page=user_role&rowID='.$role_ID.'';
+} else {
+ $url = 'index.php?page=user_roles';
+}
+
+//GET ALL ACCESS ELEMENTS
+$api_url = '/v2/access_elements/status=1';
+$access_elements = ioServer($api_url,'');
+//Decode Payload
+if (!empty($access_elements)){$access_elements = json_decode($access_elements);}else{$access_elements = null;}
+
+//GET ROLE PERMISSIONS (if editing)
+$role_permissions = [];
+if ($role_ID != ''){
+ $api_url = '/v2/role_access_permissions/role_id='.$role_ID;
+ $role_permissions_response = ioServer($api_url,'');
+ if (!empty($role_permissions_response)){
+ $role_permissions_data = json_decode($role_permissions_response);
+ foreach ($role_permissions_data as $perm){
+ $role_permissions[$perm->access_id] = [
+ 'can_create' => $perm->can_create,
+ 'can_read' => $perm->can_read,
+ 'can_update' => $perm->can_update,
+ 'can_delete' => $perm->can_delete
+ ];
+ }
+ }
+}
+
+if (isset($_GET['rowID'])) {
+ // ID param exists, edit an existing role
+ //CALL TO API
+ $api_url = '/v2/user_roles/rowID='.$role_ID;
+ $responses = ioServer($api_url,'');
+ //Decode Payload
+ if (!empty($responses)){$responses = json_decode($responses,true);}else{$responses = null;}
+
+ $role = $responses[0];
+
+ if ($update_allowed === 1){
+ if (isset($_POST['submit'])) {
+ //GET ALL POST DATA
+ $data = json_encode($_POST, JSON_UNESCAPED_UNICODE);
+ //API call
+ $responses = ioServer('/v2/user_roles', $data);
+
+ if ($responses === 'NOK'){
+
+ } else {
+ header('Location: index.php?page=user_role&rowID='.$role_ID.'&success_msg=2');
+ exit;
+ }
+ }
+ }
+
+ if ($delete_allowed === 1){
+ if (isset($_POST['delete'])) {
+ //GET ALL POST DATA
+ $data = json_encode($_POST , JSON_UNESCAPED_UNICODE);
+ //API call
+ $responses = ioServer('/v2/user_roles', $data);
+ // Redirect and delete role
+ if ($responses === 'NOK'){
+
+ } else {
+ header('Location: index.php?page=user_roles&success_msg=3');
+ exit;
+ }
+ }
+ }
+
+} else {
+ // Create a new role
+ if (isset($_POST['submit']) && $create_allowed === 1) {
+ //GET ALL POST DATA
+ $data = json_encode($_POST, JSON_UNESCAPED_UNICODE);
+ //API call
+ $responses = ioServer('/v2/user_roles', $data);
+ if ($responses === 'NOK'){
+
+ } else {
+ header('Location: index.php?page=user_roles&success_msg=1');
+ exit;
+ }
+ }
+}
+
+template_header(($user_role_title ?? 'User Role'), 'user_role', 'manage');
+
+$label_h2 = (($role_ID !='')? ($manage_role_h2 ?? 'Edit Role') : ($button_create_role ?? 'Create Role'));
+$view ='
+
';
+
+//Output
+echo $view;
+template_footer()?>
diff --git a/user_roles.php b/user_roles.php
new file mode 100644
index 0000000..daf39af
--- /dev/null
+++ b/user_roles.php
@@ -0,0 +1,202 @@
+←':'';
+
+//Check if allowed
+if (isAllowed($page,$_SESSION['profile'],$_SESSION['permission'],'R') === 0){
+ header('location: index.php');
+ exit;
+}
+//PAGE Security
+$page_manage = 'user_role_manage';
+$update_allowed = isAllowed($page_manage ,$_SESSION['profile'],$_SESSION['permission'],'U');
+$delete_allowed = isAllowed($page_manage ,$_SESSION['profile'],$_SESSION['permission'],'D');
+$create_allowed = isAllowed($page_manage ,$_SESSION['profile'],$_SESSION['permission'],'C');
+
+//GET PARAMETERS && STORE in SESSION for FURTHER USE/NAVIGATION
+$pagination_page = $_SESSION['p'] = isset($_GET['p']) ? $_GET['p'] : 1;
+$status = $_SESSION['status'] = isset($_GET['status']) ? '&status='.$_GET['status'] : '';
+$sort = $_SESSION['sort'] = isset($_GET['sort']) ? '&sort='.$_GET['sort'] : '';
+$search = $_SESSION['search'] = isset($_GET['search']) ? '&search='.$_GET['search'] : '';
+
+//GET PARAMETERS FOR FILTERS
+$filter = urlGETdetailsFilter($_GET) ?? '';
+
+// Determine the URL
+$url = 'index.php?page=user_roles'.$status.$search.$sort;
+//GET Details from URL
+$GET_VALUES = urlGETdetails($_GET) ?? '';
+//CALL TO API
+$api_url = '/v2/user_roles/'.$GET_VALUES;
+$responses = ioServer($api_url,'');
+//Decode Payload
+if (!empty($responses)){$responses = json_decode($responses);}else{$responses = null;}
+
+//Return QueryTotal from API
+$total_url = ((!empty($GET_VALUES) && $GET_VALUES !='') ? '&totals=' : 'totals=' );
+$api_url = '/v2/user_roles/'.$GET_VALUES.$total_url;
+$query_total = ioServer($api_url,'');
+//Decode Payload
+if (!empty($query_total)){$query_total = json_decode($query_total);}else{$query_total = null;}
+
+// Handle success messages
+if (isset($_GET['success_msg'])) {
+ if ($_GET['success_msg'] == 1) {
+ $success_msg = ($message_role_1 ?? 'Role created successfully');
+ }
+ if ($_GET['success_msg'] == 2) {
+ $success_msg = ($message_role_2 ?? 'Role updated successfully');
+ }
+ if ($_GET['success_msg'] == 3) {
+ $success_msg = ($message_role_3 ?? 'Role deleted successfully');
+ }
+}
+
+template_header(($user_roles_title ?? 'User Roles'), 'user_roles','view');
+$view = '
+
+
+
+
+
'.($user_roles_h2 ?? 'User Roles').' ('.$query_total.')
+
'.($user_roles_p ?? 'Manage user roles and permissions').'
+
+
+
+ '.$back_btn_orgin;
+
+if ($create_allowed === 1){
+ $view .= '
+';
+}
+
+$view .= '
+
+
';
+
+if (isset($success_msg)){
+$view .= '
';
+}
+
+$view .= '
+
+
+
+
+
+';
+$view .= '
+
+
+
+
+
+ | '.($role_name ?? 'Role Name').' |
+ '.($role_description ?? 'Description').' |
+ '.($general_status ?? 'Status').' |
+ '.($role_permissions_count ?? 'Permissions').' |
+ '.($general_created ?? 'Created').' |
+
+
+
+ ';
+
+ if (empty($responses)){
+
+ $view .= '
+
+ | '.($message_no_roles ?? 'No roles found').' |
+
';
+ }
+
+foreach ($responses as $response){
+//Translate status INT to STR
+$status_text = ($response->is_active == 1) ? ($enabled ?? 'Active') : ($disabled ?? 'Inactive');
+$status_class = ($response->is_active == 1) ? 'id1' : 'id0';
+
+$view .= '
+ | '.$response->name.' |
+ '.($response->description ?? '-').' |
+ '.$status_text.' |
+ '.($response->permission_count ?? '0').' |
+ '.getRelativeTime($response->created).' |
+
+ ';
+ }
+ $view .= '
+
+
+
+
+';
+
+$page_rows = $page_rows_equipment ?? 20;
+$view.='';
+//OUTPUT
+echo $view;
+
+template_footer();
+?>
diff --git a/users.php b/users.php
index 025e91c..624356a 100644
--- a/users.php
+++ b/users.php
@@ -38,16 +38,16 @@ $url = 'index.php?page=users'.$status.$search;
//GET Details from URL
$GET_VALUES = urlGETdetails($_GET) ?? '';
//CALL TO API
-$api_url = '/v1/users/'.$GET_VALUES;
+$api_url = '/v2/users/'.$GET_VALUES;
$responses = ioServer($api_url,'');
//Decode Payload
-if (!empty($responses)){$responses = decode_payload($responses);}else{$responses = null;}
+if (!empty($responses)){$responses = json_decode($responses);}else{$responses = null;}
//Return QueryTotal from API
-$api_url = '/v1/users/'.$GET_VALUES.'&totals=';
+$api_url = '/v2/users/'.$GET_VALUES.'&totals=';
$query_total = ioServer($api_url,'');
//Decode Payload
-if (!empty($query_total)){$query_total = decode_payload($query_total);}else{$query_total = null;}
+if (!empty($query_total)){$query_total = json_decode($query_total);}else{$query_total = null;}
// Handle success messages
if (isset($_GET['success_msg'])) {