@moontra/moonui-pro 2.4.0 → 2.4.2

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/dist/index.d.ts CHANGED
@@ -1541,6 +1541,13 @@ interface BulkAction<T = any> {
1541
1541
  */
1542
1542
  type ExportFormat = 'csv' | 'json' | 'xlsx';
1543
1543
 
1544
+ interface FilterCondition {
1545
+ column: string;
1546
+ operator: FilterOperator;
1547
+ value: any;
1548
+ }
1549
+ type FilterOperator = 'equals' | 'notEquals' | 'contains' | 'notContains' | 'startsWith' | 'endsWith' | 'greaterThan' | 'lessThan' | 'greaterThanOrEqual' | 'lessThanOrEqual' | 'between' | 'in' | 'notIn' | 'isNull' | 'isNotNull';
1550
+
1544
1551
  interface DataTableProps<TData, TValue> {
1545
1552
  columns: ColumnDef<TData, TValue>[];
1546
1553
  data: TData[];
@@ -1610,7 +1617,7 @@ interface DataTableProps<TData, TValue> {
1610
1617
  filterButton?: string;
1611
1618
  };
1612
1619
  }
1613
- declare function DataTable<TData, TValue>({ columns, data, searchable, filterable, exportable, selectable, pagination, pageSize, className, onRowSelect, onExport, enableExpandable, renderSubComponent, expandedRows: controlledExpandedRows, onRowExpandChange, bulkActions, features, theme, texts, enableSorting, enableFiltering, enablePagination, enableColumnVisibility, enableRowSelection, filterPlaceholder, defaultPageSize, manualPagination, pageCount, onPaginationChange, onSortingChange, onColumnFiltersChange, state: externalState, }: DataTableProps<TData, TValue>): react_jsx_runtime.JSX.Element;
1620
+ declare function DataTable<TData, TValue>({ columns: originalColumns, data, searchable, filterable, exportable, selectable, pagination, pageSize, className, onRowSelect, onExport, enableExpandable, renderSubComponent, expandedRows: controlledExpandedRows, onRowExpandChange, bulkActions, features, theme, texts, enableSorting, enableFiltering, enablePagination, enableColumnVisibility, enableRowSelection, filterPlaceholder, defaultPageSize, manualPagination, pageCount, onPaginationChange, onSortingChange, onColumnFiltersChange, state: externalState, }: DataTableProps<TData, TValue>): react_jsx_runtime.JSX.Element;
1614
1621
  /**
1615
1622
  * Helper function to create an expandable column
1616
1623
  * @param expandedRows - Set of expanded row IDs
@@ -1748,4 +1755,4 @@ declare namespace index {
1748
1755
  };
1749
1756
  }
1750
1757
 
1751
- export { MoonUIAccordionPro as Accordion, MoonUIAccordionContentPro as AccordionContent, MoonUIAccordionItemPro as AccordionItem, MoonUIAccordionTriggerPro as AccordionTrigger, AdvancedChart, AdvancedFormField, AdvancedForms, AdvancedFormsProps, MoonUIAlertPro as Alert, MoonUIAlertDescriptionPro as AlertDescription, MoonUIAlertTitlePro as AlertTitle, AnimatedButton, AnimatedButtonProps, MoonUIAspectRatioPro as AspectRatio, MoonUIAvatarPro as Avatar, MoonUIAvatarFallbackPro as AvatarFallback, MoonUIAvatarImagePro as AvatarImage, MoonUIBadgePro as Badge, MoonUIBreadcrumbPro as Breadcrumb, MoonUIBreadcrumbEllipsisPro as BreadcrumbEllipsis, MoonUIBreadcrumbItemPro as BreadcrumbItem, MoonUIBreadcrumbLinkPro as BreadcrumbLink, MoonUIBreadcrumbListPro as BreadcrumbList, MoonUIBreadcrumbPagePro as BreadcrumbPage, MoonUIBreadcrumbSeparatorPro as BreadcrumbSeparator, BulkAction, MoonUIButtonPro as Button, Calendar, CalendarEvent, MoonUICardPro as Card, MoonUICardContentPro as CardContent, MoonUICardDescriptionPro as CardDescription, MoonUICardFooterPro as CardFooter, MoonUICardHeaderPro as CardHeader, MoonUICardTitlePro as CardTitle, ChartType, MoonUICheckboxPro as Checkbox, MoonUICollapsiblePro as Collapsible, MoonUICollapsibleContentPro as CollapsibleContent, MoonUICollapsibleTriggerPro as CollapsibleTrigger, MoonUIColorPickerPro as ColorPicker, MoonUICommandPro as Command, MoonUICommandDialogPro as CommandDialog, MoonUICommandEmptyPro as CommandEmpty, MoonUICommandGroupPro as CommandGroup, MoonUICommandInputPro as CommandInput, MoonUICommandItemPro as CommandItem, MoonUICommandListPro as CommandList, MoonUICommandSeparatorPro as CommandSeparator, MoonUICommandShortcutPro as CommandShortcut, Dashboard, DataTable, MoonUIDialogPro as Dialog, MoonUIDialogClosePro as DialogClose, MoonUIDialogContentPro as DialogContent, MoonUIDialogDescriptionPro as DialogDescription, MoonUIDialogFooterPro as DialogFooter, MoonUIDialogHeaderPro as DialogHeader, MoonUIDialogTitlePro as DialogTitle, MoonUIDialogTriggerPro as DialogTrigger, DraggableList, DraggableListProps, MoonUIDropdownMenuPro as DropdownMenu, MoonUIDropdownMenuCheckboxItemPro as DropdownMenuCheckboxItem, MoonUIDropdownMenuContentPro as DropdownMenuContent, MoonUIDropdownMenuGroupPro as DropdownMenuGroup, MoonUIDropdownMenuItemPro as DropdownMenuItem, MoonUIDropdownMenuLabelPro as DropdownMenuLabel, MoonUIDropdownMenuPortalPro as DropdownMenuPortal, MoonUIDropdownMenuRadioGroupPro as DropdownMenuRadioGroup, MoonUIDropdownMenuRadioItemPro as DropdownMenuRadioItem, MoonUIDropdownMenuSeparatorPro as DropdownMenuSeparator, MoonUIDropdownMenuShortcutPro as DropdownMenuShortcut, MoonUIDropdownMenuSubPro as DropdownMenuSub, MoonUIDropdownMenuSubContentPro as DropdownMenuSubContent, MoonUIDropdownMenuSubTriggerPro as DropdownMenuSubTrigger, MoonUIDropdownMenuTriggerPro as DropdownMenuTrigger, index as Enhanced, ErrorBoundary, ExportFormat, FileUpload, FloatingActionButton, FloatingActionButtonProps, GitHubRepository, GitHubStars, GitHubStarsProps, HealthCheck, HealthCheckEndpoint, HealthCheckProps, HealthCheckResult, HoverCard3D, HoverCard3DProps, MoonUIInputPro as Input, Kanban, MoonUILabelPro as Label, LazyComponent, LazyImage, LazyImageProps, LazyList, LazyListProps, MagneticButton, MagneticButtonProps, MemoryAnalytics, MemoryAnalyticsProps, MemoryConfig, MemoryEfficientData, MemoryEfficientDataProps, MemoryStats, MoonUIAccordionContentPro, MoonUIAccordionItemPro, MoonUIAccordionPro, MoonUIAccordionTriggerPro, MoonUIAlertDescriptionPro, MoonUIAlertPro, MoonUIAlertTitlePro, MoonUIAspectRatioPro, MoonUIAvatarFallbackPro, MoonUIAvatarImagePro, MoonUIAvatarPro, MoonUIBadgePro, MoonUIBreadcrumbEllipsisPro, MoonUIBreadcrumbItemPro, MoonUIBreadcrumbLinkPro, MoonUIBreadcrumbListPro, MoonUIBreadcrumbPagePro, MoonUIBreadcrumbPro, MoonUIBreadcrumbSeparatorPro, MoonUIButtonPro, MoonUICardContentPro, MoonUICardDescriptionPro, MoonUICardFooterPro, MoonUICardHeaderPro, MoonUICardPro, MoonUICardTitlePro, MoonUICheckboxPro, MoonUICollapsibleContentPro, MoonUICollapsiblePro, MoonUICollapsibleTriggerPro, MoonUIColorPickerPro, MoonUICommandDialogPro, MoonUICommandEmptyPro, MoonUICommandGroupPro, MoonUICommandInputPro, MoonUICommandItemPro, MoonUICommandListPro, MoonUICommandPro, MoonUICommandSeparatorPro, MoonUICommandShortcutPro, MoonUIDialogClosePro, MoonUIDialogContentPro, MoonUIDialogDescriptionPro, MoonUIDialogFooterPro, MoonUIDialogHeaderPro, MoonUIDialogPro, MoonUIDialogTitlePro, MoonUIDialogTriggerPro, MoonUIDropdownMenuCheckboxItemPro, MoonUIDropdownMenuContentPro, MoonUIDropdownMenuGroupPro, MoonUIDropdownMenuItemPro, MoonUIDropdownMenuLabelPro, MoonUIDropdownMenuPortalPro, MoonUIDropdownMenuPro, MoonUIDropdownMenuRadioGroupPro, MoonUIDropdownMenuRadioItemPro, MoonUIDropdownMenuSeparatorPro, MoonUIDropdownMenuShortcutPro, MoonUIDropdownMenuSubContentPro, MoonUIDropdownMenuSubPro, MoonUIDropdownMenuSubTriggerPro, MoonUIDropdownMenuTriggerPro, MoonUIInputPro, MoonUILabelPro, MoonUIPaginationContentPro, MoonUIPaginationEllipsisPro, MoonUIPaginationItemPro, MoonUIPaginationLinkPro, MoonUIPaginationNextPro, MoonUIPaginationPreviousPro, MoonUIPaginationPro, MoonUIPopoverContentPro, MoonUIPopoverPro, MoonUIPopoverTriggerPro, MoonUIProgressPro, MoonUIRadioGroupContextPro, MoonUIRadioGroupItemPro, MoonUIRadioGroupPro, MoonUIRadioItemWithLabelPro, MoonUIRadioLabelPro, MoonUISelectContentPro, MoonUISelectGroupPro, MoonUISelectItemPro, MoonUISelectLabelPro, MoonUISelectPro, MoonUISelectSeparatorPro, MoonUISelectTriggerPro, MoonUISelectValuePro, MoonUISeparatorPro, MoonUISkeletonPro, MoonUISliderPro, MoonUISwitchPro, MoonUITableBodyPro, MoonUITableCaptionPro, MoonUITableCellPro, MoonUITableFooterPro, MoonUITableHeadPro, MoonUITableHeaderPro, MoonUITablePro, MoonUITableRowPro, MoonUITabsContentPro, MoonUITabsListPro, MoonUITabsPro, MoonUITabsTriggerPro, MoonUITextareaPro, MoonUIToastPro, MoonUITogglePro, MoonUITooltipContentPro, MoonUITooltipPro, MoonUITooltipProviderPro, MoonUITooltipTriggerPro, MoonUIalertVariantsPro, MoonUIaspectRatioVariantsPro, MoonUIbreadcrumbVariantsPro, MoonUIcollapsibleContentVariantsPro, MoonUIcollapsibleTriggerVariantsPro, MoonUIcommandVariantsPro, MoonUIradioGroupItemVariantsPro, MoonUItableVariantsPro, MoonUItoggleVariantsPro, OptimizedImage, OptimizedImageProps, MoonUIPaginationPro as Pagination, MoonUIPaginationContentPro as PaginationContent, MoonUIPaginationEllipsisPro as PaginationEllipsis, MoonUIPaginationItemPro as PaginationItem, MoonUIPaginationLinkPro as PaginationLink, MoonUIPaginationNextPro as PaginationNext, MoonUIPaginationPreviousPro as PaginationPrevious, PerformanceAlert, PerformanceDebugger, PerformanceDebuggerProps, PerformanceEntry, PerformanceMetric, PerformanceMetrics, PerformanceMonitor, PerformanceMonitorProps, PinchZoom, MoonUIPopoverPro as Popover, MoonUIPopoverContentPro as PopoverContent, MoonUIPopoverTriggerPro as PopoverTrigger, MoonUIProgressPro as Progress, MoonUIRadioGroupPro as RadioGroup, MoonUIRadioGroupContextPro as RadioGroupContext, MoonUIRadioGroupItemPro as RadioGroupItem, MoonUIRadioItemWithLabelPro as RadioItemWithLabel, MoonUIRadioLabelPro as RadioLabel, RichTextEditor, MoonUISelectPro as Select, MoonUISelectContentPro as SelectContent, MoonUISelectGroupPro as SelectGroup, MoonUISelectItemPro as SelectItem, MoonUISelectLabelPro as SelectLabel, MoonUISelectSeparatorPro as SelectSeparator, MoonUISelectTriggerPro as SelectTrigger, MoonUISelectValuePro as SelectValue, SelectableVirtualList, SelectableVirtualListProps, MoonUISeparatorPro as Separator, MoonUISkeletonPro as Skeleton, MoonUISliderPro as Slider, SpotlightCard, SpotlightCardProps, SwipeableCard, MoonUISwitchPro as Switch, MoonUITablePro as Table, MoonUITableBodyPro as TableBody, MoonUITableCaptionPro as TableCaption, MoonUITableCellPro as TableCell, MoonUITableFooterPro as TableFooter, MoonUITableHeadPro as TableHead, MoonUITableHeaderPro as TableHeader, MoonUITableRowPro as TableRow, MoonUITabsPro as Tabs, MoonUITabsContentPro as TabsContent, MoonUITabsListPro as TabsList, MoonUITabsTriggerPro as TabsTrigger, MoonUITextareaPro as Textarea, Timeline, MoonUIToastPro as Toast, MoonUITogglePro as Toggle, MoonUITooltipPro as Tooltip, MoonUITooltipContentPro as TooltipContent, MoonUITooltipProviderPro as TooltipProvider, MoonUITooltipTriggerPro as TooltipTrigger, VirtualList, VirtualListProps, MoonUIalertVariantsPro as alertVariants, animatedButtonVariants, MoonUIaspectRatioVariantsPro as aspectRatioVariants, moonUIBadgeVariantsPro as badgeVariants, MoonUIbreadcrumbVariantsPro as breadcrumbVariants, moonUIButtonProVariants as buttonVariants, cn, MoonUIcollapsibleContentVariantsPro as collapsibleContentVariants, MoonUIcollapsibleTriggerVariantsPro as collapsibleTriggerVariants, MoonUIcommandVariantsPro as commandVariants, getExpandableColumn, moonUIBadgeVariantsPro, moonUIButtonProVariants, moonUISeparatorVariantsPro, MoonUIradioGroupItemVariantsPro as radioGroupItemVariants, moonUISeparatorVariantsPro as separatorVariants, MoonUItableVariantsPro as tableVariants, MoonUItoggleVariantsPro as toggleVariants, useExpandableRows, useStreamingData, useVirtualList };
1758
+ export { MoonUIAccordionPro as Accordion, MoonUIAccordionContentPro as AccordionContent, MoonUIAccordionItemPro as AccordionItem, MoonUIAccordionTriggerPro as AccordionTrigger, AdvancedChart, AdvancedFormField, AdvancedForms, AdvancedFormsProps, MoonUIAlertPro as Alert, MoonUIAlertDescriptionPro as AlertDescription, MoonUIAlertTitlePro as AlertTitle, AnimatedButton, AnimatedButtonProps, MoonUIAspectRatioPro as AspectRatio, MoonUIAvatarPro as Avatar, MoonUIAvatarFallbackPro as AvatarFallback, MoonUIAvatarImagePro as AvatarImage, MoonUIBadgePro as Badge, MoonUIBreadcrumbPro as Breadcrumb, MoonUIBreadcrumbEllipsisPro as BreadcrumbEllipsis, MoonUIBreadcrumbItemPro as BreadcrumbItem, MoonUIBreadcrumbLinkPro as BreadcrumbLink, MoonUIBreadcrumbListPro as BreadcrumbList, MoonUIBreadcrumbPagePro as BreadcrumbPage, MoonUIBreadcrumbSeparatorPro as BreadcrumbSeparator, BulkAction, MoonUIButtonPro as Button, Calendar, CalendarEvent, MoonUICardPro as Card, MoonUICardContentPro as CardContent, MoonUICardDescriptionPro as CardDescription, MoonUICardFooterPro as CardFooter, MoonUICardHeaderPro as CardHeader, MoonUICardTitlePro as CardTitle, ChartType, MoonUICheckboxPro as Checkbox, MoonUICollapsiblePro as Collapsible, MoonUICollapsibleContentPro as CollapsibleContent, MoonUICollapsibleTriggerPro as CollapsibleTrigger, MoonUIColorPickerPro as ColorPicker, MoonUICommandPro as Command, MoonUICommandDialogPro as CommandDialog, MoonUICommandEmptyPro as CommandEmpty, MoonUICommandGroupPro as CommandGroup, MoonUICommandInputPro as CommandInput, MoonUICommandItemPro as CommandItem, MoonUICommandListPro as CommandList, MoonUICommandSeparatorPro as CommandSeparator, MoonUICommandShortcutPro as CommandShortcut, Dashboard, DataTable, MoonUIDialogPro as Dialog, MoonUIDialogClosePro as DialogClose, MoonUIDialogContentPro as DialogContent, MoonUIDialogDescriptionPro as DialogDescription, MoonUIDialogFooterPro as DialogFooter, MoonUIDialogHeaderPro as DialogHeader, MoonUIDialogTitlePro as DialogTitle, MoonUIDialogTriggerPro as DialogTrigger, DraggableList, DraggableListProps, MoonUIDropdownMenuPro as DropdownMenu, MoonUIDropdownMenuCheckboxItemPro as DropdownMenuCheckboxItem, MoonUIDropdownMenuContentPro as DropdownMenuContent, MoonUIDropdownMenuGroupPro as DropdownMenuGroup, MoonUIDropdownMenuItemPro as DropdownMenuItem, MoonUIDropdownMenuLabelPro as DropdownMenuLabel, MoonUIDropdownMenuPortalPro as DropdownMenuPortal, MoonUIDropdownMenuRadioGroupPro as DropdownMenuRadioGroup, MoonUIDropdownMenuRadioItemPro as DropdownMenuRadioItem, MoonUIDropdownMenuSeparatorPro as DropdownMenuSeparator, MoonUIDropdownMenuShortcutPro as DropdownMenuShortcut, MoonUIDropdownMenuSubPro as DropdownMenuSub, MoonUIDropdownMenuSubContentPro as DropdownMenuSubContent, MoonUIDropdownMenuSubTriggerPro as DropdownMenuSubTrigger, MoonUIDropdownMenuTriggerPro as DropdownMenuTrigger, index as Enhanced, ErrorBoundary, ExportFormat, FileUpload, FilterCondition, FilterOperator, FloatingActionButton, FloatingActionButtonProps, GitHubRepository, GitHubStars, GitHubStarsProps, HealthCheck, HealthCheckEndpoint, HealthCheckProps, HealthCheckResult, HoverCard3D, HoverCard3DProps, MoonUIInputPro as Input, Kanban, MoonUILabelPro as Label, LazyComponent, LazyImage, LazyImageProps, LazyList, LazyListProps, MagneticButton, MagneticButtonProps, MemoryAnalytics, MemoryAnalyticsProps, MemoryConfig, MemoryEfficientData, MemoryEfficientDataProps, MemoryStats, MoonUIAccordionContentPro, MoonUIAccordionItemPro, MoonUIAccordionPro, MoonUIAccordionTriggerPro, MoonUIAlertDescriptionPro, MoonUIAlertPro, MoonUIAlertTitlePro, MoonUIAspectRatioPro, MoonUIAvatarFallbackPro, MoonUIAvatarImagePro, MoonUIAvatarPro, MoonUIBadgePro, MoonUIBreadcrumbEllipsisPro, MoonUIBreadcrumbItemPro, MoonUIBreadcrumbLinkPro, MoonUIBreadcrumbListPro, MoonUIBreadcrumbPagePro, MoonUIBreadcrumbPro, MoonUIBreadcrumbSeparatorPro, MoonUIButtonPro, MoonUICardContentPro, MoonUICardDescriptionPro, MoonUICardFooterPro, MoonUICardHeaderPro, MoonUICardPro, MoonUICardTitlePro, MoonUICheckboxPro, MoonUICollapsibleContentPro, MoonUICollapsiblePro, MoonUICollapsibleTriggerPro, MoonUIColorPickerPro, MoonUICommandDialogPro, MoonUICommandEmptyPro, MoonUICommandGroupPro, MoonUICommandInputPro, MoonUICommandItemPro, MoonUICommandListPro, MoonUICommandPro, MoonUICommandSeparatorPro, MoonUICommandShortcutPro, MoonUIDialogClosePro, MoonUIDialogContentPro, MoonUIDialogDescriptionPro, MoonUIDialogFooterPro, MoonUIDialogHeaderPro, MoonUIDialogPro, MoonUIDialogTitlePro, MoonUIDialogTriggerPro, MoonUIDropdownMenuCheckboxItemPro, MoonUIDropdownMenuContentPro, MoonUIDropdownMenuGroupPro, MoonUIDropdownMenuItemPro, MoonUIDropdownMenuLabelPro, MoonUIDropdownMenuPortalPro, MoonUIDropdownMenuPro, MoonUIDropdownMenuRadioGroupPro, MoonUIDropdownMenuRadioItemPro, MoonUIDropdownMenuSeparatorPro, MoonUIDropdownMenuShortcutPro, MoonUIDropdownMenuSubContentPro, MoonUIDropdownMenuSubPro, MoonUIDropdownMenuSubTriggerPro, MoonUIDropdownMenuTriggerPro, MoonUIInputPro, MoonUILabelPro, MoonUIPaginationContentPro, MoonUIPaginationEllipsisPro, MoonUIPaginationItemPro, MoonUIPaginationLinkPro, MoonUIPaginationNextPro, MoonUIPaginationPreviousPro, MoonUIPaginationPro, MoonUIPopoverContentPro, MoonUIPopoverPro, MoonUIPopoverTriggerPro, MoonUIProgressPro, MoonUIRadioGroupContextPro, MoonUIRadioGroupItemPro, MoonUIRadioGroupPro, MoonUIRadioItemWithLabelPro, MoonUIRadioLabelPro, MoonUISelectContentPro, MoonUISelectGroupPro, MoonUISelectItemPro, MoonUISelectLabelPro, MoonUISelectPro, MoonUISelectSeparatorPro, MoonUISelectTriggerPro, MoonUISelectValuePro, MoonUISeparatorPro, MoonUISkeletonPro, MoonUISliderPro, MoonUISwitchPro, MoonUITableBodyPro, MoonUITableCaptionPro, MoonUITableCellPro, MoonUITableFooterPro, MoonUITableHeadPro, MoonUITableHeaderPro, MoonUITablePro, MoonUITableRowPro, MoonUITabsContentPro, MoonUITabsListPro, MoonUITabsPro, MoonUITabsTriggerPro, MoonUITextareaPro, MoonUIToastPro, MoonUITogglePro, MoonUITooltipContentPro, MoonUITooltipPro, MoonUITooltipProviderPro, MoonUITooltipTriggerPro, MoonUIalertVariantsPro, MoonUIaspectRatioVariantsPro, MoonUIbreadcrumbVariantsPro, MoonUIcollapsibleContentVariantsPro, MoonUIcollapsibleTriggerVariantsPro, MoonUIcommandVariantsPro, MoonUIradioGroupItemVariantsPro, MoonUItableVariantsPro, MoonUItoggleVariantsPro, OptimizedImage, OptimizedImageProps, MoonUIPaginationPro as Pagination, MoonUIPaginationContentPro as PaginationContent, MoonUIPaginationEllipsisPro as PaginationEllipsis, MoonUIPaginationItemPro as PaginationItem, MoonUIPaginationLinkPro as PaginationLink, MoonUIPaginationNextPro as PaginationNext, MoonUIPaginationPreviousPro as PaginationPrevious, PerformanceAlert, PerformanceDebugger, PerformanceDebuggerProps, PerformanceEntry, PerformanceMetric, PerformanceMetrics, PerformanceMonitor, PerformanceMonitorProps, PinchZoom, MoonUIPopoverPro as Popover, MoonUIPopoverContentPro as PopoverContent, MoonUIPopoverTriggerPro as PopoverTrigger, MoonUIProgressPro as Progress, MoonUIRadioGroupPro as RadioGroup, MoonUIRadioGroupContextPro as RadioGroupContext, MoonUIRadioGroupItemPro as RadioGroupItem, MoonUIRadioItemWithLabelPro as RadioItemWithLabel, MoonUIRadioLabelPro as RadioLabel, RichTextEditor, MoonUISelectPro as Select, MoonUISelectContentPro as SelectContent, MoonUISelectGroupPro as SelectGroup, MoonUISelectItemPro as SelectItem, MoonUISelectLabelPro as SelectLabel, MoonUISelectSeparatorPro as SelectSeparator, MoonUISelectTriggerPro as SelectTrigger, MoonUISelectValuePro as SelectValue, SelectableVirtualList, SelectableVirtualListProps, MoonUISeparatorPro as Separator, MoonUISkeletonPro as Skeleton, MoonUISliderPro as Slider, SpotlightCard, SpotlightCardProps, SwipeableCard, MoonUISwitchPro as Switch, MoonUITablePro as Table, MoonUITableBodyPro as TableBody, MoonUITableCaptionPro as TableCaption, MoonUITableCellPro as TableCell, MoonUITableFooterPro as TableFooter, MoonUITableHeadPro as TableHead, MoonUITableHeaderPro as TableHeader, MoonUITableRowPro as TableRow, MoonUITabsPro as Tabs, MoonUITabsContentPro as TabsContent, MoonUITabsListPro as TabsList, MoonUITabsTriggerPro as TabsTrigger, MoonUITextareaPro as Textarea, Timeline, MoonUIToastPro as Toast, MoonUITogglePro as Toggle, MoonUITooltipPro as Tooltip, MoonUITooltipContentPro as TooltipContent, MoonUITooltipProviderPro as TooltipProvider, MoonUITooltipTriggerPro as TooltipTrigger, VirtualList, VirtualListProps, MoonUIalertVariantsPro as alertVariants, animatedButtonVariants, MoonUIaspectRatioVariantsPro as aspectRatioVariants, moonUIBadgeVariantsPro as badgeVariants, MoonUIbreadcrumbVariantsPro as breadcrumbVariants, moonUIButtonProVariants as buttonVariants, cn, MoonUIcollapsibleContentVariantsPro as collapsibleContentVariants, MoonUIcollapsibleTriggerVariantsPro as collapsibleTriggerVariants, MoonUIcommandVariantsPro as commandVariants, getExpandableColumn, moonUIBadgeVariantsPro, moonUIButtonProVariants, moonUISeparatorVariantsPro, MoonUIradioGroupItemVariantsPro as radioGroupItemVariants, moonUISeparatorVariantsPro as separatorVariants, MoonUItableVariantsPro as tableVariants, MoonUItoggleVariantsPro as toggleVariants, useExpandableRows, useStreamingData, useVirtualList };
package/dist/index.mjs CHANGED
@@ -3791,7 +3791,7 @@ var me = t.forwardRef((r2, o) => {
3791
3791
  var e;
3792
3792
  return Array.from(((e = I.current) == null ? void 0 : e.querySelectorAll(ce)) || []);
3793
3793
  }
3794
- function X12(e) {
3794
+ function X13(e) {
3795
3795
  let s = V()[e];
3796
3796
  s && E.setState("value", s.getAttribute(T));
3797
3797
  }
@@ -3806,10 +3806,10 @@ var me = t.forwardRef((r2, o) => {
3806
3806
  s = e > 0 ? we(s, N) : De(s, N), i = s == null ? void 0 : s.querySelector(ce);
3807
3807
  i ? E.setState("value", i.getAttribute(T)) : Q(e);
3808
3808
  }
3809
- let oe = () => X12(V().length - 1), ie3 = (e) => {
3809
+ let oe = () => X13(V().length - 1), ie3 = (e) => {
3810
3810
  e.preventDefault(), e.metaKey ? oe() : e.altKey ? re(1) : Q(1);
3811
3811
  }, se = (e) => {
3812
- e.preventDefault(), e.metaKey ? X12(0) : e.altKey ? re(-1) : Q(-1);
3812
+ e.preventDefault(), e.metaKey ? X13(0) : e.altKey ? re(-1) : Q(-1);
3813
3813
  };
3814
3814
  return t.createElement(Primitive2.div, { ref: o, tabIndex: -1, ...O, "cmdk-root": "", onKeyDown: (e) => {
3815
3815
  var s;
@@ -3836,7 +3836,7 @@ var me = t.forwardRef((r2, o) => {
3836
3836
  break;
3837
3837
  }
3838
3838
  case "Home": {
3839
- e.preventDefault(), X12(0);
3839
+ e.preventDefault(), X13(0);
3840
3840
  break;
3841
3841
  }
3842
3842
  case "End": {
@@ -52710,8 +52710,340 @@ function getVisibleColumns(columns, columnVisibility) {
52710
52710
  return key && columnVisibility[key] !== false;
52711
52711
  }).map((col) => col.id || col.accessorKey).filter(Boolean);
52712
52712
  }
52713
- function DataTable({
52713
+ var operatorLabels = {
52714
+ equals: "Equals",
52715
+ notEquals: "Not equals",
52716
+ contains: "Contains",
52717
+ notContains: "Not contains",
52718
+ startsWith: "Starts with",
52719
+ endsWith: "Ends with",
52720
+ greaterThan: "Greater than",
52721
+ lessThan: "Less than",
52722
+ greaterThanOrEqual: "Greater than or equal",
52723
+ lessThanOrEqual: "Less than or equal",
52724
+ between: "Between",
52725
+ in: "In",
52726
+ notIn: "Not in",
52727
+ isNull: "Is empty",
52728
+ isNotNull: "Is not empty"
52729
+ };
52730
+ function getOperatorsForColumnType(columnType) {
52731
+ switch (columnType) {
52732
+ case "number":
52733
+ return ["equals", "notEquals", "greaterThan", "lessThan", "greaterThanOrEqual", "lessThanOrEqual", "between", "isNull", "isNotNull"];
52734
+ case "date":
52735
+ return ["equals", "notEquals", "greaterThan", "lessThan", "greaterThanOrEqual", "lessThanOrEqual", "between", "isNull", "isNotNull"];
52736
+ case "boolean":
52737
+ return ["equals", "notEquals", "isNull", "isNotNull"];
52738
+ case "select":
52739
+ return ["equals", "notEquals", "in", "notIn", "isNull", "isNotNull"];
52740
+ default:
52741
+ return ["equals", "notEquals", "contains", "notContains", "startsWith", "endsWith", "isNull", "isNotNull"];
52742
+ }
52743
+ }
52744
+ function DataTableFilterDrawer({
52745
+ table,
52746
+ open,
52747
+ onOpenChange,
52748
+ position = "right",
52749
+ width = "400px",
52750
+ filters: externalFilters,
52751
+ onFiltersChange,
52752
+ customFilters
52753
+ }) {
52754
+ const [internalFilters, setInternalFilters] = useState([]);
52755
+ const [matchAll, setMatchAll] = useState(true);
52756
+ const filters = externalFilters || internalFilters;
52757
+ const setFilters = onFiltersChange || setInternalFilters;
52758
+ const filterableColumns = useMemo(() => {
52759
+ return table.getAllColumns().filter((column) => {
52760
+ if (column.id === "select" || column.id === "actions" || column.id === "expander") {
52761
+ return false;
52762
+ }
52763
+ return column.getCanFilter();
52764
+ });
52765
+ }, [table]);
52766
+ const addFilter = () => {
52767
+ const firstColumn = filterableColumns[0];
52768
+ if (!firstColumn)
52769
+ return;
52770
+ const newFilter = {
52771
+ column: firstColumn.id,
52772
+ operator: "contains",
52773
+ value: ""
52774
+ };
52775
+ setFilters([...filters, newFilter]);
52776
+ };
52777
+ const updateFilter = (index, updates) => {
52778
+ const newFilters = [...filters];
52779
+ newFilters[index] = { ...newFilters[index], ...updates };
52780
+ setFilters(newFilters);
52781
+ };
52782
+ const removeFilter = (index) => {
52783
+ setFilters(filters.filter((_, i) => i !== index));
52784
+ };
52785
+ const clearAllFilters = () => {
52786
+ setFilters([]);
52787
+ table.resetColumnFilters();
52788
+ };
52789
+ const applyFilters = () => {
52790
+ table.resetColumnFilters();
52791
+ filters.forEach((filter) => {
52792
+ const column = table.getColumn(filter.column);
52793
+ if (!column)
52794
+ return;
52795
+ switch (filter.operator) {
52796
+ case "equals":
52797
+ column.setFilterValue(filter.value);
52798
+ break;
52799
+ case "notEquals":
52800
+ column.setFilterValue((value) => value !== filter.value);
52801
+ break;
52802
+ case "contains":
52803
+ column.setFilterValue(
52804
+ (value) => String(value).toLowerCase().includes(String(filter.value).toLowerCase())
52805
+ );
52806
+ break;
52807
+ case "notContains":
52808
+ column.setFilterValue(
52809
+ (value) => !String(value).toLowerCase().includes(String(filter.value).toLowerCase())
52810
+ );
52811
+ break;
52812
+ case "startsWith":
52813
+ column.setFilterValue(
52814
+ (value) => String(value).toLowerCase().startsWith(String(filter.value).toLowerCase())
52815
+ );
52816
+ break;
52817
+ case "endsWith":
52818
+ column.setFilterValue(
52819
+ (value) => String(value).toLowerCase().endsWith(String(filter.value).toLowerCase())
52820
+ );
52821
+ break;
52822
+ case "greaterThan":
52823
+ column.setFilterValue((value) => Number(value) > Number(filter.value));
52824
+ break;
52825
+ case "lessThan":
52826
+ column.setFilterValue((value) => Number(value) < Number(filter.value));
52827
+ break;
52828
+ case "greaterThanOrEqual":
52829
+ column.setFilterValue((value) => Number(value) >= Number(filter.value));
52830
+ break;
52831
+ case "lessThanOrEqual":
52832
+ column.setFilterValue((value) => Number(value) <= Number(filter.value));
52833
+ break;
52834
+ case "isNull":
52835
+ column.setFilterValue((value) => value == null || value === "");
52836
+ break;
52837
+ case "isNotNull":
52838
+ column.setFilterValue((value) => value != null && value !== "");
52839
+ break;
52840
+ }
52841
+ });
52842
+ onOpenChange(false);
52843
+ };
52844
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
52845
+ /* @__PURE__ */ jsx(AnimatePresence, { children: open && /* @__PURE__ */ jsx(
52846
+ motion.div,
52847
+ {
52848
+ initial: { opacity: 0 },
52849
+ animate: { opacity: 1 },
52850
+ exit: { opacity: 0 },
52851
+ className: "fixed inset-0 bg-black/20 z-40",
52852
+ onClick: () => onOpenChange(false)
52853
+ }
52854
+ ) }),
52855
+ /* @__PURE__ */ jsx(AnimatePresence, { children: open && /* @__PURE__ */ jsx(
52856
+ motion.div,
52857
+ {
52858
+ initial: { x: position === "right" ? "100%" : "-100%" },
52859
+ animate: { x: 0 },
52860
+ exit: { x: position === "right" ? "100%" : "-100%" },
52861
+ transition: { type: "spring", damping: 30, stiffness: 300 },
52862
+ className: cn(
52863
+ "fixed top-0 bottom-0 z-50 bg-background border-l shadow-xl",
52864
+ position === "right" ? "right-0" : "left-0"
52865
+ ),
52866
+ style: { width },
52867
+ children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col h-full", children: [
52868
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between p-4 border-b", children: [
52869
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
52870
+ /* @__PURE__ */ jsx(Filter, { className: "h-5 w-5" }),
52871
+ /* @__PURE__ */ jsx("h2", { className: "text-lg font-semibold", children: "Filters" }),
52872
+ filters.length > 0 && /* @__PURE__ */ jsxs("span", { className: "text-sm text-muted-foreground", children: [
52873
+ "(",
52874
+ filters.length,
52875
+ " active)"
52876
+ ] })
52877
+ ] }),
52878
+ /* @__PURE__ */ jsx(
52879
+ MoonUIButtonPro,
52880
+ {
52881
+ variant: "ghost",
52882
+ size: "icon",
52883
+ onClick: () => onOpenChange(false),
52884
+ children: /* @__PURE__ */ jsx(X, { className: "h-4 w-4" })
52885
+ }
52886
+ )
52887
+ ] }),
52888
+ /* @__PURE__ */ jsxs("div", { className: "flex-1 overflow-y-auto p-4", children: [
52889
+ /* @__PURE__ */ jsxs("div", { className: "mb-6", children: [
52890
+ /* @__PURE__ */ jsx(MoonUILabelPro, { className: "text-sm font-medium mb-2 block", children: "Match conditions" }),
52891
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
52892
+ /* @__PURE__ */ jsx(
52893
+ MoonUIButtonPro,
52894
+ {
52895
+ variant: matchAll ? "primary" : "outline",
52896
+ size: "sm",
52897
+ onClick: () => setMatchAll(true),
52898
+ className: "flex-1",
52899
+ children: "Match all"
52900
+ }
52901
+ ),
52902
+ /* @__PURE__ */ jsx(
52903
+ MoonUIButtonPro,
52904
+ {
52905
+ variant: !matchAll ? "primary" : "outline",
52906
+ size: "sm",
52907
+ onClick: () => setMatchAll(false),
52908
+ className: "flex-1",
52909
+ children: "Match any"
52910
+ }
52911
+ )
52912
+ ] })
52913
+ ] }),
52914
+ /* @__PURE__ */ jsx(MoonUISeparatorPro, { className: "mb-6" }),
52915
+ customFilters && /* @__PURE__ */ jsxs(Fragment, { children: [
52916
+ customFilters,
52917
+ /* @__PURE__ */ jsx(MoonUISeparatorPro, { className: "my-6" })
52918
+ ] }),
52919
+ /* @__PURE__ */ jsx("div", { className: "space-y-4", children: filters.map((filter, index) => /* @__PURE__ */ jsx(
52920
+ FilterConditionRow,
52921
+ {
52922
+ filter,
52923
+ columns: filterableColumns,
52924
+ onUpdate: (updates) => updateFilter(index, updates),
52925
+ onRemove: () => removeFilter(index)
52926
+ },
52927
+ index
52928
+ )) }),
52929
+ /* @__PURE__ */ jsxs(
52930
+ MoonUIButtonPro,
52931
+ {
52932
+ variant: "outline",
52933
+ size: "sm",
52934
+ onClick: addFilter,
52935
+ className: "w-full mt-4",
52936
+ children: [
52937
+ /* @__PURE__ */ jsx(Plus, { className: "h-4 w-4 mr-2" }),
52938
+ "Add filter"
52939
+ ]
52940
+ }
52941
+ )
52942
+ ] }),
52943
+ /* @__PURE__ */ jsx("div", { className: "p-4 border-t space-y-2", children: /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
52944
+ /* @__PURE__ */ jsxs(
52945
+ MoonUIButtonPro,
52946
+ {
52947
+ variant: "outline",
52948
+ onClick: clearAllFilters,
52949
+ disabled: filters.length === 0,
52950
+ className: "flex-1",
52951
+ children: [
52952
+ /* @__PURE__ */ jsx(Trash2, { className: "h-4 w-4 mr-2" }),
52953
+ "Clear all"
52954
+ ]
52955
+ }
52956
+ ),
52957
+ /* @__PURE__ */ jsx(MoonUIButtonPro, { onClick: applyFilters, className: "flex-1", children: "Apply filters" })
52958
+ ] }) })
52959
+ ] })
52960
+ }
52961
+ ) })
52962
+ ] });
52963
+ }
52964
+ function FilterConditionRow({
52965
+ filter,
52714
52966
  columns,
52967
+ onUpdate,
52968
+ onRemove
52969
+ }) {
52970
+ const selectedColumn = columns.find((col) => col.id === filter.column);
52971
+ const columnDef = selectedColumn?.columnDef;
52972
+ const columnType = columnDef?.meta?.filterType || "string";
52973
+ const availableOperators = getOperatorsForColumnType(columnType);
52974
+ const needsValue = filter.operator !== "isNull" && filter.operator !== "isNotNull";
52975
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-2 p-3 border rounded-lg bg-muted/30", children: [
52976
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
52977
+ /* @__PURE__ */ jsxs(
52978
+ MoonUISelectPro,
52979
+ {
52980
+ value: filter.column,
52981
+ onValueChange: (value) => onUpdate({ column: value }),
52982
+ children: [
52983
+ /* @__PURE__ */ jsx(MoonUISelectTriggerPro, { className: "flex-1", children: /* @__PURE__ */ jsx(MoonUISelectValuePro, {}) }),
52984
+ /* @__PURE__ */ jsx(MoonUISelectContentPro, { children: columns.map((column) => {
52985
+ const header = column.columnDef.header;
52986
+ const label = typeof header === "function" ? column.id : header || column.id;
52987
+ return /* @__PURE__ */ jsx(MoonUISelectItemPro, { value: column.id, children: label }, column.id);
52988
+ }) })
52989
+ ]
52990
+ }
52991
+ ),
52992
+ /* @__PURE__ */ jsx(
52993
+ MoonUIButtonPro,
52994
+ {
52995
+ variant: "ghost",
52996
+ size: "icon",
52997
+ onClick: onRemove,
52998
+ className: "h-8 w-8",
52999
+ children: /* @__PURE__ */ jsx(X, { className: "h-4 w-4" })
53000
+ }
53001
+ )
53002
+ ] }),
53003
+ /* @__PURE__ */ jsxs(
53004
+ MoonUISelectPro,
53005
+ {
53006
+ value: filter.operator,
53007
+ onValueChange: (value) => onUpdate({ operator: value }),
53008
+ children: [
53009
+ /* @__PURE__ */ jsx(MoonUISelectTriggerPro, { children: /* @__PURE__ */ jsx(MoonUISelectValuePro, {}) }),
53010
+ /* @__PURE__ */ jsx(MoonUISelectContentPro, { children: availableOperators.map((operator2) => /* @__PURE__ */ jsx(MoonUISelectItemPro, { value: operator2, children: operatorLabels[operator2] }, operator2)) })
53011
+ ]
53012
+ }
53013
+ ),
53014
+ needsValue && /* @__PURE__ */ jsx("div", { children: columnType === "boolean" ? /* @__PURE__ */ jsxs(
53015
+ MoonUISelectPro,
53016
+ {
53017
+ value: String(filter.value),
53018
+ onValueChange: (value) => onUpdate({ value: value === "true" }),
53019
+ children: [
53020
+ /* @__PURE__ */ jsx(MoonUISelectTriggerPro, { children: /* @__PURE__ */ jsx(MoonUISelectValuePro, {}) }),
53021
+ /* @__PURE__ */ jsxs(MoonUISelectContentPro, { children: [
53022
+ /* @__PURE__ */ jsx(MoonUISelectItemPro, { value: "true", children: "True" }),
53023
+ /* @__PURE__ */ jsx(MoonUISelectItemPro, { value: "false", children: "False" })
53024
+ ] })
53025
+ ]
53026
+ }
53027
+ ) : columnType === "number" ? /* @__PURE__ */ jsx(
53028
+ MoonUIInputPro,
53029
+ {
53030
+ type: "number",
53031
+ value: filter.value || "",
53032
+ onChange: (e) => onUpdate({ value: e.target.value }),
53033
+ placeholder: "Enter value..."
53034
+ }
53035
+ ) : /* @__PURE__ */ jsx(
53036
+ MoonUIInputPro,
53037
+ {
53038
+ value: filter.value || "",
53039
+ onChange: (e) => onUpdate({ value: e.target.value }),
53040
+ placeholder: "Enter value..."
53041
+ }
53042
+ ) })
53043
+ ] });
53044
+ }
53045
+ function DataTable({
53046
+ columns: originalColumns,
52715
53047
  data,
52716
53048
  searchable = true,
52717
53049
  filterable = true,
@@ -52745,6 +53077,12 @@ function DataTable({
52745
53077
  onColumnFiltersChange,
52746
53078
  state: externalState
52747
53079
  }) {
53080
+ const columns = t__default.useMemo(() => {
53081
+ return originalColumns.map((col) => ({
53082
+ ...col,
53083
+ enableHiding: col.enableHiding !== false
53084
+ }));
53085
+ }, [originalColumns]);
52748
53086
  const { hasProAccess, isLoading } = useSubscription();
52749
53087
  if (!isLoading && !hasProAccess) {
52750
53088
  return /* @__PURE__ */ jsx(MoonUICardPro, { className: cn("w-full", className), children: /* @__PURE__ */ jsx(MoonUICardContentPro, { className: "py-12 text-center", children: /* @__PURE__ */ jsxs("div", { className: "max-w-md mx-auto space-y-4", children: [
@@ -52766,6 +53104,7 @@ function DataTable({
52766
53104
  const [globalFilter, setGlobalFilter] = t__default.useState("");
52767
53105
  const [isPaginationLoading, setIsPaginationLoading] = t__default.useState(false);
52768
53106
  const [internalExpandedRows, setInternalExpandedRows] = t__default.useState(/* @__PURE__ */ new Set());
53107
+ const [filterDrawerOpen, setFilterDrawerOpen] = t__default.useState(false);
52769
53108
  const expandedRows = controlledExpandedRows || internalExpandedRows;
52770
53109
  const actualPageSize = defaultPageSize || pageSize;
52771
53110
  const stableData = t__default.useMemo(() => data, [data]);
@@ -52784,6 +53123,9 @@ function DataTable({
52784
53123
  globalFilterFn: "includesString",
52785
53124
  manualPagination,
52786
53125
  pageCount,
53126
+ enableColumnFilters: true,
53127
+ enableSorting: true,
53128
+ enableHiding: true,
52787
53129
  state: externalState || {
52788
53130
  sorting,
52789
53131
  columnFilters,
@@ -52876,10 +53218,19 @@ function DataTable({
52876
53218
  }
52877
53219
  )
52878
53220
  ] }),
52879
- filterable && /* @__PURE__ */ jsxs(MoonUIButtonPro, { variant: "outline", size: "sm", children: [
52880
- /* @__PURE__ */ jsx("span", { suppressHydrationWarning: true, children: /* @__PURE__ */ jsx(Filter, { className: "mr-2 h-4 w-4" }) }),
52881
- "Filters"
52882
- ] }),
53221
+ filterable && /* @__PURE__ */ jsxs(
53222
+ MoonUIButtonPro,
53223
+ {
53224
+ variant: "outline",
53225
+ size: "sm",
53226
+ onClick: () => setFilterDrawerOpen(true),
53227
+ children: [
53228
+ /* @__PURE__ */ jsx("span", { suppressHydrationWarning: true, children: /* @__PURE__ */ jsx(Filter, { className: "mr-2 h-4 w-4" }) }),
53229
+ "Filters",
53230
+ columnFilters.length > 0 && /* @__PURE__ */ jsx("span", { className: "ml-2 rounded-full bg-primary px-2 py-0.5 text-xs text-primary-foreground", children: columnFilters.length })
53231
+ ]
53232
+ }
53233
+ ),
52883
53234
  selectable && bulkActions.length > 0 && /* @__PURE__ */ jsx(
52884
53235
  DataTableBulkActions,
52885
53236
  {
@@ -53080,7 +53431,15 @@ function DataTable({
53080
53431
  )
53081
53432
  ] })
53082
53433
  ] })
53083
- ] })
53434
+ ] }),
53435
+ filterable && /* @__PURE__ */ jsx(
53436
+ DataTableFilterDrawer,
53437
+ {
53438
+ table,
53439
+ open: filterDrawerOpen,
53440
+ onOpenChange: setFilterDrawerOpen
53441
+ }
53442
+ )
53084
53443
  ] });
53085
53444
  }
53086
53445
  function getExpandableColumn(expandedRows, onToggle) {
@@ -53153,7 +53512,7 @@ var TableRow2 = t__default.memo(({
53153
53512
  children: row.getVisibleCells().map((cell) => /* @__PURE__ */ jsx("td", { className: "moonui-data-table-td p-4 align-middle", children: flexRender(cell.column.columnDef.cell, cell.getContext()) }, cell.id))
53154
53513
  }
53155
53514
  ),
53156
- isExpanded && renderSubComponent && /* @__PURE__ */ jsx("tr", { className: "border-b", children: /* @__PURE__ */ jsx("td", { colSpan: columns.length, className: "p-0 overflow-hidden", children: /* @__PURE__ */ jsx(
53515
+ isExpanded && renderSubComponent && /* @__PURE__ */ jsx("tr", { className: "border-b", children: /* @__PURE__ */ jsx("td", { colSpan: row.getVisibleCells().length, className: "p-0 overflow-hidden", children: /* @__PURE__ */ jsx(
53157
53516
  "div",
53158
53517
  {
53159
53518
  className: "transition-all duration-300 ease-out",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moontra/moonui-pro",
3
- "version": "2.4.0",
3
+ "version": "2.4.2",
4
4
  "description": "Premium React components for MoonUI - Advanced UI library with 50+ pro components including performance, interactive, and gesture components",
5
5
  "type": "module",
6
6
  "main": "dist/index.mjs",
@@ -0,0 +1,442 @@
1
+ "use client"
2
+
3
+ import React, { useState, useMemo } from 'react'
4
+ import { Column, Table } from '@tanstack/react-table'
5
+ import { X, Filter, Trash2, Plus } from 'lucide-react'
6
+ import { Button } from '../ui/button'
7
+ import { Input } from '../ui/input'
8
+ import { Label } from '../ui/label'
9
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select'
10
+ import { Switch } from '../ui/switch'
11
+ import { Separator } from '../ui/separator'
12
+ import { cn } from '../../lib/utils'
13
+ import { motion, AnimatePresence } from 'framer-motion'
14
+
15
+ export interface FilterCondition {
16
+ column: string
17
+ operator: FilterOperator
18
+ value: any
19
+ }
20
+
21
+ export type FilterOperator =
22
+ | 'equals'
23
+ | 'notEquals'
24
+ | 'contains'
25
+ | 'notContains'
26
+ | 'startsWith'
27
+ | 'endsWith'
28
+ | 'greaterThan'
29
+ | 'lessThan'
30
+ | 'greaterThanOrEqual'
31
+ | 'lessThanOrEqual'
32
+ | 'between'
33
+ | 'in'
34
+ | 'notIn'
35
+ | 'isNull'
36
+ | 'isNotNull'
37
+
38
+ export interface DataTableFilterDrawerProps<TData> {
39
+ table: Table<TData>
40
+ open: boolean
41
+ onOpenChange: (open: boolean) => void
42
+ position?: 'left' | 'right'
43
+ width?: string
44
+ filters?: FilterCondition[]
45
+ onFiltersChange?: (filters: FilterCondition[]) => void
46
+ customFilters?: React.ReactNode
47
+ }
48
+
49
+ const operatorLabels: Record<FilterOperator, string> = {
50
+ equals: 'Equals',
51
+ notEquals: 'Not equals',
52
+ contains: 'Contains',
53
+ notContains: 'Not contains',
54
+ startsWith: 'Starts with',
55
+ endsWith: 'Ends with',
56
+ greaterThan: 'Greater than',
57
+ lessThan: 'Less than',
58
+ greaterThanOrEqual: 'Greater than or equal',
59
+ lessThanOrEqual: 'Less than or equal',
60
+ between: 'Between',
61
+ in: 'In',
62
+ notIn: 'Not in',
63
+ isNull: 'Is empty',
64
+ isNotNull: 'Is not empty',
65
+ }
66
+
67
+ function getOperatorsForColumnType(columnType?: string): FilterOperator[] {
68
+ switch (columnType) {
69
+ case 'number':
70
+ return ['equals', 'notEquals', 'greaterThan', 'lessThan', 'greaterThanOrEqual', 'lessThanOrEqual', 'between', 'isNull', 'isNotNull']
71
+ case 'date':
72
+ return ['equals', 'notEquals', 'greaterThan', 'lessThan', 'greaterThanOrEqual', 'lessThanOrEqual', 'between', 'isNull', 'isNotNull']
73
+ case 'boolean':
74
+ return ['equals', 'notEquals', 'isNull', 'isNotNull']
75
+ case 'select':
76
+ return ['equals', 'notEquals', 'in', 'notIn', 'isNull', 'isNotNull']
77
+ default: // string
78
+ return ['equals', 'notEquals', 'contains', 'notContains', 'startsWith', 'endsWith', 'isNull', 'isNotNull']
79
+ }
80
+ }
81
+
82
+ export function DataTableFilterDrawer<TData>({
83
+ table,
84
+ open,
85
+ onOpenChange,
86
+ position = 'right',
87
+ width = '400px',
88
+ filters: externalFilters,
89
+ onFiltersChange,
90
+ customFilters,
91
+ }: DataTableFilterDrawerProps<TData>) {
92
+ const [internalFilters, setInternalFilters] = useState<FilterCondition[]>([])
93
+ const [matchAll, setMatchAll] = useState(true)
94
+
95
+ const filters = externalFilters || internalFilters
96
+ const setFilters = onFiltersChange || setInternalFilters
97
+
98
+ // Get filterable columns
99
+ const filterableColumns = useMemo(() => {
100
+ return table.getAllColumns().filter(column => {
101
+ // Skip special columns
102
+ if (column.id === 'select' || column.id === 'actions' || column.id === 'expander') {
103
+ return false
104
+ }
105
+ // Only include columns that can be filtered
106
+ return column.getCanFilter()
107
+ })
108
+ }, [table])
109
+
110
+ const addFilter = () => {
111
+ const firstColumn = filterableColumns[0]
112
+ if (!firstColumn) return
113
+
114
+ const newFilter: FilterCondition = {
115
+ column: firstColumn.id,
116
+ operator: 'contains',
117
+ value: '',
118
+ }
119
+ setFilters([...filters, newFilter])
120
+ }
121
+
122
+ const updateFilter = (index: number, updates: Partial<FilterCondition>) => {
123
+ const newFilters = [...filters]
124
+ newFilters[index] = { ...newFilters[index], ...updates }
125
+ setFilters(newFilters)
126
+ }
127
+
128
+ const removeFilter = (index: number) => {
129
+ setFilters(filters.filter((_, i) => i !== index))
130
+ }
131
+
132
+ const clearAllFilters = () => {
133
+ setFilters([])
134
+ table.resetColumnFilters()
135
+ }
136
+
137
+ const applyFilters = () => {
138
+ // Reset all column filters first
139
+ table.resetColumnFilters()
140
+
141
+ // Apply each filter
142
+ filters.forEach(filter => {
143
+ const column = table.getColumn(filter.column)
144
+ if (!column) return
145
+
146
+ // Apply filter based on operator
147
+ switch (filter.operator) {
148
+ case 'equals':
149
+ column.setFilterValue(filter.value)
150
+ break
151
+ case 'notEquals':
152
+ column.setFilterValue((value: any) => value !== filter.value)
153
+ break
154
+ case 'contains':
155
+ column.setFilterValue((value: any) =>
156
+ String(value).toLowerCase().includes(String(filter.value).toLowerCase())
157
+ )
158
+ break
159
+ case 'notContains':
160
+ column.setFilterValue((value: any) =>
161
+ !String(value).toLowerCase().includes(String(filter.value).toLowerCase())
162
+ )
163
+ break
164
+ case 'startsWith':
165
+ column.setFilterValue((value: any) =>
166
+ String(value).toLowerCase().startsWith(String(filter.value).toLowerCase())
167
+ )
168
+ break
169
+ case 'endsWith':
170
+ column.setFilterValue((value: any) =>
171
+ String(value).toLowerCase().endsWith(String(filter.value).toLowerCase())
172
+ )
173
+ break
174
+ case 'greaterThan':
175
+ column.setFilterValue((value: any) => Number(value) > Number(filter.value))
176
+ break
177
+ case 'lessThan':
178
+ column.setFilterValue((value: any) => Number(value) < Number(filter.value))
179
+ break
180
+ case 'greaterThanOrEqual':
181
+ column.setFilterValue((value: any) => Number(value) >= Number(filter.value))
182
+ break
183
+ case 'lessThanOrEqual':
184
+ column.setFilterValue((value: any) => Number(value) <= Number(filter.value))
185
+ break
186
+ case 'isNull':
187
+ column.setFilterValue((value: any) => value == null || value === '')
188
+ break
189
+ case 'isNotNull':
190
+ column.setFilterValue((value: any) => value != null && value !== '')
191
+ break
192
+ // Add more operators as needed
193
+ }
194
+ })
195
+
196
+ onOpenChange(false)
197
+ }
198
+
199
+ return (
200
+ <>
201
+ {/* Backdrop */}
202
+ <AnimatePresence>
203
+ {open && (
204
+ <motion.div
205
+ initial={{ opacity: 0 }}
206
+ animate={{ opacity: 1 }}
207
+ exit={{ opacity: 0 }}
208
+ className="fixed inset-0 bg-black/20 z-40"
209
+ onClick={() => onOpenChange(false)}
210
+ />
211
+ )}
212
+ </AnimatePresence>
213
+
214
+ {/* Drawer */}
215
+ <AnimatePresence>
216
+ {open && (
217
+ <motion.div
218
+ initial={{ x: position === 'right' ? '100%' : '-100%' }}
219
+ animate={{ x: 0 }}
220
+ exit={{ x: position === 'right' ? '100%' : '-100%' }}
221
+ transition={{ type: 'spring', damping: 30, stiffness: 300 }}
222
+ className={cn(
223
+ "fixed top-0 bottom-0 z-50 bg-background border-l shadow-xl",
224
+ position === 'right' ? 'right-0' : 'left-0'
225
+ )}
226
+ style={{ width }}
227
+ >
228
+ <div className="flex flex-col h-full">
229
+ {/* Header */}
230
+ <div className="flex items-center justify-between p-4 border-b">
231
+ <div className="flex items-center gap-2">
232
+ <Filter className="h-5 w-5" />
233
+ <h2 className="text-lg font-semibold">Filters</h2>
234
+ {filters.length > 0 && (
235
+ <span className="text-sm text-muted-foreground">
236
+ ({filters.length} active)
237
+ </span>
238
+ )}
239
+ </div>
240
+ <Button
241
+ variant="ghost"
242
+ size="icon"
243
+ onClick={() => onOpenChange(false)}
244
+ >
245
+ <X className="h-4 w-4" />
246
+ </Button>
247
+ </div>
248
+
249
+ {/* Content */}
250
+ <div className="flex-1 overflow-y-auto p-4">
251
+ {/* Match mode */}
252
+ <div className="mb-6">
253
+ <Label className="text-sm font-medium mb-2 block">
254
+ Match conditions
255
+ </Label>
256
+ <div className="flex items-center gap-2">
257
+ <Button
258
+ variant={matchAll ? 'primary' : 'outline'}
259
+ size="sm"
260
+ onClick={() => setMatchAll(true)}
261
+ className="flex-1"
262
+ >
263
+ Match all
264
+ </Button>
265
+ <Button
266
+ variant={!matchAll ? 'primary' : 'outline'}
267
+ size="sm"
268
+ onClick={() => setMatchAll(false)}
269
+ className="flex-1"
270
+ >
271
+ Match any
272
+ </Button>
273
+ </div>
274
+ </div>
275
+
276
+ <Separator className="mb-6" />
277
+
278
+ {/* Custom filters */}
279
+ {customFilters && (
280
+ <>
281
+ {customFilters}
282
+ <Separator className="my-6" />
283
+ </>
284
+ )}
285
+
286
+ {/* Filter conditions */}
287
+ <div className="space-y-4">
288
+ {filters.map((filter, index) => (
289
+ <FilterConditionRow
290
+ key={index}
291
+ filter={filter}
292
+ columns={filterableColumns}
293
+ onUpdate={(updates) => updateFilter(index, updates)}
294
+ onRemove={() => removeFilter(index)}
295
+ />
296
+ ))}
297
+ </div>
298
+
299
+ {/* Add filter button */}
300
+ <Button
301
+ variant="outline"
302
+ size="sm"
303
+ onClick={addFilter}
304
+ className="w-full mt-4"
305
+ >
306
+ <Plus className="h-4 w-4 mr-2" />
307
+ Add filter
308
+ </Button>
309
+ </div>
310
+
311
+ {/* Footer */}
312
+ <div className="p-4 border-t space-y-2">
313
+ <div className="flex gap-2">
314
+ <Button
315
+ variant="outline"
316
+ onClick={clearAllFilters}
317
+ disabled={filters.length === 0}
318
+ className="flex-1"
319
+ >
320
+ <Trash2 className="h-4 w-4 mr-2" />
321
+ Clear all
322
+ </Button>
323
+ <Button onClick={applyFilters} className="flex-1">
324
+ Apply filters
325
+ </Button>
326
+ </div>
327
+ </div>
328
+ </div>
329
+ </motion.div>
330
+ )}
331
+ </AnimatePresence>
332
+ </>
333
+ )
334
+ }
335
+
336
+ interface FilterConditionRowProps<TData> {
337
+ filter: FilterCondition
338
+ columns: Column<TData, any>[]
339
+ onUpdate: (updates: Partial<FilterCondition>) => void
340
+ onRemove: () => void
341
+ }
342
+
343
+ function FilterConditionRow<TData>({
344
+ filter,
345
+ columns,
346
+ onUpdate,
347
+ onRemove,
348
+ }: FilterConditionRowProps<TData>) {
349
+ const selectedColumn = columns.find(col => col.id === filter.column)
350
+ const columnDef = selectedColumn?.columnDef as any
351
+ const columnType = columnDef?.meta?.filterType || 'string'
352
+ const availableOperators = getOperatorsForColumnType(columnType)
353
+
354
+ const needsValue = filter.operator !== 'isNull' && filter.operator !== 'isNotNull'
355
+
356
+ return (
357
+ <div className="space-y-2 p-3 border rounded-lg bg-muted/30">
358
+ {/* Column selector */}
359
+ <div className="flex items-center gap-2">
360
+ <Select
361
+ value={filter.column}
362
+ onValueChange={(value) => onUpdate({ column: value })}
363
+ >
364
+ <SelectTrigger className="flex-1">
365
+ <SelectValue />
366
+ </SelectTrigger>
367
+ <SelectContent>
368
+ {columns.map(column => {
369
+ const header = column.columnDef.header
370
+ const label = typeof header === 'function' ? column.id : header || column.id
371
+
372
+ return (
373
+ <SelectItem key={column.id} value={column.id}>
374
+ {label}
375
+ </SelectItem>
376
+ )
377
+ })}
378
+ </SelectContent>
379
+ </Select>
380
+
381
+ <Button
382
+ variant="ghost"
383
+ size="icon"
384
+ onClick={onRemove}
385
+ className="h-8 w-8"
386
+ >
387
+ <X className="h-4 w-4" />
388
+ </Button>
389
+ </div>
390
+
391
+ {/* Operator selector */}
392
+ <Select
393
+ value={filter.operator}
394
+ onValueChange={(value) => onUpdate({ operator: value as FilterOperator })}
395
+ >
396
+ <SelectTrigger>
397
+ <SelectValue />
398
+ </SelectTrigger>
399
+ <SelectContent>
400
+ {availableOperators.map(operator => (
401
+ <SelectItem key={operator} value={operator}>
402
+ {operatorLabels[operator]}
403
+ </SelectItem>
404
+ ))}
405
+ </SelectContent>
406
+ </Select>
407
+
408
+ {/* Value input */}
409
+ {needsValue && (
410
+ <div>
411
+ {columnType === 'boolean' ? (
412
+ <Select
413
+ value={String(filter.value)}
414
+ onValueChange={(value) => onUpdate({ value: value === 'true' })}
415
+ >
416
+ <SelectTrigger>
417
+ <SelectValue />
418
+ </SelectTrigger>
419
+ <SelectContent>
420
+ <SelectItem value="true">True</SelectItem>
421
+ <SelectItem value="false">False</SelectItem>
422
+ </SelectContent>
423
+ </Select>
424
+ ) : columnType === 'number' ? (
425
+ <Input
426
+ type="number"
427
+ value={filter.value || ''}
428
+ onChange={(e) => onUpdate({ value: e.target.value })}
429
+ placeholder="Enter value..."
430
+ />
431
+ ) : (
432
+ <Input
433
+ value={filter.value || ''}
434
+ onChange={(e) => onUpdate({ value: e.target.value })}
435
+ placeholder="Enter value..."
436
+ />
437
+ )}
438
+ </div>
439
+ )}
440
+ </div>
441
+ )
442
+ }
@@ -44,6 +44,7 @@ import { motion, AnimatePresence } from 'framer-motion'
44
44
  import { DataTableColumnToggle } from './data-table-column-toggle'
45
45
  import { DataTableBulkActions, type BulkAction } from './data-table-bulk-actions'
46
46
  import { exportData, type ExportFormat, getVisibleColumns } from './data-table-export'
47
+ import { DataTableFilterDrawer, type FilterCondition } from './data-table-filter-drawer'
47
48
  import {
48
49
  DropdownMenu,
49
50
  DropdownMenuContent,
@@ -118,7 +119,7 @@ interface DataTableProps<TData, TValue> {
118
119
  }
119
120
 
120
121
  export function DataTable<TData, TValue>({
121
- columns,
122
+ columns: originalColumns,
122
123
  data,
123
124
  searchable = true,
124
125
  filterable = true,
@@ -152,6 +153,13 @@ export function DataTable<TData, TValue>({
152
153
  onColumnFiltersChange,
153
154
  state: externalState,
154
155
  }: DataTableProps<TData, TValue>) {
156
+ // Process columns to ensure they can be hidden
157
+ const columns = React.useMemo(() => {
158
+ return originalColumns.map(col => ({
159
+ ...col,
160
+ enableHiding: col.enableHiding !== false,
161
+ }))
162
+ }, [originalColumns])
155
163
  // Check if we're in docs mode or have pro access
156
164
  const { hasProAccess, isLoading } = useSubscription()
157
165
 
@@ -192,6 +200,7 @@ export function DataTable<TData, TValue>({
192
200
  const [globalFilter, setGlobalFilter] = React.useState('')
193
201
  const [isPaginationLoading, setIsPaginationLoading] = React.useState(false)
194
202
  const [internalExpandedRows, setInternalExpandedRows] = React.useState<Set<string>>(new Set())
203
+ const [filterDrawerOpen, setFilterDrawerOpen] = React.useState(false)
195
204
 
196
205
  // Use controlled or internal expanded state
197
206
  const expandedRows = controlledExpandedRows || internalExpandedRows
@@ -219,6 +228,9 @@ export function DataTable<TData, TValue>({
219
228
  globalFilterFn: 'includesString',
220
229
  manualPagination,
221
230
  pageCount,
231
+ enableColumnFilters: true,
232
+ enableSorting: true,
233
+ enableHiding: true,
222
234
  state: externalState || {
223
235
  sorting,
224
236
  columnFilters,
@@ -339,9 +351,18 @@ export function DataTable<TData, TValue>({
339
351
  )}
340
352
 
341
353
  {filterable && (
342
- <Button variant="outline" size="sm">
354
+ <Button
355
+ variant="outline"
356
+ size="sm"
357
+ onClick={() => setFilterDrawerOpen(true)}
358
+ >
343
359
  <span suppressHydrationWarning><Filter className="mr-2 h-4 w-4" /></span>
344
360
  Filters
361
+ {columnFilters.length > 0 && (
362
+ <span className="ml-2 rounded-full bg-primary px-2 py-0.5 text-xs text-primary-foreground">
363
+ {columnFilters.length}
364
+ </span>
365
+ )}
345
366
  </Button>
346
367
  )}
347
368
 
@@ -586,6 +607,15 @@ export function DataTable<TData, TValue>({
586
607
  </div>
587
608
  </div>
588
609
  )}
610
+
611
+ {/* Filter Drawer */}
612
+ {filterable && (
613
+ <DataTableFilterDrawer
614
+ table={table}
615
+ open={filterDrawerOpen}
616
+ onOpenChange={setFilterDrawerOpen}
617
+ />
618
+ )}
589
619
  </div>
590
620
  )
591
621
  }
@@ -703,7 +733,7 @@ const TableRow = React.memo(({
703
733
 
704
734
  {isExpanded && renderSubComponent && (
705
735
  <tr className="border-b">
706
- <td colSpan={columns.length} className="p-0 overflow-hidden">
736
+ <td colSpan={row.getVisibleCells().length} className="p-0 overflow-hidden">
707
737
  <div
708
738
  className="transition-all duration-300 ease-out"
709
739
  style={{
@@ -736,3 +766,4 @@ TableRow.displayName = 'TableRow'
736
766
  export { type ColumnDef } from "@tanstack/react-table";
737
767
  export type { BulkAction } from './data-table-bulk-actions';
738
768
  export type { ExportFormat } from './data-table-export';
769
+ export type { FilterCondition, FilterOperator } from './data-table-filter-drawer';