argo-cd

Форк
0
/
application-urls.tsx 
79 строк · 2.4 Кб
1
import {DropDownMenu} from 'argo-ui';
2
import * as React from 'react';
3
import {isValidURL} from '../../shared/utils';
4

5
export class InvalidExternalLinkError extends Error {
6
    constructor(message: string) {
7
        super(message);
8
        Object.setPrototypeOf(this, InvalidExternalLinkError.prototype);
9
        this.name = 'InvalidExternalLinkError';
10
    }
11
}
12

13
export class ExternalLink {
14
    public title: string;
15
    public ref: string;
16

17
    constructor(url: string) {
18
        const parts = url.split('|');
19
        if (parts.length === 2) {
20
            this.title = parts[0];
21
            this.ref = parts[1];
22
        } else {
23
            this.title = url;
24
            this.ref = url;
25
        }
26
        if (!isValidURL(this.ref)) {
27
            throw new InvalidExternalLinkError('Invalid URL');
28
        }
29
    }
30
}
31

32
export const ApplicationURLs = ({urls}: {urls: string[]}) => {
33
    const externalLinks: ExternalLink[] = [];
34
    for (const url of urls || []) {
35
        try {
36
            const externalLink = new ExternalLink(url);
37
            externalLinks.push(externalLink);
38
        } catch (InvalidExternalLinkError) {
39
            continue;
40
        }
41
    }
42

43
    // sorted alphabetically & links with titles first
44
    externalLinks.sort((a, b) => {
45
        if (a.title !== '' && b.title !== '') {
46
            return a.title > b.title ? 1 : -1;
47
        } else if (a.title === '') {
48
            return 1;
49
        } else if (b.title === '') {
50
            return -1;
51
        }
52
        return a.ref > b.ref ? 1 : -1;
53
    });
54

55
    return (
56
        ((externalLinks || []).length > 0 && (
57
            <div className='applications-list__external-links-icon-container'>
58
                <a
59
                    title={externalLinks[0].title}
60
                    onClick={e => {
61
                        e.stopPropagation();
62
                        window.open(externalLinks[0].ref);
63
                    }}>
64
                    <i className='fa fa-external-link-alt' />{' '}
65
                    {externalLinks.length > 1 && (
66
                        <DropDownMenu
67
                            anchor={() => <i className='fa fa-caret-down' />}
68
                            items={externalLinks.map(item => ({
69
                                title: item.title,
70
                                action: () => window.open(item.ref)
71
                            }))}
72
                        />
73
                    )}
74
                </a>
75
            </div>
76
        )) ||
77
        null
78
    );
79
};
80

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

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

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

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