webupdate

This commit is contained in:
Local Server
2026-01-18 02:22:05 -06:00
parent 6fc159051a
commit 2a2a3d99e5
135 changed files with 54897 additions and 9825 deletions

View File

@@ -12,6 +12,7 @@ const rolePermissions = {
"View Reports",
"View Financial Data",
],
Sales: ["Manage Products", "Manage Orders", "View Reports"],
Admin: [
"Manage Products",
"Manage Portfolio",
@@ -19,14 +20,8 @@ const rolePermissions = {
"Manage Pages",
"Manage Users",
"View Reports",
],
MasterAdmin: [
"Full System Access",
"Manage Settings",
"Manage Users",
"Manage All Content",
"View Logs",
"System Configuration",
],
};
@@ -85,22 +80,22 @@ function renderUsers(users) {
<td>${formatDate(u.createdat)}</td>
<td>
<button class="btn btn-sm btn-info" onclick="editUser('${escapeHtml(
u.id
u.id,
)}')" title="Edit User">
<i class="bi bi-pencil"></i>
</button>
<button class="btn btn-sm btn-warning" onclick="showChangePassword('${escapeHtml(
u.id
u.id,
)}', '${escapeHtml(u.name)}')" title="Change Password">
<i class="bi bi-key"></i>
</button>
<button class="btn btn-sm btn-danger" onclick="deleteUser('${escapeHtml(
u.id
u.id,
)}', '${escapeHtml(u.name)}')" title="Delete User">
<i class="bi bi-trash"></i>
</button>
</td>
</tr>`
</tr>`,
)
.join("");
}
@@ -111,7 +106,7 @@ function filterUsers() {
(u) =>
u.name.toLowerCase().includes(searchTerm) ||
u.email.toLowerCase().includes(searchTerm) ||
u.username.toLowerCase().includes(searchTerm)
u.username.toLowerCase().includes(searchTerm),
);
renderUsers(filtered);
}
@@ -174,6 +169,18 @@ async function saveUser() {
showError("Password must be at least 8 characters long");
return;
}
if (!/[A-Z]/.test(password)) {
showError("Password must contain at least one uppercase letter");
return;
}
if (!/[a-z]/.test(password)) {
showError("Password must contain at least one lowercase letter");
return;
}
if (!/[0-9]/.test(password)) {
showError("Password must contain at least one number");
return;
}
}
const formData = {
@@ -212,7 +219,7 @@ async function saveUser() {
if (data.success) {
showSuccess(
id ? "User updated successfully" : "User created successfully"
id ? "User updated successfully" : "User created successfully",
);
userModal.hide();
loadUsers();
@@ -254,6 +261,21 @@ async function changePassword() {
return;
}
if (!/[A-Z]/.test(newPassword)) {
showError("Password must contain at least one uppercase letter");
return;
}
if (!/[a-z]/.test(newPassword)) {
showError("Password must contain at least one lowercase letter");
return;
}
if (!/[0-9]/.test(newPassword)) {
showError("Password must contain at least one number");
return;
}
showLoading("Changing password...");
try {
@@ -281,34 +303,33 @@ async function changePassword() {
}
async function deleteUser(id, name) {
if (
!confirm(
`Are you sure you want to delete user "${name}"? This action cannot be undone.`
)
)
return;
showDeleteConfirm(
`Are you sure you want to delete user "${name}"? This action cannot be undone.`,
async () => {
showLoading("Deleting user...");
showLoading("Deleting user...");
try {
const response = await fetch(`/api/admin/users/${id}`, {
method: "DELETE",
credentials: "include",
});
const data = await response.json();
hideLoading();
try {
const response = await fetch(`/api/admin/users/${id}`, {
method: "DELETE",
credentials: "include",
});
const data = await response.json();
hideLoading();
if (data.success) {
showSuccess("User deleted successfully");
loadUsers();
} else {
showError(data.message || "Failed to delete user");
}
} catch (error) {
console.error("Failed to delete user:", error);
hideLoading();
showError("Failed to delete user");
}
if (data.success) {
showSuccess("User deleted successfully");
loadUsers();
} else {
showError(data.message || "Failed to delete user");
}
} catch (error) {
console.error("Failed to delete user:", error);
hideLoading();
showError("Failed to delete user");
}
},
{ title: "Delete User", confirmText: "Delete User" },
);
}
function updatePermissionsPreview() {
@@ -323,7 +344,7 @@ function updatePermissionsPreview() {
<i class="bi bi-check-circle-fill" style="color: #10b981; margin-right: 8px;"></i>
<span>${perm}</span>
</div>
`
`,
)
.join("");
}