⚝
One Hat Cyber Team
⚝
Your IP:
216.73.217.4
Server IP:
41.128.143.86
Server:
Linux host.raqmix.cloud 6.8.0-1025-azure #30~22.04.1-Ubuntu SMP Wed Mar 12 15:28:20 UTC 2025 x86_64
Server Software:
Apache
PHP Version:
8.3.23
Buat File
|
Buat Folder
Eksekusi
Dir :
~
/
usr
/
share
/
grafana
/
public
/
app
/
features
/
explore
/
View File Name :
ShortLinkButtonMenu.tsx
import React, { useState } from 'react'; import { IconName } from '@grafana/data'; import { reportInteraction, config } from '@grafana/runtime'; import { ToolbarButton, Dropdown, Menu, Stack, ToolbarButtonRow, MenuGroup } from '@grafana/ui'; import { t } from 'app/core/internationalization'; import { copyStringToClipboard } from 'app/core/utils/explore'; import { createAndCopyShortLink } from 'app/core/utils/shortLinks'; import { useSelector } from 'app/types'; import { selectPanes } from './state/selectors'; import { constructAbsoluteUrl } from './utils/links'; interface ShortLinkGroupData { key: string; label: string; items: ShortLinkMenuItemData[]; } interface ShortLinkMenuItemData { key: string; label: string; icon: IconName; getUrl: Function; shorten: boolean; absTime: boolean; } const defaultMode: ShortLinkMenuItemData = { key: 'copy-link', label: t('explore.toolbar.copy-shortened-link', 'Copy shortened URL'), icon: 'share-alt', getUrl: () => undefined, shorten: true, absTime: false, }; export function ShortLinkButtonMenu() { const panes = useSelector(selectPanes); const [isOpen, setIsOpen] = useState(false); const [lastSelected, setLastSelected] = useState(defaultMode); const onCopyLink = (shorten: boolean, absTime: boolean, url?: string) => { if (shorten) { createAndCopyShortLink(url || global.location.href); reportInteraction('grafana_explore_shortened_link_clicked', { isAbsoluteTime: absTime }); } else { copyStringToClipboard( url !== undefined ? `${window.location.protocol}//${window.location.host}${config.appSubUrl}${url}` : global.location.href ); reportInteraction('grafana_explore_copy_link_clicked', { isAbsoluteTime: absTime }); } }; const menuOptions: ShortLinkGroupData[] = [ { key: 'normal', label: t('explore.toolbar.copy-links-normal-category', 'Normal URL links'), items: [ { key: 'copy-shortened-link', icon: 'link', label: t('explore.toolbar.copy-shortened-link', 'Copy shortened URL'), getUrl: () => undefined, shorten: true, absTime: false, }, { key: 'copy-link', icon: 'link', label: t('explore.toolbar.copy-link', 'Copy URL'), getUrl: () => undefined, shorten: false, absTime: false, }, ], }, { key: 'timesync', label: t('explore.toolbar.copy-links-absolute-category', 'Time-sync URL links (share with time range intact)'), items: [ { key: 'copy-short-link-abs-time', icon: 'clock-nine', label: t('explore.toolbar.copy-shortened-link-abs-time', 'Copy Absolute Shortened URL'), shorten: true, getUrl: () => { return constructAbsoluteUrl(panes); }, absTime: true, }, { key: 'copy-link-abs-time', icon: 'clock-nine', label: t('explore.toolbar.copy-link-abs-time', 'Copy Absolute Shortened URL'), shorten: false, getUrl: () => { return constructAbsoluteUrl(panes); }, absTime: true, }, ], }, ]; const MenuActions = (
{menuOptions.map((groupOption) => { return (
{groupOption.items.map((option) => { return (
{ const url = option.getUrl(); onCopyLink(option.shorten, option.absTime, url); setLastSelected(option); }} /> ); })}
); })}
); // we need the Toolbar button click to be an action separate from opening/closing the menu return (
{ const url = lastSelected.getUrl(); onCopyLink(lastSelected.shorten, lastSelected.absTime, url); }} aria-label={t('explore.toolbar.copy-shortened-link', 'Copy shortened URL')} />
); }