33 * SPDX-License-Identifier: Apache-2.0
44 */
55
6- import { BehaviorSubject , combineLatest , Observable , ReplaySubject , Subscription } from 'rxjs' ;
6+ import { BehaviorSubject , combineLatest , Observable , of , ReplaySubject , Subscription } from 'rxjs' ;
77import { AppCategory , ChromeNavGroup , ChromeNavLink } from 'opensearch-dashboards/public' ;
8- import { map , takeUntil } from 'rxjs/operators' ;
8+ import { map , switchMap , takeUntil } from 'rxjs/operators' ;
99import { IUiSettingsClient } from '../../ui_settings' ;
1010import {
1111 flattenLinksOrCategories ,
@@ -31,12 +31,15 @@ export type NavGroupItemInMap = ChromeNavGroup & {
3131 navLinks : ChromeRegistrationNavLink [ ] ;
3232} ;
3333
34+ export type ChromeNavGroupUpdater = ( navGroup : ChromeNavGroup ) => Partial < ChromeNavGroup > | void ;
35+
3436export interface ChromeNavGroupServiceSetupContract {
3537 addNavLinksToGroup : ( navGroup : ChromeNavGroup , navLinks : ChromeRegistrationNavLink [ ] ) => void ;
3638 /**
3739 * Get a boolean value to indicates whether use case is enabled
3840 */
3941 getNavGroupEnabled : ( ) => boolean ;
42+ registerNavGroupUpdater : ( navGroupUpdater : Observable < ChromeNavGroupUpdater > ) => ( ) => void ;
4043}
4144
4245export interface ChromeNavGroupServiceStartContract {
@@ -51,6 +54,7 @@ export class ChromeNavGroupService {
5154 private navLinks$ : Observable < Array < Readonly < ChromeNavLink > > > = new BehaviorSubject ( [ ] ) ;
5255 private navGroupEnabled : boolean = false ;
5356 private navGroupEnabledUiSettingsSubscription : Subscription | undefined ;
57+ private navGroupUpdaters$$ = new BehaviorSubject < Array < Observable < ChromeNavGroupUpdater > > > ( [ ] ) ;
5458 private addNavLinkToGroup (
5559 currentGroupsMap : Record < string , NavGroupItemInMap > ,
5660 navGroup : ChromeNavGroup ,
@@ -78,7 +82,7 @@ export class ChromeNavGroupService {
7882 return currentGroupsMap ;
7983 }
8084 private getSortedNavGroupsMap$ ( ) {
81- return combineLatest ( [ this . navGroupsMap$ , this . navLinks$ ] )
85+ return combineLatest ( [ this . getUpdatedNavGroupsMap$ ( ) , this . navLinks$ ] )
8286 . pipe ( takeUntil ( this . stop$ ) )
8387 . pipe (
8488 map ( ( [ navGroupsMap , navLinks ] ) => {
@@ -96,6 +100,33 @@ export class ChromeNavGroupService {
96100 } )
97101 ) ;
98102 }
103+
104+ private getUpdatedNavGroupsMap$ ( ) {
105+ return combineLatest ( [ this . navGroupsMap$ , this . navGroupUpdaters$$ ] ) . pipe (
106+ switchMap ( ( [ navGroupsMap , updaters$ ] ) => {
107+ if ( updaters$ . length === 0 ) {
108+ return of ( navGroupsMap ) ;
109+ }
110+ return combineLatest ( updaters$ ) . pipe (
111+ map ( ( updaters ) => {
112+ return Object . keys ( navGroupsMap ) . reduce < Record < string , NavGroupItemInMap > > (
113+ ( previousValue , currentKey ) => ( {
114+ ...previousValue ,
115+ [ currentKey ] : updaters . reduce (
116+ ( prevNavGroup , currentUpdater ) => ( {
117+ ...prevNavGroup ,
118+ ...currentUpdater ( prevNavGroup ) ,
119+ } ) ,
120+ navGroupsMap [ currentKey ]
121+ ) ,
122+ } ) ,
123+ { }
124+ ) ;
125+ } )
126+ ) ;
127+ } )
128+ ) ;
129+ }
99130 setup ( { uiSettings } : { uiSettings : IUiSettingsClient } ) : ChromeNavGroupServiceSetupContract {
100131 this . navGroupEnabledUiSettingsSubscription = uiSettings
101132 . get$ ( 'home:useNewHomePage' , false )
@@ -116,6 +147,14 @@ export class ChromeNavGroupService {
116147 this . navGroupsMap$ . next ( navGroupsMapAfterAdd ) ;
117148 } ,
118149 getNavGroupEnabled : ( ) => this . navGroupEnabled ,
150+ registerNavGroupUpdater : ( updater$ ) => {
151+ this . navGroupUpdaters$$ . next ( [ ...this . navGroupUpdaters$$ . getValue ( ) , updater$ ] ) ;
152+ return ( ) => {
153+ this . navGroupUpdaters$$ . next (
154+ this . navGroupUpdaters$$ . getValue ( ) . filter ( ( item ) => item !== updater$ )
155+ ) ;
156+ } ;
157+ } ,
119158 } ;
120159 }
121160 async start ( {
0 commit comments