@iclips/ui 2.0.2 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MIGRATION-v3.md +244 -0
- package/README.md +1 -1
- package/dist/alert-theme.css +20 -79
- package/dist/components/ui/charts/donut-chart.cjs +1 -1
- package/dist/components/ui/charts/donut-chart.cjs.map +1 -1
- package/dist/components/ui/charts/donut-chart.js +39 -60
- package/dist/components/ui/charts/donut-chart.js.map +1 -1
- package/dist/components/ui/charts/kpi-card.cjs +1 -1
- package/dist/components/ui/charts/kpi-card.cjs.map +1 -1
- package/dist/components/ui/charts/kpi-card.js +19 -19
- package/dist/components/ui/charts/kpi-card.js.map +1 -1
- package/dist/components/ui/data/comment-system.cjs +1 -1
- package/dist/components/ui/data/comment-system.cjs.map +1 -1
- package/dist/components/ui/data/comment-system.js +67 -67
- package/dist/components/ui/data/comment-system.js.map +1 -1
- package/dist/components/ui/data/data-table.cjs +1 -1
- package/dist/components/ui/data/data-table.cjs.map +1 -1
- package/dist/components/ui/data/data-table.js +112 -101
- package/dist/components/ui/data/data-table.js.map +1 -1
- package/dist/components/ui/data/editorial-calendar.cjs +1 -1
- package/dist/components/ui/data/editorial-calendar.cjs.map +1 -1
- package/dist/components/ui/data/editorial-calendar.js +291 -291
- package/dist/components/ui/data/editorial-calendar.js.map +1 -1
- package/dist/components/ui/data/filter-builder.cjs +1 -1
- package/dist/components/ui/data/filter-builder.cjs.map +1 -1
- package/dist/components/ui/data/filter-builder.js +1 -1
- package/dist/components/ui/data/filter-builder.js.map +1 -1
- package/dist/components/ui/feedback/empty-state.cjs +1 -1
- package/dist/components/ui/feedback/empty-state.cjs.map +1 -1
- package/dist/components/ui/feedback/empty-state.js +14 -14
- package/dist/components/ui/feedback/empty-state.js.map +1 -1
- package/dist/components/ui/feedback/toast.cjs +1 -1
- package/dist/components/ui/feedback/toast.cjs.map +1 -1
- package/dist/components/ui/feedback/toast.js +53 -22
- package/dist/components/ui/feedback/toast.js.map +1 -1
- package/dist/components/ui/forms/calendar.cjs +1 -1
- package/dist/components/ui/forms/calendar.cjs.map +1 -1
- package/dist/components/ui/forms/calendar.js +16 -16
- package/dist/components/ui/forms/calendar.js.map +1 -1
- package/dist/components/ui/forms/combobox.cjs +1 -1
- package/dist/components/ui/forms/combobox.cjs.map +1 -1
- package/dist/components/ui/forms/combobox.js +78 -76
- package/dist/components/ui/forms/combobox.js.map +1 -1
- package/dist/components/ui/forms/file-attachment-list.cjs +1 -1
- package/dist/components/ui/forms/file-attachment-list.cjs.map +1 -1
- package/dist/components/ui/forms/file-attachment-list.js +4 -4
- package/dist/components/ui/forms/file-attachment-list.js.map +1 -1
- package/dist/components/ui/forms/file-upload-zone.cjs +2 -2
- package/dist/components/ui/forms/file-upload-zone.cjs.map +1 -1
- package/dist/components/ui/forms/file-upload-zone.js +55 -49
- package/dist/components/ui/forms/file-upload-zone.js.map +1 -1
- package/dist/components/ui/forms/form.cjs +1 -1
- package/dist/components/ui/forms/form.cjs.map +1 -1
- package/dist/components/ui/forms/form.js +11 -11
- package/dist/components/ui/forms/form.js.map +1 -1
- package/dist/components/ui/forms/input-validation.cjs +1 -1
- package/dist/components/ui/forms/input-validation.cjs.map +1 -1
- package/dist/components/ui/forms/input-validation.js +20 -20
- package/dist/components/ui/forms/input-validation.js.map +1 -1
- package/dist/components/ui/forms/multi-select.cjs +1 -1
- package/dist/components/ui/forms/multi-select.cjs.map +1 -1
- package/dist/components/ui/forms/multi-select.js +69 -67
- package/dist/components/ui/forms/multi-select.js.map +1 -1
- package/dist/components/ui/forms/radio-group.cjs +1 -1
- package/dist/components/ui/forms/radio-group.cjs.map +1 -1
- package/dist/components/ui/forms/radio-group.js +19 -19
- package/dist/components/ui/forms/radio-group.js.map +1 -1
- package/dist/components/ui/forms/social-button.cjs +1 -1
- package/dist/components/ui/forms/social-button.cjs.map +1 -1
- package/dist/components/ui/forms/social-button.js +6 -6
- package/dist/components/ui/forms/social-button.js.map +1 -1
- package/dist/components/ui/forms/toggle.cjs +1 -1
- package/dist/components/ui/forms/toggle.cjs.map +1 -1
- package/dist/components/ui/forms/toggle.js +7 -7
- package/dist/components/ui/forms/toggle.js.map +1 -1
- package/dist/components/ui/navigation/navigation-menu.cjs +1 -1
- package/dist/components/ui/navigation/navigation-menu.cjs.map +1 -1
- package/dist/components/ui/navigation/navigation-menu.js +14 -14
- package/dist/components/ui/navigation/navigation-menu.js.map +1 -1
- package/dist/components/ui/navigation/sidebar.cjs +1 -1
- package/dist/components/ui/navigation/sidebar.cjs.map +1 -1
- package/dist/components/ui/navigation/sidebar.js +44 -44
- package/dist/components/ui/navigation/sidebar.js.map +1 -1
- package/dist/components/ui/overlays/context-menu.cjs +1 -1
- package/dist/components/ui/overlays/context-menu.cjs.map +1 -1
- package/dist/components/ui/overlays/context-menu.js +1 -1
- package/dist/components/ui/overlays/context-menu.js.map +1 -1
- package/dist/components/ui/overlays/dropdown-menu.cjs +1 -1
- package/dist/components/ui/overlays/dropdown-menu.cjs.map +1 -1
- package/dist/components/ui/overlays/dropdown-menu.js +5 -5
- package/dist/components/ui/overlays/dropdown-menu.js.map +1 -1
- package/dist/components/ui/overlays/menubar.cjs +1 -1
- package/dist/components/ui/overlays/menubar.cjs.map +1 -1
- package/dist/components/ui/overlays/menubar.js +29 -29
- package/dist/components/ui/overlays/menubar.js.map +1 -1
- package/dist/components/ui/overlays/tooltip.cjs +1 -1
- package/dist/components/ui/overlays/tooltip.cjs.map +1 -1
- package/dist/components/ui/overlays/tooltip.js +12 -12
- package/dist/components/ui/overlays/tooltip.js.map +1 -1
- package/dist/components/ui/primitives/avatar.cjs +1 -1
- package/dist/components/ui/primitives/avatar.cjs.map +1 -1
- package/dist/components/ui/primitives/avatar.js +20 -27
- package/dist/components/ui/primitives/avatar.js.map +1 -1
- package/dist/components/ui/primitives/badge.cjs +1 -1
- package/dist/components/ui/primitives/badge.cjs.map +1 -1
- package/dist/components/ui/primitives/badge.js +13 -13
- package/dist/components/ui/primitives/badge.js.map +1 -1
- package/dist/components/ui/primitives/button.cjs +1 -1
- package/dist/components/ui/primitives/button.cjs.map +1 -1
- package/dist/components/ui/primitives/button.js +11 -8
- package/dist/components/ui/primitives/button.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +34 -35
- package/dist/index.js.map +1 -1
- package/dist/preset.css +1 -2
- package/dist/toast-theme.css +100 -64
- package/dist/tokens.css +59 -159
- package/package.json +5 -3
- package/scripts/check-colors.mjs +208 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editorial-calendar.js","sources":["../../../../src/components/ui/data/editorial-calendar.tsx"],"sourcesContent":["import React, { useState, useMemo } from \"react\";\nimport { \n format, \n addMonths, \n subMonths, \n startOfMonth, \n endOfMonth, \n startOfWeek, \n endOfWeek, \n eachDayOfInterval, \n isSameMonth, \n isSameDay, \n isToday,\n addDays,\n setHours,\n getHours,\n getMinutes,\n differenceInMinutes,\n addHours,\n} from \"date-fns\";\nimport { \n ChevronLeft, \n ChevronRight, \n Plus, \n GripVertical,\n Instagram,\n Linkedin,\n Facebook,\n Twitter,\n Youtube,\n Calendar as CalendarIcon,\n Clock,\n PanelLeftClose,\n PanelLeftOpen,\n\n} from \"lucide-react\";\nimport { cn } from \"../utils\";\nimport { Button } from \"../primitives/button\";\nimport { Avatar, AvatarImage, AvatarFallback } from \"../primitives/avatar\";\nimport { Badge } from \"../primitives/badge\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../overlays/dialog\";\nimport { ToggleGroup, ToggleGroupItem } from \"../forms/toggle-group\";\nimport { ScrollArea } from \"../layout/scroll-area\";\nimport { DndProvider, useDrag, useDrop } from \"react-dnd\";\nimport { HTML5Backend } from \"react-dnd-html5-backend\";\n\n// --- Tipos ---\n\nexport type SocialChannel = \"instagram\" | \"linkedin\" | \"facebook\" | \"twitter\" | \"youtube\" | \"blog\" | \"other\";\nexport type TaskStatus = \"idea\" | \"planned\" | \"in-progress\" | \"approval\" | \"scheduled\" | \"published\";\nexport type CalendarMode = \"editorial\" | \"execution\";\n\nexport interface CalendarTask {\n id: string;\n title: string;\n date?: Date | string; // Data de início\n endDate?: Date | string; // Data de término (opcional)\n channel?: SocialChannel;\n status: TaskStatus;\n imageUrl?: string;\n description?: string;\n assignees?: {\n name: string;\n avatar?: string;\n }[];\n color?: string; // Cor customizada opcional\n}\n\ninterface BaseCalendarProps {\n tasks: CalendarTask[];\n onTaskUpdate: (updatedTask: CalendarTask) => void;\n onTaskCreate?: (newTask: Partial<CalendarTask>) => void;\n className?: string;\n}\n\ntype CalendarView = \"month\" | \"week\" | \"day\";\n\n/** Props compartilhadas pelas views de topo (recebem o grid inteiro de dias). */\ninterface CalendarViewProps {\n days: Date[];\n tasks: CalendarTask[];\n onDropTask: (taskId: string, date: Date) => void;\n onTaskClick: (task: CalendarTask) => void;\n onAddClick: (date?: Date) => void;\n}\n\n/** Props compartilhadas pelas colunas/células internas (já recebem um único dia). */\ninterface CalendarColumnProps {\n tasks: CalendarTask[];\n onDropTask: (taskId: string, date: Date) => void;\n onTaskClick: (task: CalendarTask) => void;\n onAddClick: (date: Date) => void;\n}\n\n// --- Constantes e Auxiliares ---\n\nconst ItemTypes = {\n TASK: 'task',\n};\n\nconst ChannelIcons: Record<SocialChannel, React.ElementType> = {\n instagram: Instagram,\n linkedin: Linkedin,\n facebook: Facebook,\n twitter: Twitter,\n youtube: Youtube,\n blog: CalendarIcon,\n other: CalendarIcon,\n};\n\n// Ícones de canal são monocromáticos — a forma do ícone carrega a identidade,\n// a cor fica no token neutro. Se o time quiser cores por canal no futuro, a\n// paleta de marca de terceiros entra como tokens `--brand-*` em tokens.css.\n\nconst StatusColors: Record<TaskStatus, string> = {\n idea: \"bg-muted text-muted-foreground border-border\",\n planned: \"bg-info/10 text-info-emphasis border-info/20\",\n \"in-progress\": \"bg-warning/10 text-warning-emphasis border-warning/20\",\n approval: \"bg-accent text-accent-foreground border-border\",\n scheduled: \"bg-success/10 text-success-emphasis border-success/20\",\n published: \"bg-foreground text-background border-foreground\",\n};\n\n// Rotating chart tokens for Execution mode cards (flip in dark mode)\nconst PastelColors = [\n \"bg-chart-2/15 border-chart-2/30 text-chart-2\",\n \"bg-chart-3/15 border-chart-3/30 text-chart-3\",\n \"bg-chart-1/15 border-chart-1/30 text-chart-1\",\n \"bg-chart-4/15 border-chart-4/30 text-chart-4\",\n \"bg-chart-5/15 border-chart-5/30 text-chart-5\",\n \"bg-chart-8/15 border-chart-8/30 text-chart-8\",\n];\n\nconst getRandomColor = (id: string) => {\n const index = id.split(\"\").reduce((acc, char) => acc + char.charCodeAt(0), 0);\n return PastelColors[index % PastelColors.length];\n};\n\n// --- Draggable Card Component ---\n\nfunction DraggableTaskCard({ \n task, \n view = \"month\", \n mode = \"editorial\",\n onClick, \n style \n}: { \n task: CalendarTask; \n view?: \"month\" | \"week\" | \"day\" | \"4day\" | \"backlog\" | \"list\"; \n mode?: CalendarMode;\n onClick: () => void;\n style?: React.CSSProperties;\n}) {\n const [{ isDragging }, drag] = useDrag(() => ({\n type: ItemTypes.TASK,\n item: { id: task.id, type: ItemTypes.TASK },\n collect: (monitor) => ({\n isDragging: !!monitor.isDragging(),\n }),\n }), [task.id]);\n\n const ChannelIcon = task.channel ? ChannelIcons[task.channel] : CalendarIcon;\n \n const startDate = task.date ? new Date(task.date) : null;\n const endDate = task.endDate ? new Date(task.endDate) : (startDate ? addHours(startDate, 1) : null);\n \n const timeString = startDate ? format(startDate, \"HH:mm\") : null;\n const durationString = startDate && endDate \n ? `${format(startDate, \"HH:mm\")} - ${format(endDate, \"HH:mm\")}`\n : timeString;\n\n // ---- STYLES ----\n \n // 1. EDITORIAL - WEEK / DAY (Feed Style)\n if (mode === \"editorial\" && (view === \"week\" || view === \"day\")) {\n return (\n <div\n ref={drag as unknown as React.Ref<HTMLDivElement>}\n onClick={onClick}\n className={cn(\n \"relative group cursor-pointer bg-card border rounded-md shadow-sm hover:shadow-md transition-all mb-3 overflow-hidden\",\n isDragging ? \"opacity-50\" : \"opacity-100\",\n task.status === \"published\" ? \"border-l-2 border-l-foreground\" : \"border-l-2 border-l-primary\"\n )}\n >\n {/* Header: Time & Channel */}\n <div className=\"flex items-center justify-between px-3 py-2 border-b bg-muted/50\">\n <div className=\"flex items-center gap-2\">\n <ChannelIcon size={14} className=\"text-muted-foreground\" />\n {timeString && <span className=\"text-xs font-medium text-muted-foreground\">{timeString}</span>}\n </div>\n <div className=\"opacity-0 group-hover:opacity-100 text-muted-foreground cursor-grab\">\n <GripVertical size={14} />\n </div>\n </div>\n\n {/* Image (Large) */}\n {task.imageUrl && (\n <div className=\"w-full aspect-video bg-muted relative border-b\">\n <img src={task.imageUrl} alt=\"\" className=\"w-full h-full object-cover\" />\n </div>\n )}\n\n {/* Content */}\n <div className=\"p-3\">\n <h4 className=\"text-sm font-medium text-foreground line-clamp-2 mb-2 leading-snug\">\n {task.title}\n </h4>\n <div className=\"flex items-center justify-between\">\n <Badge variant=\"outline\" className={cn(\"px-1.5 py-0 text-[10px] h-5 font-normal uppercase tracking-wide\", StatusColors[task.status])}>\n {task.status}\n </Badge>\n {task.assignees && task.assignees.length > 0 && (\n <div className=\"flex -space-x-2\">\n {task.assignees.slice(0,2).map((a, i) => (\n <Avatar key={i} className=\"w-5 h-5 border border-background\">\n <AvatarImage src={a.avatar} />\n <AvatarFallback className=\"text-[8px]\">{a.name[0]}</AvatarFallback>\n </Avatar>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n }\n\n // 2. EDITORIAL - MONTH (Compact Grid)\n if (mode === \"editorial\" && view === \"month\") {\n return (\n <div\n ref={drag as unknown as React.Ref<HTMLDivElement>}\n onClick={onClick}\n className={cn(\n \"relative group cursor-pointer bg-card border rounded-md shadow-sm hover:shadow-md transition-all mb-1 overflow-hidden flex items-center gap-2 p-1.5\",\n isDragging ? \"opacity-50\" : \"opacity-100\",\n task.status === \"published\" ? \"border-l-2 border-l-foreground\" : \"border-l-2 border-l-primary\"\n )}\n >\n {task.imageUrl && (\n <div className=\"w-8 h-8 flex-shrink-0 bg-muted rounded overflow-hidden\">\n <img src={task.imageUrl} alt=\"\" className=\"w-full h-full object-cover\" />\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-1.5\">\n <ChannelIcon size={12} className=\"text-muted-foreground\" />\n <span className=\"truncate font-medium text-xs\">{task.title}</span>\n </div>\n </div>\n </div>\n );\n }\n\n // 3. EXECUTION - TIMELINE (Week / Day)\n if (mode === \"execution\" && (view === \"week\" || view === \"day\")) {\n return (\n <div\n ref={drag as unknown as React.Ref<HTMLDivElement>}\n onClick={onClick}\n style={style}\n className={cn(\n \"absolute z-10 rounded-md border shadow-sm p-1.5 text-xs flex flex-col overflow-hidden hover:overflow-visible hover:h-auto! hover:min-h-[min-content] hover:z-50 transition-all cursor-pointer group\",\n isDragging ? \"opacity-50\" : \"opacity-100\",\n task.color || getRandomColor(task.id)\n )}\n >\n <div className=\"flex items-center gap-1 mb-0.5 font-semibold opacity-75 text-[10px] leading-none\">\n <Clock size={10} />\n <span className=\"truncate\">{durationString}</span>\n </div>\n \n <div className=\"font-bold leading-tight mb-1 line-clamp-2 text-[11px]\">{task.title}</div>\n \n <div className=\"mt-auto flex items-center justify-between pt-1\">\n <div className=\"flex -space-x-1.5\">\n {task.assignees?.map((a, i) => (\n <Avatar key={i} className=\"w-4 h-4 border border-background\">\n <AvatarImage src={a.avatar} />\n <AvatarFallback className=\"text-[8px]\">{a.name[0]}</AvatarFallback>\n </Avatar>\n ))}\n </div>\n {task.status !== 'published' && (\n <div className={cn(\"w-2 h-2 rounded-full\", StatusColors[task.status].split(\" \")[1].replace(\"text-\", \"bg-\"))} />\n )}\n </div>\n </div>\n );\n }\n \n // 4. EXECUTION - MONTH\n if (mode === \"execution\" && view === \"month\") {\n return (\n <div\n ref={drag as unknown as React.Ref<HTMLDivElement>}\n onClick={onClick}\n className={cn(\n \"relative group cursor-pointer rounded px-2 py-1 mb-1 text-xs truncate font-medium transition-all\",\n isDragging ? \"opacity-50\" : \"opacity-100\",\n task.color || getRandomColor(task.id).replace(\"bg-\", \"bg-opacity-20 bg-\") // lighter background\n )}\n >\n {timeString} {task.title}\n </div>\n );\n }\n\n // 5. BACKLOG (Generic)\n return (\n <div\n ref={drag as unknown as React.Ref<HTMLDivElement>}\n onClick={onClick}\n className={cn(\n \"relative group cursor-pointer bg-card border rounded-md shadow-sm hover:shadow-md transition-all mb-2 p-2 flex items-start gap-3\",\n isDragging ? \"opacity-50\" : \"opacity-100\",\n mode === 'editorial' && (task.status === \"published\" ? \"border-l-2 border-l-foreground\" : \"border-l-2 border-l-primary\")\n )}\n >\n {mode === 'editorial' && task.imageUrl && (\n <div className=\"w-10 h-10 flex-shrink-0 bg-muted rounded overflow-hidden\">\n <img src={task.imageUrl} alt=\"\" className=\"w-full h-full object-cover\" />\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-1.5 mb-1\">\n {mode === 'editorial' && <ChannelIcon size={12} className=\"text-muted-foreground\" />}\n <span className=\"truncate font-medium text-sm\">{task.title}</span>\n </div>\n <Badge variant=\"secondary\" className=\"text-[10px] h-4 px-1 py-0\">{task.status}</Badge>\n </div>\n </div>\n );\n}\n\n// --- Layout Views ---\n\n// 1. EDITORIAL WEEK/DAY VIEW (Columnar, NOT Timeline)\nfunction EditorialColumnView({\n days,\n tasks,\n onDropTask,\n onTaskClick,\n onAddClick,\n view\n}: CalendarViewProps & { view: CalendarView }) {\n return (\n <div className={cn(\n \"grid h-full min-h-[calc(100vh-200px)] bg-muted/30\",\n view === 'week' ? \"grid-cols-7 divide-x\" : \"grid-cols-1 border-x\"\n )}>\n {days.map((day: Date) => {\n const dayTasks = tasks\n .filter((t: CalendarTask) => t.date && isSameDay(new Date(t.date), day))\n .sort((a: CalendarTask, b: CalendarTask) => {\n // Sort by time if available\n if (a.date && b.date) {\n return new Date(a.date).getTime() - new Date(b.date).getTime();\n }\n return 0;\n });\n\n return (\n <EditorialColumn \n key={day.toISOString()}\n day={day}\n tasks={dayTasks}\n onDropTask={onDropTask}\n onTaskClick={onTaskClick}\n onAddClick={onAddClick}\n isToday={isToday(day)}\n />\n )\n })}\n </div>\n );\n}\n\nfunction EditorialColumn({ day, tasks, onDropTask, onTaskClick, onAddClick, isToday }: CalendarColumnProps & { day: Date; isToday: boolean }) {\n const [{ isOver }, drop] = useDrop(() => ({\n accept: ItemTypes.TASK,\n drop: (item: { id: string }) => onDropTask(item.id, day),\n collect: (monitor) => ({\n isOver: !!monitor.isOver(),\n }),\n }), [day, onDropTask]);\n\n return (\n <div \n ref={drop as unknown as React.Ref<HTMLDivElement>}\n className={cn(\n \"flex flex-col h-full min-h-0 transition-colors\",\n isOver && \"bg-accent ring-inset ring-2 ring-ring\"\n )}\n >\n {/* Sticky Header */}\n <div className={cn(\n \"p-2 text-center border-b bg-card sticky top-0 z-10\",\n isToday && \"bg-accent/50\"\n )}>\n <div className=\"text-xs font-semibold uppercase text-muted-foreground mb-1\">{format(day, 'EEE')}</div>\n <div className={cn(\n \"w-8 h-8 rounded-full flex items-center justify-center mx-auto text-sm font-medium\",\n isToday ? \"bg-primary text-primary-foreground\" : \"text-foreground bg-muted\"\n )}>\n {format(day, 'd')}\n </div>\n </div>\n\n {/* Scrollable Content */}\n <div className=\"flex-1 p-2 space-y-3 overflow-y-auto\">\n <Button \n variant=\"outline\" \n size=\"sm\" \n className=\"w-full mb-2 justify-center px-1\"\n onClick={() => onAddClick(day)}\n >\n <Plus size={12} className=\"flex-shrink-0\" /> \n <span className=\"truncate ml-1.5 hidden xl:inline\">Add Post</span>\n <span className=\"truncate ml-1.5 inline xl:hidden\">Add</span>\n </Button>\n\n {tasks.map((task: CalendarTask) => (\n <DraggableTaskCard \n key={task.id}\n task={task}\n view=\"week\" // Triggers the Editorial Feed Card style\n mode=\"editorial\"\n onClick={() => onTaskClick(task)}\n />\n ))}\n </div>\n </div>\n );\n}\n\n// 2. EXECUTION TIMELINE VIEW (Gantt/Agenda Style)\nfunction ExecutionTimelineView({ \n days,\n tasks, \n onDropTask, \n onTaskClick, \n onAddClick\n}: { \n days: Date[];\n tasks: CalendarTask[]; \n onDropTask: (taskId: string, date: Date) => void; \n onTaskClick: (task: CalendarTask) => void;\n onAddClick: (date: Date) => void;\n}) {\n \n const HOURS = Array.from({ length: 24 }, (_, i) => i);\n\n return (\n <div className=\"flex h-full relative overflow-y-auto bg-card select-none\">\n {/* Time Axis */}\n <div className=\"w-14 flex-shrink-0 border-r bg-card sticky left-0 z-30\">\n <div className=\"h-10 border-b bg-card sticky top-0 z-40 flex-shrink-0\" /> {/* Fixed height header match */}\n {HOURS.map(hour => (\n <div key={hour} className=\"h-24 border-b text-right pr-2 pt-2 text-xs text-muted-foreground font-medium relative\">\n <span className=\"-top-2.5 relative\">{format(setHours(new Date(), hour), \"ha\")}</span>\n </div>\n ))}\n </div>\n\n {/* Columns Container */}\n <div className=\"flex flex-1 min-w-0 relative\">\n {days.map((day, dayIndex) => {\n const dayTasks = tasks.filter(t => t.date && isSameDay(new Date(t.date), day));\n \n return (\n <ExecutionTimelineColumn \n key={day.toISOString()}\n day={day}\n tasks={dayTasks}\n onDropTask={onDropTask}\n onTaskClick={onTaskClick}\n onAddClick={onAddClick}\n isLast={dayIndex === days.length - 1}\n HOURS={HOURS}\n />\n );\n })}\n \n {/* Horizontal Grid Lines (Background) */}\n <div className=\"absolute inset-0 pointer-events-none z-0\">\n <div className=\"h-10 border-b bg-transparent\" /> {/* Header Spacer in grid */}\n {HOURS.map(hour => (\n <div key={hour} className=\"h-24 border-b border-dashed border-border w-full\" />\n ))}\n </div>\n </div>\n </div>\n );\n}\n\nfunction ExecutionTimelineColumn({\n day,\n tasks,\n onDropTask,\n onTaskClick,\n onAddClick,\n isLast,\n HOURS\n}: CalendarColumnProps & { day: Date; isLast: boolean; HOURS: number[] }) {\n const [{ isOver }, drop] = useDrop(() => ({\n accept: ItemTypes.TASK,\n drop: (item: { id: string }) => {\n onDropTask(item.id, day);\n },\n collect: (monitor) => ({\n isOver: !!monitor.isOver(),\n }),\n }), [day, onDropTask]);\n\n return (\n <div \n ref={drop as unknown as React.Ref<HTMLDivElement>}\n className={cn(\n \"flex-1 relative min-w-[150px]\", \n !isLast && \"border-r\",\n isOver && \"bg-accent/50\"\n )}\n >\n {/* Header (Only for timeline view within scroll area) */}\n <div className=\"sticky top-0 z-20 bg-card border-b h-10 flex items-center justify-center shadow-sm\">\n <div className=\"text-xs font-bold text-muted-foreground\">{format(day, 'EEE')} <span className={cn(\"ml-1\", isToday(day) && \"text-primary\")}>{format(day, 'd')}</span></div>\n </div>\n\n {/* Clickable areas for adding tasks */}\n {HOURS.map((hour: number) => (\n <div \n key={hour} \n className=\"h-24 w-full absolute hover:bg-muted/50 transition-colors cursor-pointer z-10\"\n style={{ top: `${hour * 96 + 40}px` }} \n onClick={(e) => {\n e.stopPropagation();\n const d = new Date(day);\n d.setHours(hour, 0);\n onAddClick(d);\n }}\n />\n ))}\n\n {/* Render Tasks */}\n {tasks.map((task: CalendarTask) => {\n const taskStart = task.date ? new Date(task.date) : new Date();\n const taskEnd = task.endDate ? new Date(task.endDate) : addHours(taskStart, 1);\n \n const startHour = getHours(taskStart);\n const startMin = getMinutes(taskStart);\n \n // Calculate duration in minutes for height\n let durationMins = differenceInMinutes(taskEnd, taskStart);\n if (durationMins < 30) durationMins = 30; // Min height\n\n const topPosition = (startHour * 96) + ((startMin / 60) * 96) + 40; // +40 for header offset\n const height = (durationMins / 60) * 96;\n\n return (\n <DraggableTaskCard \n key={task.id} \n task={task} \n view=\"week\" // Logic handled inside card based on 'mode' prop\n mode=\"execution\"\n onClick={() => onTaskClick(task)}\n style={{ \n top: `${topPosition}px`, \n height: `${height}px`, \n left: '4px',\n right: '4px',\n position: 'absolute'\n }}\n />\n );\n })}\n </div>\n );\n}\n\n// 3. MONTH VIEW\nfunction MonthView({\n days,\n tasks,\n currentDate,\n onDropTask,\n onTaskClick,\n onAddClick,\n mode\n}: CalendarViewProps & { currentDate: Date; mode: CalendarMode }) {\n return (\n <div className=\"grid grid-cols-7 auto-rows-fr min-h-[800px]\">\n {days.map((day: Date) => {\n const dayTasks = tasks.filter((t: CalendarTask) => \n t.date && isSameDay(new Date(t.date), day)\n );\n\n return (\n <DroppableMonthCell\n key={day.toISOString()}\n date={day}\n tasks={dayTasks}\n isCurrentMonth={isSameMonth(day, currentDate)}\n onDropTask={onDropTask}\n onTaskClick={onTaskClick}\n onAddClick={onAddClick}\n mode={mode}\n />\n );\n })}\n </div>\n )\n}\n\nfunction DroppableMonthCell({\n date,\n tasks,\n isCurrentMonth,\n onDropTask,\n onTaskClick,\n onAddClick,\n mode\n}: CalendarColumnProps & { date: Date; isCurrentMonth: boolean; mode: CalendarMode }) {\n const [{ isOver }, drop] = useDrop(() => ({\n accept: ItemTypes.TASK,\n drop: (item: { id: string }) => onDropTask(item.id, date),\n collect: (monitor) => ({\n isOver: !!monitor.isOver(),\n }),\n }), [date, onDropTask]);\n\n const isTodayDate = isToday(date);\n\n return (\n <div\n ref={drop as unknown as React.Ref<HTMLDivElement>}\n className={cn(\n \"min-h-[120px] border-b border-r p-2 relative transition-colors group flex flex-col\",\n !isCurrentMonth && \"bg-muted/50 text-muted-foreground\",\n isOver && \"bg-accent ring-2 ring-inset ring-ring\",\n isTodayDate && \"bg-accent/30\"\n )}\n >\n <div className=\"flex justify-between items-start mb-2\">\n <span className={cn(\n \"text-sm font-medium rounded-full w-7 h-7 flex items-center justify-center\",\n isTodayDate ? \"bg-primary text-primary-foreground\" : \"text-foreground\"\n )}>\n {format(date, \"d\")}\n </span>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6 opacity-0 group-hover:opacity-100 transition-opacity\"\n onClick={() => onAddClick(date)}\n aria-label={`Agendar publicação em ${format(date, \"d/MM\")}`}\n >\n <Plus size={14} />\n </Button>\n </div>\n\n <div className=\"flex-1 flex flex-col gap-1\">\n {tasks.map((task: CalendarTask) => (\n <DraggableTaskCard \n key={task.id}\n task={task}\n view=\"month\"\n mode={mode}\n onClick={() => onTaskClick(task)}\n />\n ))}\n </div>\n </div>\n )\n}\n\n// --- Task Modal (Shared) ---\n\nfunction TaskModal({ \n isOpen, \n onClose, \n task, \n onSave, \n isNew = false \n}: { \n isOpen: boolean; \n onClose: () => void; \n task?: Partial<CalendarTask>; \n onSave: (task: Partial<CalendarTask>) => void;\n isNew?: boolean;\n}) {\n const [editedTask, setEditedTask] = useState<Partial<CalendarTask>>(task || {});\n\n // Reset state when task changes\n useMemo(() => {\n setEditedTask(task || {});\n }, [task]);\n\n const handleSave = () => {\n onSave(editedTask);\n onClose();\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogContent className=\"sm:max-w-[600px]\">\n <DialogHeader>\n <DialogTitle>{isNew ? \"Create New Task\" : \"Edit Task\"}</DialogTitle>\n <DialogDescription>\n {isNew ? \"Enter the details for the new task below.\" : \"Modify the details of the selected task.\"}\n </DialogDescription>\n </DialogHeader>\n \n <div className=\"grid gap-6 py-4\">\n <div className=\"grid grid-cols-4 items-center gap-4\">\n <label htmlFor=\"title\" className=\"text-right text-sm font-medium\">\n Title\n </label>\n <input\n id=\"title\"\n className=\"col-span-3 flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n value={editedTask.title || \"\"}\n onChange={(e) => setEditedTask({ ...editedTask, title: e.target.value })}\n placeholder=\"e.g. New Feature Announcement\"\n />\n </div>\n\n <div className=\"grid grid-cols-4 items-center gap-4\">\n <label className=\"text-right text-sm font-medium\">\n Time\n </label>\n <div className=\"col-span-3 flex gap-2 items-center\">\n <input\n type=\"date\"\n className=\"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm\"\n value={editedTask.date instanceof Date ? format(editedTask.date, 'yyyy-MM-dd') : (typeof editedTask.date === 'string' ? editedTask.date.split('T')[0] : '')}\n onChange={(e) => {\n const newDateStr = e.target.value;\n const current = editedTask.date instanceof Date ? editedTask.date : new Date();\n const newDate = new Date(`${newDateStr}T${format(current, 'HH:mm')}`);\n setEditedTask({ ...editedTask, date: newDate })\n }}\n />\n <span className=\"text-sm text-muted-foreground\">at</span>\n <input \n type=\"time\"\n className=\"w-32 flex h-9 rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm\"\n value={editedTask.date instanceof Date ? format(editedTask.date, 'HH:mm') : '09:00'}\n onChange={(e) => {\n const timeStr = e.target.value;\n const dateStr = editedTask.date instanceof Date ? format(editedTask.date, 'yyyy-MM-dd') : format(new Date(), 'yyyy-MM-dd');\n setEditedTask({ ...editedTask, date: new Date(`${dateStr}T${timeStr}`) })\n }}\n />\n </div>\n </div>\n \n <div className=\"grid grid-cols-4 items-center gap-4\">\n <label htmlFor=\"channel\" className=\"text-right text-sm font-medium\">\n Channel / Category\n </label>\n <select\n id=\"channel\"\n className=\"col-span-3 flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm\"\n value={editedTask.channel || \"instagram\"}\n onChange={(e) => setEditedTask({ ...editedTask, channel: e.target.value as SocialChannel })}\n >\n {Object.keys(ChannelIcons).map((channel) => (\n <option key={channel} value={channel}>{channel.charAt(0).toUpperCase() + channel.slice(1)}</option>\n ))}\n </select>\n </div>\n\n <div className=\"grid grid-cols-4 items-center gap-4\">\n <label htmlFor=\"status\" className=\"text-right text-sm font-medium\">\n Status\n </label>\n <select\n id=\"status\"\n className=\"col-span-3 flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm\"\n value={editedTask.status || \"idea\"}\n onChange={(e) => setEditedTask({ ...editedTask, status: e.target.value as TaskStatus })}\n >\n {Object.keys(StatusColors).map((status) => (\n <option key={status} value={status}>{status.charAt(0).toUpperCase() + status.slice(1)}</option>\n ))}\n </select>\n </div>\n\n <div className=\"grid grid-cols-4 items-start gap-4\">\n <label htmlFor=\"description\" className=\"text-right text-sm font-medium pt-2\">\n Description\n </label>\n <textarea\n id=\"description\"\n className=\"col-span-3 flex min-h-[80px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n value={editedTask.description || \"\"}\n onChange={(e) => setEditedTask({ ...editedTask, description: e.target.value })}\n placeholder=\"Details about this post...\"\n />\n </div>\n </div>\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={onClose}>Cancel</Button>\n <Button onClick={handleSave}>Save Changes</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\n// --- Shared Controller Logic ---\n\nfunction useCalendarController({\n tasks: initialTasks,\n onTaskUpdate,\n onTaskCreate,\n defaultView = \"month\"\n}: BaseCalendarProps & { defaultView?: \"month\" | \"week\" | \"day\" }) {\n const [currentDate, setCurrentDate] = useState(new Date());\n const [view, setView] = useState<\"month\" | \"week\" | \"day\">(defaultView);\n const [isSidebarOpen, setIsSidebarOpen] = useState(true);\n \n // Modal state\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [editingTask, setEditingTask] = useState<Partial<CalendarTask> | null>(null);\n const [isNewTask, setIsNewTask] = useState(false);\n\n // Calendar Grid Generation\n const calendarDays = useMemo(() => {\n let startDate, endDate;\n\n if (view === 'month') {\n const monthStart = startOfMonth(currentDate);\n const monthEnd = endOfMonth(monthStart);\n startDate = startOfWeek(monthStart);\n endDate = endOfWeek(monthEnd);\n } else if (view === 'week') {\n startDate = startOfWeek(currentDate);\n endDate = endOfWeek(currentDate);\n } else {\n // Day view\n startDate = currentDate;\n endDate = currentDate;\n }\n\n return eachDayOfInterval({ start: startDate, end: endDate });\n }, [currentDate, view]);\n\n // Derived State\n const unplannedTasks = initialTasks.filter(t => !t.date);\n const scheduledTasks = initialTasks.filter(t => t.date);\n\n const handlePrev = () => {\n if (view === 'month') setCurrentDate(subMonths(currentDate, 1));\n else if (view === 'week') setCurrentDate(addDays(currentDate, -7));\n else setCurrentDate(addDays(currentDate, -1));\n };\n\n const handleNext = () => {\n if (view === 'month') setCurrentDate(addMonths(currentDate, 1));\n else if (view === 'week') setCurrentDate(addDays(currentDate, 7));\n else setCurrentDate(addDays(currentDate, 1));\n };\n\n const handleToday = () => setCurrentDate(new Date());\n\n const handleDropTask = (taskId: string, targetDate: Date, mode: CalendarMode) => {\n const task = initialTasks.find(t => t.id === taskId);\n if (task) {\n let newDate = new Date(targetDate);\n \n if (view === 'month' || mode === 'editorial') {\n if (task.date) {\n const oldDate = new Date(task.date);\n newDate.setHours(oldDate.getHours(), oldDate.getMinutes());\n } else {\n newDate.setHours(9, 0);\n }\n } \n \n const updatedTask = { ...task, date: newDate };\n onTaskUpdate(updatedTask);\n }\n };\n\n const handleTaskClick = (task: CalendarTask) => {\n setEditingTask(task);\n setIsNewTask(false);\n setIsModalOpen(true);\n };\n\n const handleAddClick = (date?: Date) => {\n const d = date || new Date();\n if (getHours(d) === 0 && getMinutes(d) === 0) {\n d.setHours(9, 0);\n }\n setEditingTask({\n date: d,\n status: \"idea\",\n channel: \"instagram\"\n });\n setIsNewTask(true);\n setIsModalOpen(true);\n };\n\n const handleModalSave = (task: Partial<CalendarTask>) => {\n if (isNewTask) {\n if (onTaskCreate) {\n onTaskCreate(task);\n }\n } else {\n if (task.id) {\n onTaskUpdate(task as CalendarTask);\n }\n }\n setIsModalOpen(false);\n };\n\n return {\n currentDate,\n view,\n setView,\n isSidebarOpen,\n setIsSidebarOpen,\n isModalOpen,\n setIsModalOpen,\n editingTask,\n isNewTask,\n calendarDays,\n unplannedTasks,\n scheduledTasks,\n handlePrev,\n handleNext,\n handleToday,\n handleDropTask,\n handleTaskClick,\n handleAddClick,\n handleModalSave\n };\n}\n\n// --- Helper Components ---\n\nfunction CalendarSidebar({ isOpen, setIsOpen, tasks, onAddClick, onTaskClick, mode }: {\n isOpen: boolean;\n setIsOpen: (open: boolean) => void;\n tasks: CalendarTask[];\n onAddClick: () => void;\n onTaskClick: (task: CalendarTask) => void;\n mode: CalendarMode;\n}) {\n if (!isOpen) {\n return (\n <div className=\"border-r bg-card flex flex-col items-center py-4 w-12 flex-shrink-0 cursor-pointer hover:bg-muted transition-colors\" onClick={() => setIsOpen(true)}>\n <PanelLeftOpen className=\"text-muted-foreground mb-4\" size={20} />\n <div className=\"flex-1 flex items-center justify-center min-h-0\">\n <div className=\"whitespace-nowrap text-xs font-medium text-muted-foreground -rotate-90 transform\">BACKLOG</div>\n </div>\n <Badge className=\"mt-2 h-5 w-5 p-0 flex items-center justify-center rounded-full bg-primary text-[10px]\">{tasks.length}</Badge>\n </div>\n );\n }\n\n return (\n <div className=\"w-72 border-r bg-muted/50 flex flex-col transition-all duration-300 flex-shrink-0\">\n <div className=\"p-4 border-b bg-card flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"font-semibold text-sm text-foreground\">Backlog</h3>\n <Badge variant=\"secondary\" className=\"bg-muted text-xs\">{tasks.length}</Badge>\n </div>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6\" onClick={() => setIsOpen(false)} aria-label=\"Recolher backlog\">\n <PanelLeftClose size={16} />\n </Button>\n </div>\n <div className=\"px-4 pt-3 bg-card pb-3 border-b space-y-2\">\n <Button \n onClick={onAddClick} \n variant=\"outline\" \n size=\"sm\" \n className=\"w-full justify-start pl-2\"\n >\n <Plus size={12} className=\"mr-1.5\" /> New Task\n </Button>\n </div>\n \n <ScrollArea className=\"flex-1 p-3\">\n <div className=\"space-y-2\">\n {tasks.length === 0 ? (\n <div className=\"text-center py-10 px-4 border-2 border-dashed border-border rounded-lg\">\n <p className=\"text-xs text-foreground/70\">Nenhum item sem agenda</p>\n </div>\n ) : (\n tasks.map((task: CalendarTask) => (\n <DraggableTaskCard \n key={task.id} \n task={task} \n view=\"backlog\"\n mode={mode}\n onClick={() => onTaskClick(task)} \n />\n ))\n )}\n </div>\n </ScrollArea>\n </div>\n );\n}\n\nfunction CalendarHeader({ title, onPrev, onNext, onToday, onAdd, view, setView }: {\n title: string;\n onPrev: () => void;\n onNext: () => void;\n onToday: () => void;\n onAdd: () => void;\n view: CalendarView;\n setView: (view: CalendarView) => void;\n mode?: CalendarMode;\n}) {\n return (\n <div className=\"flex flex-col xl:flex-row items-center justify-between p-4 border-b gap-4 flex-shrink-0 bg-card\">\n <div className=\"flex items-center gap-4 w-full xl:w-auto justify-between xl:justify-start\">\n <div className=\"flex items-center border rounded-md bg-card shadow-sm\">\n <Button variant=\"ghost\" size=\"icon\" onClick={onPrev} className=\"h-8 w-8 rounded-r-none\" aria-label=\"Anterior\">\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" onClick={onToday} className=\"h-8 px-3 rounded-none border-x text-sm font-medium hover:bg-muted\">\n Hoje\n </Button>\n <Button variant=\"ghost\" size=\"icon\" onClick={onNext} className=\"h-8 w-8 rounded-l-none\" aria-label=\"Próximo\">\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n <h2 className=\"text-lg font-bold text-foreground whitespace-nowrap\">\n {title}\n </h2>\n </div>\n\n <div className=\"flex items-center gap-3 w-full xl:w-auto overflow-x-auto pb-1 xl:pb-0 justify-end\">\n <ToggleGroup\n type=\"single\"\n value={view}\n onValueChange={(v) => v && setView(v as CalendarView)}\n className=\"flex-shrink-0\"\n aria-label=\"Visualização do calendário\"\n >\n <ToggleGroupItem value=\"month\" className=\"text-xs\">Mês</ToggleGroupItem>\n <ToggleGroupItem value=\"week\" className=\"text-xs\">Semana</ToggleGroupItem>\n <ToggleGroupItem value=\"day\" className=\"text-xs\">Dia</ToggleGroupItem>\n </ToggleGroup>\n\n <Button\n variant=\"default\"\n className=\"h-9 px-4 flex-shrink-0\"\n onClick={onAdd}\n >\n <Plus className=\"mr-2 h-4 w-4\" /> Criar\n </Button>\n </div>\n </div>\n );\n}\n\nfunction MonthHeader({ days }: { days: Date[] }) {\n return (\n <div className=\"grid grid-cols-7 border-b bg-muted/50 flex-shrink-0 divide-x\">\n {days.slice(0, 7).map((day, index) => (\n <div key={index} className=\"py-2 text-center group\">\n <div className={cn(\"text-xs font-semibold uppercase tracking-wider\", isToday(day) ? \"text-primary\" : \"text-foreground/70\")}>\n {format(day, 'EEE')}\n </div>\n </div>\n ))}\n </div>\n );\n}\n\n// --- EXPORTED COMPONENTS ---\n\nexport function EditorialCalendar(props: BaseCalendarProps) {\n const ctrl = useCalendarController({ ...props, defaultView: \"month\" });\n \n return (\n <DndProvider backend={HTML5Backend}>\n <div className={cn(\"flex h-[calc(100vh-100px)] bg-background border rounded-lg overflow-hidden shadow-sm\", props.className)}>\n <CalendarSidebar \n isOpen={ctrl.isSidebarOpen} \n setIsOpen={ctrl.setIsSidebarOpen} \n tasks={ctrl.unplannedTasks} \n onAddClick={() => ctrl.handleAddClick()}\n onTaskClick={ctrl.handleTaskClick}\n mode=\"editorial\"\n />\n \n <div className=\"flex-1 flex flex-col min-w-0 bg-card\">\n <CalendarHeader \n title={ctrl.view === 'day' ? format(ctrl.currentDate, \"MMM d, yyyy\") : format(ctrl.currentDate, \"MMMM yyyy\")}\n onPrev={ctrl.handlePrev}\n onNext={ctrl.handleNext}\n onToday={ctrl.handleToday}\n onAdd={() => ctrl.handleAddClick(ctrl.currentDate)}\n view={ctrl.view}\n setView={ctrl.setView}\n mode=\"editorial\"\n />\n\n {ctrl.view === 'month' && <MonthHeader days={ctrl.calendarDays} />}\n \n <div className=\"flex-1 overflow-hidden flex flex-col relative\">\n {ctrl.view === 'month' ? (\n <MonthView \n days={ctrl.calendarDays}\n tasks={ctrl.scheduledTasks}\n currentDate={ctrl.currentDate}\n onDropTask={(id: string, d: Date) => ctrl.handleDropTask(id, d, \"editorial\")}\n onTaskClick={ctrl.handleTaskClick}\n onAddClick={ctrl.handleAddClick}\n mode=\"editorial\"\n />\n ) : (\n <EditorialColumnView \n days={ctrl.calendarDays}\n tasks={ctrl.scheduledTasks}\n onDropTask={(id: string, d: Date) => ctrl.handleDropTask(id, d, \"editorial\")}\n onTaskClick={ctrl.handleTaskClick}\n onAddClick={ctrl.handleAddClick}\n view={ctrl.view}\n />\n )}\n </div>\n </div>\n\n {ctrl.isModalOpen && (\n <TaskModal\n isOpen={ctrl.isModalOpen}\n onClose={() => ctrl.setIsModalOpen(false)}\n task={ctrl.editingTask || {}}\n onSave={ctrl.handleModalSave}\n isNew={ctrl.isNewTask}\n />\n )}\n </div>\n </DndProvider>\n );\n}\n\nexport function TaskCalendar(props: BaseCalendarProps) {\n const ctrl = useCalendarController({ ...props, defaultView: \"week\" });\n\n return (\n <DndProvider backend={HTML5Backend}>\n <div className={cn(\"flex h-[calc(100vh-100px)] bg-background border rounded-lg overflow-hidden shadow-sm\", props.className)}>\n <CalendarSidebar \n isOpen={ctrl.isSidebarOpen} \n setIsOpen={ctrl.setIsSidebarOpen} \n tasks={ctrl.unplannedTasks} \n onAddClick={() => ctrl.handleAddClick()}\n onTaskClick={ctrl.handleTaskClick}\n mode=\"execution\"\n />\n \n <div className=\"flex-1 flex flex-col min-w-0 bg-card\">\n <CalendarHeader \n title={ctrl.view === 'day' ? format(ctrl.currentDate, \"MMM d, yyyy\") : format(ctrl.currentDate, \"MMMM yyyy\")}\n onPrev={ctrl.handlePrev}\n onNext={ctrl.handleNext}\n onToday={ctrl.handleToday}\n onAdd={() => ctrl.handleAddClick(ctrl.currentDate)}\n view={ctrl.view}\n setView={ctrl.setView}\n mode=\"execution\"\n />\n \n {ctrl.view === 'month' && <MonthHeader days={ctrl.calendarDays} />}\n\n <div className=\"flex-1 overflow-hidden flex flex-col relative\">\n {ctrl.view === 'month' ? (\n <MonthView \n days={ctrl.calendarDays}\n tasks={ctrl.scheduledTasks}\n currentDate={ctrl.currentDate}\n onDropTask={(id: string, d: Date) => ctrl.handleDropTask(id, d, \"execution\")}\n onTaskClick={ctrl.handleTaskClick}\n onAddClick={ctrl.handleAddClick}\n mode=\"execution\"\n />\n ) : (\n <ExecutionTimelineView \n days={ctrl.calendarDays}\n tasks={ctrl.scheduledTasks}\n onDropTask={(id: string, d: Date) => ctrl.handleDropTask(id, d, \"execution\")}\n onTaskClick={ctrl.handleTaskClick}\n onAddClick={ctrl.handleAddClick}\n />\n )}\n </div>\n </div>\n\n {ctrl.isModalOpen && (\n <TaskModal\n isOpen={ctrl.isModalOpen}\n onClose={() => ctrl.setIsModalOpen(false)}\n task={ctrl.editingTask || {}}\n onSave={ctrl.handleModalSave}\n isNew={ctrl.isNewTask}\n />\n )}\n </div>\n </DndProvider>\n );\n}\n"],"names":["ItemTypes","ChannelIcons","Instagram","Linkedin","Facebook","Twitter","Youtube","CalendarIcon","StatusColors","PastelColors","getRandomColor","id","index","acc","char","DraggableTaskCard","task","view","mode","onClick","style","isDragging","drag","useDrag","monitor","ChannelIcon","startDate","endDate","addHours","timeString","format","durationString","jsxs","cn","jsx","GripVertical","Badge","a","i","Avatar","AvatarImage","AvatarFallback","Clock","_a","EditorialColumnView","days","tasks","onDropTask","onTaskClick","onAddClick","day","dayTasks","t","isSameDay","b","EditorialColumn","isToday","isOver","drop","useDrop","item","Button","Plus","ExecutionTimelineView","HOURS","_","hour","setHours","dayIndex","ExecutionTimelineColumn","isLast","e","d","taskStart","taskEnd","startHour","getHours","startMin","getMinutes","durationMins","differenceInMinutes","topPosition","height","MonthView","currentDate","DroppableMonthCell","isSameMonth","date","isCurrentMonth","isTodayDate","TaskModal","isOpen","onClose","onSave","isNew","editedTask","setEditedTask","useState","useMemo","handleSave","Dialog","open","DialogContent","DialogHeader","DialogTitle","DialogDescription","newDateStr","current","newDate","timeStr","dateStr","channel","status","DialogFooter","useCalendarController","initialTasks","onTaskUpdate","onTaskCreate","defaultView","setCurrentDate","setView","isSidebarOpen","setIsSidebarOpen","isModalOpen","setIsModalOpen","editingTask","setEditingTask","isNewTask","setIsNewTask","calendarDays","monthStart","startOfMonth","monthEnd","endOfMonth","startOfWeek","endOfWeek","eachDayOfInterval","unplannedTasks","scheduledTasks","subMonths","addDays","addMonths","taskId","targetDate","oldDate","updatedTask","CalendarSidebar","setIsOpen","PanelLeftClose","ScrollArea","PanelLeftOpen","CalendarHeader","title","onPrev","onNext","onToday","onAdd","ChevronLeft","ChevronRight","ToggleGroup","v","ToggleGroupItem","MonthHeader","EditorialCalendar","props","ctrl","DndProvider","HTML5Backend","TaskCalendar"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"editorial-calendar.js","sources":["../../../../src/components/ui/data/editorial-calendar.tsx"],"sourcesContent":["import React, { useState, useMemo } from \"react\";\nimport { \n format, \n addMonths, \n subMonths, \n startOfMonth, \n endOfMonth, \n startOfWeek, \n endOfWeek, \n eachDayOfInterval, \n isSameMonth, \n isSameDay, \n isToday,\n addDays,\n setHours,\n getHours,\n getMinutes,\n differenceInMinutes,\n addHours,\n} from \"date-fns\";\nimport { \n ChevronLeft, \n ChevronRight, \n Plus, \n GripVertical,\n Instagram,\n Linkedin,\n Facebook,\n Twitter,\n Youtube,\n Calendar as CalendarIcon,\n Clock,\n PanelLeftClose,\n PanelLeftOpen,\n\n} from \"lucide-react\";\nimport { cn } from \"../utils\";\nimport { Button } from \"../primitives/button\";\nimport { Avatar, AvatarImage, AvatarFallback } from \"../primitives/avatar\";\nimport { Badge } from \"../primitives/badge\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../overlays/dialog\";\nimport { ToggleGroup, ToggleGroupItem } from \"../forms/toggle-group\";\nimport { ScrollArea } from \"../layout/scroll-area\";\nimport { DndProvider, useDrag, useDrop } from \"react-dnd\";\nimport { HTML5Backend } from \"react-dnd-html5-backend\";\n\n// --- Tipos ---\n\nexport type SocialChannel = \"instagram\" | \"linkedin\" | \"facebook\" | \"twitter\" | \"youtube\" | \"blog\" | \"other\";\nexport type TaskStatus = \"idea\" | \"planned\" | \"in-progress\" | \"approval\" | \"scheduled\" | \"published\";\nexport type CalendarMode = \"editorial\" | \"execution\";\n\nexport interface CalendarTask {\n id: string;\n title: string;\n date?: Date | string; // Data de início\n endDate?: Date | string; // Data de término (opcional)\n channel?: SocialChannel;\n status: TaskStatus;\n imageUrl?: string;\n description?: string;\n assignees?: {\n name: string;\n avatar?: string;\n }[];\n color?: string; // Cor customizada opcional\n}\n\ninterface BaseCalendarProps {\n tasks: CalendarTask[];\n onTaskUpdate: (updatedTask: CalendarTask) => void;\n onTaskCreate?: (newTask: Partial<CalendarTask>) => void;\n className?: string;\n}\n\ntype CalendarView = \"month\" | \"week\" | \"day\";\n\n/** Props compartilhadas pelas views de topo (recebem o grid inteiro de dias). */\ninterface CalendarViewProps {\n days: Date[];\n tasks: CalendarTask[];\n onDropTask: (taskId: string, date: Date) => void;\n onTaskClick: (task: CalendarTask) => void;\n onAddClick: (date?: Date) => void;\n}\n\n/** Props compartilhadas pelas colunas/células internas (já recebem um único dia). */\ninterface CalendarColumnProps {\n tasks: CalendarTask[];\n onDropTask: (taskId: string, date: Date) => void;\n onTaskClick: (task: CalendarTask) => void;\n onAddClick: (date: Date) => void;\n}\n\n// --- Constantes e Auxiliares ---\n\nconst ItemTypes = {\n TASK: 'task',\n};\n\nconst ChannelIcons: Record<SocialChannel, React.ElementType> = {\n instagram: Instagram,\n linkedin: Linkedin,\n facebook: Facebook,\n twitter: Twitter,\n youtube: Youtube,\n blog: CalendarIcon,\n other: CalendarIcon,\n};\n\n// Ícones de canal são monocromáticos — a forma do ícone carrega a identidade,\n// a cor fica no token neutro. Se o time quiser cores por canal no futuro, a\n// paleta de marca de terceiros entra como tokens `--brand-*` em tokens.css.\n\nconst StatusColors: Record<TaskStatus, string> = {\n idea: \"bg-muted text-muted-foreground border-border\",\n planned: \"bg-info/10 text-info-emphasis border-info/20\",\n \"in-progress\": \"bg-warning/10 text-warning-emphasis border-warning/20\",\n approval: \"bg-secondary text-secondary-foreground border-border\",\n scheduled: \"bg-success/10 text-success-emphasis border-success/20\",\n published: \"bg-foreground text-background border-foreground\",\n};\n\n// Rotating chart tokens for Execution mode cards (flip in dark mode)\n// Texto: chart-N misturado 45% com --foreground — o token cru é preenchimento e não passa AA\n// sobre o tint /15; 45% dá ≥ 5,3:1 nas 8 séries, nos dois temas (editorial-calendar.test.ts).\nconst PastelColors = [\n \"bg-chart-2/15 border-chart-2/30 text-[color-mix(in_oklab,var(--chart-2)_45%,var(--foreground))]\",\n \"bg-chart-3/15 border-chart-3/30 text-[color-mix(in_oklab,var(--chart-3)_45%,var(--foreground))]\",\n \"bg-chart-1/15 border-chart-1/30 text-[color-mix(in_oklab,var(--chart-1)_45%,var(--foreground))]\",\n \"bg-chart-4/15 border-chart-4/30 text-[color-mix(in_oklab,var(--chart-4)_45%,var(--foreground))]\",\n \"bg-chart-5/15 border-chart-5/30 text-[color-mix(in_oklab,var(--chart-5)_45%,var(--foreground))]\",\n \"bg-chart-8/15 border-chart-8/30 text-[color-mix(in_oklab,var(--chart-8)_45%,var(--foreground))]\",\n];\n\nconst getRandomColor = (id: string) => {\n const index = id.split(\"\").reduce((acc, char) => acc + char.charCodeAt(0), 0);\n return PastelColors[index % PastelColors.length];\n};\n\n// --- Draggable Card Component ---\n\nfunction DraggableTaskCard({ \n task, \n view = \"month\", \n mode = \"editorial\",\n onClick, \n style \n}: { \n task: CalendarTask; \n view?: \"month\" | \"week\" | \"day\" | \"4day\" | \"backlog\" | \"list\"; \n mode?: CalendarMode;\n onClick: () => void;\n style?: React.CSSProperties;\n}) {\n const [{ isDragging }, drag] = useDrag(() => ({\n type: ItemTypes.TASK,\n item: { id: task.id, type: ItemTypes.TASK },\n collect: (monitor) => ({\n isDragging: !!monitor.isDragging(),\n }),\n }), [task.id]);\n\n const ChannelIcon = task.channel ? ChannelIcons[task.channel] : CalendarIcon;\n \n const startDate = task.date ? new Date(task.date) : null;\n const endDate = task.endDate ? new Date(task.endDate) : (startDate ? addHours(startDate, 1) : null);\n \n const timeString = startDate ? format(startDate, \"HH:mm\") : null;\n const durationString = startDate && endDate \n ? `${format(startDate, \"HH:mm\")} - ${format(endDate, \"HH:mm\")}`\n : timeString;\n\n // ---- STYLES ----\n \n // 1. EDITORIAL - WEEK / DAY (Feed Style)\n if (mode === \"editorial\" && (view === \"week\" || view === \"day\")) {\n return (\n <div\n ref={drag as unknown as React.Ref<HTMLDivElement>}\n onClick={onClick}\n className={cn(\n \"relative group cursor-pointer bg-card border rounded-md shadow-sm hover:shadow-md transition-all mb-3 overflow-hidden\",\n isDragging ? \"opacity-50\" : \"opacity-100\",\n task.status === \"published\" ? \"border-l-2 border-l-foreground\" : \"border-l-2 border-l-primary\"\n )}\n >\n {/* Header: Time & Channel */}\n <div className=\"flex items-center justify-between px-3 py-2 border-b bg-muted/50\">\n <div className=\"flex items-center gap-2\">\n <ChannelIcon size={14} className=\"text-muted-foreground\" />\n {timeString && <span className=\"text-xs font-medium text-muted-foreground\">{timeString}</span>}\n </div>\n <div className=\"opacity-0 group-hover:opacity-100 text-muted-foreground cursor-grab\">\n <GripVertical size={14} />\n </div>\n </div>\n\n {/* Image (Large) */}\n {task.imageUrl && (\n <div className=\"w-full aspect-video bg-muted relative border-b\">\n <img src={task.imageUrl} alt=\"\" className=\"w-full h-full object-cover\" />\n </div>\n )}\n\n {/* Content */}\n <div className=\"p-3\">\n <h4 className=\"text-sm font-medium text-foreground line-clamp-2 mb-2 leading-snug\">\n {task.title}\n </h4>\n <div className=\"flex items-center justify-between\">\n <Badge variant=\"outline\" className={cn(\"px-1.5 py-0 text-[10px] h-5 font-normal uppercase tracking-wide\", StatusColors[task.status])}>\n {task.status}\n </Badge>\n {task.assignees && task.assignees.length > 0 && (\n <div className=\"flex -space-x-2\">\n {task.assignees.slice(0,2).map((a, i) => (\n <Avatar key={i} className=\"w-5 h-5 border border-background\">\n <AvatarImage src={a.avatar} />\n <AvatarFallback className=\"text-[8px]\">{a.name[0]}</AvatarFallback>\n </Avatar>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n }\n\n // 2. EDITORIAL - MONTH (Compact Grid)\n if (mode === \"editorial\" && view === \"month\") {\n return (\n <div\n ref={drag as unknown as React.Ref<HTMLDivElement>}\n onClick={onClick}\n className={cn(\n \"relative group cursor-pointer bg-card border rounded-md shadow-sm hover:shadow-md transition-all mb-1 overflow-hidden flex items-center gap-2 p-1.5\",\n isDragging ? \"opacity-50\" : \"opacity-100\",\n task.status === \"published\" ? \"border-l-2 border-l-foreground\" : \"border-l-2 border-l-primary\"\n )}\n >\n {task.imageUrl && (\n <div className=\"w-8 h-8 flex-shrink-0 bg-muted rounded overflow-hidden\">\n <img src={task.imageUrl} alt=\"\" className=\"w-full h-full object-cover\" />\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-1.5\">\n <ChannelIcon size={12} className=\"text-muted-foreground\" />\n <span className=\"truncate font-medium text-xs\">{task.title}</span>\n </div>\n </div>\n </div>\n );\n }\n\n // 3. EXECUTION - TIMELINE (Week / Day)\n if (mode === \"execution\" && (view === \"week\" || view === \"day\")) {\n return (\n <div\n ref={drag as unknown as React.Ref<HTMLDivElement>}\n onClick={onClick}\n style={style}\n className={cn(\n \"absolute z-10 rounded-md border shadow-sm p-1.5 text-xs flex flex-col overflow-hidden hover:overflow-visible hover:h-auto! hover:min-h-[min-content] hover:z-50 transition-all cursor-pointer group\",\n isDragging ? \"opacity-50\" : \"opacity-100\",\n task.color || getRandomColor(task.id)\n )}\n >\n <div className=\"flex items-center gap-1 mb-0.5 font-semibold text-[10px] leading-none\">\n <Clock size={10} />\n <span className=\"truncate\">{durationString}</span>\n </div>\n \n <div className=\"font-bold leading-tight mb-1 line-clamp-2 text-[11px]\">{task.title}</div>\n \n <div className=\"mt-auto flex items-center justify-between pt-1\">\n <div className=\"flex -space-x-1.5\">\n {task.assignees?.map((a, i) => (\n <Avatar key={i} className=\"w-4 h-4 border border-background\">\n <AvatarImage src={a.avatar} />\n <AvatarFallback className=\"text-[8px]\">{a.name[0]}</AvatarFallback>\n </Avatar>\n ))}\n </div>\n {task.status !== 'published' && (\n <div className={cn(\"w-2 h-2 rounded-full\", StatusColors[task.status].split(\" \")[1].replace(\"text-\", \"bg-\"))} />\n )}\n </div>\n </div>\n );\n }\n \n // 4. EXECUTION - MONTH\n if (mode === \"execution\" && view === \"month\") {\n return (\n <div\n ref={drag as unknown as React.Ref<HTMLDivElement>}\n onClick={onClick}\n className={cn(\n \"relative group cursor-pointer rounded px-2 py-1 mb-1 text-xs truncate font-medium transition-all\",\n isDragging ? \"opacity-50\" : \"opacity-100\",\n task.color || getRandomColor(task.id).replace(\"bg-\", \"bg-opacity-20 bg-\") // lighter background\n )}\n >\n {timeString} {task.title}\n </div>\n );\n }\n\n // 5. BACKLOG (Generic)\n return (\n <div\n ref={drag as unknown as React.Ref<HTMLDivElement>}\n onClick={onClick}\n className={cn(\n \"relative group cursor-pointer bg-card border rounded-md shadow-sm hover:shadow-md transition-all mb-2 p-2 flex items-start gap-3\",\n isDragging ? \"opacity-50\" : \"opacity-100\",\n mode === 'editorial' && (task.status === \"published\" ? \"border-l-2 border-l-foreground\" : \"border-l-2 border-l-primary\")\n )}\n >\n {mode === 'editorial' && task.imageUrl && (\n <div className=\"w-10 h-10 flex-shrink-0 bg-muted rounded overflow-hidden\">\n <img src={task.imageUrl} alt=\"\" className=\"w-full h-full object-cover\" />\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-1.5 mb-1\">\n {mode === 'editorial' && <ChannelIcon size={12} className=\"text-muted-foreground\" />}\n <span className=\"truncate font-medium text-sm\">{task.title}</span>\n </div>\n <Badge variant=\"secondary\" className=\"text-[10px] h-4 px-1 py-0\">{task.status}</Badge>\n </div>\n </div>\n );\n}\n\n// --- Layout Views ---\n\n// 1. EDITORIAL WEEK/DAY VIEW (Columnar, NOT Timeline)\nfunction EditorialColumnView({\n days,\n tasks,\n onDropTask,\n onTaskClick,\n onAddClick,\n view\n}: CalendarViewProps & { view: CalendarView }) {\n return (\n <div className={cn(\n \"grid h-full min-h-[calc(100vh-200px)] bg-muted/30\",\n view === 'week' ? \"grid-cols-7 divide-x\" : \"grid-cols-1 border-x\"\n )}>\n {days.map((day: Date) => {\n const dayTasks = tasks\n .filter((t: CalendarTask) => t.date && isSameDay(new Date(t.date), day))\n .sort((a: CalendarTask, b: CalendarTask) => {\n // Sort by time if available\n if (a.date && b.date) {\n return new Date(a.date).getTime() - new Date(b.date).getTime();\n }\n return 0;\n });\n\n return (\n <EditorialColumn \n key={day.toISOString()}\n day={day}\n tasks={dayTasks}\n onDropTask={onDropTask}\n onTaskClick={onTaskClick}\n onAddClick={onAddClick}\n isToday={isToday(day)}\n />\n )\n })}\n </div>\n );\n}\n\nfunction EditorialColumn({ day, tasks, onDropTask, onTaskClick, onAddClick, isToday }: CalendarColumnProps & { day: Date; isToday: boolean }) {\n const [{ isOver }, drop] = useDrop(() => ({\n accept: ItemTypes.TASK,\n drop: (item: { id: string }) => onDropTask(item.id, day),\n collect: (monitor) => ({\n isOver: !!monitor.isOver(),\n }),\n }), [day, onDropTask]);\n\n return (\n <div \n ref={drop as unknown as React.Ref<HTMLDivElement>}\n className={cn(\n \"flex flex-col h-full min-h-0 transition-colors\",\n isOver && \"bg-accent ring-inset ring-2 ring-ring\"\n )}\n >\n {/* Sticky Header */}\n <div className={cn(\n \"p-2 text-center border-b bg-card sticky top-0 z-10\",\n isToday && \"bg-accent/50\"\n )}>\n <div className=\"text-xs font-semibold uppercase text-muted-foreground mb-1\">{format(day, 'EEE')}</div>\n <div className={cn(\n \"w-8 h-8 rounded-full flex items-center justify-center mx-auto text-sm font-medium\",\n isToday ? \"bg-primary text-primary-foreground\" : \"text-foreground bg-muted\"\n )}>\n {format(day, 'd')}\n </div>\n </div>\n\n {/* Scrollable Content */}\n <div className=\"flex-1 p-2 space-y-3 overflow-y-auto focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\" tabIndex={0} role=\"group\" aria-label={`Publicações de ${format(day, 'PP')}`}>\n <Button \n variant=\"outline\" \n size=\"sm\" \n className=\"w-full mb-2 justify-center px-1\"\n onClick={() => onAddClick(day)}\n >\n <Plus size={12} className=\"flex-shrink-0\" /> \n <span className=\"truncate ml-1.5 hidden xl:inline\">Add Post</span>\n <span className=\"truncate ml-1.5 inline xl:hidden\">Add</span>\n </Button>\n\n {tasks.map((task: CalendarTask) => (\n <DraggableTaskCard \n key={task.id}\n task={task}\n view=\"week\" // Triggers the Editorial Feed Card style\n mode=\"editorial\"\n onClick={() => onTaskClick(task)}\n />\n ))}\n </div>\n </div>\n );\n}\n\n// 2. EXECUTION TIMELINE VIEW (Gantt/Agenda Style)\nfunction ExecutionTimelineView({ \n days,\n tasks, \n onDropTask, \n onTaskClick, \n onAddClick\n}: { \n days: Date[];\n tasks: CalendarTask[]; \n onDropTask: (taskId: string, date: Date) => void; \n onTaskClick: (task: CalendarTask) => void;\n onAddClick: (date: Date) => void;\n}) {\n \n const HOURS = Array.from({ length: 24 }, (_, i) => i);\n\n return (\n <div className=\"flex h-full relative overflow-y-auto bg-card select-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\" tabIndex={0} role=\"group\" aria-label=\"Linha do tempo de execução\">\n {/* Time Axis */}\n <div className=\"w-14 flex-shrink-0 border-r bg-card sticky left-0 z-30\">\n <div className=\"h-10 border-b bg-card sticky top-0 z-40 flex-shrink-0\" /> {/* Fixed height header match */}\n {HOURS.map(hour => (\n <div key={hour} className=\"h-24 border-b text-right pr-2 pt-2 text-xs text-muted-foreground font-medium relative\">\n <span className=\"-top-2.5 relative\">{format(setHours(new Date(), hour), \"ha\")}</span>\n </div>\n ))}\n </div>\n\n {/* Columns Container */}\n <div className=\"flex flex-1 min-w-0 relative\">\n {days.map((day, dayIndex) => {\n const dayTasks = tasks.filter(t => t.date && isSameDay(new Date(t.date), day));\n \n return (\n <ExecutionTimelineColumn \n key={day.toISOString()}\n day={day}\n tasks={dayTasks}\n onDropTask={onDropTask}\n onTaskClick={onTaskClick}\n onAddClick={onAddClick}\n isLast={dayIndex === days.length - 1}\n HOURS={HOURS}\n />\n );\n })}\n \n {/* Horizontal Grid Lines (Background) */}\n <div className=\"absolute inset-0 pointer-events-none z-0\">\n <div className=\"h-10 border-b bg-transparent\" /> {/* Header Spacer in grid */}\n {HOURS.map(hour => (\n <div key={hour} className=\"h-24 border-b border-dashed border-border w-full\" />\n ))}\n </div>\n </div>\n </div>\n );\n}\n\nfunction ExecutionTimelineColumn({\n day,\n tasks,\n onDropTask,\n onTaskClick,\n onAddClick,\n isLast,\n HOURS\n}: CalendarColumnProps & { day: Date; isLast: boolean; HOURS: number[] }) {\n const [{ isOver }, drop] = useDrop(() => ({\n accept: ItemTypes.TASK,\n drop: (item: { id: string }) => {\n onDropTask(item.id, day);\n },\n collect: (monitor) => ({\n isOver: !!monitor.isOver(),\n }),\n }), [day, onDropTask]);\n\n return (\n <div \n ref={drop as unknown as React.Ref<HTMLDivElement>}\n className={cn(\n \"flex-1 relative min-w-[150px]\", \n !isLast && \"border-r\",\n isOver && \"bg-accent/50\"\n )}\n >\n {/* Header (Only for timeline view within scroll area) */}\n <div className=\"sticky top-0 z-20 bg-card border-b h-10 flex items-center justify-center shadow-sm\">\n <div className=\"text-xs font-bold text-muted-foreground\">{format(day, 'EEE')} <span className={cn(\"ml-1\", isToday(day) && \"text-primary\")}>{format(day, 'd')}</span></div>\n </div>\n\n {/* Clickable areas for adding tasks */}\n {HOURS.map((hour: number) => (\n <div \n key={hour} \n className=\"h-24 w-full absolute hover:bg-muted/50 transition-colors cursor-pointer z-10\"\n style={{ top: `${hour * 96 + 40}px` }} \n onClick={(e) => {\n e.stopPropagation();\n const d = new Date(day);\n d.setHours(hour, 0);\n onAddClick(d);\n }}\n />\n ))}\n\n {/* Render Tasks */}\n {tasks.map((task: CalendarTask) => {\n const taskStart = task.date ? new Date(task.date) : new Date();\n const taskEnd = task.endDate ? new Date(task.endDate) : addHours(taskStart, 1);\n \n const startHour = getHours(taskStart);\n const startMin = getMinutes(taskStart);\n \n // Calculate duration in minutes for height\n let durationMins = differenceInMinutes(taskEnd, taskStart);\n if (durationMins < 30) durationMins = 30; // Min height\n\n const topPosition = (startHour * 96) + ((startMin / 60) * 96) + 40; // +40 for header offset\n const height = (durationMins / 60) * 96;\n\n return (\n <DraggableTaskCard \n key={task.id} \n task={task} \n view=\"week\" // Logic handled inside card based on 'mode' prop\n mode=\"execution\"\n onClick={() => onTaskClick(task)}\n style={{ \n top: `${topPosition}px`, \n height: `${height}px`, \n left: '4px',\n right: '4px',\n position: 'absolute'\n }}\n />\n );\n })}\n </div>\n );\n}\n\n// 3. MONTH VIEW\nfunction MonthView({\n days,\n tasks,\n currentDate,\n onDropTask,\n onTaskClick,\n onAddClick,\n mode\n}: CalendarViewProps & { currentDate: Date; mode: CalendarMode }) {\n return (\n <div className=\"grid grid-cols-7 auto-rows-fr min-h-[800px]\">\n {days.map((day: Date) => {\n const dayTasks = tasks.filter((t: CalendarTask) => \n t.date && isSameDay(new Date(t.date), day)\n );\n\n return (\n <DroppableMonthCell\n key={day.toISOString()}\n date={day}\n tasks={dayTasks}\n isCurrentMonth={isSameMonth(day, currentDate)}\n onDropTask={onDropTask}\n onTaskClick={onTaskClick}\n onAddClick={onAddClick}\n mode={mode}\n />\n );\n })}\n </div>\n )\n}\n\nfunction DroppableMonthCell({\n date,\n tasks,\n isCurrentMonth,\n onDropTask,\n onTaskClick,\n onAddClick,\n mode\n}: CalendarColumnProps & { date: Date; isCurrentMonth: boolean; mode: CalendarMode }) {\n const [{ isOver }, drop] = useDrop(() => ({\n accept: ItemTypes.TASK,\n drop: (item: { id: string }) => onDropTask(item.id, date),\n collect: (monitor) => ({\n isOver: !!monitor.isOver(),\n }),\n }), [date, onDropTask]);\n\n const isTodayDate = isToday(date);\n\n return (\n <div\n ref={drop as unknown as React.Ref<HTMLDivElement>}\n className={cn(\n \"min-h-[120px] border-b border-r p-2 relative transition-colors group flex flex-col\",\n !isCurrentMonth && \"bg-muted/50 text-muted-foreground\",\n isOver && \"bg-accent ring-2 ring-inset ring-ring\",\n isTodayDate && \"bg-accent/30\"\n )}\n >\n <div className=\"flex justify-between items-start mb-2\">\n <span className={cn(\n \"text-sm font-medium rounded-full w-7 h-7 flex items-center justify-center\",\n isTodayDate ? \"bg-primary text-primary-foreground\" : \"text-foreground\"\n )}>\n {format(date, \"d\")}\n </span>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6 relative before:absolute before:-inset-1.5 before:content-[''] opacity-100 md:opacity-0 md:group-hover:opacity-100 md:group-focus-within:opacity-100 transition-opacity\"\n onClick={() => onAddClick(date)}\n aria-label={`Agendar publicação em ${format(date, \"d/MM\")}`}\n >\n <Plus size={14} />\n </Button>\n </div>\n\n <div className=\"flex-1 flex flex-col gap-1\">\n {tasks.map((task: CalendarTask) => (\n <DraggableTaskCard \n key={task.id}\n task={task}\n view=\"month\"\n mode={mode}\n onClick={() => onTaskClick(task)}\n />\n ))}\n </div>\n </div>\n )\n}\n\n// --- Task Modal (Shared) ---\n\nfunction TaskModal({ \n isOpen, \n onClose, \n task, \n onSave, \n isNew = false \n}: { \n isOpen: boolean; \n onClose: () => void; \n task?: Partial<CalendarTask>; \n onSave: (task: Partial<CalendarTask>) => void;\n isNew?: boolean;\n}) {\n const [editedTask, setEditedTask] = useState<Partial<CalendarTask>>(task || {});\n\n // Reset state when task changes\n useMemo(() => {\n setEditedTask(task || {});\n }, [task]);\n\n const handleSave = () => {\n onSave(editedTask);\n onClose();\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogContent className=\"sm:max-w-[600px]\">\n <DialogHeader>\n <DialogTitle>{isNew ? \"Create New Task\" : \"Edit Task\"}</DialogTitle>\n <DialogDescription>\n {isNew ? \"Enter the details for the new task below.\" : \"Modify the details of the selected task.\"}\n </DialogDescription>\n </DialogHeader>\n \n <div className=\"grid gap-6 py-4\">\n <div className=\"grid grid-cols-4 items-center gap-4\">\n <label htmlFor=\"title\" className=\"text-right text-sm font-medium\">\n Title\n </label>\n <input\n id=\"title\"\n className=\"col-span-3 flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n value={editedTask.title || \"\"}\n onChange={(e) => setEditedTask({ ...editedTask, title: e.target.value })}\n placeholder=\"e.g. New Feature Announcement\"\n />\n </div>\n\n <div className=\"grid grid-cols-4 items-center gap-4\">\n <label className=\"text-right text-sm font-medium\">\n Time\n </label>\n <div className=\"col-span-3 flex gap-2 items-center\">\n <input\n type=\"date\"\n className=\"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm\"\n value={editedTask.date instanceof Date ? format(editedTask.date, 'yyyy-MM-dd') : (typeof editedTask.date === 'string' ? editedTask.date.split('T')[0] : '')}\n onChange={(e) => {\n const newDateStr = e.target.value;\n const current = editedTask.date instanceof Date ? editedTask.date : new Date();\n const newDate = new Date(`${newDateStr}T${format(current, 'HH:mm')}`);\n setEditedTask({ ...editedTask, date: newDate })\n }}\n />\n <span className=\"text-sm text-muted-foreground\">at</span>\n <input \n type=\"time\"\n className=\"w-32 flex h-9 rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm\"\n value={editedTask.date instanceof Date ? format(editedTask.date, 'HH:mm') : '09:00'}\n onChange={(e) => {\n const timeStr = e.target.value;\n const dateStr = editedTask.date instanceof Date ? format(editedTask.date, 'yyyy-MM-dd') : format(new Date(), 'yyyy-MM-dd');\n setEditedTask({ ...editedTask, date: new Date(`${dateStr}T${timeStr}`) })\n }}\n />\n </div>\n </div>\n \n <div className=\"grid grid-cols-4 items-center gap-4\">\n <label htmlFor=\"channel\" className=\"text-right text-sm font-medium\">\n Channel / Category\n </label>\n <select\n id=\"channel\"\n className=\"col-span-3 flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm\"\n value={editedTask.channel || \"instagram\"}\n onChange={(e) => setEditedTask({ ...editedTask, channel: e.target.value as SocialChannel })}\n >\n {Object.keys(ChannelIcons).map((channel) => (\n <option key={channel} value={channel}>{channel.charAt(0).toUpperCase() + channel.slice(1)}</option>\n ))}\n </select>\n </div>\n\n <div className=\"grid grid-cols-4 items-center gap-4\">\n <label htmlFor=\"status\" className=\"text-right text-sm font-medium\">\n Status\n </label>\n <select\n id=\"status\"\n className=\"col-span-3 flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm\"\n value={editedTask.status || \"idea\"}\n onChange={(e) => setEditedTask({ ...editedTask, status: e.target.value as TaskStatus })}\n >\n {Object.keys(StatusColors).map((status) => (\n <option key={status} value={status}>{status.charAt(0).toUpperCase() + status.slice(1)}</option>\n ))}\n </select>\n </div>\n\n <div className=\"grid grid-cols-4 items-start gap-4\">\n <label htmlFor=\"description\" className=\"text-right text-sm font-medium pt-2\">\n Description\n </label>\n <textarea\n id=\"description\"\n className=\"col-span-3 flex min-h-[80px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n value={editedTask.description || \"\"}\n onChange={(e) => setEditedTask({ ...editedTask, description: e.target.value })}\n placeholder=\"Details about this post...\"\n />\n </div>\n </div>\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={onClose}>Cancel</Button>\n <Button onClick={handleSave}>Save Changes</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\n// --- Shared Controller Logic ---\n\nfunction useCalendarController({\n tasks: initialTasks,\n onTaskUpdate,\n onTaskCreate,\n defaultView = \"month\"\n}: BaseCalendarProps & { defaultView?: \"month\" | \"week\" | \"day\" }) {\n const [currentDate, setCurrentDate] = useState(new Date());\n const [view, setView] = useState<\"month\" | \"week\" | \"day\">(defaultView);\n const [isSidebarOpen, setIsSidebarOpen] = useState(true);\n \n // Modal state\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [editingTask, setEditingTask] = useState<Partial<CalendarTask> | null>(null);\n const [isNewTask, setIsNewTask] = useState(false);\n\n // Calendar Grid Generation\n const calendarDays = useMemo(() => {\n let startDate, endDate;\n\n if (view === 'month') {\n const monthStart = startOfMonth(currentDate);\n const monthEnd = endOfMonth(monthStart);\n startDate = startOfWeek(monthStart);\n endDate = endOfWeek(monthEnd);\n } else if (view === 'week') {\n startDate = startOfWeek(currentDate);\n endDate = endOfWeek(currentDate);\n } else {\n // Day view\n startDate = currentDate;\n endDate = currentDate;\n }\n\n return eachDayOfInterval({ start: startDate, end: endDate });\n }, [currentDate, view]);\n\n // Derived State\n const unplannedTasks = initialTasks.filter(t => !t.date);\n const scheduledTasks = initialTasks.filter(t => t.date);\n\n const handlePrev = () => {\n if (view === 'month') setCurrentDate(subMonths(currentDate, 1));\n else if (view === 'week') setCurrentDate(addDays(currentDate, -7));\n else setCurrentDate(addDays(currentDate, -1));\n };\n\n const handleNext = () => {\n if (view === 'month') setCurrentDate(addMonths(currentDate, 1));\n else if (view === 'week') setCurrentDate(addDays(currentDate, 7));\n else setCurrentDate(addDays(currentDate, 1));\n };\n\n const handleToday = () => setCurrentDate(new Date());\n\n const handleDropTask = (taskId: string, targetDate: Date, mode: CalendarMode) => {\n const task = initialTasks.find(t => t.id === taskId);\n if (task) {\n let newDate = new Date(targetDate);\n \n if (view === 'month' || mode === 'editorial') {\n if (task.date) {\n const oldDate = new Date(task.date);\n newDate.setHours(oldDate.getHours(), oldDate.getMinutes());\n } else {\n newDate.setHours(9, 0);\n }\n } \n \n const updatedTask = { ...task, date: newDate };\n onTaskUpdate(updatedTask);\n }\n };\n\n const handleTaskClick = (task: CalendarTask) => {\n setEditingTask(task);\n setIsNewTask(false);\n setIsModalOpen(true);\n };\n\n const handleAddClick = (date?: Date) => {\n const d = date || new Date();\n if (getHours(d) === 0 && getMinutes(d) === 0) {\n d.setHours(9, 0);\n }\n setEditingTask({\n date: d,\n status: \"idea\",\n channel: \"instagram\"\n });\n setIsNewTask(true);\n setIsModalOpen(true);\n };\n\n const handleModalSave = (task: Partial<CalendarTask>) => {\n if (isNewTask) {\n if (onTaskCreate) {\n onTaskCreate(task);\n }\n } else {\n if (task.id) {\n onTaskUpdate(task as CalendarTask);\n }\n }\n setIsModalOpen(false);\n };\n\n return {\n currentDate,\n view,\n setView,\n isSidebarOpen,\n setIsSidebarOpen,\n isModalOpen,\n setIsModalOpen,\n editingTask,\n isNewTask,\n calendarDays,\n unplannedTasks,\n scheduledTasks,\n handlePrev,\n handleNext,\n handleToday,\n handleDropTask,\n handleTaskClick,\n handleAddClick,\n handleModalSave\n };\n}\n\n// --- Helper Components ---\n\nfunction CalendarSidebar({ isOpen, setIsOpen, tasks, onAddClick, onTaskClick, mode }: {\n isOpen: boolean;\n setIsOpen: (open: boolean) => void;\n tasks: CalendarTask[];\n onAddClick: () => void;\n onTaskClick: (task: CalendarTask) => void;\n mode: CalendarMode;\n}) {\n if (!isOpen) {\n return (\n <div className=\"border-r bg-card flex flex-col items-center py-4 w-12 flex-shrink-0 cursor-pointer hover:bg-muted transition-colors\" onClick={() => setIsOpen(true)}>\n <PanelLeftOpen className=\"text-muted-foreground mb-4\" size={20} />\n <div className=\"flex-1 flex items-center justify-center min-h-0\">\n <div className=\"whitespace-nowrap text-xs font-medium text-muted-foreground -rotate-90 transform\">BACKLOG</div>\n </div>\n <Badge className=\"mt-2 h-5 w-5 p-0 flex items-center justify-center rounded-full bg-primary text-[10px]\">{tasks.length}</Badge>\n </div>\n );\n }\n\n return (\n <div className=\"w-72 border-r bg-muted/50 flex flex-col transition-all duration-300 flex-shrink-0\">\n <div className=\"p-4 border-b bg-card flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"font-semibold text-sm text-foreground\">Backlog</h3>\n <Badge variant=\"secondary\" className=\"bg-muted text-foreground text-xs\">{tasks.length}</Badge>\n </div>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-6 w-6 relative before:absolute before:-inset-1.5 before:content-['']\" onClick={() => setIsOpen(false)} aria-label=\"Recolher backlog\">\n <PanelLeftClose size={16} />\n </Button>\n </div>\n <div className=\"px-4 pt-3 bg-card pb-3 border-b space-y-2\">\n <Button \n onClick={onAddClick} \n variant=\"outline\" \n size=\"sm\" \n className=\"w-full justify-start pl-2\"\n >\n <Plus size={12} className=\"mr-1.5\" /> New Task\n </Button>\n </div>\n \n <ScrollArea className=\"flex-1 p-3\">\n <div className=\"space-y-2\">\n {tasks.length === 0 ? (\n <div className=\"text-center py-10 px-4 border-2 border-dashed border-border rounded-lg\">\n <p className=\"text-xs text-foreground/70\">Nenhum item sem agenda</p>\n </div>\n ) : (\n tasks.map((task: CalendarTask) => (\n <DraggableTaskCard \n key={task.id} \n task={task} \n view=\"backlog\"\n mode={mode}\n onClick={() => onTaskClick(task)} \n />\n ))\n )}\n </div>\n </ScrollArea>\n </div>\n );\n}\n\nfunction CalendarHeader({ title, onPrev, onNext, onToday, onAdd, view, setView }: {\n title: string;\n onPrev: () => void;\n onNext: () => void;\n onToday: () => void;\n onAdd: () => void;\n view: CalendarView;\n setView: (view: CalendarView) => void;\n mode?: CalendarMode;\n}) {\n return (\n <div className=\"flex flex-col xl:flex-row items-center justify-between p-4 border-b gap-4 flex-shrink-0 bg-card\">\n <div className=\"flex items-center gap-4 w-full xl:w-auto justify-between xl:justify-start\">\n <div className=\"flex items-center border rounded-md bg-card shadow-sm\">\n <Button variant=\"ghost\" size=\"icon\" onClick={onPrev} className=\"h-8 w-8 rounded-r-none\" aria-label=\"Anterior\">\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <Button variant=\"ghost\" onClick={onToday} className=\"h-8 px-3 rounded-none border-x text-sm font-medium hover:bg-muted\">\n Hoje\n </Button>\n <Button variant=\"ghost\" size=\"icon\" onClick={onNext} className=\"h-8 w-8 rounded-l-none\" aria-label=\"Próximo\">\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n <h2 className=\"text-lg font-bold text-foreground whitespace-nowrap\">\n {title}\n </h2>\n </div>\n\n <div className=\"flex items-center gap-3 w-full xl:w-auto overflow-x-auto pb-1 xl:pb-0 justify-end\">\n <ToggleGroup\n type=\"single\"\n value={view}\n onValueChange={(v) => v && setView(v as CalendarView)}\n className=\"flex-shrink-0\"\n aria-label=\"Visualização do calendário\"\n >\n <ToggleGroupItem value=\"month\" className=\"text-xs\">Mês</ToggleGroupItem>\n <ToggleGroupItem value=\"week\" className=\"text-xs\">Semana</ToggleGroupItem>\n <ToggleGroupItem value=\"day\" className=\"text-xs\">Dia</ToggleGroupItem>\n </ToggleGroup>\n\n <Button\n variant=\"default\"\n className=\"h-9 px-4 flex-shrink-0\"\n onClick={onAdd}\n >\n <Plus className=\"mr-2 h-4 w-4\" /> Criar\n </Button>\n </div>\n </div>\n );\n}\n\nfunction MonthHeader({ days }: { days: Date[] }) {\n return (\n <div className=\"grid grid-cols-7 border-b bg-muted/50 flex-shrink-0 divide-x\">\n {days.slice(0, 7).map((day, index) => (\n <div key={index} className=\"py-2 text-center group\">\n <div className={cn(\"text-xs font-semibold uppercase tracking-wider\", isToday(day) ? \"text-primary\" : \"text-foreground/70\")}>\n {format(day, 'EEE')}\n </div>\n </div>\n ))}\n </div>\n );\n}\n\n// --- EXPORTED COMPONENTS ---\n\nexport function EditorialCalendar(props: BaseCalendarProps) {\n const ctrl = useCalendarController({ ...props, defaultView: \"month\" });\n \n return (\n <DndProvider backend={HTML5Backend}>\n <div className={cn(\"flex h-[calc(100vh-100px)] bg-background border rounded-lg overflow-hidden shadow-sm\", props.className)}>\n <CalendarSidebar \n isOpen={ctrl.isSidebarOpen} \n setIsOpen={ctrl.setIsSidebarOpen} \n tasks={ctrl.unplannedTasks} \n onAddClick={() => ctrl.handleAddClick()}\n onTaskClick={ctrl.handleTaskClick}\n mode=\"editorial\"\n />\n \n <div className=\"flex-1 flex flex-col min-w-0 bg-card\">\n <CalendarHeader \n title={ctrl.view === 'day' ? format(ctrl.currentDate, \"MMM d, yyyy\") : format(ctrl.currentDate, \"MMMM yyyy\")}\n onPrev={ctrl.handlePrev}\n onNext={ctrl.handleNext}\n onToday={ctrl.handleToday}\n onAdd={() => ctrl.handleAddClick(ctrl.currentDate)}\n view={ctrl.view}\n setView={ctrl.setView}\n mode=\"editorial\"\n />\n\n {ctrl.view === 'month' && <MonthHeader days={ctrl.calendarDays} />}\n \n <div className=\"flex-1 overflow-hidden flex flex-col relative\">\n {ctrl.view === 'month' ? (\n <MonthView \n days={ctrl.calendarDays}\n tasks={ctrl.scheduledTasks}\n currentDate={ctrl.currentDate}\n onDropTask={(id: string, d: Date) => ctrl.handleDropTask(id, d, \"editorial\")}\n onTaskClick={ctrl.handleTaskClick}\n onAddClick={ctrl.handleAddClick}\n mode=\"editorial\"\n />\n ) : (\n <EditorialColumnView \n days={ctrl.calendarDays}\n tasks={ctrl.scheduledTasks}\n onDropTask={(id: string, d: Date) => ctrl.handleDropTask(id, d, \"editorial\")}\n onTaskClick={ctrl.handleTaskClick}\n onAddClick={ctrl.handleAddClick}\n view={ctrl.view}\n />\n )}\n </div>\n </div>\n\n {ctrl.isModalOpen && (\n <TaskModal\n isOpen={ctrl.isModalOpen}\n onClose={() => ctrl.setIsModalOpen(false)}\n task={ctrl.editingTask || {}}\n onSave={ctrl.handleModalSave}\n isNew={ctrl.isNewTask}\n />\n )}\n </div>\n </DndProvider>\n );\n}\n\nexport function TaskCalendar(props: BaseCalendarProps) {\n const ctrl = useCalendarController({ ...props, defaultView: \"week\" });\n\n return (\n <DndProvider backend={HTML5Backend}>\n <div className={cn(\"flex h-[calc(100vh-100px)] bg-background border rounded-lg overflow-hidden shadow-sm\", props.className)}>\n <CalendarSidebar \n isOpen={ctrl.isSidebarOpen} \n setIsOpen={ctrl.setIsSidebarOpen} \n tasks={ctrl.unplannedTasks} \n onAddClick={() => ctrl.handleAddClick()}\n onTaskClick={ctrl.handleTaskClick}\n mode=\"execution\"\n />\n \n <div className=\"flex-1 flex flex-col min-w-0 bg-card\">\n <CalendarHeader \n title={ctrl.view === 'day' ? format(ctrl.currentDate, \"MMM d, yyyy\") : format(ctrl.currentDate, \"MMMM yyyy\")}\n onPrev={ctrl.handlePrev}\n onNext={ctrl.handleNext}\n onToday={ctrl.handleToday}\n onAdd={() => ctrl.handleAddClick(ctrl.currentDate)}\n view={ctrl.view}\n setView={ctrl.setView}\n mode=\"execution\"\n />\n \n {ctrl.view === 'month' && <MonthHeader days={ctrl.calendarDays} />}\n\n <div className=\"flex-1 overflow-hidden flex flex-col relative\">\n {ctrl.view === 'month' ? (\n <MonthView \n days={ctrl.calendarDays}\n tasks={ctrl.scheduledTasks}\n currentDate={ctrl.currentDate}\n onDropTask={(id: string, d: Date) => ctrl.handleDropTask(id, d, \"execution\")}\n onTaskClick={ctrl.handleTaskClick}\n onAddClick={ctrl.handleAddClick}\n mode=\"execution\"\n />\n ) : (\n <ExecutionTimelineView \n days={ctrl.calendarDays}\n tasks={ctrl.scheduledTasks}\n onDropTask={(id: string, d: Date) => ctrl.handleDropTask(id, d, \"execution\")}\n onTaskClick={ctrl.handleTaskClick}\n onAddClick={ctrl.handleAddClick}\n />\n )}\n </div>\n </div>\n\n {ctrl.isModalOpen && (\n <TaskModal\n isOpen={ctrl.isModalOpen}\n onClose={() => ctrl.setIsModalOpen(false)}\n task={ctrl.editingTask || {}}\n onSave={ctrl.handleModalSave}\n isNew={ctrl.isNewTask}\n />\n )}\n </div>\n </DndProvider>\n );\n}\n"],"names":["ItemTypes","ChannelIcons","Instagram","Linkedin","Facebook","Twitter","Youtube","CalendarIcon","StatusColors","PastelColors","getRandomColor","id","index","acc","char","DraggableTaskCard","task","view","mode","onClick","style","isDragging","drag","useDrag","monitor","ChannelIcon","startDate","endDate","addHours","timeString","format","durationString","jsxs","cn","jsx","GripVertical","Badge","a","i","Avatar","AvatarImage","AvatarFallback","Clock","_a","EditorialColumnView","days","tasks","onDropTask","onTaskClick","onAddClick","day","dayTasks","t","isSameDay","b","EditorialColumn","isToday","isOver","drop","useDrop","item","Button","Plus","ExecutionTimelineView","HOURS","_","hour","setHours","dayIndex","ExecutionTimelineColumn","isLast","e","d","taskStart","taskEnd","startHour","getHours","startMin","getMinutes","durationMins","differenceInMinutes","topPosition","height","MonthView","currentDate","DroppableMonthCell","isSameMonth","date","isCurrentMonth","isTodayDate","TaskModal","isOpen","onClose","onSave","isNew","editedTask","setEditedTask","useState","useMemo","handleSave","Dialog","open","DialogContent","DialogHeader","DialogTitle","DialogDescription","newDateStr","current","newDate","timeStr","dateStr","channel","status","DialogFooter","useCalendarController","initialTasks","onTaskUpdate","onTaskCreate","defaultView","setCurrentDate","setView","isSidebarOpen","setIsSidebarOpen","isModalOpen","setIsModalOpen","editingTask","setEditingTask","isNewTask","setIsNewTask","calendarDays","monthStart","startOfMonth","monthEnd","endOfMonth","startOfWeek","endOfWeek","eachDayOfInterval","unplannedTasks","scheduledTasks","subMonths","addDays","addMonths","taskId","targetDate","oldDate","updatedTask","CalendarSidebar","setIsOpen","PanelLeftClose","ScrollArea","PanelLeftOpen","CalendarHeader","title","onPrev","onNext","onToday","onAdd","ChevronLeft","ChevronRight","ToggleGroup","v","ToggleGroupItem","MonthHeader","EditorialCalendar","props","ctrl","DndProvider","HTML5Backend","TaskCalendar"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react/jsx-runtime"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react/jsx-runtime"),S=require("react"),f=require("../utils.cjs"),v=require("../primitives/button.cjs"),N=require("lucide-react"),u=require("../overlays/popover.cjs"),T=require("../primitives/badge.cjs"),P=require("../forms/input.cjs"),R=require("../forms/checkbox.cjs"),k=require("../primitives/label.cjs"),H=require("../forms/date-picker.cjs"),B=[{value:"is",label:"é",multiSelect:!1},{value:"is_not",label:"não é",multiSelect:!1},{value:"is_any_of",label:"é qualquer um de",multiSelect:!0},{value:"is_none_of",label:"não é nenhum de",multiSelect:!0},{value:"contains",label:"contém",multiSelect:!1},{value:"does_not_contain",label:"não contém",multiSelect:!1},{value:"greater_than",label:"maior que",multiSelect:!1},{value:"greater_than_or_equal",label:"maior ou igual a",multiSelect:!1},{value:"less_than",label:"menor que",multiSelect:!1},{value:"less_than_or_equal",label:"menor ou igual a",multiSelect:!1},{value:"is_empty",label:"está vazio",multiSelect:!1},{value:"is_not_empty",label:"não está vazio",multiSelect:!1}];function L({conditions:s,onConditionsChange:d,fields:b,className:n}){const y=()=>{var o;const t={id:Math.random().toString(36).substr(2,9),field:((o=b[0])==null?void 0:o.value)||"",operator:"is",value:""};d([...s,t])},l=t=>{d(s.filter(o=>o.id!==t))},h=(t,o)=>{d(s.map(c=>c.id===t?{...c,...o}:c))};return a.jsxs("div",{className:f.cn("space-y-3",n),children:[s.length===0?a.jsx("div",{className:"text-center py-8 text-muted-foreground text-sm",children:'Nenhuma condição de filtro. Clique em "Adicionar condição" para começar.'}):s.map((t,o)=>a.jsx(I,{condition:t,fields:b,index:o,onUpdate:c=>h(t.id,c),onRemove:()=>l(t.id)},t.id)),a.jsxs(v.Button,{type:"button",variant:"outline",size:"sm",onClick:y,className:"gap-2",children:[a.jsx(N.Plus,{className:"h-4 w-4"}),"Adicionar condição"]})]})}function I({condition:s,fields:d,index:b,onUpdate:n,onRemove:y}){var q;const l=d.find(e=>e.value===s.field),h=B.find(e=>e.value===s.operator),t=(l==null?void 0:l.multiSelect)||(h==null?void 0:h.multiSelect)||!1,o=!["is_empty","is_not_empty"].includes(s.operator),[c,C]=S.useState(""),p=S.useMemo(()=>l!=null&&l.groups?l.groups.flatMap(e=>[{value:e.value??`__label__${e.label}`,label:e.label,isHeader:!0,selecionavel:!!e.value},...e.options.map(r=>({value:r.value,label:r.label,isHeader:!1,selecionavel:!0,isFilho:!0}))]):((l==null?void 0:l.options)??[]).map(e=>({value:e.value,label:e.label,isHeader:!1,selecionavel:!0})),[l==null?void 0:l.options,l==null?void 0:l.groups]),_=S.useMemo(()=>{if(!c)return p;const e=c.toLowerCase(),r=m=>m.label.toLowerCase().includes(e)||m.value.toLowerCase().includes(e);if(!(l!=null&&l.groups))return p.filter(r);const i=[];let x=null,w=!1,j=!1;for(const m of p){if(m.isHeader){x=m,w=r(m),j=!1,w&&(i.push(m),j=!0);continue}(w||r(m))&&(!j&&x&&(i.push(x),j=!0),i.push(m))}return i},[p,c,l==null?void 0:l.groups]),g=Array.isArray(s.value)?s.value:s.value?[s.value]:[],A=e=>{if(!t){n({value:e});return}const r=Array.isArray(s.value)?s.value:[],i=r.includes(e)?r.filter(x=>x!==e):[...r,e];n({value:i})},z=e=>{if(!t)return;const r=Array.isArray(s.value)?s.value:[];n({value:r.filter(i=>i!==e)})};return a.jsxs("div",{className:"flex items-start gap-2 group",children:[a.jsx("div",{className:"flex items-center h-9 px-2 text-sm text-muted-foreground",children:b===0?"Onde":"E"}),a.jsxs("div",{className:"flex-1 flex items-center gap-2 flex-wrap p-2 border rounded-lg bg-background",children:[a.jsxs(u.Popover,{children:[a.jsx(u.PopoverTrigger,{asChild:!0,children:a.jsx(v.Button,{variant:"ghost",size:"sm",className:"h-7 px-2 font-normal hover:bg-muted",children:(l==null?void 0:l.label)||"Selecionar campo"})}),a.jsx(u.PopoverContent,{className:"w-[200px] p-2",align:"start",children:a.jsx("div",{className:"space-y-1",children:d.map(e=>a.jsx(v.Button,{variant:"ghost",size:"sm",className:f.cn("w-full justify-start",s.field===e.value&&"bg-muted"),onClick:()=>n({field:e.value,value:e.multiSelect?[]:""}),children:e.label},e.value))})})]}),a.jsxs(u.Popover,{children:[a.jsx(u.PopoverTrigger,{asChild:!0,children:a.jsx(v.Button,{variant:"ghost",size:"sm",className:"h-7 px-2 font-normal hover:bg-muted text-muted-foreground",children:(h==null?void 0:h.label)||"is"})}),a.jsx(u.PopoverContent,{className:"w-[200px] p-2",align:"start",children:a.jsx("div",{className:"space-y-1",children:B.map(e=>a.jsx(v.Button,{variant:"ghost",size:"sm",className:f.cn("w-full justify-start",s.operator===e.value&&"bg-muted"),onClick:()=>n({operator:e.value,value:e.multiSelect?[]:""}),children:e.label},e.value))})})]}),o&&a.jsxs(a.Fragment,{children:[l!=null&&l.options||l!=null&&l.groups?a.jsxs(u.Popover,{onOpenChange:e=>!e&&C(""),children:[a.jsx(u.PopoverTrigger,{asChild:!0,children:a.jsx(v.Button,{variant:"ghost",size:"sm",className:"h-7 px-2 font-normal hover:bg-muted",children:t&&g.length>0?a.jsxs("span",{className:"flex items-center gap-1",children:[g.length," selecionado",g.length>1?"s":""]}):!t&&s.value&&((q=p.find(e=>e.value===s.value))==null?void 0:q.label)||"Selecionar valor"})}),a.jsx(u.PopoverContent,{className:"w-80 max-w-[calc(100vw-2rem)] p-3",align:"start",collisionPadding:8,children:a.jsxs("div",{className:"space-y-2",children:[a.jsx(k.Label,{className:"text-xs text-muted-foreground",children:t?"Selecionar valores":"Selecionar valor"}),a.jsxs("div",{className:"relative",children:[a.jsx(N.Search,{className:"absolute left-2 top-2.5 h-4 w-4 text-muted-foreground"}),a.jsx(P.Input,{type:"text",placeholder:"Buscar...",value:c,onChange:e=>C(e.target.value),className:"h-9 pl-8",autoFocus:!0})]}),a.jsx("div",{className:"space-y-2 max-h-[320px] overflow-y-auto overflow-x-hidden",children:_.length===0?a.jsx("div",{className:"text-sm text-muted-foreground text-center py-4",children:"Nenhum resultado encontrado"}):_.map(e=>{if(e.isHeader&&!e.selecionavel)return a.jsx("div",{title:e.label,className:"truncate pt-1 text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:e.label},e.value);const r=t?g.includes(e.value):s.value===e.value;return a.jsx("div",{className:f.cn("flex min-w-0 items-center space-x-2",e.isFilho&&"pl-4"),children:t?a.jsxs(a.Fragment,{children:[a.jsx(R.Checkbox,{id:`${s.id}-${e.value}`,checked:r,onCheckedChange:()=>A(e.value)}),a.jsx("label",{htmlFor:`${s.id}-${e.value}`,title:e.label,className:f.cn("min-w-0 flex-1 cursor-pointer truncate text-sm",e.isHeader&&"font-semibold uppercase tracking-wide"),children:e.label})]}):a.jsx(v.Button,{variant:"ghost",size:"sm",title:e.label,className:f.cn("w-full min-w-0 justify-start",e.isHeader&&"font-semibold uppercase tracking-wide",r&&"bg-muted"),onClick:()=>n({value:e.value}),children:a.jsx("span",{className:"truncate",children:e.label})})},e.value)})})]})})]}):(l==null?void 0:l.type)==="date"?a.jsx(H.DatePicker,{value:s.value?new Date(s.value+"T00:00:00"):void 0,onChange:e=>{if(e){const r=e.toISOString().split("T")[0];n({value:r})}else n({value:""})},placeholder:"Selecionar data",className:"h-7 text-sm"}):a.jsxs(u.Popover,{children:[a.jsx(u.PopoverTrigger,{asChild:!0,children:a.jsx(v.Button,{variant:"ghost",size:"sm",className:"h-7 px-2 font-normal hover:bg-muted max-w-[200px] truncate",children:s.value||"Inserir valor"})}),a.jsx(u.PopoverContent,{className:"w-[240px] p-3",align:"start",children:a.jsxs("div",{className:"space-y-2",children:[a.jsx(k.Label,{className:"text-xs text-muted-foreground",children:"Inserir valor"}),a.jsx(P.Input,{type:(l==null?void 0:l.type)==="number"?"number":"text",value:Array.isArray(s.value)?"":s.value,onChange:e=>n({value:e.target.value}),placeholder:"Digite o valor...",autoFocus:!0})]})})]}),t&&g.length>0&&a.jsx("div",{className:"flex items-center gap-1 flex-wrap",children:g.map(e=>{var i;const r=((i=p.find(x=>x.value===e))==null?void 0:i.label)||e;return a.jsxs(T.Badge,{variant:"secondary",className:"gap-1 h-6 text-xs",children:[r,a.jsx("button",{type:"button",onClick:()=>z(e),className:"ml-1 rounded-sm hover:bg-muted p-0.5 transition-colors","aria-label":`Remover ${r}`,children:a.jsx(N.X,{className:"h-3 w-3"})})]},e)})})]})]}),a.jsx(v.Button,{type:"button",variant:"ghost",size:"sm",onClick:y,className:"h-9 w-9 p-0 opacity-100 md:opacity-0 md:group-hover:opacity-100 md:group-focus-within:opacity-100 transition-opacity","aria-label":"Remover condição",children:a.jsx(N.X,{className:"h-4 w-4"})})]})}exports.FilterBuilder=L;
|
|
2
2
|
//# sourceMappingURL=filter-builder.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter-builder.cjs","sources":["../../../../src/components/ui/data/filter-builder.tsx"],"sourcesContent":["import React from \"react\";\nimport { cn } from \"../utils\";\nimport { Button } from \"../primitives/button\";\nimport { Plus, X, Search } from \"lucide-react\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../overlays/popover\";\nimport { Badge } from \"../primitives/badge\";\nimport { Input } from \"../forms/input\";\nimport { Checkbox } from \"../forms/checkbox\";\nimport { Label } from \"../primitives/label\";\nimport { DatePicker } from \"../forms/date-picker\";\n\nexport interface FilterCondition {\n id: string;\n field: string;\n operator: string;\n value: string | string[]; // Suporta multi-seleção\n}\n\n/** Item já achatado da lista de valores, com a marcação de hierarquia preservada */\ninterface ListItem {\n value: string;\n label: string;\n isHeader: boolean;\n selecionavel: boolean;\n isFilho?: boolean;\n}\n\nexport interface FilterOptionGroup {\n label: string;\n /** Quando presente, o cabeçalho do grupo também é selecionável */\n value?: string;\n options: { value: string; label: string }[];\n}\n\nexport interface FilterField {\n value: string;\n label: string;\n type?: \"text\" | \"number\" | \"select\" | \"date\";\n options?: { value: string; label: string }[]; // Para campos select\n /**\n * Opções agrupadas hierarquicamente — mesma forma usada por Combobox e MultiSelect.\n * Use `options` OU `groups`. O cabeçalho só é selecionável quando tem `value`.\n */\n groups?: FilterOptionGroup[];\n multiSelect?: boolean; // Habilitar multi-seleção para este campo\n}\n\nexport interface FilterBuilderProps {\n conditions: FilterCondition[];\n onConditionsChange: (conditions: FilterCondition[]) => void;\n fields: FilterField[];\n className?: string;\n}\n\n// Definições de operadores com suporte a multi-seleção\nconst OPERATORS = [\n { value: \"is\", label: \"é\", multiSelect: false },\n { value: \"is_not\", label: \"não é\", multiSelect: false },\n { value: \"is_any_of\", label: \"é qualquer um de\", multiSelect: true },\n { value: \"is_none_of\", label: \"não é nenhum de\", multiSelect: true },\n { value: \"contains\", label: \"contém\", multiSelect: false },\n { value: \"does_not_contain\", label: \"não contém\", multiSelect: false },\n { value: \"greater_than\", label: \"maior que\", multiSelect: false },\n { value: \"greater_than_or_equal\", label: \"maior ou igual a\", multiSelect: false },\n { value: \"less_than\", label: \"menor que\", multiSelect: false },\n { value: \"less_than_or_equal\", label: \"menor ou igual a\", multiSelect: false },\n { value: \"is_empty\", label: \"está vazio\", multiSelect: false },\n { value: \"is_not_empty\", label: \"não está vazio\", multiSelect: false },\n];\n\nexport function FilterBuilder({\n conditions,\n onConditionsChange,\n fields,\n className,\n}: FilterBuilderProps) {\n const addCondition = () => {\n const newCondition: FilterCondition = {\n id: Math.random().toString(36).substr(2, 9),\n field: fields[0]?.value || \"\",\n operator: \"is\",\n value: \"\",\n };\n onConditionsChange([...conditions, newCondition]);\n };\n\n const removeCondition = (id: string) => {\n onConditionsChange(conditions.filter((c) => c.id !== id));\n };\n\n const updateCondition = (id: string, updates: Partial<FilterCondition>) => {\n onConditionsChange(\n conditions.map((c) => (c.id === id ? { ...c, ...updates } : c))\n );\n };\n\n return (\n <div className={cn(\"space-y-3\", className)}>\n {/* Conditions */}\n {conditions.length === 0 ? (\n <div className=\"text-center py-8 text-muted-foreground text-sm\">\n Nenhuma condição de filtro. Clique em \"Adicionar condição\" para começar.\n </div>\n ) : (\n conditions.map((condition, index) => (\n <ConditionRow\n key={condition.id}\n condition={condition}\n fields={fields}\n index={index}\n onUpdate={(updates) => updateCondition(condition.id, updates)}\n onRemove={() => removeCondition(condition.id)}\n />\n ))\n )}\n\n {/* Add Condition Button */}\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={addCondition}\n className=\"gap-2\"\n >\n <Plus className=\"h-4 w-4\" />\n Adicionar condição\n </Button>\n </div>\n );\n}\n\ninterface ConditionRowProps {\n condition: FilterCondition;\n fields: FilterField[];\n index: number;\n onUpdate: (updates: Partial<FilterCondition>) => void;\n onRemove: () => void;\n}\n\nfunction ConditionRow({\n condition,\n fields,\n index,\n onUpdate,\n onRemove,\n}: ConditionRowProps) {\n const selectedField = fields.find((f) => f.value === condition.field);\n const selectedOperator = OPERATORS.find((op) => op.value === condition.operator);\n \n // Multi-select enabled if field has multiSelect: true OR operator requires it\n const isMultiSelect = selectedField?.multiSelect || selectedOperator?.multiSelect || false;\n const needsValue = ![\"is_empty\", \"is_not_empty\"].includes(condition.operator);\n\n // Search state for filtering options\n const [searchTerm, setSearchTerm] = React.useState(\"\");\n\n // Lista achatada com metadados de hierarquia — unifica `options` e `groups` num único\n // fluxo de renderização, preservando a marcação de cabeçalho e de filho.\n const itensLista = React.useMemo<ListItem[]>(() => {\n if (selectedField?.groups) {\n return selectedField.groups.flatMap((group) => [\n {\n value: group.value ?? `__label__${group.label}`,\n label: group.label,\n isHeader: true,\n selecionavel: Boolean(group.value),\n },\n ...group.options.map((o) => ({\n value: o.value,\n label: o.label,\n isHeader: false,\n selecionavel: true,\n isFilho: true,\n })),\n ]);\n }\n return (selectedField?.options ?? []).map((o) => ({\n value: o.value,\n label: o.label,\n isHeader: false,\n selecionavel: true,\n }));\n }, [selectedField?.options, selectedField?.groups]);\n\n // Busca preservando a hierarquia: casar o cabeçalho mantém todos os seus filhos;\n // casar um filho mantém o cabeçalho como contexto.\n const itensFiltrados = React.useMemo(() => {\n if (!searchTerm) return itensLista;\n\n const termo = searchTerm.toLowerCase();\n const casa = (i: ListItem) =>\n i.label.toLowerCase().includes(termo) || i.value.toLowerCase().includes(termo);\n\n if (!selectedField?.groups) return itensLista.filter(casa);\n\n const resultado: ListItem[] = [];\n let header: ListItem | null = null;\n let headerCasou = false;\n let headerIncluido = false;\n\n for (const item of itensLista) {\n if (item.isHeader) {\n header = item;\n headerCasou = casa(item);\n headerIncluido = false;\n if (headerCasou) {\n resultado.push(item);\n headerIncluido = true;\n }\n continue;\n }\n if (headerCasou || casa(item)) {\n if (!headerIncluido && header) {\n resultado.push(header);\n headerIncluido = true;\n }\n resultado.push(item);\n }\n }\n return resultado;\n }, [itensLista, searchTerm, selectedField?.groups]);\n\n // Convert value to array for multi-select\n const valueAsArray = Array.isArray(condition.value)\n ? condition.value\n : condition.value\n ? [condition.value]\n : [];\n\n const toggleValue = (val: string) => {\n if (!isMultiSelect) {\n onUpdate({ value: val });\n return;\n }\n\n const currentValues = Array.isArray(condition.value) ? condition.value : [];\n const newValues = currentValues.includes(val)\n ? currentValues.filter((v) => v !== val)\n : [...currentValues, val];\n onUpdate({ value: newValues });\n };\n\n const removeValue = (val: string) => {\n if (!isMultiSelect) return;\n const currentValues = Array.isArray(condition.value) ? condition.value : [];\n onUpdate({ value: currentValues.filter((v) => v !== val) });\n };\n\n return (\n <div className=\"flex items-start gap-2 group\">\n {/* Index */}\n <div className=\"flex items-center h-9 px-2 text-sm text-muted-foreground\">\n {index === 0 ? \"Onde\" : \"E\"}\n </div>\n\n {/* Condition Display */}\n <div className=\"flex-1 flex items-center gap-2 flex-wrap p-2 border rounded-lg bg-background\">\n {/* Field Selector */}\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 font-normal hover:bg-muted\"\n >\n {selectedField?.label || \"Selecionar campo\"}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[200px] p-2\" align=\"start\">\n <div className=\"space-y-1\">\n {fields.map((field) => (\n <Button\n key={field.value}\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n \"w-full justify-start\",\n condition.field === field.value && \"bg-muted\"\n )}\n onClick={() => \n onUpdate({ \n field: field.value, \n value: field.multiSelect ? [] : \"\" \n })\n }\n >\n {field.label}\n </Button>\n ))}\n </div>\n </PopoverContent>\n </Popover>\n\n {/* Operator Selector */}\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 font-normal hover:bg-muted text-muted-foreground\"\n >\n {selectedOperator?.label || \"is\"}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[200px] p-2\" align=\"start\">\n <div className=\"space-y-1\">\n {OPERATORS.map((op) => (\n <Button\n key={op.value}\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n \"w-full justify-start\",\n condition.operator === op.value && \"bg-muted\"\n )}\n onClick={() =>\n onUpdate({\n operator: op.value,\n value: op.multiSelect ? [] : \"\",\n })\n }\n >\n {op.label}\n </Button>\n ))}\n </div>\n </PopoverContent>\n </Popover>\n\n {/* Value Selector/Input */}\n {needsValue && (\n <>\n {selectedField?.options || selectedField?.groups ? (\n // Select field with options\n <Popover onOpenChange={(open) => !open && setSearchTerm(\"\")}>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 font-normal hover:bg-muted\"\n >\n {isMultiSelect && valueAsArray.length > 0 ? (\n <span className=\"flex items-center gap-1\">\n {valueAsArray.length} selecionado{valueAsArray.length > 1 ? 's' : ''}\n </span>\n ) : !isMultiSelect && condition.value ? (\n itensLista.find((opt) => opt.value === condition.value)?.label ||\n \"Selecionar valor\"\n ) : (\n \"Selecionar valor\"\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-80 max-w-[calc(100vw-2rem)] p-3\"\n align=\"start\"\n collisionPadding={8}\n >\n <div className=\"space-y-2\">\n <Label className=\"text-xs text-muted-foreground\">\n {isMultiSelect ? \"Selecionar valores\" : \"Selecionar valor\"}\n </Label>\n \n {/* Search Input */}\n <div className=\"relative\">\n <Search className=\"absolute left-2 top-2.5 h-4 w-4 text-muted-foreground\" />\n <Input\n type=\"text\"\n placeholder=\"Buscar...\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n className=\"h-9 pl-8\"\n autoFocus\n />\n </div>\n \n {/* Filtered Options */}\n <div className=\"space-y-2 max-h-[320px] overflow-y-auto overflow-x-hidden\">\n {(() => {\n if (itensFiltrados.length === 0) {\n return (\n <div className=\"text-sm text-muted-foreground text-center py-4\">\n Nenhum resultado encontrado\n </div>\n );\n }\n\n return itensFiltrados.map((option) => {\n // Cabeçalho de grupo sem `value` — apenas rótulo visual\n if (option.isHeader && !option.selecionavel) {\n return (\n <div\n key={option.value}\n title={option.label}\n className=\"truncate pt-1 text-xs font-semibold uppercase tracking-wide text-muted-foreground\"\n >\n {option.label}\n </div>\n );\n }\n\n const isSelected = isMultiSelect\n ? valueAsArray.includes(option.value)\n : condition.value === option.value;\n\n return (\n <div\n key={option.value}\n className={cn(\n \"flex min-w-0 items-center space-x-2\",\n option.isFilho && \"pl-4\"\n )}\n >\n {isMultiSelect ? (\n <>\n <Checkbox\n id={`${condition.id}-${option.value}`}\n checked={isSelected}\n onCheckedChange={() =>\n toggleValue(option.value)\n }\n />\n <label\n htmlFor={`${condition.id}-${option.value}`}\n title={option.label}\n className={cn(\n \"min-w-0 flex-1 cursor-pointer truncate text-sm\",\n option.isHeader && \"font-semibold uppercase tracking-wide\"\n )}\n >\n {option.label}\n </label>\n </>\n ) : (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n title={option.label}\n className={cn(\n \"w-full min-w-0 justify-start\",\n option.isHeader && \"font-semibold uppercase tracking-wide\",\n isSelected && \"bg-muted\"\n )}\n onClick={() => onUpdate({ value: option.value })}\n >\n <span className=\"truncate\">{option.label}</span>\n </Button>\n )}\n </div>\n );\n });\n })()}\n </div>\n </div>\n </PopoverContent>\n </Popover>\n ) : selectedField?.type === \"date\" ? (\n // Date picker\n <DatePicker\n value={condition.value ? new Date(condition.value + 'T00:00:00') : undefined}\n onChange={(date) => {\n if (date) {\n // Formato ISO (YYYY-MM-DD)\n const isoDate = date.toISOString().split('T')[0];\n onUpdate({ value: isoDate });\n } else {\n onUpdate({ value: '' });\n }\n }}\n placeholder=\"Selecionar data\"\n className=\"h-7 text-sm\"\n />\n ) : (\n // Text/Number input\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 font-normal hover:bg-muted max-w-[200px] truncate\"\n >\n {condition.value || \"Inserir valor\"}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[240px] p-3\" align=\"start\">\n <div className=\"space-y-2\">\n <Label className=\"text-xs text-muted-foreground\">\n Inserir valor\n </Label>\n <Input\n type={selectedField?.type === \"number\" ? \"number\" : \"text\"}\n value={\n Array.isArray(condition.value) ? \"\" : condition.value\n }\n onChange={(e) => onUpdate({ value: e.target.value })}\n placeholder=\"Digite o valor...\"\n autoFocus\n />\n </div>\n </PopoverContent>\n </Popover>\n )}\n\n {/* Multi-select chips */}\n {isMultiSelect && valueAsArray.length > 0 && (\n <div className=\"flex items-center gap-1 flex-wrap\">\n {valueAsArray.map((val) => {\n // itensLista ja cobre `options` e `groups` (inclusive o cabecalho\n // selecionavel do grupo). Buscar so em `options` fazia o badge de um campo\n // hierarquico exibir o value cru — \"g-2\" no lugar do nome do grupo.\n const optionLabel =\n itensLista.find((item) => item.value === val)?.label || val;\n return (\n <Badge\n key={val}\n variant=\"secondary\"\n className=\"gap-1 h-6 text-xs\"\n >\n {optionLabel}\n <button\n type=\"button\"\n onClick={() => removeValue(val)}\n className=\"ml-1 rounded-sm hover:bg-muted p-0.5 transition-colors\"\n aria-label={`Remover ${optionLabel}`}\n >\n <X className=\"h-3 w-3\" />\n </button>\n </Badge>\n );\n })}\n </div>\n )}\n </>\n )}\n </div>\n\n {/* Remove Button */}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={onRemove}\n className=\"h-9 w-9 p-0 opacity-0 group-hover:opacity-100 transition-opacity\"\n aria-label=\"Remover condição\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n );\n}"],"names":["OPERATORS","FilterBuilder","conditions","onConditionsChange","fields","className","addCondition","newCondition","_a","removeCondition","id","c","updateCondition","updates","cn","jsx","condition","index","ConditionRow","jsxs","Button","Plus","onUpdate","onRemove","selectedField","f","selectedOperator","op","isMultiSelect","needsValue","searchTerm","setSearchTerm","React","itensLista","group","o","itensFiltrados","termo","casa","i","resultado","header","headerCasou","headerIncluido","item","valueAsArray","toggleValue","val","currentValues","newValues","v","removeValue","Popover","PopoverTrigger","PopoverContent","field","Fragment","open","opt","Label","Search","Input","option","isSelected","Checkbox","DatePicker","date","isoDate","optionLabel","Badge","X"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"filter-builder.cjs","sources":["../../../../src/components/ui/data/filter-builder.tsx"],"sourcesContent":["import React from \"react\";\nimport { cn } from \"../utils\";\nimport { Button } from \"../primitives/button\";\nimport { Plus, X, Search } from \"lucide-react\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../overlays/popover\";\nimport { Badge } from \"../primitives/badge\";\nimport { Input } from \"../forms/input\";\nimport { Checkbox } from \"../forms/checkbox\";\nimport { Label } from \"../primitives/label\";\nimport { DatePicker } from \"../forms/date-picker\";\n\nexport interface FilterCondition {\n id: string;\n field: string;\n operator: string;\n value: string | string[]; // Suporta multi-seleção\n}\n\n/** Item já achatado da lista de valores, com a marcação de hierarquia preservada */\ninterface ListItem {\n value: string;\n label: string;\n isHeader: boolean;\n selecionavel: boolean;\n isFilho?: boolean;\n}\n\nexport interface FilterOptionGroup {\n label: string;\n /** Quando presente, o cabeçalho do grupo também é selecionável */\n value?: string;\n options: { value: string; label: string }[];\n}\n\nexport interface FilterField {\n value: string;\n label: string;\n type?: \"text\" | \"number\" | \"select\" | \"date\";\n options?: { value: string; label: string }[]; // Para campos select\n /**\n * Opções agrupadas hierarquicamente — mesma forma usada por Combobox e MultiSelect.\n * Use `options` OU `groups`. O cabeçalho só é selecionável quando tem `value`.\n */\n groups?: FilterOptionGroup[];\n multiSelect?: boolean; // Habilitar multi-seleção para este campo\n}\n\nexport interface FilterBuilderProps {\n conditions: FilterCondition[];\n onConditionsChange: (conditions: FilterCondition[]) => void;\n fields: FilterField[];\n className?: string;\n}\n\n// Definições de operadores com suporte a multi-seleção\nconst OPERATORS = [\n { value: \"is\", label: \"é\", multiSelect: false },\n { value: \"is_not\", label: \"não é\", multiSelect: false },\n { value: \"is_any_of\", label: \"é qualquer um de\", multiSelect: true },\n { value: \"is_none_of\", label: \"não é nenhum de\", multiSelect: true },\n { value: \"contains\", label: \"contém\", multiSelect: false },\n { value: \"does_not_contain\", label: \"não contém\", multiSelect: false },\n { value: \"greater_than\", label: \"maior que\", multiSelect: false },\n { value: \"greater_than_or_equal\", label: \"maior ou igual a\", multiSelect: false },\n { value: \"less_than\", label: \"menor que\", multiSelect: false },\n { value: \"less_than_or_equal\", label: \"menor ou igual a\", multiSelect: false },\n { value: \"is_empty\", label: \"está vazio\", multiSelect: false },\n { value: \"is_not_empty\", label: \"não está vazio\", multiSelect: false },\n];\n\nexport function FilterBuilder({\n conditions,\n onConditionsChange,\n fields,\n className,\n}: FilterBuilderProps) {\n const addCondition = () => {\n const newCondition: FilterCondition = {\n id: Math.random().toString(36).substr(2, 9),\n field: fields[0]?.value || \"\",\n operator: \"is\",\n value: \"\",\n };\n onConditionsChange([...conditions, newCondition]);\n };\n\n const removeCondition = (id: string) => {\n onConditionsChange(conditions.filter((c) => c.id !== id));\n };\n\n const updateCondition = (id: string, updates: Partial<FilterCondition>) => {\n onConditionsChange(\n conditions.map((c) => (c.id === id ? { ...c, ...updates } : c))\n );\n };\n\n return (\n <div className={cn(\"space-y-3\", className)}>\n {/* Conditions */}\n {conditions.length === 0 ? (\n <div className=\"text-center py-8 text-muted-foreground text-sm\">\n Nenhuma condição de filtro. Clique em \"Adicionar condição\" para começar.\n </div>\n ) : (\n conditions.map((condition, index) => (\n <ConditionRow\n key={condition.id}\n condition={condition}\n fields={fields}\n index={index}\n onUpdate={(updates) => updateCondition(condition.id, updates)}\n onRemove={() => removeCondition(condition.id)}\n />\n ))\n )}\n\n {/* Add Condition Button */}\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={addCondition}\n className=\"gap-2\"\n >\n <Plus className=\"h-4 w-4\" />\n Adicionar condição\n </Button>\n </div>\n );\n}\n\ninterface ConditionRowProps {\n condition: FilterCondition;\n fields: FilterField[];\n index: number;\n onUpdate: (updates: Partial<FilterCondition>) => void;\n onRemove: () => void;\n}\n\nfunction ConditionRow({\n condition,\n fields,\n index,\n onUpdate,\n onRemove,\n}: ConditionRowProps) {\n const selectedField = fields.find((f) => f.value === condition.field);\n const selectedOperator = OPERATORS.find((op) => op.value === condition.operator);\n \n // Multi-select enabled if field has multiSelect: true OR operator requires it\n const isMultiSelect = selectedField?.multiSelect || selectedOperator?.multiSelect || false;\n const needsValue = ![\"is_empty\", \"is_not_empty\"].includes(condition.operator);\n\n // Search state for filtering options\n const [searchTerm, setSearchTerm] = React.useState(\"\");\n\n // Lista achatada com metadados de hierarquia — unifica `options` e `groups` num único\n // fluxo de renderização, preservando a marcação de cabeçalho e de filho.\n const itensLista = React.useMemo<ListItem[]>(() => {\n if (selectedField?.groups) {\n return selectedField.groups.flatMap((group) => [\n {\n value: group.value ?? `__label__${group.label}`,\n label: group.label,\n isHeader: true,\n selecionavel: Boolean(group.value),\n },\n ...group.options.map((o) => ({\n value: o.value,\n label: o.label,\n isHeader: false,\n selecionavel: true,\n isFilho: true,\n })),\n ]);\n }\n return (selectedField?.options ?? []).map((o) => ({\n value: o.value,\n label: o.label,\n isHeader: false,\n selecionavel: true,\n }));\n }, [selectedField?.options, selectedField?.groups]);\n\n // Busca preservando a hierarquia: casar o cabeçalho mantém todos os seus filhos;\n // casar um filho mantém o cabeçalho como contexto.\n const itensFiltrados = React.useMemo(() => {\n if (!searchTerm) return itensLista;\n\n const termo = searchTerm.toLowerCase();\n const casa = (i: ListItem) =>\n i.label.toLowerCase().includes(termo) || i.value.toLowerCase().includes(termo);\n\n if (!selectedField?.groups) return itensLista.filter(casa);\n\n const resultado: ListItem[] = [];\n let header: ListItem | null = null;\n let headerCasou = false;\n let headerIncluido = false;\n\n for (const item of itensLista) {\n if (item.isHeader) {\n header = item;\n headerCasou = casa(item);\n headerIncluido = false;\n if (headerCasou) {\n resultado.push(item);\n headerIncluido = true;\n }\n continue;\n }\n if (headerCasou || casa(item)) {\n if (!headerIncluido && header) {\n resultado.push(header);\n headerIncluido = true;\n }\n resultado.push(item);\n }\n }\n return resultado;\n }, [itensLista, searchTerm, selectedField?.groups]);\n\n // Convert value to array for multi-select\n const valueAsArray = Array.isArray(condition.value)\n ? condition.value\n : condition.value\n ? [condition.value]\n : [];\n\n const toggleValue = (val: string) => {\n if (!isMultiSelect) {\n onUpdate({ value: val });\n return;\n }\n\n const currentValues = Array.isArray(condition.value) ? condition.value : [];\n const newValues = currentValues.includes(val)\n ? currentValues.filter((v) => v !== val)\n : [...currentValues, val];\n onUpdate({ value: newValues });\n };\n\n const removeValue = (val: string) => {\n if (!isMultiSelect) return;\n const currentValues = Array.isArray(condition.value) ? condition.value : [];\n onUpdate({ value: currentValues.filter((v) => v !== val) });\n };\n\n return (\n <div className=\"flex items-start gap-2 group\">\n {/* Index */}\n <div className=\"flex items-center h-9 px-2 text-sm text-muted-foreground\">\n {index === 0 ? \"Onde\" : \"E\"}\n </div>\n\n {/* Condition Display */}\n <div className=\"flex-1 flex items-center gap-2 flex-wrap p-2 border rounded-lg bg-background\">\n {/* Field Selector */}\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 font-normal hover:bg-muted\"\n >\n {selectedField?.label || \"Selecionar campo\"}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[200px] p-2\" align=\"start\">\n <div className=\"space-y-1\">\n {fields.map((field) => (\n <Button\n key={field.value}\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n \"w-full justify-start\",\n condition.field === field.value && \"bg-muted\"\n )}\n onClick={() => \n onUpdate({ \n field: field.value, \n value: field.multiSelect ? [] : \"\" \n })\n }\n >\n {field.label}\n </Button>\n ))}\n </div>\n </PopoverContent>\n </Popover>\n\n {/* Operator Selector */}\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 font-normal hover:bg-muted text-muted-foreground\"\n >\n {selectedOperator?.label || \"is\"}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[200px] p-2\" align=\"start\">\n <div className=\"space-y-1\">\n {OPERATORS.map((op) => (\n <Button\n key={op.value}\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n \"w-full justify-start\",\n condition.operator === op.value && \"bg-muted\"\n )}\n onClick={() =>\n onUpdate({\n operator: op.value,\n value: op.multiSelect ? [] : \"\",\n })\n }\n >\n {op.label}\n </Button>\n ))}\n </div>\n </PopoverContent>\n </Popover>\n\n {/* Value Selector/Input */}\n {needsValue && (\n <>\n {selectedField?.options || selectedField?.groups ? (\n // Select field with options\n <Popover onOpenChange={(open) => !open && setSearchTerm(\"\")}>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 font-normal hover:bg-muted\"\n >\n {isMultiSelect && valueAsArray.length > 0 ? (\n <span className=\"flex items-center gap-1\">\n {valueAsArray.length} selecionado{valueAsArray.length > 1 ? 's' : ''}\n </span>\n ) : !isMultiSelect && condition.value ? (\n itensLista.find((opt) => opt.value === condition.value)?.label ||\n \"Selecionar valor\"\n ) : (\n \"Selecionar valor\"\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-80 max-w-[calc(100vw-2rem)] p-3\"\n align=\"start\"\n collisionPadding={8}\n >\n <div className=\"space-y-2\">\n <Label className=\"text-xs text-muted-foreground\">\n {isMultiSelect ? \"Selecionar valores\" : \"Selecionar valor\"}\n </Label>\n \n {/* Search Input */}\n <div className=\"relative\">\n <Search className=\"absolute left-2 top-2.5 h-4 w-4 text-muted-foreground\" />\n <Input\n type=\"text\"\n placeholder=\"Buscar...\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n className=\"h-9 pl-8\"\n autoFocus\n />\n </div>\n \n {/* Filtered Options */}\n <div className=\"space-y-2 max-h-[320px] overflow-y-auto overflow-x-hidden\">\n {(() => {\n if (itensFiltrados.length === 0) {\n return (\n <div className=\"text-sm text-muted-foreground text-center py-4\">\n Nenhum resultado encontrado\n </div>\n );\n }\n\n return itensFiltrados.map((option) => {\n // Cabeçalho de grupo sem `value` — apenas rótulo visual\n if (option.isHeader && !option.selecionavel) {\n return (\n <div\n key={option.value}\n title={option.label}\n className=\"truncate pt-1 text-xs font-semibold uppercase tracking-wide text-muted-foreground\"\n >\n {option.label}\n </div>\n );\n }\n\n const isSelected = isMultiSelect\n ? valueAsArray.includes(option.value)\n : condition.value === option.value;\n\n return (\n <div\n key={option.value}\n className={cn(\n \"flex min-w-0 items-center space-x-2\",\n option.isFilho && \"pl-4\"\n )}\n >\n {isMultiSelect ? (\n <>\n <Checkbox\n id={`${condition.id}-${option.value}`}\n checked={isSelected}\n onCheckedChange={() =>\n toggleValue(option.value)\n }\n />\n <label\n htmlFor={`${condition.id}-${option.value}`}\n title={option.label}\n className={cn(\n \"min-w-0 flex-1 cursor-pointer truncate text-sm\",\n option.isHeader && \"font-semibold uppercase tracking-wide\"\n )}\n >\n {option.label}\n </label>\n </>\n ) : (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n title={option.label}\n className={cn(\n \"w-full min-w-0 justify-start\",\n option.isHeader && \"font-semibold uppercase tracking-wide\",\n isSelected && \"bg-muted\"\n )}\n onClick={() => onUpdate({ value: option.value })}\n >\n <span className=\"truncate\">{option.label}</span>\n </Button>\n )}\n </div>\n );\n });\n })()}\n </div>\n </div>\n </PopoverContent>\n </Popover>\n ) : selectedField?.type === \"date\" ? (\n // Date picker\n <DatePicker\n value={condition.value ? new Date(condition.value + 'T00:00:00') : undefined}\n onChange={(date) => {\n if (date) {\n // Formato ISO (YYYY-MM-DD)\n const isoDate = date.toISOString().split('T')[0];\n onUpdate({ value: isoDate });\n } else {\n onUpdate({ value: '' });\n }\n }}\n placeholder=\"Selecionar data\"\n className=\"h-7 text-sm\"\n />\n ) : (\n // Text/Number input\n <Popover>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2 font-normal hover:bg-muted max-w-[200px] truncate\"\n >\n {condition.value || \"Inserir valor\"}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-[240px] p-3\" align=\"start\">\n <div className=\"space-y-2\">\n <Label className=\"text-xs text-muted-foreground\">\n Inserir valor\n </Label>\n <Input\n type={selectedField?.type === \"number\" ? \"number\" : \"text\"}\n value={\n Array.isArray(condition.value) ? \"\" : condition.value\n }\n onChange={(e) => onUpdate({ value: e.target.value })}\n placeholder=\"Digite o valor...\"\n autoFocus\n />\n </div>\n </PopoverContent>\n </Popover>\n )}\n\n {/* Multi-select chips */}\n {isMultiSelect && valueAsArray.length > 0 && (\n <div className=\"flex items-center gap-1 flex-wrap\">\n {valueAsArray.map((val) => {\n // itensLista ja cobre `options` e `groups` (inclusive o cabecalho\n // selecionavel do grupo). Buscar so em `options` fazia o badge de um campo\n // hierarquico exibir o value cru — \"g-2\" no lugar do nome do grupo.\n const optionLabel =\n itensLista.find((item) => item.value === val)?.label || val;\n return (\n <Badge\n key={val}\n variant=\"secondary\"\n className=\"gap-1 h-6 text-xs\"\n >\n {optionLabel}\n <button\n type=\"button\"\n onClick={() => removeValue(val)}\n className=\"ml-1 rounded-sm hover:bg-muted p-0.5 transition-colors\"\n aria-label={`Remover ${optionLabel}`}\n >\n <X className=\"h-3 w-3\" />\n </button>\n </Badge>\n );\n })}\n </div>\n )}\n </>\n )}\n </div>\n\n {/* Remove Button */}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={onRemove}\n className=\"h-9 w-9 p-0 opacity-100 md:opacity-0 md:group-hover:opacity-100 md:group-focus-within:opacity-100 transition-opacity\"\n aria-label=\"Remover condição\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n );\n}"],"names":["OPERATORS","FilterBuilder","conditions","onConditionsChange","fields","className","addCondition","newCondition","_a","removeCondition","id","c","updateCondition","updates","cn","jsx","condition","index","ConditionRow","jsxs","Button","Plus","onUpdate","onRemove","selectedField","f","selectedOperator","op","isMultiSelect","needsValue","searchTerm","setSearchTerm","React","itensLista","group","o","itensFiltrados","termo","casa","i","resultado","header","headerCasou","headerIncluido","item","valueAsArray","toggleValue","val","currentValues","newValues","v","removeValue","Popover","PopoverTrigger","PopoverContent","field","Fragment","open","opt","Label","Search","Input","option","isSelected","Checkbox","DatePicker","date","isoDate","optionLabel","Badge","X"],"mappings":"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"}
|
|
@@ -365,7 +365,7 @@ function E({
|
|
|
365
365
|
variant: "ghost",
|
|
366
366
|
size: "sm",
|
|
367
367
|
onClick: _,
|
|
368
|
-
className: "h-9 w-9 p-0 opacity-0 group-hover:opacity-100 transition-opacity",
|
|
368
|
+
className: "h-9 w-9 p-0 opacity-100 md:opacity-0 md:group-hover:opacity-100 md:group-focus-within:opacity-100 transition-opacity",
|
|
369
369
|
"aria-label": "Remover condição",
|
|
370
370
|
children: /* @__PURE__ */ l(P, { className: "h-4 w-4" })
|
|
371
371
|
}
|