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 = """ {/* Mobile View (< 768px) */}
{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 || "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!")