'use client'; import React from 'react'; import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; import {faArrowLeft, faEdit, faPlus, faSave, faShare, faTrash, faTimes} from '@fortawesome/free-solid-svg-icons'; import {IconDefinition} from '@fortawesome/fontawesome-svg-core'; import {useTranslations} from 'next-intl'; import {ViewMode} from '@/shared/interface'; interface ActionButton { icon: IconDefinition; onClick: () => void; title?: string; variant?: 'primary' | 'danger' | 'secondary' | 'blue'; } interface SidebarHeaderProps { title: string; defaultTitle: string; viewMode: ViewMode; isNew: boolean; onBack: () => void; onEdit?: () => void; onSave?: () => void; onCancel?: () => void; onDelete?: () => void; onExport?: () => void; showExport?: boolean; showDelete?: boolean; } /** * ToolDetailHeader - Header pour les composants Editor (ComposerRightBar) et Settings Detail/Edit * Comportement par mode: * - list: Retourne null (pas de header) * - detail: Boutons Back, Edit, Delete, Export (si applicable) * - edit: Boutons Cancel, Save/Create */ export default function ToolDetailHeader({ title, defaultTitle, viewMode, isNew, onBack, onEdit, onSave, onCancel, onDelete, onExport, showExport = false, showDelete = true, }: SidebarHeaderProps): React.JSX.Element | null { const t = useTranslations(); if (viewMode === 'list') { return null; } function getVariantClasses(variant: 'primary' | 'danger' | 'secondary' | 'blue'): string { switch (variant) { case 'primary': return 'bg-primary/10 hover:bg-primary/20 border-primary/30'; case 'danger': return 'bg-error/10 hover:bg-error/20 border-error/30'; case 'blue': return 'bg-blue-500/10 hover:bg-blue-500/20 border-blue-500/30'; case 'secondary': default: return 'bg-secondary/50 hover:bg-secondary border-secondary/50 hover:border-secondary'; } } function getIconColorClass(variant: 'primary' | 'danger' | 'secondary' | 'blue'): string { switch (variant) { case 'primary': return 'text-primary'; case 'danger': return 'text-error'; case 'blue': return 'text-blue-500'; case 'secondary': default: return 'text-text-primary'; } } function renderActionButton(button: ActionButton, index: number): React.JSX.Element { const variant = button.variant || 'secondary'; return ( ); } function getActionButtons(): ActionButton[] { const buttons: ActionButton[] = []; if (viewMode === 'detail') { if (showExport && onExport) { buttons.push({ icon: faShare, onClick: onExport, title: t('common.exportToSeries'), variant: 'blue', }); } if (showDelete && onDelete) { buttons.push({ icon: faTrash, onClick: onDelete, title: t('common.delete'), variant: 'danger', }); } if (onEdit) { buttons.push({ icon: faEdit, onClick: onEdit, title: t('common.edit'), variant: 'primary', }); } } else if (viewMode === 'edit') { if (onCancel) { buttons.push({ icon: faTimes, onClick: onCancel, title: t('common.cancel'), variant: 'danger', }); } if (onSave) { buttons.push({ icon: isNew ? faPlus : faSave, onClick: onSave, title: isNew ? t('common.create') : t('common.save'), variant: 'primary', }); } } return buttons; } return (
{title || defaultTitle}
{getActionButtons().map(renderActionButton)}
); }