@@ -4,6 +4,7 @@ import styled from 'styled-components';
44
55import { palette } from '../../../../helpers/colorHelpers' ;
66import { EmptyState } from '../../../emptyState/emptyState' ;
7+ import { NavigationalDropdownContainer } from '../../components/NavigationalDropdownContainer' ;
78import { NavigationalDropdownProvider } from '../../context/NavigationalDropdownContext' ;
89import { Dropdown } from '../../dropdown' ;
910import { DropdownButton } from '../../dropdownButton' ;
@@ -12,7 +13,6 @@ import {DropdownHeader} from '../../dropdownHeader';
1213import { DropdownHeading } from '../../dropdownHeading' ;
1314import { DropdownItem } from '../../dropdownItem' ;
1415import { DropdownItemIcon } from '../../dropdownItemIcon' ;
15- import { NavigationalDropdownContainer } from '../../components/NavigationalDropdownContainer' ;
1616
1717const StyledWrapperDiv = styled . div `
1818 display: flex;
@@ -63,6 +63,42 @@ const ticketStatusesData = [
6363/**
6464 * Basic navigational dropdown example
6565 */
66+ // Inbox item component
67+ const InboxDropdownItem : React . FC < {
68+ inbox : { id : string ; name : string ; icon : string ; isPrivate ?: boolean } ;
69+ isSelected : boolean ;
70+ onToggle : ( ) => void ;
71+ color : string ;
72+ } > = ( { inbox, isSelected, onToggle, color} ) => (
73+ < DropdownItem key = { inbox . id } type = "multi" isSelected = { isSelected } onClick = { onToggle } >
74+ < DropdownItemIcon color = { color } iconName = "Archive" />
75+ { inbox . name }
76+ </ DropdownItem >
77+ ) ;
78+
79+ // Tag item component
80+ const TagDropdownItem : React . FC < {
81+ tag : { id : string ; name : string ; color : string } ;
82+ isSelected : boolean ;
83+ onToggle : ( ) => void ;
84+ } > = ( { tag, isSelected, onToggle} ) => (
85+ < DropdownItem key = { tag . id } type = "multi" isSelected = { isSelected } onClick = { onToggle } >
86+ < DropdownItemIcon color = { tag . color } iconName = "Star" />
87+ { tag . name }
88+ </ DropdownItem >
89+ ) ;
90+
91+ // Assignee item component
92+ const AssigneeDropdownItem : React . FC < {
93+ assignee : { id : string ; name : string ; email : string } ;
94+ isSelected : boolean ;
95+ onToggle : ( ) => void ;
96+ } > = ( { assignee, isSelected, onToggle} ) => (
97+ < DropdownItem key = { assignee . id } type = "multi" isSelected = { isSelected } onClick = { onToggle } description = { assignee . email } >
98+ { assignee . name }
99+ </ DropdownItem >
100+ ) ;
101+
66102const BasicNavigationalTemplate : StoryFn = ( ) => {
67103 const [ selectedFilters , setSelectedFilters ] = useState < Record < string , string [ ] > > ( {
68104 inboxes : [ ] ,
@@ -90,18 +126,61 @@ const BasicNavigationalTemplate: StoryFn = () => {
90126 return items . filter ( ( item ) => item . name . toLowerCase ( ) . includes ( search . toLowerCase ( ) ) ) ;
91127 } ;
92128
93- // Helper to render a category section with heading (only if items exist)
94- const renderCategorySection = < T extends { id : string ; name : string } > (
129+ // Helper to render inbox sections
130+ const renderInboxSection = (
95131 heading : string ,
96- items : T [ ] ,
97- category : string ,
98- renderItem : ( item : T ) => React . ReactNode
132+ inboxes : typeof inboxesData ,
133+ color : string
99134 ) => {
100- if ( items . length === 0 ) return null ;
135+ if ( inboxes . length === 0 ) return null ;
101136 return (
102137 < >
103138 < DropdownHeading > { heading } </ DropdownHeading >
104- { items . map ( ( item ) => renderItem ( item ) ) }
139+ { inboxes . map ( ( inbox ) => (
140+ < InboxDropdownItem
141+ key = { inbox . id }
142+ inbox = { inbox }
143+ isSelected = { selectedFilters . inboxes . includes ( inbox . id ) }
144+ onToggle = { ( ) => toggleFilter ( 'inboxes' , inbox . id ) }
145+ color = { color }
146+ />
147+ ) ) }
148+ </ >
149+ ) ;
150+ } ;
151+
152+ // Helper to render tag sections
153+ const renderTagSection = ( heading : string , tags : typeof tagsData ) => {
154+ if ( tags . length === 0 ) return null ;
155+ return (
156+ < >
157+ < DropdownHeading > { heading } </ DropdownHeading >
158+ { tags . map ( ( tag ) => (
159+ < TagDropdownItem
160+ key = { tag . id }
161+ tag = { tag }
162+ isSelected = { selectedFilters . tags . includes ( tag . id ) }
163+ onToggle = { ( ) => toggleFilter ( 'tags' , tag . id ) }
164+ />
165+ ) ) }
166+ </ >
167+ ) ;
168+ } ;
169+
170+ // Helper to render assignee sections
171+ const renderAssigneeSection = ( heading : string , assignees : typeof assigneesData ) => {
172+ if ( assignees . length === 0 ) return null ;
173+ return (
174+ < >
175+ < DropdownHeading > { heading } </ DropdownHeading >
176+ { assignees . map ( ( assignee ) => (
177+ < AssigneeDropdownItem
178+ key = { assignee . id }
179+ assignee = { assignee }
180+ isSelected = { selectedFilters . assignees . includes ( assignee . id ) }
181+ onToggle = { ( ) => toggleFilter ( 'assignees' , assignee . id ) }
182+ />
183+ ) ) }
105184 </ >
106185 ) ;
107186 } ;
@@ -114,36 +193,9 @@ const BasicNavigationalTemplate: StoryFn = () => {
114193
115194 return (
116195 < >
117- { renderCategorySection ( 'Any' , anyInboxes , 'inboxes' , ( inbox ) => (
118- < DropdownItem
119- key = { inbox . id }
120- type = "multi"
121- isSelected = { selectedFilters . inboxes . includes ( inbox . id ) }
122- onClick = { ( ) => toggleFilter ( 'inboxes' , inbox . id ) } >
123- < DropdownItemIcon color = { palette . blue . shade40 } iconName = "Archive" />
124- { inbox . name }
125- </ DropdownItem >
126- ) ) }
127- { renderCategorySection ( 'Individual' , individualInboxes , 'inboxes' , ( inbox ) => (
128- < DropdownItem
129- key = { inbox . id }
130- type = "multi"
131- isSelected = { selectedFilters . inboxes . includes ( inbox . id ) }
132- onClick = { ( ) => toggleFilter ( 'inboxes' , inbox . id ) } >
133- < DropdownItemIcon color = { palette . green . shade40 } iconName = "Archive" />
134- { inbox . name }
135- </ DropdownItem >
136- ) ) }
137- { renderCategorySection ( 'Shared' , sharedInboxes , 'inboxes' , ( inbox ) => (
138- < DropdownItem
139- key = { inbox . id }
140- type = "multi"
141- isSelected = { selectedFilters . inboxes . includes ( inbox . id ) }
142- onClick = { ( ) => toggleFilter ( 'inboxes' , inbox . id ) } >
143- < DropdownItemIcon color = { palette . purple . shade40 } iconName = "Archive" />
144- { inbox . name }
145- </ DropdownItem >
146- ) ) }
196+ { renderInboxSection ( 'Any' , anyInboxes , palette . blue . shade40 ) }
197+ { renderInboxSection ( 'Individual' , individualInboxes , palette . green . shade40 ) }
198+ { renderInboxSection ( 'Shared' , sharedInboxes , palette . purple . shade40 ) }
147199 </ >
148200 ) ;
149201 } ;
@@ -187,16 +239,7 @@ const BasicNavigationalTemplate: StoryFn = () => {
187239 onSearchChange = { ( newValue ) => setSearchValues ( ( prev ) => ( { ...prev , tags : newValue } ) ) } >
188240 Tags
189241 </ DropdownHeader >
190- { renderCategorySection ( 'Tags' , getFilteredItems ( tagsData , 'tags' ) , 'tags' , ( tag ) => (
191- < DropdownItem
192- key = { tag . id }
193- type = "multi"
194- isSelected = { selectedFilters . tags . includes ( tag . id ) }
195- onClick = { ( ) => toggleFilter ( 'tags' , tag . id ) } >
196- < DropdownItemIcon color = { tag . color } iconName = "Star" />
197- { tag . name }
198- </ DropdownItem >
199- ) ) }
242+ { renderTagSection ( 'Tags' , getFilteredItems ( tagsData , 'tags' ) ) }
200243 </ Dropdown >
201244 } >
202245 < DropdownItemIcon color = { palette . orange . shade40 } iconName = "Star" />
@@ -219,21 +262,7 @@ const BasicNavigationalTemplate: StoryFn = () => {
219262 onSearchChange = { ( newValue ) => setSearchValues ( ( prev ) => ( { ...prev , assignees : newValue } ) ) } >
220263 Assignees
221264 </ DropdownHeader >
222- { renderCategorySection (
223- 'Assignees' ,
224- getFilteredItems ( assigneesData , 'assignees' ) ,
225- 'assignees' ,
226- ( assignee ) => (
227- < DropdownItem
228- key = { assignee . id }
229- type = "multi"
230- isSelected = { selectedFilters . assignees . includes ( assignee . id ) }
231- onClick = { ( ) => toggleFilter ( 'assignees' , assignee . id ) }
232- description = { assignee . email } >
233- { assignee . name }
234- </ DropdownItem >
235- )
236- ) }
265+ { renderAssigneeSection ( 'Assignees' , getFilteredItems ( assigneesData , 'assignees' ) ) }
237266 </ Dropdown >
238267 } >
239268 < DropdownItemIcon color = { palette . green . shade40 } iconName = "Calendar" />
0 commit comments