From 2440b7778eb3630502048e947d8a8d383e66a209 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Mierzwa?= Date: Thu, 30 Apr 2020 17:27:45 +0100 Subject: [PATCH] fix(ui): rewrite GroupHeader & GroupFooter components with hooks --- .../AlertGrid/AlertGroup/GroupFooter/index.js | 155 ++++++------- .../AlertGrid/AlertGroup/GroupHeader/index.js | 219 +++++++++--------- 2 files changed, 176 insertions(+), 198 deletions(-) diff --git a/ui/src/Components/Grid/AlertGrid/AlertGroup/GroupFooter/index.js b/ui/src/Components/Grid/AlertGrid/AlertGroup/GroupFooter/index.js index 3cafe960e..c5307c853 100644 --- a/ui/src/Components/Grid/AlertGrid/AlertGroup/GroupFooter/index.js +++ b/ui/src/Components/Grid/AlertGrid/AlertGroup/GroupFooter/index.js @@ -1,7 +1,7 @@ -import React, { Component } from "react"; +import React from "react"; import PropTypes from "prop-types"; -import { observer } from "mobx-react"; +import { useObserver } from "mobx-react"; import { APIGroup } from "Models/API"; import { StaticLabels } from "Common/Query"; @@ -11,92 +11,79 @@ import { FilteringLabel } from "Components/Labels/FilteringLabel"; import { RenderNonLinkAnnotation, RenderLinkAnnotation } from "../Annotation"; import { RenderSilence } from "../Silences"; -const GroupFooter = observer( - class GroupFooter extends Component { - static propTypes = { - group: APIGroup.isRequired, - alertmanagers: PropTypes.arrayOf(PropTypes.string).isRequired, - afterUpdate: PropTypes.func.isRequired, - alertStore: PropTypes.instanceOf(AlertStore).isRequired, - silenceFormStore: PropTypes.instanceOf(SilenceFormStore).isRequired, - }; - - render() { - const { - group, - alertmanagers, - afterUpdate, - alertStore, - silenceFormStore, - } = this.props; - - return ( -
-
- {group.shared.annotations - .filter((a) => a.isLink === false) - .map((a) => ( - - ))} -
- {Object.entries(group.shared.labels).map(([name, value]) => ( - { + return useObserver(() => ( +
+
+ {group.shared.annotations + .filter((a) => a.isLink === false) + .map((a) => ( + ))} - {alertmanagers.map((am) => ( - - ))} - - {group.shared.annotations - .filter((a) => a.isLink === true) - .map((a) => ( - - ))} - {Object.keys(group.shared.silences).length === 0 ? null : ( -
- {Object.entries( - group.shared.silences - ).map(([cluster, silences]) => - silences.map((silenceID) => - RenderSilence( - alertStore, - silenceFormStore, - afterUpdate, - cluster, - silenceID - ) - ) - )} -
+
+ {Object.entries(group.shared.labels).map(([name, value]) => ( + + ))} + {alertmanagers.map((am) => ( + + ))} + + {group.shared.annotations + .filter((a) => a.isLink === true) + .map((a) => ( + + ))} + {Object.keys(group.shared.silences).length === 0 ? null : ( +
+ {Object.entries(group.shared.silences).map(([cluster, silences]) => + silences.map((silenceID) => + RenderSilence( + alertStore, + silenceFormStore, + afterUpdate, + cluster, + silenceID + ) + ) )}
- ); - } - } -); + )} +
+ )); +}; +GroupFooter.propTypes = { + group: APIGroup.isRequired, + alertmanagers: PropTypes.arrayOf(PropTypes.string).isRequired, + afterUpdate: PropTypes.func.isRequired, + alertStore: PropTypes.instanceOf(AlertStore).isRequired, + silenceFormStore: PropTypes.instanceOf(SilenceFormStore).isRequired, +}; export { GroupFooter }; diff --git a/ui/src/Components/Grid/AlertGrid/AlertGroup/GroupHeader/index.js b/ui/src/Components/Grid/AlertGrid/AlertGroup/GroupHeader/index.js index ac646c01c..4c88fd505 100644 --- a/ui/src/Components/Grid/AlertGrid/AlertGroup/GroupHeader/index.js +++ b/ui/src/Components/Grid/AlertGrid/AlertGroup/GroupHeader/index.js @@ -1,7 +1,7 @@ -import React, { Component } from "react"; +import React from "react"; import PropTypes from "prop-types"; -import { observer } from "mobx-react"; +import { useObserver } from "mobx-react"; import { APIGroup } from "Models/API"; import { AlertStore } from "Stores/AlertStore"; @@ -13,119 +13,110 @@ import { AlertAck } from "Components/AlertAck"; import { ToggleIcon } from "Components/ToggleIcon"; import { GroupMenu } from "./GroupMenu"; -const GroupHeader = observer( - class GroupHeader extends Component { - static propTypes = { - collapseStore: PropTypes.shape({ - value: PropTypes.bool.isRequired, - toggle: PropTypes.func.isRequired, - }).isRequired, - group: APIGroup.isRequired, - alertStore: PropTypes.instanceOf(AlertStore).isRequired, - silenceFormStore: PropTypes.instanceOf(SilenceFormStore).isRequired, - themedCounters: PropTypes.bool.isRequired, - setIsMenuOpen: PropTypes.func.isRequired, - gridLabelValue: PropTypes.string.isRequired, - }; +const GroupHeader = ({ + collapseStore, + group, + alertStore, + silenceFormStore, + themedCounters, + setIsMenuOpen, + gridLabelValue, +}) => { + const onCollapseClick = (event) => { + // left click => toggle current group + // left click + alt => toggle all groups + collapseStore.toggle(); - onCollapseClick = (event) => { - const { collapseStore, gridLabelValue } = this.props; - - // left click => toggle current group - // left click + alt => toggle all groups - - collapseStore.toggle(); - - if (event.altKey === true) { - const toggleEvent = new CustomEvent("alertGroupCollapse", { - detail: { - gridLabelValue: gridLabelValue, - value: collapseStore.value, - }, - }); - window.dispatchEvent(toggleEvent); - } - }; - - render() { - const { - collapseStore, - group, - alertStore, - silenceFormStore, - themedCounters, - setIsMenuOpen, - } = this.props; - - return ( -
- - - - - {Object.keys(group.labels).map((name) => ( - - ))} - - - {group.stateCount.active > 0 && ( - - )} - - - - - - - - - -
- ); + if (event.altKey === true) { + const toggleEvent = new CustomEvent("alertGroupCollapse", { + detail: { + gridLabelValue: gridLabelValue, + value: collapseStore.value, + }, + }); + window.dispatchEvent(toggleEvent); } - } -); + }; + + return useObserver(() => ( +
+ + + + + {Object.keys(group.labels).map((name) => ( + + ))} + + + {group.stateCount.active > 0 && ( + + )} + + + + + + + + + +
+ )); +}; +GroupHeader.propTypes = { + collapseStore: PropTypes.shape({ + value: PropTypes.bool.isRequired, + toggle: PropTypes.func.isRequired, + }).isRequired, + group: APIGroup.isRequired, + alertStore: PropTypes.instanceOf(AlertStore).isRequired, + silenceFormStore: PropTypes.instanceOf(SilenceFormStore).isRequired, + themedCounters: PropTypes.bool.isRequired, + setIsMenuOpen: PropTypes.func.isRequired, + gridLabelValue: PropTypes.string.isRequired, +}; export { GroupHeader };