2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								package  navtree  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"encoding/json" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"sort" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								const  (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// These weights may be used by an extension to reliably place
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// itself in relation to a particular item in the menu. The weights
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// are negative to ensure that the default items are placed above
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// any items with default weight.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-10-03 22:05:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									WeightHome  =  ( iota  -  20 )  *  100 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									WeightSavedItems 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									WeightCreate 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									WeightDashboard 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-08 02:31:45 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									WeightQueryLibrary 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									WeightExplore 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									WeightAlerting 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									WeightDataConnections 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									WeightPlugin 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									WeightConfig 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-05 17:46:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									WeightAlertsAndIncidents 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									WeightMonitoring 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									WeightApps 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									WeightAdmin 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									WeightProfile 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									WeightHelp 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const  (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									NavSectionCore    string  =  "core" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									NavSectionPlugin  string  =  "plugin" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									NavSectionConfig  string  =  "config" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  (  
						 
					
						
							
								
									
										
										
										
											2022-11-18 17:05:45 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									NavIDRoot                =  "root" 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									NavIDDashboards          =  "dashboards" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									NavIDDashboardsBrowse    =  "dashboards/browse" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									NavIDCfg                 =  "cfg"  // NavIDCfg is the id for org configuration navigation node
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									NavIDAdmin               =  "admin" 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-18 23:11:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									NavIDAdminGeneral        =  "admin/general" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									NavIDAdminPlugins        =  "admin/plugins" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									NavIDAdminAccess         =  "admin/access" 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									NavIDAlertsAndIncidents  =  "alerts-and-incidents" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									NavIDAlerting            =  "alerting" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									NavIDMonitoring          =  "monitoring" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									NavIDReporting           =  "reports" 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-05 17:46:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									NavIDApps                =  "apps" 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								type  NavLink  struct  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Id                string      ` json:"id,omitempty" ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Text              string      ` json:"text" ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Section           string      ` json:"section,omitempty" ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									SubTitle          string      ` json:"subTitle,omitempty" ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Icon              string      ` json:"icon,omitempty" `  // Available icons can be browsed in Storybook: https://developers.grafana.com/ui/latest/index.html?path=/story/docs-overview-icon--icons-overview
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Img               string      ` json:"img,omitempty" ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Url               string      ` json:"url,omitempty" ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Target            string      ` json:"target,omitempty" ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									SortWeight        int64       ` json:"sortWeight,omitempty" ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Divider           bool        ` json:"divider,omitempty" ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									HideFromMenu      bool        ` json:"hideFromMenu,omitempty" ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									HideFromTabs      bool        ` json:"hideFromTabs,omitempty" ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ShowIconInNavbar  bool        ` json:"showIconInNavbar,omitempty" ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									RoundIcon         bool        ` json:"roundIcon,omitempty" ` 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-31 18:01:34 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									IsSection         bool        ` json:"isSection,omitempty" ` 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									Children          [ ] * NavLink  ` json:"children,omitempty" ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									HighlightText     string      ` json:"highlightText,omitempty" ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									HighlightID       string      ` json:"highlightId,omitempty" ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									EmptyMessageId    string      ` json:"emptyMessageId,omitempty" ` 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-04 04:19:42 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									PluginID          string      ` json:"pluginId,omitempty" `  // (Optional) The ID of the plugin that registered nav link (e.g. as a standalone plugin page)
 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-15 20:08:15 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									IsCreateAction    bool        ` json:"isCreateAction,omitempty" ` 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( node  * NavLink )  Sort ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Sort ( node . Children ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type  NavTreeRoot  struct  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Children  [ ] * NavLink 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( root  * NavTreeRoot )  AddSection ( node  * NavLink )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									root . Children  =  append ( root . Children ,  node ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( root  * NavTreeRoot )  RemoveSection ( node  * NavLink )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									var  result  [ ] * NavLink 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  _ ,  child  :=  range  root . Children  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  child  !=  node  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											result  =  append ( result ,  child ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									root . Children  =  result 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( root  * NavTreeRoot )  FindById ( id  string )  * NavLink  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  FindById ( root . Children ,  id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( root  * NavTreeRoot )  RemoveEmptySectionsAndApplyNewInformationArchitecture ( topNavEnabled  bool )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Remove server admin node if it has no children or set the url to first child
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  node  :=  root . FindById ( NavIDAdmin ) ;  node  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  len ( node . Children )  ==  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											root . RemoveSection ( node ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											node . Url  =  node . Children [ 0 ] . Url 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  topNavEnabled  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-18 23:11:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ApplyAdminIA ( root ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Move reports into dashboards
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  reports  :=  root . FindById ( NavIDReporting ) ;  reports  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  dashboards  :=  root . FindById ( NavIDDashboards ) ;  dashboards  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												reports . SortWeight  =  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												dashboards . Children  =  append ( dashboards . Children ,  reports ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												root . RemoveSection ( reports ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Change id of dashboards
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  dashboards  :=  root . FindById ( NavIDDashboards ) ;  dashboards  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dashboards . Id  =  "dashboards/browse" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Remove top level cfg / administration node if it has no children (needs to be after topnav new info archicture logic above that moves server admin into it)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Remove server admin node if it has no children or set the url to first child
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  node  :=  root . FindById ( NavIDCfg ) ;  node  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  len ( node . Children )  ==  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											root . RemoveSection ( node ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  if  ! topNavEnabled  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											node . Url  =  node . Children [ 0 ] . Url 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-21 16:43:21 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  len ( root . Children )  <  1  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										root . Children  =  make ( [ ] * NavLink ,  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( root  * NavTreeRoot )  Sort ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Sort ( root . Children ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( root  * NavTreeRoot )  MarshalJSON ( )  ( [ ] byte ,  error )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  json . Marshal ( root . Children ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  Sort ( nodes  [ ] * NavLink )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									sort . SliceStable ( nodes ,  func ( i ,  j  int )  bool  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										iw  :=  nodes [ i ] . SortWeight 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  iw  ==  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											iw  =  int64 ( i )  +  1 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										jw  :=  nodes [ j ] . SortWeight 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  jw  ==  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											jw  =  int64 ( j )  +  1 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  iw  <  jw 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  _ ,  child  :=  range  nodes  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										child . Sort ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-11-18 23:11:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ApplyAdminIA ( root  * NavTreeRoot )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									orgAdminNode  :=  root . FindById ( NavIDCfg ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  orgAdminNode  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										orgAdminNode . Url  =  "/admin" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										orgAdminNode . Text  =  "Administration" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										generalNodeLinks  :=  [ ] * NavLink { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pluginsNodeLinks  :=  [ ] * NavLink { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										accessNodeLinks  :=  [ ] * NavLink { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										generalNodeLinks  =  AppendIfNotNil ( generalNodeLinks ,  root . FindById ( "upgrading" ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-12 23:23:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										generalNodeLinks  =  AppendIfNotNil ( generalNodeLinks ,  root . FindById ( "licensing" ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-18 23:11:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  orgSettings  :=  root . FindById ( "org-settings" ) ;  orgSettings  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											orgSettings . Text  =  "Default preferences" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											generalNodeLinks  =  append ( generalNodeLinks ,  orgSettings ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										generalNodeLinks  =  AppendIfNotNil ( generalNodeLinks ,  root . FindById ( "global-orgs" ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										generalNodeLinks  =  AppendIfNotNil ( generalNodeLinks ,  root . FindById ( "server-settings" ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pluginsNodeLinks  =  AppendIfNotNil ( pluginsNodeLinks ,  root . FindById ( "plugins" ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pluginsNodeLinks  =  AppendIfNotNil ( pluginsNodeLinks ,  root . FindById ( "datasources" ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pluginsNodeLinks  =  AppendIfNotNil ( pluginsNodeLinks ,  root . FindById ( "correlations" ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pluginsNodeLinks  =  AppendIfNotNil ( pluginsNodeLinks ,  root . FindById ( "plugin-page-grafana-cloud-link-app" ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pluginsNodeLinks  =  AppendIfNotNil ( pluginsNodeLinks ,  root . FindById ( "recordedQueries" ) )  // enterprise only
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  globalUsers  :=  root . FindById ( "global-users" ) ;  globalUsers  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-30 21:24:53 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											globalUsers . Text  =  "Users" 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-18 23:11:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											accessNodeLinks  =  append ( accessNodeLinks ,  globalUsers ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										accessNodeLinks  =  AppendIfNotNil ( accessNodeLinks ,  root . FindById ( "teams" ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										accessNodeLinks  =  AppendIfNotNil ( accessNodeLinks ,  root . FindById ( "serviceaccounts" ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										accessNodeLinks  =  AppendIfNotNil ( accessNodeLinks ,  root . FindById ( "apikeys" ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-12 23:23:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										accessNodeLinks  =  AppendIfNotNil ( accessNodeLinks ,  root . FindById ( "ldap" ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-23 18:01:57 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										accessNodeLinks  =  AppendIfNotNil ( accessNodeLinks ,  root . FindById ( "standalone-plugin-page-/a/grafana-auth-app" ) )  // Cloud Access Policies
 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-18 23:11:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										generalNode  :=  & NavLink { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Text :      "General" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Id :        NavIDAdminGeneral , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Url :       "/admin/general" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Icon :      "shield" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Children :  generalNodeLinks , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pluginsNode  :=  & NavLink { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Text :      "Plugins and data" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Id :        NavIDAdminPlugins , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Url :       "/admin/plugins" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Icon :      "shield" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Children :  pluginsNodeLinks , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										accessNode  :=  & NavLink { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Text :      "Users and access" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Id :        NavIDAdminAccess , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Url :       "/admin/access" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Icon :      "shield" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Children :  accessNodeLinks , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										adminNodeLinks  :=  [ ] * NavLink { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  len ( generalNode . Children )  >  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											adminNodeLinks  =  append ( adminNodeLinks ,  generalNode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  len ( pluginsNode . Children )  >  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											adminNodeLinks  =  append ( adminNodeLinks ,  pluginsNode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  len ( accessNode . Children )  >  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											adminNodeLinks  =  append ( adminNodeLinks ,  accessNode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-09 02:57:33 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										adminNodeLinks  =  AppendIfNotNil ( adminNodeLinks ,  root . FindById ( "storage" ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-11-18 23:11:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  len ( adminNodeLinks )  >  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											orgAdminNode . Children  =  adminNodeLinks 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											root . RemoveSection ( orgAdminNode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  serverAdminNode  :=  root . FindById ( NavIDAdmin ) ;  serverAdminNode  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										root . RemoveSection ( serverAdminNode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  AppendIfNotNil ( children  [ ] * NavLink ,  newChild  * NavLink )  [ ] * NavLink  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  newChild  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  append ( children ,  newChild ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  children 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  FindById ( nodes  [ ] * NavLink ,  id  string )  * NavLink  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  _ ,  child  :=  range  nodes  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  child . Id  ==  id  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  child 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  if  len ( child . Children )  >  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  found  :=  FindById ( child . Children ,  id ) ;  found  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  found 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  nil 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}