@@ -25,6 +25,7 @@ import classnames from 'classnames'
2525import BreadcrumbsDropdown from '../../../elements/BreadcrumbsDropdown/BreadcrumbsDropdown'
2626import { RoundedIcon } from 'igz-controls/components'
2727
28+ import { BREADCRUMBS_STEP_ITEM_TYPE , BREADCRUMBS_STEP_PROJECT_TYPE , BREADCRUMBS_STEP_SCREEN_TYPE } from '../../../constants'
2829import { scrollToElement } from '../../../utils/scroll.util'
2930
3031import ArrowIcon from 'igz-controls/images/arrow.svg?react'
@@ -45,7 +46,7 @@ const BreadcrumbsStep = React.forwardRef(
4546 setShowScreensList,
4647 showProjectsList,
4748 showScreensList,
48- urlPart ,
49+ pathItem ,
4950 urlParts
5051 } ,
5152 ref
@@ -54,28 +55,11 @@ const BreadcrumbsStep = React.forwardRef(
5455 const screenListRef = useRef ( )
5556 const separatorRef = useRef ( )
5657
57- const isParam = useMemo ( ( ) => Object . values ( params ?? { } ) . includes ( urlPart ) , [ urlPart , params ] )
58- const label = useMemo (
59- ( ) => ( isParam ? urlPart : urlPart . charAt ( 0 ) . toUpperCase ( ) + urlPart . slice ( 1 ) ) ,
60- [ urlPart , isParam ]
61- )
62-
63- const to = useMemo (
64- ( ) => `/${ urlParts . pathItems . slice ( 0 , index + 1 ) . join ( '/' ) } ` ,
65- [ index , urlParts . pathItems ]
66- )
6758 const isLastStep = useMemo (
6859 ( ) => index === urlParts . pathItems . length - 1 ,
6960 [ index , urlParts . pathItems . length ]
7061 )
7162
72- const separatorClassNames = classnames (
73- 'breadcrumbs__separator' ,
74- ( ( urlParts . pathItems [ index + 1 ] === urlParts . screen ?. id && ! isParam ) ||
75- urlParts . pathItems [ index + 1 ] === params . projectName ) &&
76- 'breadcrumbs__separator_tumbler'
77- )
78-
7963 const handleSelectDropdownItem = separatorRef => {
8064 if ( showProjectsList ) setShowProjectsList ( false )
8165
@@ -136,117 +120,94 @@ const BreadcrumbsStep = React.forwardRef(
136120 } , [ handleCloseDropdown ] )
137121
138122 const handleSeparatorClick = ( nextItem , separatorRef ) => {
139- const nextItemIsScreen = Boolean ( mlrunScreens . find ( screen => screen . label === nextItem ) )
123+ if ( nextItem . type === ' screen' || nextItem . type === 'project' ) {
140124
141- if ( nextItemIsScreen || nextItem === params . projectName ) {
142125 const [ activeSeparator ] = document . getElementsByClassName ( 'breadcrumbs__separator_active' )
143126
144- if (
145- activeSeparator &&
146- ! separatorRef . current . classList . contains ( 'breadcrumbs__separator_active' )
147- ) {
148- activeSeparator . classList . remove ( 'breadcrumbs__separator_active' )
127+ if ( nextItem . type === BREADCRUMBS_STEP_PROJECT_TYPE ) {
128+ setShowProjectsList ( state => ! state )
129+
130+ if ( showScreensList ) {
131+ setShowScreensList ( false )
132+ }
149133 }
150134
151- if ( nextItemIsScreen ) {
135+ if ( nextItem . type === BREADCRUMBS_STEP_SCREEN_TYPE ) {
152136 setShowScreensList ( state => ! state )
153137
154138 if ( showProjectsList ) {
155139 setShowProjectsList ( false )
156140 }
157141 }
158142
159- if ( nextItem === params . projectName ) {
160- setShowProjectsList ( state => ! state )
161-
162- if ( showScreensList ) {
163- setShowScreensList ( false )
164- }
143+ if (
144+ activeSeparator &&
145+ ! separatorRef . current . classList . contains ( 'breadcrumbs__separator_active' )
146+ ) {
147+ activeSeparator . classList . remove ( 'breadcrumbs__separator_active' )
165148 }
166149
167150 separatorRef . current . classList . toggle ( 'breadcrumbs__separator_active' )
168151 }
169152 }
170153
171154 return isLastStep ? (
172- < >
173- { urlParts . itemName ? (
174- < >
175- < li
176- data-testid = "breadcrumbs-last-item"
177- className = "breadcrumbs__item"
178- key = { `${ index } ${ urlPart } ` }
155+ < li
156+ data-testid = "breadcrumbs-last-item"
157+ className = "breadcrumbs__item"
158+ key = { pathItem . id }
159+ >
160+ { pathItem . label }
161+ </ li >
162+ )
163+ : (
164+ < >
165+ < li key = { pathItem . id } className = "breadcrumbs__item" >
166+ < Link to = { pathItem . link } onClick = { onClick } >
167+ { pathItem . label }
168+ </ Link >
169+ </ li >
170+ < li key = { index } className = "breadcrumbs__item" >
171+ { urlParts . pathItems [ index + 1 ] ?. type === BREADCRUMBS_STEP_ITEM_TYPE ? ( < div className = 'breadcrumbs__separator' > < ArrowIcon /> </ div > ) : < RoundedIcon
172+ className = 'breadcrumbs__separator'
173+ id = { `separator-${ index } ` }
174+ ref = { separatorRef }
175+ onClick = { ( ) => handleSeparatorClick ( urlParts . pathItems [ index + 1 ] , separatorRef ) }
179176 >
180- < Link to = { urlParts . screen ?. link } onClick = { onClick } >
181- { urlParts . screen ?. label || label }
182- </ Link >
183-
184- </ li >
185- < li className = "breadcrumbs__separator" >
186177 < ArrowIcon />
187- </ li >
188- < li data-testid = "breadcrumbs-tab" className = "breadcrumbs__item" >
189- { urlParts . itemName }
190- </ li >
191- </ >
192- ) : (
193- < li
194- data-testid = "breadcrumbs-last-item"
195- className = "breadcrumbs__item"
196- key = { `${ index } ${ urlPart } ` }
197- >
198- { urlParts . screen ?. label || label }
199- </ li >
200- ) }
201- </ >
202- ) : (
203- < >
204- < li key = { `${ index } ${ urlPart } ` } className = "breadcrumbs__item" >
205- < Link to = { to } onClick = { onClick } >
206- { label }
207- </ Link >
208- </ li >
209- < li key = { index } className = "breadcrumbs__item" >
210- < RoundedIcon
211- className = { separatorClassNames }
212- id = { `separator-${ index } ` }
213- ref = { separatorRef }
214- onClick = { ( ) => handleSeparatorClick ( urlParts . pathItems [ index + 1 ] , separatorRef ) }
215- >
216- < ArrowIcon />
217- </ RoundedIcon >
218- { showScreensList && urlParts . pathItems [ index + 1 ] === urlParts . screen ?. label && (
219- < BreadcrumbsDropdown
220- id = "breadcrumbs-screens-dropdown"
221- link = { to }
222- list = { mlrunScreens }
223- onClick = { ( ) => handleSelectDropdownItem ( separatorRef ) }
224- ref = { screenListRef }
225- selectedItem = { urlParts . screen ?. id }
226- searchValue = { searchValue }
227- setSearchValue = { setSearchValue }
228- />
229- ) }
230- { showProjectsList && urlParts . pathItems [ index + 1 ] === params . projectName && (
231- < >
178+ </ RoundedIcon > }
179+ { showScreensList && urlParts . pathItems [ index + 1 ] . type === BREADCRUMBS_STEP_SCREEN_TYPE && (
232180 < BreadcrumbsDropdown
233- id = "breadcrumbs-projects -dropdown"
234- link = { to }
235- list = { projectsList }
181+ id = "breadcrumbs-screens -dropdown"
182+ link = { pathItem . link }
183+ list = { mlrunScreens }
236184 onClick = { ( ) => handleSelectDropdownItem ( separatorRef ) }
237- ref = { projectListRef }
238- selectedItem = { params . projectName }
185+ ref = { screenListRef }
186+ selectedItem = { urlParts . screen ?. id }
239187 searchValue = { searchValue }
240188 setSearchValue = { setSearchValue }
241- urlParts = { urlParts }
242- withSearch
243- withAllProjects
244189 />
245- </ >
246- ) }
247- </ li >
248- </ >
249- )
190+ ) }
191+ { showProjectsList && urlParts . pathItems [ index + 1 ] . type === BREADCRUMBS_STEP_PROJECT_TYPE && (
192+ < >
193+ < BreadcrumbsDropdown
194+ id = "breadcrumbs-projects-dropdown"
195+ link = { pathItem . link }
196+ list = { projectsList }
197+ onClick = { ( ) => handleSelectDropdownItem ( separatorRef ) }
198+ ref = { projectListRef }
199+ selectedItem = { params . projectName }
200+ searchValue = { searchValue }
201+ setSearchValue = { setSearchValue }
202+ urlParts = { urlParts }
203+ withSearch
204+ withAllProjects
205+ />
206+ </ >
207+ ) }
208+ </ li >
209+ </ >
210+ )
250211 }
251212)
252213
@@ -257,27 +218,21 @@ BreadcrumbsStep.propTypes = {
257218 mlrunScreens : PropTypes . arrayOf ( PropTypes . object ) . isRequired ,
258219 onClick : PropTypes . func ,
259220 params : PropTypes . object . isRequired ,
221+ pathItem : PropTypes . object . isRequired ,
260222 projectsList : PropTypes . arrayOf ( PropTypes . object ) . isRequired ,
261223 searchValue : PropTypes . string . isRequired ,
262224 setSearchValue : PropTypes . func . isRequired ,
263225 setShowProjectsList : PropTypes . func . isRequired ,
264226 setShowScreensList : PropTypes . func . isRequired ,
265227 showProjectsList : PropTypes . bool . isRequired ,
266228 showScreensList : PropTypes . bool . isRequired ,
267- urlPart : PropTypes . string . isRequired ,
268229 urlParts : PropTypes . shape ( {
269- pathItems : PropTypes . arrayOf ( PropTypes . string ) . isRequired ,
230+ pathItems : PropTypes . arrayOf ( PropTypes . object ) . isRequired ,
270231 screen : PropTypes . shape ( {
271232 id : PropTypes . string ,
272233 label : PropTypes . string ,
273234 link : PropTypes . string
274235 } ) ,
275- tab : PropTypes . shape ( {
276- id : PropTypes . string ,
277- label : PropTypes . string
278-
279- } ) ,
280- itemName : PropTypes . string
281236 } ) . isRequired
282237}
283238
0 commit comments