2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								package  navtreeimpl  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"fmt" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"sort" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/grafana/grafana/pkg/api/dtos" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/grafana/grafana/pkg/infra/kvstore" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/grafana/grafana/pkg/infra/log" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/grafana/grafana/pkg/plugins" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ac  "github.com/grafana/grafana/pkg/services/accesscontrol" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/grafana/grafana/pkg/services/apikey" 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-27 15:50:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									contextmodel  "github.com/grafana/grafana/pkg/services/contexthandler/model" 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									"github.com/grafana/grafana/pkg/services/dashboards" 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-06 16:11:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/grafana/grafana/pkg/services/datasources" 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									"github.com/grafana/grafana/pkg/services/featuremgmt" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/grafana/grafana/pkg/services/navtree" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/grafana/grafana/pkg/services/org" 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-08 00:22:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/grafana/grafana/pkg/services/pluginsintegration/pluginsettings" 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									pref  "github.com/grafana/grafana/pkg/services/preference" 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-08 02:31:45 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/grafana/grafana/pkg/services/querylibrary" 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									"github.com/grafana/grafana/pkg/services/star" 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-28 04:04:04 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/grafana/grafana/pkg/services/supportbundles/supportbundlesimpl" 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									"github.com/grafana/grafana/pkg/setting" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type  ServiceImpl  struct  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									cfg                   * setting . Cfg 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									log                   log . Logger 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									accessControl         ac . AccessControl 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									pluginStore           plugins . Store 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									pluginSettings        pluginsettings . Service 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									starService           star . Service 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									features              * featuremgmt . FeatureManager 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dashboardService      dashboards . DashboardService 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									accesscontrolService  ac . Service 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									kvStore               kvstore . KVStore 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									apiKeyService         apikey . Service 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-08 02:31:45 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									queryLibraryService   querylibrary . HTTPService 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Navigation
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									navigationAppConfig      map [ string ] NavigationAppConfig 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									navigationAppPathConfig  map [ string ] NavigationAppConfig 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type  NavigationAppConfig  struct  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									SectionID   string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									SortWeight  int64 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-14 17:01:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Text        string 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-10 18:29:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Icon        string 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-10-08 02:31:45 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ProvideService ( cfg  * setting . Cfg ,  accessControl  ac . AccessControl ,  pluginStore  plugins . Store ,  pluginSettings  pluginsettings . Service ,  starService  star . Service ,  features  * featuremgmt . FeatureManager ,  dashboardService  dashboards . DashboardService ,  accesscontrolService  ac . Service ,  kvStore  kvstore . KVStore ,  apiKeyService  apikey . Service ,  queryLibraryService  querylibrary . HTTPService )  navtree . Service  {  
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									service  :=  & ServiceImpl { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										cfg :                   cfg , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										log :                   log . New ( "navtree service" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										accessControl :         accessControl , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pluginStore :           pluginStore , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pluginSettings :        pluginSettings , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										starService :           starService , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										features :              features , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										dashboardService :      dashboardService , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										accesscontrolService :  accesscontrolService , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										kvStore :               kvStore , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										apiKeyService :         apiKeyService , 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-08 02:31:45 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										queryLibraryService :   queryLibraryService , 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									service . readNavigationSettings ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  service 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//nolint:gocyclo
  
						 
					
						
							
								
									
										
										
										
											2023-01-27 15:50:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( s  * ServiceImpl )  GetNavTree ( c  * contextmodel . ReqContext ,  hasEditPerm  bool ,  prefs  * pref . Preference )  ( * navtree . NavTreeRoot ,  error )  {  
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									hasAccess  :=  ac . HasAccess ( s . accessControl ,  c ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									treeRoot  :=  & navtree . NavTreeRoot { } 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-11-23 00:48:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									treeRoot . AddSection ( s . getHomeNode ( c ,  prefs ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-03 22:05:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  hasAccess ( ac . ReqSignedIn ,  ac . EvalPermission ( dashboards . ActionDashboardsRead ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-03 22:05:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										starredItemsLinks ,  err  :=  s . buildStarredItemsNavLinks ( c ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										treeRoot . AddSection ( & navtree . NavLink { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											Text :            "Starred" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Id :              "starred" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Icon :            "star" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											SortWeight :      navtree . WeightSavedItems , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Section :         navtree . NavSectionCore , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Children :        starredItemsLinks , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											EmptyMessageId :  "starred-empty" , 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-08 23:18:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Url :             s . cfg . AppSubURL  +  "/dashboards?starred" , 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-18 17:15:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-10-25 03:34:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  c . IsPublicDashboardView  ||  hasAccess ( ac . ReqSignedIn ,  ac . EvalAny ( ac . EvalPermission ( dashboards . ActionDashboardsRead ) ,  ac . EvalPermission ( dashboards . ActionDashboardsCreate ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										dashboardChildLinks  :=  s . buildDashboardNavLinks ( c ,  hasEditPerm ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										dashboardLink  :=  & navtree . NavLink { 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-03 17:09:32 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Text :        "Dashboards" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Id :          navtree . NavIDDashboards , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											SubTitle :    "Create and manage dashboards to visualize your data" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Icon :        "apps" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Url :         s . cfg . AppSubURL  +  "/dashboards" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											SortWeight :  navtree . WeightDashboard , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Section :     navtree . NavSectionCore , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Children :    dashboardChildLinks , 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										treeRoot . AddSection ( dashboardLink ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-27 15:50:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									canExplore  :=  func ( context  * contextmodel . ReqContext )  bool  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return  c . OrgRole  ==  org . RoleAdmin  ||  c . OrgRole  ==  org . RoleEditor  ||  setting . ViewersCanEdit 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  setting . ExploreEnabled  &&  hasAccess ( canExplore ,  ac . EvalPermission ( ac . ActionDatasourcesExplore ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										treeRoot . AddSection ( & navtree . NavLink { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											Text :        "Explore" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Id :          "explore" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											SubTitle :    "Explore your data" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Icon :        "compass" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											SortWeight :  navtree . WeightExplore , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Section :     navtree . NavSectionCore , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Url :         s . cfg . AppSubURL  +  "/explore" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-10-08 02:31:45 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ! s . queryLibraryService . IsDisabled ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										treeRoot . AddSection ( & navtree . NavLink { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Text :        "Query Library" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Id :          "query" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											SubTitle :    "Store, import, export and manage your team queries in an easy way." , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Icon :        "file-search-alt" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											SortWeight :  navtree . WeightQueryLibrary , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Section :     navtree . NavSectionCore , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Url :         s . cfg . AppSubURL  +  "/query-library" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  setting . ProfileEnabled  &&  c . IsSignedIn  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										treeRoot . AddSection ( s . getProfileNode ( c ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_ ,  uaIsDisabledForOrg  :=  s . cfg . UnifiedAlerting . DisabledOrgs [ c . OrgID ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									uaVisibleForOrg  :=  s . cfg . UnifiedAlerting . IsEnabled ( )  &&  ! uaIsDisabledForOrg 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  setting . AlertingEnabled  !=  nil  &&  * setting . AlertingEnabled  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  legacyAlertSection  :=  s . buildLegacyAlertNavLinks ( c ) ;  legacyAlertSection  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											treeRoot . AddSection ( legacyAlertSection ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									}  else  if  uaVisibleForOrg  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  alertingSection  :=  s . buildAlertNavLinks ( c ,  hasEditPerm ) ;  alertingSection  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											treeRoot . AddSection ( alertingSection ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  s . features . IsEnabled ( featuremgmt . FlagDataConnectionsConsole )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-06 16:11:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  connectionsSection  :=  s . buildDataConnectionsNavLink ( c ) ;  connectionsSection  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											treeRoot . AddSection ( connectionsSection ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  s . features . IsEnabled ( featuremgmt . FlagLivePipeline )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										liveNavLinks  :=  [ ] * navtree . NavLink { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										liveNavLinks  =  append ( liveNavLinks ,  & navtree . NavLink { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Text :  "Status" ,  Id :  "live-status" ,  Url :  s . cfg . AppSubURL  +  "/live" ,  Icon :  "exchange-alt" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										liveNavLinks  =  append ( liveNavLinks ,  & navtree . NavLink { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Text :  "Pipeline" ,  Id :  "live-pipeline" ,  Url :  s . cfg . AppSubURL  +  "/live/pipeline" ,  Icon :  "arrow-to-right" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										liveNavLinks  =  append ( liveNavLinks ,  & navtree . NavLink { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Text :  "Cloud" ,  Id :  "live-cloud" ,  Url :  s . cfg . AppSubURL  +  "/live/cloud" ,  Icon :  "cloud-upload" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										treeRoot . AddSection ( & navtree . NavLink { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											Id :            "live" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Text :          "Live" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											SubTitle :      "Event streaming" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Icon :          "exchange-alt" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Url :           s . cfg . AppSubURL  +  "/live" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Children :      liveNavLinks , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Section :       navtree . NavSectionConfig , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											HideFromTabs :  true , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									orgAdminNode ,  err  :=  s . getOrgAdminNode ( c ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  orgAdminNode  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										treeRoot . AddSection ( orgAdminNode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  nil ,  err 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									serverAdminNode  :=  s . getServerAdminNode ( c ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  serverAdminNode  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										treeRoot . AddSection ( serverAdminNode ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									s . addHelpLinks ( treeRoot ,  c ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  err  :=  s . addAppLinks ( treeRoot ,  c ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  treeRoot ,  nil 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-27 15:50:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( s  * ServiceImpl )  getHomeNode ( c  * contextmodel . ReqContext ,  prefs  * pref . Preference )  * navtree . NavLink  {  
						 
					
						
							
								
									
										
										
										
											2022-10-03 22:05:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									homeUrl  :=  s . cfg . AppSubURL  +  "/" 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-10 00:42:45 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ! c . IsSignedIn  &&  ! s . cfg . AnonymousEnabled  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										homeUrl  =  s . cfg . AppSubURL  +  "/login" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										homePage  :=  s . cfg . HomePage 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-03 22:05:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-03-10 00:42:45 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  prefs . HomeDashboardID  ==  0  &&  len ( homePage )  >  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											homeUrl  =  homePage 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-03 22:05:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-11-23 00:48:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									homeNode  :=  & navtree . NavLink { 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-03 22:05:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Text :        "Home" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Id :          "home" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Url :         homeUrl , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Icon :        "home-alt" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Section :     navtree . NavSectionCore , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										SortWeight :  navtree . WeightHome , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-23 00:48:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ! s . features . IsEnabled ( featuremgmt . FlagTopnav )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										homeNode . HideFromMenu  =  true 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  homeNode 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-03 22:05:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-28 04:04:04 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  isSupportBundlesEnabled ( s  * ServiceImpl )  bool  {  
						 
					
						
							
								
									
										
										
										
											2023-02-10 17:12:04 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  s . cfg . SectionWithEnvOverrides ( "support_bundles" ) . Key ( "enabled" ) . MustBool ( true ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-28 04:04:04 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-27 15:50:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( s  * ServiceImpl )  addHelpLinks ( treeRoot  * navtree . NavTreeRoot ,  c  * contextmodel . ReqContext )  {  
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  setting . HelpEnabled  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										helpVersion  :=  fmt . Sprintf ( ` %s v%s (%s) ` ,  setting . ApplicationName ,  setting . BuildVersion ,  setting . BuildCommit ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  s . cfg . AnonymousHideVersion  &&  ! c . IsSignedIn  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											helpVersion  =  setting . ApplicationName 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-28 04:04:04 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										helpNode  :=  & navtree . NavLink { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											Text :        "Help" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											SubTitle :    helpVersion , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Id :          "help" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Url :         "#" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Icon :        "question-circle" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											SortWeight :  navtree . WeightHelp , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Section :     navtree . NavSectionConfig , 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-28 04:04:04 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Children :    [ ] * navtree . NavLink { } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										treeRoot . AddSection ( helpNode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										hasAccess  :=  ac . HasAccess ( s . accessControl ,  c ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										supportBundleAccess  :=  ac . EvalAny ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ac . EvalPermission ( supportbundlesimpl . ActionRead ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ac . EvalPermission ( supportbundlesimpl . ActionCreate ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  isSupportBundlesEnabled ( s )  &&  hasAccess ( ac . ReqGrafanaAdmin ,  supportBundleAccess )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											supportBundleNode  :=  & navtree . NavLink { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Text :        "Support bundles" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Id :          "support-bundles" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Url :         "/support-bundles" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Icon :        "wrench" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Section :     navtree . NavSectionConfig , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												SortWeight :  navtree . WeightHelp , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											helpNode . Children  =  append ( helpNode . Children ,  supportBundleNode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-27 15:50:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( s  * ServiceImpl )  getProfileNode ( c  * contextmodel . ReqContext )  * navtree . NavLink  {  
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									// Only set login if it's different from the name
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									var  login  string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  c . SignedInUser . Login  !=  c . SignedInUser . NameOrFallback ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										login  =  c . SignedInUser . Login 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									gravatarURL  :=  dtos . GetGravatarUrl ( c . Email ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									children  :=  [ ] * navtree . NavLink { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-24 16:32:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Text :  "Profile" ,  Id :  "profile/settings" ,  Url :  s . cfg . AppSubURL  +  "/profile" ,  Icon :  "sliders-v-alt" , 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									children  =  append ( children ,  & navtree . NavLink { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Text :  "Notification history" ,  Id :  "profile/notifications" ,  Url :  s . cfg . AppSubURL  +  "/profile/notifications" ,  Icon :  "bell" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-02-27 22:28:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  s . cfg . AddChangePasswordLink ( )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										children  =  append ( children ,  & navtree . NavLink { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Text :  "Change password" ,  Id :  "profile/password" ,  Url :  s . cfg . AppSubURL  +  "/profile/password" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Icon :  "lock" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ! setting . DisableSignoutMenu  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// add sign out first
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										children  =  append ( children ,  & navtree . NavLink { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Text :          "Sign out" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Id :            "sign-out" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Url :           s . cfg . AppSubURL  +  "/logout" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Icon :          "arrow-from-right" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Target :        "_self" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											HideFromTabs :  true , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  & navtree . NavLink { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Text :        c . SignedInUser . NameOrFallback ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										SubTitle :    login , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Id :          "profile" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Img :         gravatarURL , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Url :         s . cfg . AppSubURL  +  "/profile" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Section :     navtree . NavSectionConfig , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										SortWeight :  navtree . WeightProfile , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Children :    children , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										RoundIcon :   true , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-27 15:50:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( s  * ServiceImpl )  buildStarredItemsNavLinks ( c  * contextmodel . ReqContext )  ( [ ] * navtree . NavLink ,  error )  {  
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									starredItemsChildNavs  :=  [ ] * navtree . NavLink { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									query  :=  star . GetUserStarsQuery { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										UserID :  c . SignedInUser . UserID , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									starredDashboardResult ,  err  :=  s . starService . GetByUser ( c . Req . Context ( ) ,  & query ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  nil ,  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-03-16 17:20:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  len ( starredDashboardResult . UserStars )  >  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										var  ids  [ ] int64 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  id  :=  range  starredDashboardResult . UserStars  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ids  =  append ( ids ,  id ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-16 17:20:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										starredDashboards ,  err  :=  s . dashboardService . GetDashboards ( c . Req . Context ( ) ,  & dashboards . GetDashboardsQuery { DashboardIDs :  ids ,  OrgID :  c . OrgID } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  nil ,  err 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-16 17:20:07 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Set a loose limit to the first 50 starred dashboards found
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  len ( starredDashboards )  >  50  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											starredDashboards  =  starredDashboards [ : 50 ] 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sort . Slice ( starredDashboards ,  func ( i ,  j  int )  bool  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  starredDashboards [ i ] . Title  <  starredDashboards [ j ] . Title 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  _ ,  starredItem  :=  range  starredDashboards  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											starredItemsChildNavs  =  append ( starredItemsChildNavs ,  & navtree . NavLink { 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-16 23:33:55 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Id :    "starred/"  +  starredItem . UID , 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												Text :  starredItem . Title , 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-16 23:33:55 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Url :   starredItem . GetURL ( ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  starredItemsChildNavs ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-27 15:50:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( s  * ServiceImpl )  buildDashboardNavLinks ( c  * contextmodel . ReqContext ,  hasEditPerm  bool )  [ ] * navtree . NavLink  {  
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									hasAccess  :=  ac . HasAccess ( s . accessControl ,  c ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-27 15:50:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									hasEditPermInAnyFolder  :=  func ( c  * contextmodel . ReqContext )  bool  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return  hasEditPerm 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dashboardChildNavs  :=  [ ] * navtree . NavLink { } 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  ! s . features . IsEnabled ( featuremgmt . FlagTopnav )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										dashboardChildNavs  =  append ( dashboardChildNavs ,  & navtree . NavLink { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Text :  "Browse" ,  Id :  navtree . NavIDDashboardsBrowse ,  Url :  s . cfg . AppSubURL  +  "/dashboards" ,  Icon :  "sitemap" , 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									dashboardChildNavs  =  append ( dashboardChildNavs ,  & navtree . NavLink { 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-03 17:09:32 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Text :  "Playlists" ,  SubTitle :  "Groups of dashboards that are displayed in a sequence" ,  Id :  "dashboards/playlists" ,  Url :  s . cfg . AppSubURL  +  "/playlists" ,  Icon :  "presentation-play" , 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  c . IsSignedIn  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-26 21:28:11 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  s . cfg . SnapshotEnabled  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dashboardChildNavs  =  append ( dashboardChildNavs ,  & navtree . NavLink { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Text :      "Snapshots" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												SubTitle :  "Interactive, publically available, point-in-time representations of dashboards" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Id :        "dashboards/snapshots" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Url :       s . cfg . AppSubURL  +  "/dashboard/snapshots" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Icon :      "camera" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										dashboardChildNavs  =  append ( dashboardChildNavs ,  & navtree . NavLink { 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-03 17:09:32 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Text :      "Library panels" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											SubTitle :  "Reusable panels that can be added to multiple dashboards" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Id :        "dashboards/library-panels" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Url :       s . cfg . AppSubURL  +  "/library-panels" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Icon :      "library-panel" , 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-13 13:36:05 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  s . features . IsEnabled ( featuremgmt . FlagPublicDashboards )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dashboardChildNavs  =  append ( dashboardChildNavs ,  & navtree . NavLink { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Text :  "Public dashboards" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Id :    "dashboards/public" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Url :   s . cfg . AppSubURL  +  "/dashboard/public" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Icon :  "library-panel" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  s . features . IsEnabled ( featuremgmt . FlagScenes )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										dashboardChildNavs  =  append ( dashboardChildNavs ,  & navtree . NavLink { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Text :  "Scenes" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Id :    "scenes" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Url :   s . cfg . AppSubURL  +  "/scenes" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Icon :  "apps" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  hasEditPerm  &&  ! s . features . IsEnabled ( featuremgmt . FlagTopnav )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										dashboardChildNavs  =  append ( dashboardChildNavs ,  & navtree . NavLink { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Text :  "Divider" ,  Divider :  true ,  Id :  "divider" ,  HideFromTabs :  true , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-15 20:08:15 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-11-15 20:08:15 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  hasEditPerm  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										if  hasAccess ( hasEditPermInAnyFolder ,  ac . EvalPermission ( dashboards . ActionDashboardsCreate ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dashboardChildNavs  =  append ( dashboardChildNavs ,  & navtree . NavLink { 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-15 20:08:15 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Text :  "New dashboard" ,  Icon :  "plus" ,  Url :  s . cfg . AppSubURL  +  "/dashboard/new" ,  HideFromTabs :  true ,  Id :  "dashboards/new" ,  ShowIconInNavbar :  true ,  IsCreateAction :  true , 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-15 20:08:15 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-11-15 20:08:15 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  hasEditPerm  &&  ! s . features . IsEnabled ( featuremgmt . FlagTopnav )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										if  hasAccess ( ac . ReqOrgAdminOrEditor ,  ac . EvalPermission ( dashboards . ActionFoldersCreate ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dashboardChildNavs  =  append ( dashboardChildNavs ,  & navtree . NavLink { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Text :  "New folder" ,  SubTitle :  "Create a new folder to organize your dashboards" ,  Id :  "dashboards/folder/new" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Icon :  "plus" ,  Url :  s . cfg . AppSubURL  +  "/dashboards/folder/new" ,  HideFromTabs :  true ,  ShowIconInNavbar :  true , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  hasAccess ( hasEditPermInAnyFolder ,  ac . EvalPermission ( dashboards . ActionDashboardsCreate ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dashboardChildNavs  =  append ( dashboardChildNavs ,  & navtree . NavLink { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Text :  "Import" ,  SubTitle :  "Import dashboard from file or Grafana.com" ,  Id :  "dashboards/import" ,  Icon :  "plus" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Url :  s . cfg . AppSubURL  +  "/dashboard/import" ,  HideFromTabs :  true ,  ShowIconInNavbar :  true , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  dashboardChildNavs 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-27 15:50:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( s  * ServiceImpl )  buildLegacyAlertNavLinks ( c  * contextmodel . ReqContext )  * navtree . NavLink  {  
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									var  alertChildNavs  [ ] * navtree . NavLink 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									alertChildNavs  =  append ( alertChildNavs ,  & navtree . NavLink { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Text :  "Alert rules" ,  Id :  "alert-list" ,  Url :  s . cfg . AppSubURL  +  "/alerting/list" ,  Icon :  "list-ul" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  c . HasRole ( org . RoleEditor )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										alertChildNavs  =  append ( alertChildNavs ,  & navtree . NavLink { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Text :  "Notification channels" ,  Id :  "channels" ,  Url :  s . cfg . AppSubURL  +  "/alerting/notifications" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Icon :  "comment-alt-share" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									var  alertNav  =  navtree . NavLink { 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-03 17:09:32 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Text :        "Alerting" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										SubTitle :    "Learn about problems in your systems moments after they occur" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Id :          "alerting-legacy" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Icon :        "bell" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Children :    alertChildNavs , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Section :     navtree . NavSectionCore , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										SortWeight :  navtree . WeightAlerting , 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  s . features . IsEnabled ( featuremgmt . FlagTopnav )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										alertNav . Url  =  s . cfg . AppSubURL  +  "/alerting" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										alertNav . Url  =  s . cfg . AppSubURL  +  "/alerting/list" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  & alertNav 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-27 15:50:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( s  * ServiceImpl )  buildAlertNavLinks ( c  * contextmodel . ReqContext ,  hasEditPerm  bool )  * navtree . NavLink  {  
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									hasAccess  :=  ac . HasAccess ( s . accessControl ,  c ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									var  alertChildNavs  [ ] * navtree . NavLink 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-20 23:21:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ! s . features . IsEnabled ( featuremgmt . FlagTopnav )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										alertChildNavs  =  append ( alertChildNavs ,  & navtree . NavLink { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Text :  "Home" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Id :    "alert-home" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Url :   s . cfg . AppSubURL  +  "/alerting/home" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Icon :  "home" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  hasAccess ( ac . ReqViewer ,  ac . EvalAny ( ac . EvalPermission ( ac . ActionAlertingRuleRead ) ,  ac . EvalPermission ( ac . ActionAlertingRuleExternalRead ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										alertChildNavs  =  append ( alertChildNavs ,  & navtree . NavLink { 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-03 17:09:32 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Text :  "Alert rules" ,  SubTitle :  "Rules that determine whether an alert will fire" ,  Id :  "alert-list" ,  Url :  s . cfg . AppSubURL  +  "/alerting/list" ,  Icon :  "list-ul" , 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  hasAccess ( ac . ReqOrgAdminOrEditor ,  ac . EvalAny ( ac . EvalPermission ( ac . ActionAlertingNotificationsRead ) ,  ac . EvalPermission ( ac . ActionAlertingNotificationsExternalRead ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										alertChildNavs  =  append ( alertChildNavs ,  & navtree . NavLink { 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-30 23:26:21 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Text :  "Contact points" ,  SubTitle :  "Choose how to notify your  contact points when an alert instance fires" ,  Id :  "receivers" ,  Url :  s . cfg . AppSubURL  +  "/alerting/notifications" , 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-03 17:09:32 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Icon :  "comment-alt-share" , 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-03 17:09:32 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										alertChildNavs  =  append ( alertChildNavs ,  & navtree . NavLink { Text :  "Notification policies" ,  SubTitle :  "Determine how alerts are routed to contact points" ,  Id :  "am-routes" ,  Url :  s . cfg . AppSubURL  +  "/alerting/routes" ,  Icon :  "sitemap" } ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  hasAccess ( ac . ReqViewer ,  ac . EvalAny ( ac . EvalPermission ( ac . ActionAlertingInstanceRead ) ,  ac . EvalPermission ( ac . ActionAlertingInstancesExternalRead ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-03 17:09:32 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										alertChildNavs  =  append ( alertChildNavs ,  & navtree . NavLink { Text :  "Silences" ,  SubTitle :  "Stop notifications from one or more alerting rules" ,  Id :  "silences" ,  Url :  s . cfg . AppSubURL  +  "/alerting/silences" ,  Icon :  "bell-slash" } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										alertChildNavs  =  append ( alertChildNavs ,  & navtree . NavLink { Text :  "Alert groups" ,  SubTitle :  "See grouped alerts from an Alertmanager instance" ,  Id :  "groups" ,  Url :  s . cfg . AppSubURL  +  "/alerting/groups" ,  Icon :  "layer-group" } ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  c . OrgRole  ==  org . RoleAdmin  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										alertChildNavs  =  append ( alertChildNavs ,  & navtree . NavLink { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Text :  "Admin" ,  Id :  "alerting-admin" ,  Url :  s . cfg . AppSubURL  +  "/alerting/admin" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Icon :  "cog" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-27 15:50:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									fallbackHasEditPerm  :=  func ( * contextmodel . ReqContext )  bool  {  return  hasEditPerm  } 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  hasAccess ( fallbackHasEditPerm ,  ac . EvalAny ( ac . EvalPermission ( ac . ActionAlertingRuleCreate ) ,  ac . EvalPermission ( ac . ActionAlertingRuleExternalWrite ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-15 20:08:15 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ! s . features . IsEnabled ( featuremgmt . FlagTopnav )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											alertChildNavs  =  append ( alertChildNavs ,  & navtree . NavLink { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Text :  "Divider" ,  Divider :  true ,  Id :  "divider" ,  HideFromTabs :  true , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										alertChildNavs  =  append ( alertChildNavs ,  & navtree . NavLink { 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-30 23:26:21 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Text :  "Create alert rule" ,  SubTitle :  "Create an alert rule" ,  Id :  "alert" , 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-15 20:08:15 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Icon :  "plus" ,  Url :  s . cfg . AppSubURL  +  "/alerting/new" ,  HideFromTabs :  true ,  ShowIconInNavbar :  true ,  IsCreateAction :  true , 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  len ( alertChildNavs )  >  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										var  alertNav  =  navtree . NavLink { 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-03 17:09:32 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Text :        "Alerting" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											SubTitle :    "Learn about problems in your systems moments after they occur" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Id :          navtree . NavIDAlerting , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Icon :        "bell" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Children :    alertChildNavs , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Section :     navtree . NavSectionCore , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											SortWeight :  navtree . WeightAlerting , 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  s . features . IsEnabled ( featuremgmt . FlagTopnav )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											alertNav . Url  =  s . cfg . AppSubURL  +  "/alerting" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-20 23:21:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											alertNav . Url  =  s . cfg . AppSubURL  +  "/alerting/home" 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  & alertNav 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 14:29:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-27 15:50:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( s  * ServiceImpl )  buildDataConnectionsNavLink ( c  * contextmodel . ReqContext )  * navtree . NavLink  {  
						 
					
						
							
								
									
										
										
										
											2023-01-06 16:11:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									hasAccess  :=  ac . HasAccess ( s . accessControl ,  c ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									var  children  [ ] * navtree . NavLink 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									var  navLink  * navtree . NavLink 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-11-10 18:14:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									baseUrl  :=  s . cfg . AppSubURL  +  "/connections" 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-18 22:34:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  hasAccess ( ac . ReqOrgAdmin ,  datasources . ConfigurationPageAccess )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Connect data
 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-11 18:40:21 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										children  =  append ( children ,  & navtree . NavLink { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Id :         "connections-connect-data" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Text :       "Connect data" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											SubTitle :   "Browse and create new connections" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											IsSection :  true , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Url :        s . cfg . AppSubURL  +  "/connections/connect-data" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Children :   [ ] * navtree . NavLink { } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-06 16:11:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Your connections
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										children  =  append ( children ,  & navtree . NavLink { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Id :        "connections-your-connections" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Text :      "Your connections" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											SubTitle :  "Manage your existing connections" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Url :       baseUrl  +  "/your-connections" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Datasources
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Children :  [ ] * navtree . NavLink { { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Id :        "connections-your-connections-datasources" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Text :      "Data sources" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												SubTitle :  "View and manage your connected data source connections" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Url :       baseUrl  +  "/your-connections/datasources" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-06 16:11:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  len ( children )  >  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Connections (main)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										navLink  =  & navtree . NavLink { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Text :        "Connections" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Icon :        "adjust-circle" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Id :          "connections" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Url :         baseUrl , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Children :    children , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Section :     navtree . NavSectionCore , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											SortWeight :  navtree . WeightDataConnections , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  navLink 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  nil 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-23 04:04:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}