diff --git a/ui/src/Components/ManagedSilence/SilenceDetails.js b/ui/src/Components/ManagedSilence/SilenceDetails.js index db632ac57..b197776a8 100644 --- a/ui/src/Components/ManagedSilence/SilenceDetails.js +++ b/ui/src/Components/ManagedSilence/SilenceDetails.js @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useState } from "react"; import PropTypes from "prop-types"; import hash from "object-hash"; @@ -6,19 +6,45 @@ import hash from "object-hash"; import moment from "moment"; import Moment from "react-moment"; +import copy from "copy-to-clipboard"; + +import Flash from "react-reveal/Flash"; + import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faEdit } from "@fortawesome/free-solid-svg-icons/faEdit"; import { faCalendarCheck } from "@fortawesome/free-solid-svg-icons/faCalendarCheck"; import { faCalendarTimes } from "@fortawesome/free-solid-svg-icons/faCalendarTimes"; import { faFilter } from "@fortawesome/free-solid-svg-icons/faFilter"; import { faHome } from "@fortawesome/free-solid-svg-icons/faHome"; +import { faFingerprint } from "@fortawesome/free-solid-svg-icons/faFingerprint"; +import { faCopy } from "@fortawesome/free-solid-svg-icons/faCopy"; import { APISilence } from "Models/API"; import { SilenceFormStore } from "Stores/SilenceFormStore"; import { QueryOperators } from "Common/Query"; +import { TooltipWrapper } from "Components/TooltipWrapper"; import { RenderLinkAnnotation } from "Components/Grid/AlertGrid/AlertGroup/Annotation"; import { DeleteSilence } from "./DeleteSilence"; +const SilenceIDCopyButton = ({ id }) => { + const [clickCount, setClickCount] = useState(0); + return ( + + + { + copy(id); + setClickCount(clickCount + 1); + }} + > + + + + + ); +}; + const SilenceDetails = ({ alertStore, silenceFormStore, @@ -63,6 +89,20 @@ const SilenceDetails = ({ {expiresLabel} {silence.endsAt} +
+ + + ID: + + + {silence.id} + + +
", () => { "http://example.com/#/silences/04d37636-2350-4878-b382-e0b50353230f" ); }); + + it("clicking on the copy button copies silence ID to the clipboard", () => { + const tree = MountedSilenceDetails(); + const button = tree.find("span.badge.badge-secondary"); + button.simulate("click"); + expect(copy).toHaveBeenCalledTimes(1); + expect(copy).toHaveBeenCalledWith(silence.id); + }); }); diff --git a/ui/src/Components/ManagedSilence/__snapshots__/index.test.js.snap b/ui/src/Components/ManagedSilence/__snapshots__/index.test.js.snap index 83d733d00..65733c361 100644 --- a/ui/src/Components/ManagedSilence/__snapshots__/index.test.js.snap +++ b/ui/src/Components/ManagedSilence/__snapshots__/index.test.js.snap @@ -119,7 +119,7 @@ exports[` matches snapshot with expaned details 1`] = `
matches snapshot with expaned details 1`] = `
+
+ + + + + + ID: + + + 04d37636-2350-4878-b382-e0b50353230f + +
+ + + + + + +
+
{ - if (reactDeprecationWarning.test(message) === false) { + if ( + reactDeprecationWarning.test(message) === false && + message !== "react-reveal - animation failed" + ) { throw new Error(`message=${message} args=${args}`); } };