argo-cd
78 строк · 3.3 Кб
1import {DataLoader, DropDownMenu} from 'argo-ui';
2import * as React from 'react';
3
4import {services} from '../../../shared/services';
5import {Context} from '../../context';
6
7require('./badge-panel.scss');
8
9export const BadgePanel = ({app, project, appNamespace, nsEnabled}: {app?: string; project?: string; appNamespace?: string; nsEnabled?: boolean}) => {
10const [badgeType, setBadgeType] = React.useState('URL');
11const context = React.useContext(Context);
12if (!app && !project) {
13throw new Error('Either app or project property must be specified');
14}
15
16function badgeContent(statusBadgeRootUrl: string) {
17const root = statusBadgeRootUrl ? statusBadgeRootUrl : `${location.protocol}//${location.host}${context.baseHref}`;
18let badgeURL = '';
19let entityURL = '';
20let alt = '';
21if (app) {
22badgeURL = `${root}api/badge?name=${app}&revision=true`;
23if (nsEnabled) {
24badgeURL += `&namespace=${appNamespace}`;
25}
26entityURL = `${root}applications/${app}`;
27alt = 'App Status';
28} else if (project) {
29badgeURL = `${root}api/badge?project=${project}&revision=true`;
30entityURL = `${root}projects/${project}`;
31alt = 'Project Status';
32}
33return (
34<div className='white-box'>
35<div className='white-box__details'>
36<p>STATUS BADGE</p>
37<p>
38<img src={badgeURL} />{' '}
39</p>
40<div className='white-box__details-row'>
41<DropDownMenu
42anchor={() => (
43<p>
44{badgeType} <i className='fa fa-caret-down' />
45</p>
46)}
47items={['URL', 'Markdown', 'Textile', 'Rdoc', 'AsciiDoc'].map(type => ({title: type, action: () => setBadgeType(type)}))}
48/>
49<textarea
50onClick={e => (e.target as HTMLInputElement).select()}
51className='badge-panel'
52readOnly={true}
53value={
54badgeType === 'URL'
55? badgeURL
56: badgeType === 'Markdown'
57? `[![${alt}](${badgeURL})](${entityURL})`
58: badgeType === 'Textile'
59? `!${badgeURL}!:${entityURL}`
60: badgeType === 'Rdoc'
61? `{<img src="${badgeURL}" alt="${alt}" />}[${entityURL}]`
62: badgeType === 'AsciiDoc'
63? `image:${badgeURL}["${alt}", link="${entityURL}"]`
64: ''
65}
66/>
67</div>
68</div>
69</div>
70);
71}
72
73return (
74<DataLoader load={() => services.authService.settings()}>
75{settings => (settings.statusBadgeEnabled && <div>{badgeContent(settings.statusBadgeRootUrl)}</div>) || null}
76</DataLoader>
77);
78};
79