Add missing pages to command palette and fix feature flag handling

Add Social Dashboard/Graph/Moderation, Jitsi Video Meetings, and Ad Analytics
to searchable command registry. Add missing ContactsOutlined and ScissorOutlined
icons to ICON_MAP. Update defaults-off feature flag list to include enableSocial,
enableChat, and enableMeet.

Bunker Admin
This commit is contained in:
bunker-admin 2026-02-27 20:11:06 -07:00
parent 06ce9dac1b
commit ce590ccae8
4 changed files with 69 additions and 5 deletions

View File

@ -40,6 +40,8 @@ import {
ThunderboltOutlined,
UserOutlined,
FileMarkdownOutlined,
ContactsOutlined,
ScissorOutlined,
} from '@ant-design/icons';
import { useCommandPaletteStore } from '@/stores/command-palette.store';
import { useAuthStore } from '@/stores/auth.store';
@ -88,6 +90,8 @@ const ICON_MAP: Record<string, React.ReactNode> = {
TagOutlined: <TagOutlined />,
FileMarkdownOutlined: <FileMarkdownOutlined />,
UserOutlined: <UserOutlined />,
ContactsOutlined: <ContactsOutlined />,
ScissorOutlined: <ScissorOutlined />,
};
const CATEGORY_LABELS: Record<CommandCategory, string> = {
@ -229,9 +233,8 @@ export default function CommandPalette() {
[flatList, selectedIndex, handleSelect],
);
if (!shouldRender) return null;
// Group commands by category for display
// NOTE: These hooks must stay above the early return to satisfy Rules of Hooks
const groupedCommands = useMemo(() => {
const items = query ? commandResults : recentCommandItems;
const groups = new Map<string, CommandItem[]>();
@ -253,6 +256,8 @@ export default function CommandPalette() {
return groups;
}, [entityResults]);
if (!shouldRender) return null;
// Get flat index for a given item
let flatIndex = 0;

View File

@ -49,6 +49,41 @@ export const commandRegistry: CommandItem[] = [
requiredRoles: ['SUPER_ADMIN'],
},
// ── Navigation: Social ───────────────────────────────
{
id: 'nav-social-dashboard',
title: 'Social Dashboard',
group: 'Social',
path: '/app/social',
icon: 'TeamOutlined',
keywords: ['social', 'community', 'friends', 'connections', 'engagement'],
category: 'navigation',
featureFlag: 'enableSocial',
requiredRoles: ['SUPER_ADMIN', 'INFLUENCE_ADMIN', 'MAP_ADMIN'],
},
{
id: 'nav-social-graph',
title: 'Social Graph',
group: 'Social',
path: '/app/social/graph',
icon: 'BranchesOutlined',
keywords: ['network', 'connections', 'graph', 'relationships', 'visualization'],
category: 'navigation',
featureFlag: 'enableSocial',
requiredRoles: ['SUPER_ADMIN', 'INFLUENCE_ADMIN', 'MAP_ADMIN'],
},
{
id: 'nav-social-moderation',
title: 'Social Moderation',
group: 'Social',
path: '/app/social/moderation',
icon: 'MessageOutlined',
keywords: ['moderation', 'reports', 'flagged', 'content review', 'social moderation'],
category: 'navigation',
featureFlag: 'enableSocial',
requiredRoles: ['SUPER_ADMIN', 'INFLUENCE_ADMIN', 'MAP_ADMIN'],
},
// ── Navigation: Advocacy ──────────────────────────────
{
id: 'nav-campaigns',
@ -366,6 +401,17 @@ export const commandRegistry: CommandItem[] = [
featureFlag: 'enablePayments',
requiredRoles: ['SUPER_ADMIN'],
},
{
id: 'nav-ad-analytics',
title: 'Ad Analytics',
group: 'Payments',
path: '/app/payments/ads/analytics',
icon: 'LineChartOutlined',
keywords: ['ad performance', 'ad metrics', 'banner stats', 'ad dashboard'],
category: 'navigation',
featureFlag: 'enablePayments',
requiredRoles: ['SUPER_ADMIN'],
},
{
id: 'nav-media-jobs',
title: 'Processing Jobs',
@ -557,6 +603,17 @@ export const commandRegistry: CommandItem[] = [
category: 'navigation',
requiredRoles: ['SUPER_ADMIN'],
},
{
id: 'nav-jitsi',
title: 'Video Meetings',
group: 'Services',
path: '/app/services/jitsi',
icon: 'PlaySquareOutlined',
keywords: ['jitsi', 'video call', 'conference', 'meeting', 'webrtc'],
category: 'navigation',
featureFlag: 'enableMeet',
requiredRoles: ['SUPER_ADMIN'],
},
{
id: 'nav-qr-codes',
title: 'QR Codes',

View File

@ -28,8 +28,9 @@ export function useCommandIndex() {
if (!flag) return true;
if (!settings) return true; // show all when settings haven't loaded
const value = (settings as unknown as Record<string, unknown>)[flag];
// enablePayments, enableSms, and enablePeople default off, others default on
if (flag === 'enablePayments' || flag === 'enableSms' || flag === 'enablePeople') return value === true;
// Flags that default to false — only show when explicitly enabled
const defaultsOff = ['enablePayments', 'enableSms', 'enablePeople', 'enableSocial', 'enableChat', 'enableMeet'];
if (defaultsOff.includes(flag)) return value === true;
return value !== false;
};

View File

@ -158,7 +158,8 @@ export function useEntitySearch(query: string) {
const activeConfigs = entityConfigs.filter((cfg) => {
if (cfg.featureFlag && settings) {
const val = (settings as unknown as Record<string, unknown>)[cfg.featureFlag];
if (cfg.featureFlag === 'enablePayments' || cfg.featureFlag === 'enableSms' || cfg.featureFlag === 'enablePeople') {
const defaultsOff = ['enablePayments', 'enableSms', 'enablePeople', 'enableSocial', 'enableChat', 'enableMeet'];
if (defaultsOff.includes(cfg.featureFlag)) {
if (val !== true) return false;
} else if (val === false) return false;
}