github.com/argoproj/argo-cd/v2@v2.10.9/ui/src/app/shared/services/extensions-service.ts (about) 1 import * as React from 'react'; 2 import * as minimatch from 'minimatch'; 3 4 import {Application, ApplicationTree, State} from '../models'; 5 6 const extensions = { 7 resourceExtentions: new Array<ResourceTabExtension>(), 8 systemLevelExtensions: new Array<SystemLevelExtension>(), 9 appViewExtensions: new Array<AppViewExtension>(), 10 statusPanelExtensions: new Array<StatusPanelExtension>() 11 }; 12 13 function registerResourceExtension(component: ExtensionComponent, group: string, kind: string, tabTitle: string, opts?: {icon: string}) { 14 extensions.resourceExtentions.push({component, group, kind, title: tabTitle, icon: opts?.icon}); 15 } 16 17 function registerSystemLevelExtension(component: ExtensionComponent, title: string, path: string, icon: string) { 18 extensions.systemLevelExtensions.push({component, title, icon, path}); 19 } 20 21 function registerAppViewExtension(component: ExtensionComponent, title: string, icon: string) { 22 extensions.appViewExtensions.push({component, title, icon}); 23 } 24 25 function registerStatusPanelExtension(component: StatusPanelExtensionComponent, title: string, id: string, flyout?: ExtensionComponent) { 26 extensions.statusPanelExtensions.push({component, flyout, title, id}); 27 } 28 29 let legacyInitialized = false; 30 31 function initLegacyExtensions() { 32 if (legacyInitialized) { 33 return; 34 } 35 legacyInitialized = true; 36 const resources = (window as any).extensions.resources; 37 Object.keys(resources).forEach(key => { 38 const [group, kind] = key.split('/'); 39 registerResourceExtension(resources[key].component, group, kind, 'More'); 40 }); 41 } 42 43 export interface ResourceTabExtension { 44 title: string; 45 group: string; 46 kind: string; 47 component: ExtensionComponent; 48 icon?: string; 49 } 50 51 export interface SystemLevelExtension { 52 title: string; 53 component: SystemExtensionComponent; 54 icon?: string; 55 path?: string; 56 } 57 58 export interface AppViewExtension { 59 component: AppViewExtensionComponent; 60 title: string; 61 icon?: string; 62 } 63 64 export interface StatusPanelExtension { 65 component: StatusPanelExtensionComponent; 66 flyout?: StatusPanelExtensionFlyoutComponent; 67 title: string; 68 id: string; 69 } 70 71 export type ExtensionComponent = React.ComponentType<ExtensionComponentProps>; 72 export type SystemExtensionComponent = React.ComponentType; 73 export type AppViewExtensionComponent = React.ComponentType<AppViewComponentProps>; 74 export type StatusPanelExtensionComponent = React.ComponentType<StatusPanelComponentProps>; 75 export type StatusPanelExtensionFlyoutComponent = React.ComponentType<StatusPanelFlyoutProps>; 76 77 export interface Extension { 78 component: ExtensionComponent; 79 } 80 81 export interface ExtensionComponentProps { 82 resource: State; 83 tree: ApplicationTree; 84 application: Application; 85 } 86 87 export interface AppViewComponentProps { 88 application: Application; 89 tree: ApplicationTree; 90 } 91 92 export interface StatusPanelComponentProps { 93 application: Application; 94 openFlyout: () => any; 95 } 96 97 export interface StatusPanelFlyoutProps { 98 application: Application; 99 tree: ApplicationTree; 100 } 101 102 export class ExtensionsService { 103 public getResourceTabs(group: string, kind: string): ResourceTabExtension[] { 104 initLegacyExtensions(); 105 const items = extensions.resourceExtentions.filter(extension => minimatch(group, extension.group) && minimatch(kind, extension.kind)).slice(); 106 return items.sort((a, b) => a.title.localeCompare(b.title)); 107 } 108 109 public getSystemExtensions(): SystemLevelExtension[] { 110 return extensions.systemLevelExtensions.slice(); 111 } 112 113 public getAppViewExtensions(): AppViewExtension[] { 114 return extensions.appViewExtensions.slice(); 115 } 116 117 public getStatusPanelExtensions(): StatusPanelExtension[] { 118 return extensions.statusPanelExtensions.slice(); 119 } 120 } 121 122 ((window: any) => { 123 // deprecated: kept for backwards compatibility 124 window.extensions = {resources: {}}; 125 window.extensionsAPI = { 126 registerResourceExtension, 127 registerSystemLevelExtension, 128 registerAppViewExtension, 129 registerStatusPanelExtension 130 }; 131 })(window);