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);