Initial commit: SKEEN Derma Experts - Sistema Integral de Gestión Clínica
- Frontend React (SKEEN Brand) con Vite, TypeScript, Tailwind - Frontend Homenest (versión alternativa) - Módulos Odoo 17 custom (citas, pacientes, monedero, pagos, ventas, inventario, whatsapp) - WACRM fork (Next.js 16 + Supabase) - Hermes + Bridge + Skills (Qwen3.6 via Nan Builders) - Scripts de migración y operación - Documentación extensiva en docs/
This commit is contained in:
81
wacrm/src/components/settings/settings-sections.ts
Normal file
81
wacrm/src/components/settings/settings-sections.ts
Normal file
@@ -0,0 +1,81 @@
|
||||
import {
|
||||
Coins,
|
||||
FileText,
|
||||
KeyRound,
|
||||
LayoutGrid,
|
||||
Palette,
|
||||
PlugZap,
|
||||
Shield,
|
||||
Tags,
|
||||
User,
|
||||
UsersRound,
|
||||
type LucideIcon,
|
||||
} from 'lucide-react';
|
||||
|
||||
/**
|
||||
* Settings information architecture for the redesigned page.
|
||||
*
|
||||
* The flat tab strip became a grouped left rail with a new Overview
|
||||
* landing. The URL query param stays `?tab=` (deep-linkable, and it
|
||||
* keeps the existing links in sidebar.tsx / header.tsx working) — we
|
||||
* just map the old values onto the new sections.
|
||||
*/
|
||||
export const SETTINGS_SECTIONS = [
|
||||
'overview',
|
||||
'profile',
|
||||
'security',
|
||||
'appearance',
|
||||
'whatsapp',
|
||||
'templates',
|
||||
'fields',
|
||||
'deals',
|
||||
'members',
|
||||
'api',
|
||||
] as const;
|
||||
|
||||
export type SettingsSection = (typeof SETTINGS_SECTIONS)[number];
|
||||
|
||||
export const DEFAULT_SECTION: SettingsSection = 'overview';
|
||||
|
||||
/** Rail grouping. `adminOnly` items are hidden for non-admins. */
|
||||
export interface SectionMeta {
|
||||
id: SettingsSection;
|
||||
label: string;
|
||||
icon: LucideIcon;
|
||||
group: 'top' | 'account' | 'workspace';
|
||||
}
|
||||
|
||||
export const SECTION_META: Record<SettingsSection, SectionMeta> = {
|
||||
overview: { id: 'overview', label: 'Overview', icon: LayoutGrid, group: 'top' },
|
||||
profile: { id: 'profile', label: 'Your profile', icon: User, group: 'account' },
|
||||
security: { id: 'security', label: 'Login & security', icon: Shield, group: 'account' },
|
||||
appearance: { id: 'appearance', label: 'Appearance', icon: Palette, group: 'account' },
|
||||
whatsapp: { id: 'whatsapp', label: 'WhatsApp', icon: PlugZap, group: 'workspace' },
|
||||
templates: { id: 'templates', label: 'Templates', icon: FileText, group: 'workspace' },
|
||||
fields: { id: 'fields', label: 'Fields & tags', icon: Tags, group: 'workspace' },
|
||||
deals: { id: 'deals', label: 'Deals & currency', icon: Coins, group: 'workspace' },
|
||||
members: { id: 'members', label: 'Team members', icon: UsersRound, group: 'workspace' },
|
||||
api: { id: 'api', label: 'API keys', icon: KeyRound, group: 'workspace' },
|
||||
};
|
||||
|
||||
export const RAIL_GROUPS: { label: string | null; group: SectionMeta['group'] }[] = [
|
||||
{ label: null, group: 'top' },
|
||||
{ label: 'Account', group: 'account' },
|
||||
{ label: 'Workspace', group: 'workspace' },
|
||||
];
|
||||
|
||||
function isSection(value: string | null): value is SettingsSection {
|
||||
return !!value && (SETTINGS_SECTIONS as readonly string[]).includes(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve a raw `?tab=` value to a section. Legacy tabs from the old
|
||||
* flat layout collapse onto their new home (Tags + Custom fields → the
|
||||
* merged "Fields & tags" section). Anything unknown falls back to the
|
||||
* Overview landing.
|
||||
*/
|
||||
export function resolveSection(raw: string | null): SettingsSection {
|
||||
if (raw === 'tags' || raw === 'custom-fields') return 'fields';
|
||||
if (isSection(raw)) return raw;
|
||||
return DEFAULT_SECTION;
|
||||
}
|
||||
Reference in New Issue
Block a user