Merge "Web UI: add builds timeline on buildset page"

This commit is contained in:
Zuul 2021-10-04 16:20:05 +00:00 committed by Gerrit Code Review
commit 36086ae5a5
7 changed files with 624 additions and 5 deletions

View File

@ -0,0 +1,5 @@
---
features:
- |
On the description page of a buildset in the zuul web dashboard, a user can
display a timeline of the builds making up the buildset.

View File

@ -7,6 +7,7 @@
"license": "Apache-2.0",
"private": true,
"dependencies": {
"@patternfly/react-charts": "^6.15.23",
"@patternfly/react-core": "4.152.4",
"@patternfly/react-table": "4.29.58",
"axios": "^0.19.0",

View File

@ -12,11 +12,11 @@
// License for the specific language governing permissions and limitations
// under the License.
import * as React from 'react'
import React, { useState } from 'react'
import PropTypes from 'prop-types'
import { connect } from 'react-redux'
import { Link } from 'react-router-dom'
import { Flex, FlexItem, List, ListItem, Title } from '@patternfly/react-core'
import { Button, Flex, FlexItem, List, ListItem, Title } from '@patternfly/react-core'
import {
CodeIcon,
CodeBranchIcon,
@ -32,9 +32,12 @@ import 'moment-duration-format'
import { buildExternalLink } from '../../Misc'
import { BuildResultBadge, BuildResultWithIcon, IconProperty } from './Misc'
import { ChartModal } from '../charts/ChartModal'
import BuildsetGanttChart from '../charts/GanttChart'
function Buildset({ buildset, timezone, tenant }) {
const buildset_link = buildExternalLink(buildset)
const [isGanttChartModalOpen, setIsGanttChartModalOpen] = useState(false)
const firstStartBuild = buildset.builds.reduce(
(prev, cur) => (prev.start_time < cur.start_time ? prev : cur)
@ -140,13 +143,15 @@ function Buildset({ buildset, timezone, tenant }) {
value={
<span>
<strong>Starting build </strong>
{firstStartLink} <i>(started {moment
{firstStartLink} <br />
<i>(started {moment
.utc(firstStartBuild.start_time)
.tz(timezone)
.format('YYYY-MM-DD HH:mm:ss')})</i>
<br />
<strong>Ending build </strong>
{lastEndLink} <i>(ended {moment
{lastEndLink} <br />
<i>(ended {moment
.utc(lastEndBuild.end_time)
.tz(timezone)
.format('YYYY-MM-DD HH:mm:ss')})</i>
@ -161,7 +166,12 @@ function Buildset({ buildset, timezone, tenant }) {
<strong>Total duration </strong>
{moment
.duration(totalDuration, 'seconds')
.format('h [hr] m [min] s [sec]')}
.format('h [hr] m [min] s [sec]')} &nbsp;
<Button
key='GanttChartToggle'
variant='secondary'
onClick={() => { setIsGanttChartModalOpen(true) }}>Show timeline
</Button>
</>
}
/>
@ -185,6 +195,12 @@ function Buildset({ buildset, timezone, tenant }) {
</FlexItem>
</Flex>
</Flex>
<ChartModal
chart={<BuildsetGanttChart builds={buildset.builds} />}
isOpen={isGanttChartModalOpen}
title='Builds Timeline'
onClose={() => { setIsGanttChartModalOpen(false) }}
/>
</>
)
}

View File

@ -0,0 +1,47 @@
// Copyright 2021 Red Hat, Inc
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations
// under the License.
import * as React from 'react'
import PropTypes from 'prop-types'
import { Button, Modal } from '@patternfly/react-core'
function ChartModal(props) {
const { chart, isOpen, title, onClose } = props
return (
<Modal
isOpen={isOpen}
width={'75%'}
title={title ? title : 'No title'}
onClose={onClose}
actions={[
<Button key='chart-modal-close' variant="primary" onClick={onClose}>Close</Button>,
]}>
<center>
{chart}
</center>
</Modal>
)
}
ChartModal.propTypes = {
chart: PropTypes.object.isRequired,
isOpen: PropTypes.bool,
title: PropTypes.string,
onClose: PropTypes.func.isRequired,
}
export { ChartModal }

View File

@ -0,0 +1,127 @@
// Copyright 2021 Red Hat, Inc
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations
// under the License.
import * as React from 'react'
import PropTypes from 'prop-types'
import { connect } from 'react-redux'
import * as moment from 'moment'
import 'moment-duration-format'
import { Chart, ChartBar, ChartAxis, ChartLegend, ChartTooltip } from '@patternfly/react-charts'
import { buildResultLegendData, buildsBarStyle } from './Misc'
function BuildsetGanttChart(props) {
const { builds, timezone } = props
const sortedByStartTime = builds.sort((a, b) => {
if (a.start_time > b.start_time) {
return -1
}
if (a.start_time < b.start_time) {
return 1
}
return 0
})
const origin = moment.utc(sortedByStartTime[builds.length - 1].start_time).tz(timezone)
const longestJobName = builds.reduce((a, build) => (a.length < build.job_name.length ? build.job_name : a), '')
const data = sortedByStartTime.map((build) => {
return {
x: build.job_name,
y0: (moment.utc(build.start_time).tz(timezone) - origin) / 1000,
y: (moment.utc(build.end_time).tz(timezone) - origin) / 1000,
result: build.result,
started: moment.utc(build.start_time).tz(timezone).format('YYYY-MM-DD HH:mm:ss'),
ended: moment.utc(build.end_time).tz(timezone).format('YYYY-MM-DD HH:mm:ss'),
}
})
const legendData = builds.map((build) => (
build.result
)).filter((result, idx, self) => { return self.indexOf(result) === idx }
).map((legend) => ({ name: legend }))
const uniqueResults = builds.map(
(build) => (build.result)
).filter((result, idx, self) => {
return self.indexOf(result) === idx
})
const chartLegend = buildResultLegendData.filter((legend) => { return uniqueResults.indexOf(legend.name) > -1 })
return (
<div style={{ height: Math.max(400, 20 * builds.length) + 'px', width: '900px' }}>
<Chart
horizontal
domainPadding={{ x: 20 }}
width={750}
height={Math.max(400, 20 * builds.length)}
padding={{
bottom: 80,
left: 8 * longestJobName.length,
right: 80,
top: 80,
}}
legendOrientation='horizontal'
legendPosition='top'
legendData={legendData}
legendComponent={<ChartLegend data={chartLegend} itemsPerRow={4} />}
>
<ChartAxis />
<ChartAxis
dependentAxis
showGrid
tickFormat={(t) => {
let format
switch (true) {
case (t < 180):
format = 's [sec]'
break
case (t < 7200):
format = 'm [min]'
break
default:
format = 'h [hr] m [min]'
}
return moment.duration(t, 'seconds').format(format)
}}
fixLabelOverlap={true}
style={{ tickLabels: { angle: -25, padding: 1, verticalAnchor: 'middle', textAnchor: 'end' } }} />
<ChartBar
data={data}
style={buildsBarStyle}
labelComponent={
<ChartTooltip constrainToVisibleArea />}
labels={({ datum }) => `${datum.result}\nStarted ${datum.started}\nEnded ${datum.ended}`}
/>
</ Chart>
</div>
)
}
BuildsetGanttChart.propTypes = {
builds: PropTypes.array.isRequired,
timezone: PropTypes.string,
}
export default connect((state) => ({
timezone: state.timezone,
}))(BuildsetGanttChart)

View File

@ -0,0 +1,84 @@
// Copyright 2021 Red Hat, Inc
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations
// under the License.
const buildResultLegendData = [
{
name: 'SUCCESS',
// PF green-500
symbol: { fill: '#3E8635' },
},
{
name: 'FAILURE',
// PF red-100
symbol: { fill: '#C9190B' },
},
{
name: 'RETRY_LIMIT',
// PF red-300
symbol: { fill: '#7D1007' },
},
{
name: 'SKIPPED',
// PF light-blue-200
symbol: { fill: '#7CDBF3' },
},
{
name: 'ABORTED',
// PF gold-200
symbol: { fill: '#F6D173' },
},
{
name: 'MERGER_FAILURE',
// PF orange-200
symbol: { fill: '#EF9234' },
},
{
name: 'NODE_FAILURE',
// PF orange-300
symbol: { fill: '#EC7A08' },
},
{
name: 'TIMED_OUT',
// PF orange-400
symbol: { fill: '#C46100' },
},
{
name: 'POST_FAILURE',
// PF orange-500
symbol: { fill: '#8F4700' },
},
{
name: 'CONFIG_ERROR',
// PF orange-600
symbol: { fill: '#773D00' },
},
{
name: 'RETRY',
// PF orange-100
symbol: { fill: '#F4B678' },
},]
const buildsBarStyleMap = buildResultLegendData.reduce(
(final, x) => ({ ...final, [x.name]: x.symbol.fill }), {}
)
const buildsBarStyle = {
data: {
fill: ({ datum }) => buildsBarStyleMap[datum.result]
}
}
export { buildResultLegendData, buildsBarStyleMap, buildsBarStyle }

View File

@ -1510,6 +1510,32 @@
dependencies:
"@types/node" ">= 8"
"@patternfly/react-charts@^6.15.23":
version "6.15.23"
resolved "https://registry.yarnpkg.com/@patternfly/react-charts/-/react-charts-6.15.23.tgz#0f0326ba59692b405081e38170879edbcdfc8eff"
integrity sha512-X8ou27onHXrkpcvv9AZhyinlw8vXzd9MFesDIKuXRwaQESdaPEznKIVg55ciVBj3tdAYBk5mQmxegh4UJFWSig==
dependencies:
"@patternfly/react-styles" "^4.11.16"
"@patternfly/react-tokens" "^4.12.18"
hoist-non-react-statics "^3.3.0"
lodash "^4.17.19"
tslib "^2.0.0"
victory-area "^35.9.0"
victory-axis "^35.9.0"
victory-bar "^35.9.0"
victory-chart "^35.9.0"
victory-core "^35.9.0"
victory-create-container "^35.9.1"
victory-group "^35.9.0"
victory-legend "^35.9.0"
victory-line "^35.9.0"
victory-pie "^35.9.0"
victory-scatter "^35.9.0"
victory-stack "^35.9.0"
victory-tooltip "^35.9.1"
victory-voronoi-container "^35.9.1"
victory-zoom-container "^35.9.0"
"@patternfly/react-core@4.152.4", "@patternfly/react-core@^4.152.4":
version "4.152.4"
resolved "https://registry.yarnpkg.com/@patternfly/react-core/-/react-core-4.152.4.tgz#fa008d155ab0c4161aab27bb67ad88fb8689dee2"
@ -1533,6 +1559,11 @@
resolved "https://registry.yarnpkg.com/@patternfly/react-styles/-/react-styles-4.11.13.tgz#6595adc5ff40585add0128d27d420322b65b86a9"
integrity sha512-svhnWIqZwJt1cOxwYjvz6lVYeL+c9D17xpKqlkJapXRxJL3ppTfIqwBrT3o9+02ElaXUTKt4xjMkSnEVjw4qxA==
"@patternfly/react-styles@^4.11.16":
version "4.11.16"
resolved "https://registry.yarnpkg.com/@patternfly/react-styles/-/react-styles-4.11.16.tgz#55327c57d086aadb9f0f4c0e67ab38856c3ca165"
integrity sha512-4ZFynQuJmRF7VbZeQSs44MX6MEvW7l7ZR8lMeChd8mxnQpG8pWtVUbcHdj9FFHPZVa+sPrgrZQl8QmhbqYyOsg==
"@patternfly/react-table@4.29.58":
version "4.29.58"
resolved "https://registry.yarnpkg.com/@patternfly/react-table/-/react-table-4.29.58.tgz#be77a6eee6a60c26e1f6939aaae007f21be52355"
@ -1550,6 +1581,11 @@
resolved "https://registry.yarnpkg.com/@patternfly/react-tokens/-/react-tokens-4.12.15.tgz#af760a1b378edce85fd2f7394553911b6ee3c4f0"
integrity sha512-lRW0qxGjuFEPMweBSQFHNRNoxavx5uR8b28f0lPN0Jlz4QsaCFVTmHM2XqflOHDpjE8SPJW/hJMSsyUrqnM5dw==
"@patternfly/react-tokens@^4.12.18":
version "4.12.18"
resolved "https://registry.yarnpkg.com/@patternfly/react-tokens/-/react-tokens-4.12.18.tgz#e8c75f19ecc33de180cef6cb3e9a6679c5ffeb7c"
integrity sha512-3bNUOSOMLmhxPku4fvopxt3StotaHGqHvlIDMxp9pGIgb0o02RyZ8JIioCCO1GkvPPIn6pKs/cGJDlB7zHV48Q==
"@semantic-release/commit-analyzer@^6.1.0":
version "6.3.3"
resolved "https://registry.yarnpkg.com/@semantic-release/commit-analyzer/-/commit-analyzer-6.3.3.tgz#885f7e46e2f0aef23a23be0904dbf18d6ece45ca"
@ -4595,6 +4631,80 @@ cz-conventional-changelog@3.2.0, cz-conventional-changelog@^3.0.2:
optionalDependencies:
"@commitlint/load" ">6.1.1"
d3-array@^1.2.0:
version "1.2.4"
resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f"
integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==
d3-collection@1:
version "1.0.7"
resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e"
integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==
d3-color@1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.1.tgz#c52002bf8846ada4424d55d97982fef26eb3bc8a"
integrity sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==
d3-ease@^1.0.0:
version "1.0.7"
resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.7.tgz#9a834890ef8b8ae8c558b2fe55bd57f5993b85e2"
integrity sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==
d3-format@1:
version "1.4.5"
resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.4.5.tgz#374f2ba1320e3717eb74a9356c67daee17a7edb4"
integrity sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==
d3-interpolate@1, d3-interpolate@^1.1.1:
version "1.4.0"
resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987"
integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==
dependencies:
d3-color "1"
d3-path@1:
version "1.0.9"
resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf"
integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==
d3-scale@^1.0.0:
version "1.0.7"
resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-1.0.7.tgz#fa90324b3ea8a776422bd0472afab0b252a0945d"
integrity sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==
dependencies:
d3-array "^1.2.0"
d3-collection "1"
d3-color "1"
d3-format "1"
d3-interpolate "1"
d3-time "1"
d3-time-format "2"
d3-shape@^1.0.0, d3-shape@^1.2.0:
version "1.3.7"
resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7"
integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==
dependencies:
d3-path "1"
d3-time-format@2:
version "2.3.0"
resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.3.0.tgz#107bdc028667788a8924ba040faf1fbccd5a7850"
integrity sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==
dependencies:
d3-time "1"
d3-time@1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.1.0.tgz#b1e19d307dae9c900b7e5b25ffc5dcc249a8a0f1"
integrity sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==
d3-timer@^1.0.0:
version "1.0.10"
resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5"
integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==
d3@~3.5.0, d3@~3.5.17:
version "3.5.17"
resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.17.tgz#bc46748004378b21a360c9fc7cf5231790762fb8"
@ -4814,6 +4924,18 @@ del@^4.1.1:
pify "^4.0.1"
rimraf "^2.6.3"
delaunator@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-4.0.1.tgz#3d779687f57919a7a418f8ab947d3bddb6846957"
integrity sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==
delaunay-find@0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/delaunay-find/-/delaunay-find-0.0.6.tgz#2ed017a79410013717fa7d9422e082c2502d4ae3"
integrity sha512-1+almjfrnR7ZamBk0q3Nhg6lqSe6Le4vL0WJDSMx4IDbQwTpUTXPjxC00lqLBT8MYsJpPCbI16sIkw9cPsbi7Q==
dependencies:
delaunator "^4.0.0"
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
@ -8923,6 +9045,11 @@ lodash@^4.17.19:
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
loglevel@^1.6.6:
version "1.6.8"
resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.8.tgz#8a25fb75d092230ecd4457270d80b54e28011171"
@ -11963,6 +12090,11 @@ react-error-overlay@^6.0.7:
resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.7.tgz#1dcfb459ab671d53f660a991513cb2f0a0553108"
integrity sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA==
react-fast-compare@^2.0.0:
version "2.0.4"
resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9"
integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==
react-fontawesome@^1.6.1:
version "1.7.1"
resolved "https://registry.yarnpkg.com/react-fontawesome/-/react-fontawesome-1.7.1.tgz#f74f5a338fef3ee3b379820109c1cba47290f035"
@ -14707,6 +14839,213 @@ verror@1.10.0:
core-util-is "1.0.2"
extsprintf "^1.2.0"
victory-area@^35.9.0:
version "35.11.4"
resolved "https://registry.yarnpkg.com/victory-area/-/victory-area-35.11.4.tgz#a8cc8193c72fc91b9cd75f5cfac8c83253a9c42c"
integrity sha512-i3rN4Jvn1uwA3YvCuv3EIPEcK2SWSOq3c+TvLvVj1BKFQug11C06UjyQje+3EEzffZ/EMkvGqj2+YudIjrGEzA==
dependencies:
d3-shape "^1.2.0"
lodash "^4.17.19"
prop-types "^15.5.8"
victory-core "^35.11.4"
victory-axis@^35.11.4, victory-axis@^35.9.0:
version "35.11.4"
resolved "https://registry.yarnpkg.com/victory-axis/-/victory-axis-35.11.4.tgz#5145184e0ca3368d573b624d190b125eeab378ba"
integrity sha512-KmPXC/vgbiiWckhK0LruZvsFQqESg6BflhIqS/Xemc50ymWetqbT9VZhjPWbU0arOIP5E8xcFnGUimDN//Jffw==
dependencies:
lodash "^4.17.19"
prop-types "^15.5.8"
victory-core "^35.11.4"
victory-bar@^35.9.0:
version "35.11.4"
resolved "https://registry.yarnpkg.com/victory-bar/-/victory-bar-35.11.4.tgz#94da9511062462ef814f4c1f78f3e56eab9a86be"
integrity sha512-EZC+6VGwHkIcOYEppVFBIC5JymYnfF+RLF+NM0Uys7q5+AwaLx36LS9a2xBUBYO/gx20Wd1HVH8kjSHzw1rTqQ==
dependencies:
d3-shape "^1.2.0"
lodash "^4.17.19"
prop-types "^15.5.8"
victory-core "^35.11.4"
victory-brush-container@^35.11.4:
version "35.11.4"
resolved "https://registry.yarnpkg.com/victory-brush-container/-/victory-brush-container-35.11.4.tgz#499c1d16cdaf26fce9d734fb18fc2ce7f8334fb0"
integrity sha512-KpFYU2LxKbLIjZDhXTdveok1SWLFlG5s2R214IRq+ukYRz21CoxlvZCWhFL60lSPilD+ZD1Udv3sK/RW9CFMxA==
dependencies:
lodash "^4.17.19"
prop-types "^15.5.8"
react-fast-compare "^2.0.0"
victory-core "^35.11.4"
victory-chart@^35.9.0:
version "35.11.4"
resolved "https://registry.yarnpkg.com/victory-chart/-/victory-chart-35.11.4.tgz#1d729be0f7891d257396daa371e34770ac8cc303"
integrity sha512-oBTjx6ytp+/s6zswCuOUQotiISePQKuDUdOsjnbINBPSNvJuE2W9GXHD+B7ibDkCh4ZWXm8obHz7mnrRGbCGFQ==
dependencies:
lodash "^4.17.19"
prop-types "^15.5.8"
react-fast-compare "^2.0.0"
victory-axis "^35.11.4"
victory-core "^35.11.4"
victory-polar-axis "^35.11.4"
victory-shared-events "^35.11.4"
victory-core@^35.11.4, victory-core@^35.9.0:
version "35.11.4"
resolved "https://registry.yarnpkg.com/victory-core/-/victory-core-35.11.4.tgz#0f7d4b26140f14a53695d8be452e42567a2bafe5"
integrity sha512-PuqrOIn/a6GQgsp/DKvACiJBAJo71P77jltn56mlDZjAAzz+58BL4E0hx7x908GdodLXo2n9gEeuDdjOAlOt0Q==
dependencies:
d3-ease "^1.0.0"
d3-interpolate "^1.1.1"
d3-scale "^1.0.0"
d3-shape "^1.2.0"
d3-timer "^1.0.0"
lodash "^4.17.21"
prop-types "^15.5.8"
react-fast-compare "^2.0.0"
victory-create-container@^35.9.1:
version "35.11.4"
resolved "https://registry.yarnpkg.com/victory-create-container/-/victory-create-container-35.11.4.tgz#66107c6ff5e9971b4ecb7cb510711192424b2cd0"
integrity sha512-baDLO4GSk/7eTVEYkhikwgwV5BtrSMuNPjKZBjZrIA3Ka9Fn5shklRG9PWg+26JIBFxqZdM6zOvpF7xhjxi37Q==
dependencies:
lodash "^4.17.19"
victory-brush-container "^35.11.4"
victory-core "^35.11.4"
victory-cursor-container "^35.11.4"
victory-selection-container "^35.11.4"
victory-voronoi-container "^35.11.4"
victory-zoom-container "^35.11.4"
victory-cursor-container@^35.11.4:
version "35.11.4"
resolved "https://registry.yarnpkg.com/victory-cursor-container/-/victory-cursor-container-35.11.4.tgz#5d3bb6bd62d9f615c86a600eb3f5682fca342989"
integrity sha512-gs6bwRd/qbGTN78w2QgshIFxlyOsss5qWOMdCcY9i0Oi99l9OJ6UFQDBzSgKsgD53KGs7JxiKevmUqc3qSZZBg==
dependencies:
lodash "^4.17.19"
prop-types "^15.5.8"
victory-core "^35.11.4"
victory-group@^35.9.0:
version "35.11.4"
resolved "https://registry.yarnpkg.com/victory-group/-/victory-group-35.11.4.tgz#6e6c0be195b24bfff466950bd5ae0691d265b9a3"
integrity sha512-ceFBll9h1sPpdMjNcvdgEhnYELVHfx9ymmk8iMEjOKpxa4fVvapMhegPmL0/zTemJ/NCu71W2xIr0VqyqK0DaA==
dependencies:
lodash "^4.17.19"
prop-types "^15.5.8"
react-fast-compare "^2.0.0"
victory-core "^35.11.4"
victory-shared-events "^35.11.4"
victory-legend@^35.9.0:
version "35.11.4"
resolved "https://registry.yarnpkg.com/victory-legend/-/victory-legend-35.11.4.tgz#da22dd5ac26650382ec1914f27a405627ed3756a"
integrity sha512-JZzQARjxYorWlNf9RmZRPAzlgPjukiUV1aTBaeC8YA2S4PhP4PWhNwO/Pb3aCdkifpumpgsm3JULpJiCGOPdBQ==
dependencies:
lodash "^4.17.19"
prop-types "^15.5.8"
victory-core "^35.11.4"
victory-line@^35.9.0:
version "35.11.4"
resolved "https://registry.yarnpkg.com/victory-line/-/victory-line-35.11.4.tgz#f8b8a4b098d7a8123845b0fcf102a23b08febb53"
integrity sha512-uKX6/1b1OmlqJZOsVDCCDlyc9QItgb39vRssTwP4CJX1NLU4Sfgq2i4VVUbHXCo/I2sMEczjf3cdnxdZtC6IFA==
dependencies:
d3-shape "^1.2.0"
lodash "^4.17.19"
prop-types "^15.5.8"
victory-core "^35.11.4"
victory-pie@^35.9.0:
version "35.11.4"
resolved "https://registry.yarnpkg.com/victory-pie/-/victory-pie-35.11.4.tgz#2fb8a37fd37826f5a6654b0e43ebf472cc2c8d95"
integrity sha512-EruxP3PIkrTPTzsC5YhiRKg2s+0UtaRU1ZHZUWK8qi+zlbMDFKYg2AlHqsEnctu5AOdOWLLiye6qUG3oxjiURg==
dependencies:
d3-shape "^1.0.0"
lodash "^4.17.19"
prop-types "^15.5.8"
victory-core "^35.11.4"
victory-polar-axis@^35.11.4:
version "35.11.4"
resolved "https://registry.yarnpkg.com/victory-polar-axis/-/victory-polar-axis-35.11.4.tgz#1b362c37bbe961f123a621ad61a764a57a0285af"
integrity sha512-mnIRpfARn36TG6ZdCgKR+oWY+pIX6wLHYS0un5xM1TTObKk4IyAR3dnQhEp+3KM1SGoLg0mENFR1Ac8xrus6nQ==
dependencies:
lodash "^4.17.19"
prop-types "^15.5.8"
victory-core "^35.11.4"
victory-scatter@^35.9.0:
version "35.11.4"
resolved "https://registry.yarnpkg.com/victory-scatter/-/victory-scatter-35.11.4.tgz#fbd4f3cf12e64d75d6903cd8ae29b30fb09ee8b7"
integrity sha512-8n9rmXmVju2SqA6Xd90rRTmboaU7WStOnj1QUg4q96DDiAVf6kGPdolzCwbUBbiECLyluGoFNJ043WLXztGpiA==
dependencies:
lodash "^4.17.19"
prop-types "^15.5.8"
victory-core "^35.11.4"
victory-selection-container@^35.11.4:
version "35.11.4"
resolved "https://registry.yarnpkg.com/victory-selection-container/-/victory-selection-container-35.11.4.tgz#9311adea36d2da75d782dcd6da7e293b15f2e89b"
integrity sha512-Olxnjp9tvHUHeFr4zU/K1dzp0zbeqQRMr2Qqpr85Dd4pWV9bIReE/DanxGhjNg9s3KB5Vsn1GC46PXSTMM1XIQ==
dependencies:
lodash "^4.17.19"
prop-types "^15.5.8"
victory-core "^35.11.4"
victory-shared-events@^35.11.4:
version "35.11.4"
resolved "https://registry.yarnpkg.com/victory-shared-events/-/victory-shared-events-35.11.4.tgz#05a5dd960062010e7a1ffa0a042dcac04620b2f8"
integrity sha512-flvI27J9K+09BAbuVJf2w51D4OkXlDxE/5BlaHSKzM5jNDYsbcQ6djXa4pqa7NQtMGPOApTBkOSmVRyWRqVoYA==
dependencies:
json-stringify-safe "^5.0.1"
lodash "^4.17.19"
prop-types "^15.5.8"
react-fast-compare "^2.0.0"
victory-core "^35.11.4"
victory-stack@^35.9.0:
version "35.11.4"
resolved "https://registry.yarnpkg.com/victory-stack/-/victory-stack-35.11.4.tgz#b3f973a6aedf9d00de0cf81e30428766f214c320"
integrity sha512-fNTY50fN+DCHcK/9AgMUEq0uJ8IXGnMlRtkSCzMB9ZpEzB7Edx3jLM2Gl970zOkwVaDYXTlikPd1dwf+h3m0dA==
dependencies:
lodash "^4.17.19"
prop-types "^15.5.8"
react-fast-compare "^2.0.0"
victory-core "^35.11.4"
victory-shared-events "^35.11.4"
victory-tooltip@^35.11.4, victory-tooltip@^35.9.1:
version "35.11.4"
resolved "https://registry.yarnpkg.com/victory-tooltip/-/victory-tooltip-35.11.4.tgz#3b69abc5e39422364012522c887930263539d699"
integrity sha512-B+UUqzryurtMghJGiE34tg5eI44vHxyOOcuPIM3IpJLujnNIJXVykBjgQZnFq1CT/63TtDCOlzPkOjSbecPtXQ==
dependencies:
lodash "^4.17.19"
prop-types "^15.5.8"
victory-core "^35.11.4"
victory-voronoi-container@^35.11.4, victory-voronoi-container@^35.9.1:
version "35.11.4"
resolved "https://registry.yarnpkg.com/victory-voronoi-container/-/victory-voronoi-container-35.11.4.tgz#708d38d4d703a47926fbb48affc9413cfbe8849a"
integrity sha512-vmwHBm/+nZ9qdRcaNd7r08AVRkus/ER6UA4KAYWkKUe50ZT9NYjDxy0wW/Y7PHQldfL9q/VxAyIE/M6jSFWkEA==
dependencies:
delaunay-find "0.0.6"
lodash "^4.17.19"
prop-types "^15.5.8"
react-fast-compare "^2.0.0"
victory-core "^35.11.4"
victory-tooltip "^35.11.4"
victory-zoom-container@^35.11.4, victory-zoom-container@^35.9.0:
version "35.11.4"
resolved "https://registry.yarnpkg.com/victory-zoom-container/-/victory-zoom-container-35.11.4.tgz#5fd6d29db4cd3b2eac22c59cd7c4d1bff48bbe89"
integrity sha512-8D4hTdvGZqyZdgWjkz/pDRVy/kijWhptFbK0KWl5J1Tt4YuCGiRC9oxQOpEjlqr8TSyeVnpyuF4QuIp9YOIrAw==
dependencies:
lodash "^4.17.19"
prop-types "^15.5.8"
victory-core "^35.11.4"
vm-browserify@^1.0.1:
version "1.1.2"
resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"