diff --git a/web/index.html b/web/index.html index 19f2456..1ff59d7 100644 --- a/web/index.html +++ b/web/index.html @@ -1,13 +1,40 @@ - +
+ - + diff --git a/web/src/components/ChannelSettingsModal.tsx b/web/src/components/ChannelSettingsModal.tsx index 5beb412..b6f085e 100644 --- a/web/src/components/ChannelSettingsModal.tsx +++ b/web/src/components/ChannelSettingsModal.tsx @@ -1,9 +1,15 @@ -import { useEffect, useState } from "react"; -import { usePermissionStore, PERMISSION_LABELS, PERMS, type ChannelOverride, hasPermission } from "../stores/permissions.ts"; -import { useRoleStore } from "../stores/role.ts"; -import { useMemberStore } from "../stores/member.ts"; -import { useChannelStore } from "../stores/channel.ts"; -import { api } from "../lib/api.ts"; +import { useEffect, useMemo, useState } from 'react'; +import { api } from '../lib/api.ts'; +import { + usePermissionStore, + PERMS, + PERM_CATEGORIES, + PERMISSION_LABELS, + type ChannelOverride, + type PermissionKey, +} from '../stores/permissions.ts'; +import { useRoleStore, type Role } from '../stores/role.ts'; +import { useMemberStore, type Member } from '../stores/member.ts'; interface ChannelSettingsModalProps { serverId: string; @@ -12,226 +18,625 @@ interface ChannelSettingsModalProps { onClose: () => void; } -type Tab = 'overview' | 'permissions'; -type TargetMode = 'role' | 'user'; +type TargetType = 'role' | 'user'; +type TriState = 'allow' | 'deny' | 'inherit'; -interface OverrideFormData { - targetType: TargetMode; - targetId: string; +interface DraftOverride { + target_type: TargetType; + target_id: string; allow: number; deny: number; } -function OverrideMatrix({ allow, deny, onChange }: { allow: number; deny: number; onChange: (allow: number, deny: number) => void }) { - const toggle = (flag: number, state: 'allow' | 'deny' | 'inherit') => { - let nextAllow = allow; - let nextDeny = deny; - if (state === 'allow') { - nextAllow |= flag; - nextDeny &= ~flag; - } else if (state === 'deny') { - nextAllow &= ~flag; - nextDeny |= flag; - } else { - nextAllow &= ~flag; - nextDeny &= ~flag; - } - onChange(nextAllow, nextDeny); - }; +// Channel-scoped perms only (admin / manage-server stay at role level). +const CHANNEL_PERM_KEYS = new Set+ tip: deny View for @everyone, allow a role for private channels +
+[no overrides yet]
+ )} + {sidebarEntries.map((entry) => { + const k = targetKey(entry.type, entry.id); + const active = k === selectedKey; + const { label, color, kind } = resolveLabel(entry.type, entry.id); + return ( + + ); + })} +ERR: {permError}
} ++ ✓ allow · ✗ deny · – inherit from roles +
+ + {CHANNEL_PERM_CATEGORIES.map((cat) => ( +[no roles left to add]
+ )} + {addTab === 'role' && + filteredRoles.map((role) => ( + + ))} + {addTab === 'user' && filteredMembers.length === 0 && ( +[no members left to add]
+ )} + {addTab === 'user' && + filteredMembers.map((m) => ( + + ))}