Feat admin rbac migration (#1)
Co-authored-by: Jeffrey Smith <jasafpro@gmail.com> Co-committed-by: Jeffrey Smith <jasafpro@gmail.com>
This commit was merged in pull request #1.
This commit is contained in:
@@ -11,7 +11,6 @@ export default function GroupsSection() {
|
||||
const [members, setMembers] = useState([]);
|
||||
const [allPerms, setAllPerms] = useState([]);
|
||||
const [allUsers, setAllUsers] = useState([]);
|
||||
const [allModels, setAllModels] = useState([]);
|
||||
const [groupData, setGroupData] = useState({});
|
||||
const [showCreate, setShowCreate] = useState(false);
|
||||
const [showAddMember, setShowAddMember] = useState(false);
|
||||
@@ -30,21 +29,16 @@ export default function GroupsSection() {
|
||||
setDetail(group);
|
||||
setGroupData({
|
||||
permissions: group.permissions || [],
|
||||
token_budget_daily: group.token_budget_daily ?? '',
|
||||
token_budget_monthly: group.token_budget_monthly ?? '',
|
||||
allowed_models: group.allowed_models || [],
|
||||
});
|
||||
try {
|
||||
const [m, p, u, models] = await Promise.all([
|
||||
const [m, p, u] = await Promise.all([
|
||||
sw.api.admin.groups.members(group.id),
|
||||
sw.api.admin.permissions.list(),
|
||||
sw.api.admin.users.list(),
|
||||
sw.api.admin.models.list().catch(() => []),
|
||||
]);
|
||||
setMembers(m || []);
|
||||
setAllPerms(p.permissions || []);
|
||||
setAllUsers(u || []);
|
||||
setAllModels(models || []);
|
||||
} catch (e) { sw.toast(e.message, 'error'); }
|
||||
}
|
||||
|
||||
@@ -63,13 +57,10 @@ export default function GroupsSection() {
|
||||
} catch (e) { sw.toast(e.message, 'error'); }
|
||||
}
|
||||
|
||||
async function savePermsAndBudgets() {
|
||||
async function savePermissions() {
|
||||
try {
|
||||
await sw.api.admin.groups.update(detail.id, {
|
||||
permissions: groupData.permissions,
|
||||
token_budget_daily: groupData.token_budget_daily || null,
|
||||
token_budget_monthly: groupData.token_budget_monthly || null,
|
||||
allowed_models: groupData.allowed_models.length ? groupData.allowed_models : null,
|
||||
});
|
||||
sw.toast('Saved', 'success');
|
||||
} catch (e) { sw.toast(e.message, 'error'); }
|
||||
@@ -84,15 +75,6 @@ export default function GroupsSection() {
|
||||
});
|
||||
}
|
||||
|
||||
function toggleModel(modelId) {
|
||||
setGroupData(prev => {
|
||||
const list = prev.allowed_models.includes(modelId)
|
||||
? prev.allowed_models.filter(m => m !== modelId)
|
||||
: [...prev.allowed_models, modelId];
|
||||
return { ...prev, allowed_models: list };
|
||||
});
|
||||
}
|
||||
|
||||
async function addMember(e) {
|
||||
e.preventDefault();
|
||||
const uid = e.target.userId.value;
|
||||
@@ -151,37 +133,8 @@ export default function GroupsSection() {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="settings-section" style="margin-bottom:16px;">
|
||||
<h5 style="margin:0 0 8px;">Token Budgets</h5>
|
||||
<div class="form-row" style="gap:12px;">
|
||||
<div class="form-group" style="flex:1;"><label>Daily limit</label>
|
||||
<input type="number" placeholder="Unlimited" min="0" value=${groupData.token_budget_daily}
|
||||
onInput=${e => setGroupData(p => ({ ...p, token_budget_daily: e.target.value ? Number(e.target.value) : '' }))} />
|
||||
</div>
|
||||
<div class="form-group" style="flex:1;"><label>Monthly limit</label>
|
||||
<input type="number" placeholder="Unlimited" min="0" value=${groupData.token_budget_monthly}
|
||||
onInput=${e => setGroupData(p => ({ ...p, token_budget_monthly: e.target.value ? Number(e.target.value) : '' }))} />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="settings-section" style="margin-bottom:16px;">
|
||||
<h5 style="margin:0 0 8px;">Allowed Models</h5>
|
||||
<p class="text-muted" style="font-size:12px;margin:0 0 8px;">Leave empty for unrestricted.</p>
|
||||
<div class="admin-models-grid">
|
||||
${allModels.map(m => html`
|
||||
<label class="toggle-label" key=${m.id || m.model_id}>
|
||||
<input type="checkbox" checked=${groupData.allowed_models.includes(m.model_id || m.id)}
|
||||
onChange=${() => toggleModel(m.model_id || m.id)} />
|
||||
<span class="toggle-track"></span>
|
||||
<span>${m.display_name || m.model_id || m.id}</span>
|
||||
</label>
|
||||
`)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="margin-bottom:16px;">
|
||||
<button class="btn-small btn-primary" onClick=${savePermsAndBudgets}>Save Permissions & Budgets</button>
|
||||
<button class="btn-small btn-primary" onClick=${savePermissions}>Save Permissions</button>
|
||||
</div>
|
||||
|
||||
<hr style="border:none;border-top:1px solid var(--border);margin:16px 0;" />
|
||||
|
||||
Reference in New Issue
Block a user