import re
with open('ui/components/AdminRolesPage.tsx', 'r') as f:
content = f.read()
import_str = """import { AdminLayout } from "./AdminLayout.tsx";"""
content = content.replace(import_str, """import { AdminLayout } from "./AdminLayout.tsx";\nimport { AdminTable } from "./admin/AdminTable.tsx";\nimport { AdminModal } from "./admin/AdminModal.tsx";""")
role_form = """
"""
role_form_replacement = """
Define a global shared role or an application-scoped custom grant.
"""
content = content.replace(role_form, role_form_replacement)
roles_table_desktop_mobile = """
| Role Identifier |
Scope |
Description |
Created |
Actions |
{roles.length === 0
? (
|
No roles found.
|
)
: (
roles.map((r) => {
const isGlobal = !r.app_id;
return (
{r.name}
|
{isGlobal
? Global
: (
{r.app_name || "App Scoped"}
)}
|
{r.description || "-"}
|
{new Date(r.created_at).toLocaleDateString()}
|
{r.name !== "admin" && (
)}
|
);
})
)}
{/* Mobile View (< 768px) */}
{roles.length === 0
? (
)
: (
roles.map((r) => {
const isGlobal = !r.app_id;
return (
{r.name}
{isGlobal
? Global
: (
{r.app_name || "App Scoped"}
)}
{r.description || "No description provided."}
Created: {new Date(r.created_at).toLocaleDateString()}
{r.name !== "admin" && (
)}
);
})
)}
"""
roles_table_replacement = """ {
const isGlobal = !r.app_id;
return (
{r.name}
|
{isGlobal
? Global
: (
{r.app_name || "App Scoped"}
)}
|
{r.description || "-"}
|
{new Date(r.created_at).toLocaleDateString()}
|
{r.name !== "admin" && (
)}
|
);
})}
mobileCards={roles.map((r) => {
const isGlobal = !r.app_id;
return (
{r.name}
{isGlobal
? Global
: (
{r.app_name || "App Scoped"}
)}
{r.description || "No description provided."}
Created: {new Date(r.created_at).toLocaleDateString()}
{r.name !== "admin" && (
)}
);
})}
/>"""
content = content.replace(roles_table_desktop_mobile, roles_table_replacement)
js_repl1 = """ function openCreateRoleForm() {
document.getElementById('editRoleId').value = '';
document.getElementById('roleFormTitle').textContent = 'Create New Role';
document.getElementById('roleScope').value = 'global';
document.getElementById('roleScope').disabled = false;
document.getElementById('roleAppId').value = document.getElementById('roleAppId').options[0]?.value || '';
document.getElementById('roleName').value = '';
document.getElementById('roleName').readOnly = false;
document.getElementById('roleDescription').value = '';
handleScopeChange();
document.getElementById('roleFormCard').style.display = 'block';
document.getElementById('roleFormCard').scrollIntoView({ behavior: 'smooth' });
}"""
js_repl1_new = """ function openCreateRoleForm() {
document.getElementById('editRoleId').value = '';
document.querySelector('#roleFormModal h3').textContent = 'Create New Role';
document.getElementById('roleScope').value = 'global';
document.getElementById('roleScope').disabled = false;
document.getElementById('roleAppId').value = document.getElementById('roleAppId').options[0]?.value || '';
document.getElementById('roleName').value = '';
document.getElementById('roleName').readOnly = false;
document.getElementById('roleDescription').value = '';
handleScopeChange();
document.getElementById('roleFormModal').style.display = 'flex';
}"""
content = content.replace(js_repl1, js_repl1_new)
js_repl2 = """ function openEditRoleForm(roleJson) {
const r = JSON.parse(roleJson);
document.getElementById('editRoleId').value = r.id;
document.getElementById('roleFormTitle').textContent = 'Edit Role: ' + r.name;
document.getElementById('roleScope').value = r.app_id ? 'app_specific' : 'global';
document.getElementById('roleScope').disabled = true; // Cannot change scope after creation
document.getElementById('roleAppId').value = r.app_id || document.getElementById('roleAppId').options[0]?.value || '';
document.getElementById('roleName').value = r.name;
document.getElementById('roleName').readOnly = (r.name === 'admin'); // cannot rename admin
document.getElementById('roleDescription').value = r.description || '';
handleScopeChange();
document.getElementById('roleFormCard').style.display = 'block';
document.getElementById('roleFormCard').scrollIntoView({ behavior: 'smooth' });
}"""
js_repl2_new = """ function openEditRoleForm(roleJson) {
const r = JSON.parse(roleJson);
document.getElementById('editRoleId').value = r.id;
document.querySelector('#roleFormModal h3').textContent = 'Edit Role: ' + r.name;
document.getElementById('roleScope').value = r.app_id ? 'app_specific' : 'global';
document.getElementById('roleScope').disabled = true; // Cannot change scope after creation
document.getElementById('roleAppId').value = r.app_id || document.getElementById('roleAppId').options[0]?.value || '';
document.getElementById('roleName').value = r.name;
document.getElementById('roleName').readOnly = (r.name === 'admin'); // cannot rename admin
document.getElementById('roleDescription').value = r.description || '';
handleScopeChange();
document.getElementById('roleFormModal').style.display = 'flex';
}"""
content = content.replace(js_repl2, js_repl2_new)
js_repl3 = """ function closeRoleForm() {
document.getElementById('roleFormCard').style.display = 'none';
}"""
js_repl3_new = """ function closeRoleForm() {
document.getElementById('roleFormModal').style.display = 'none';
}"""
content = content.replace(js_repl3, js_repl3_new)
with open('ui/components/AdminRolesPage.tsx', 'w') as f:
f.write(content)
print("Replaced Roles table!")