import type { Meta, StoryObj } from '@storybook/nextjs-vite'; import { useState } from 'react'; import { Monitor } from 'lucide-react'; import { TicketInfoSection } from '../components/ui/ticket-info-section'; const meta = { title: 'Tickets/TicketInfoSection', component: TicketInfoSection, parameters: { layout: 'padded', docs: { description: { component: 'Collapsible ticket info bar showing organization, user, device, status, and expanded details including description, attachments, tags, knowledge base articles, and notes.', }, }, }, tags: ['autodocs'], decorators: [ (Story) => (
), ], } satisfies Meta; export default meta; type Story = StoryObj; const mockNotes = [ { id: '1', text: 'Started immediate cleanup. Cleared 8GB from temp files and IIS logs. Current disk usage at 91%.', authorName: 'Marcus Chen', createdAt: '2025/08/27 14:45', isOwn: true, }, { id: '2', text: 'Found 12GB of old .pst files in user profiles. Moving to archive storage. Disk now at 85%.', authorName: 'Marcus Chen', createdAt: '2025/08/27 15:20', isOwn: true, }, { id: '3', text: 'Reviewed backup agent logs. Recommend reducing retention to 14 days for this server.', authorName: 'Sarah Kim', createdAt: '2025/08/27 16:30', isOwn: false, }, ]; const mockAttachments = [ { id: '1', fileName: 'acme-logo.png', fileSize: '5.6 MB', thumbnailSrc: undefined, onDownload: () => {} }, { id: '2', fileName: 'acme-logo.svg', fileSize: '5.6 MB', onDownload: () => {} }, { id: '3', fileName: 'acme-teaser.mp4', fileSize: '5.6 MB', onDownload: () => {} }, ]; /** * Collapsed state — default view. */ export const Collapsed: Story = { args: { organization: { name: 'Acme Corp' }, user: 'Unassigned', device: { name: 'WIN-SERVER-01', icon: }, status: 'TECH_REQUIRED', expanded: false, }, }; /** * Expanded state with all sections populated. */ export const Expanded: Story = { args: { organization: { name: 'Acme Corp' }, user: 'Unassigned', device: { name: 'WIN-SERVER-01', icon: }, status: 'TECH_REQUIRED', expanded: true, assigned: { currentAssignee: { id: 'u1', name: 'Roman Smith' }, options: [ { value: 'u1', label: 'Roman Smith' }, { value: 'u2', label: 'John Doe' }, ], onAssign: (userId) => alert(`Assign: ${userId}`), }, createdAt: '2025/07/12, 22:27', description: 'Goal: Reduce new client onboarding from 4 weeks to 10 days while maintaining 95% satisfaction.\n\nCore Activities:\n- Platform setup and configuration\n- Data migration and SSO integration\n- Team training and certification\n- Go-live support', attachments: mockAttachments, tags: ['Client-onboarding', 'Process-management', 'Project-template'], notes: mockNotes, onAddNote: () => {}, onEditNote: () => {}, onDeleteNote: () => {}, }, }; /** * Interactive expand/collapse. */ export const Interactive: Story = { args: { organization: { name: 'Acme Corp' }, user: 'John Doe', device: { name: 'LINUX-WEB-02', icon: , onClick: () => alert('Navigate to device') }, status: 'ACTIVE', }, render: function InteractiveStory(args) { const [expanded, setExpanded] = useState(false); return ( setExpanded(prev => !prev)} assigned={{ currentAssignee: { id: 'u1', name: 'Roman Smith' }, options: [ { value: 'u1', label: 'Roman Smith' }, { value: 'u2', label: 'John Doe' }, ], onAssign: (userId) => alert(`Assign: ${userId}`), }} createdAt="2025/07/12, 22:27" description="This is a sample ticket description with **markdown** content." attachments={mockAttachments} tags={['Linux', 'Production', 'High-Risk']} notes={mockNotes} onAddNote={(text) => alert(`Add note: ${text}`)} onEditNote={(id) => alert(`Edit note: ${id}`)} onDeleteNote={(id) => alert(`Delete note: ${id}`)} /> ); }, }; /** * Minimal — no expanded data, just the header row. */ export const Minimal: Story = { args: { organization: { name: 'Unassigned' }, user: 'Unassigned', device: { name: 'Unassigned' }, status: 'ACTIVE', expanded: true, assigned: { options: [ { value: 'u1', label: 'Roman Smith' }, { value: 'u2', label: 'John Doe' }, ], onAssign: (userId) => alert(`Assign: ${userId}`), }, createdAt: '2025/01/01, 00:00', }, };