@@ -596,6 +596,138 @@ export const Loading: StoryFn = () => {
596596} ;
597597Loading . storyName = "Loading State" ;
598598
599+ /** DataViews with only filters and search — no tabs. Click "Add Filter" to add filters. */
600+ export const FiltersOnly : StoryFn = ( ) => {
601+ const [ view , setView ] = useState < DataViewState > ( createDefaultView ( [ "name" , "email" , "status" , "role" , "joinedAt" ] ) ) ;
602+ const [ nameFilter , setNameFilter ] = useState ( "" ) ;
603+ const [ statusFilter , setStatusFilter ] = useState ( "" ) ;
604+ const [ roleFilter , setRoleFilter ] = useState ( "" ) ;
605+
606+ let filteredUsers = [ ...allUsers ] ;
607+
608+ // Apply search
609+ const searchTerm = view . search ?? "" ;
610+ if ( searchTerm ) {
611+ filteredUsers = filteredUsers . filter ( user =>
612+ user . name . toLowerCase ( ) . includes ( searchTerm . toLowerCase ( ) ) ||
613+ user . email . toLowerCase ( ) . includes ( searchTerm . toLowerCase ( ) )
614+ ) ;
615+ }
616+
617+ if ( nameFilter ) {
618+ filteredUsers = filteredUsers . filter ( user =>
619+ user . name . toLowerCase ( ) . includes ( nameFilter . toLowerCase ( ) )
620+ ) ;
621+ }
622+
623+ if ( statusFilter ) {
624+ filteredUsers = filteredUsers . filter ( user => user . status === statusFilter ) ;
625+ }
626+
627+ if ( roleFilter ) {
628+ filteredUsers = filteredUsers . filter ( user => user . role === roleFilter ) ;
629+ }
630+
631+ const paginatedData = paginateData ( filteredUsers , view ) ;
632+
633+ const filterFields : DataViewFilterField [ ] = [
634+ {
635+ id : "name" ,
636+ label : "Name" ,
637+ field : (
638+ < Input
639+ placeholder = "Filter by name..."
640+ value = { nameFilter }
641+ onChange = { ( e ) => {
642+ setNameFilter ( e . target . value ) ;
643+ setView ( prev => ( { ...prev , page : 1 } ) ) ;
644+ } }
645+ className = "w-48"
646+ />
647+ ) ,
648+ } ,
649+ {
650+ id : "status" ,
651+ label : "Status" ,
652+ field : (
653+ < Select
654+ value = { statusFilter }
655+ onValueChange = { ( value ) => {
656+ setStatusFilter ( value ?? "" ) ;
657+ setView ( prev => ( { ...prev , page : 1 } ) ) ;
658+ } }
659+ >
660+ < SelectTrigger className = "w-40" >
661+ < SelectValue placeholder = "Select status" />
662+ </ SelectTrigger >
663+ < SelectContent >
664+ < SelectItem value = "active" > Active</ SelectItem >
665+ < SelectItem value = "inactive" > Inactive</ SelectItem >
666+ < SelectItem value = "pending" > Pending</ SelectItem >
667+ </ SelectContent >
668+ </ Select >
669+ ) ,
670+ } ,
671+ {
672+ id : "role" ,
673+ label : "Role" ,
674+ field : (
675+ < Select
676+ value = { roleFilter }
677+ onValueChange = { ( value ) => {
678+ setRoleFilter ( value ?? "" ) ;
679+ setView ( prev => ( { ...prev , page : 1 } ) ) ;
680+ } }
681+ >
682+ < SelectTrigger className = "w-40" >
683+ < SelectValue placeholder = "Select role" />
684+ </ SelectTrigger >
685+ < SelectContent >
686+ < SelectItem value = "Admin" > Admin</ SelectItem >
687+ < SelectItem value = "Editor" > Editor</ SelectItem >
688+ < SelectItem value = "Viewer" > Viewer</ SelectItem >
689+ < SelectItem value = "Manager" > Manager</ SelectItem >
690+ </ SelectContent >
691+ </ Select >
692+ ) ,
693+ } ,
694+ ] ;
695+
696+ return (
697+ < div className = "p-4" >
698+ < DataViews < User >
699+ namespace = "dataviews-demo"
700+ data = { paginatedData }
701+ fields = { fields }
702+ view = { view }
703+ onChangeView = { setView }
704+ actions = { actions }
705+ paginationInfo = { {
706+ totalItems : filteredUsers . length ,
707+ totalPages : getTotalPages ( filteredUsers . length , view . perPage ) ,
708+ } }
709+ getItemId = { ( item ) => item . id }
710+ filter = { {
711+ fields : filterFields ,
712+ onReset : ( ) => {
713+ setNameFilter ( "" ) ;
714+ setStatusFilter ( "" ) ;
715+ setRoleFilter ( "" ) ;
716+ setView ( prev => ( { ...prev , page : 1 } ) ) ;
717+ } ,
718+ onFilterRemove : ( filterId ) => {
719+ if ( filterId === "name" ) setNameFilter ( "" ) ;
720+ if ( filterId === "status" ) setStatusFilter ( "" ) ;
721+ if ( filterId === "role" ) setRoleFilter ( "" ) ;
722+ setView ( prev => ( { ...prev , page : 1 } ) ) ;
723+ } ,
724+ } }
725+ />
726+ </ div >
727+ ) ;
728+ } ;
729+ FiltersOnly . storyName = "Filters Only" ;
730+
599731/** Complete example with all features: tabs, filters, search, selection, and pagination. */
600732export const FullFeatured : StoryFn = ( ) => {
601733 const [ view , setView ] = useState < DataViewState > ( createDefaultView ( [ "name" , "email" , "status" , "role" , "joinedAt" ] ) ) ;
@@ -827,7 +959,7 @@ export const LayoutCustomComponent: StoryFn = () => {
827959 type : "table" ,
828960 search : "" ,
829961 page : 1 ,
830- perPage : 6 ,
962+ perPage : 10 ,
831963 fields : [ "name" , "email" , "status" , "role" ] ,
832964 } ) ;
833965
0 commit comments