argo-cd

Форк
0
/
extensions-service.ts 
131 строка · 4.0 Кб
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);
132

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.