@jfvilas/plugin-kwirth-metrics 0.12.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +275 -0
- package/dist/api/KwirthMetricsClient.esm.js +74 -0
- package/dist/api/KwirthMetricsClient.esm.js.map +1 -0
- package/dist/api/types.esm.js +8 -0
- package/dist/api/types.esm.js.map +1 -0
- package/dist/assets/kwirthmetrics-component-not-found.svg +29 -0
- package/dist/assets/kwirthmetrics-logo.svg +15 -0
- package/dist/components/ClusterList/ClusterList.esm.js +30 -0
- package/dist/components/ClusterList/ClusterList.esm.js.map +1 -0
- package/dist/components/ComponentNotFound/ComponentNotFound.esm.js +60 -0
- package/dist/components/ComponentNotFound/ComponentNotFound.esm.js.map +1 -0
- package/dist/components/EntityKwirthMetricsContent/EntityKwirthMetricsContent.esm.js +526 -0
- package/dist/components/EntityKwirthMetricsContent/EntityKwirthMetricsContent.esm.js.map +1 -0
- package/dist/components/EntityKwirthMetricsContent/index.esm.js +2 -0
- package/dist/components/EntityKwirthMetricsContent/index.esm.js.map +1 -0
- package/dist/components/ObjectSelector/ObjectSelector.esm.js +82 -0
- package/dist/components/ObjectSelector/ObjectSelector.esm.js.map +1 -0
- package/dist/components/Options/Options.esm.js +28 -0
- package/dist/components/Options/Options.esm.js.map +1 -0
- package/dist/components/ShowError/ShowError.esm.js +20 -0
- package/dist/components/ShowError/ShowError.esm.js.map +1 -0
- package/dist/components/StatusLog/StatusLog.esm.js +10 -0
- package/dist/components/StatusLog/StatusLog.esm.js.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.esm.js +4 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/plugin.esm.js +33 -0
- package/dist/plugin.esm.js.map +1 -0
- package/dist/routes.esm.js +8 -0
- package/dist/routes.esm.js.map +1 -0
- package/package.json +91 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntityKwirthMetricsContent.esm.js","sources":["../../../src/components/EntityKwirthMetricsContent/EntityKwirthMetricsContent.tsx"],"sourcesContent":["/*\r\nCopyright 2025 Julio Fernandez\r\n\r\nLicensed under the Apache License, Version 2.0 (the \"License\");\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\n\r\n http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n*/\r\nimport React, { useRef, useState } from 'react'\r\nimport useAsync from 'react-use/esm/useAsync'\r\n\r\nimport { Progress, WarningPanel } from '@backstage/core-components'\r\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api'\r\nimport { ANNOTATION_KWIRTH_LOCATION, isKwirthAvailable, ClusterValidPods, PodData, IStatusLine, MetricDefinition } from '@jfvilas/plugin-kwirth-common'\r\nimport { MissingAnnotationEmptyState, useEntity } from '@backstage/plugin-catalog-react'\r\n\r\n// kwirthMetrics\r\nimport { kwirthMetricsApiRef } from '../../api'\r\nimport { accessKeySerialize, MetricsConfigModeEnum, MetricsMessage, InstanceMessageActionEnum, InstanceMessageFlowEnum, InstanceConfigScopeEnum, InstanceConfigViewEnum, InstanceMessage, InstanceMessageTypeEnum, SignalMessage, SignalMessageLevelEnum, InstanceConfigObjectEnum, InstanceConfig, InstanceMessageChannelEnum, OpsCommandEnum, IOpsMessageResponse, IOpsMessage, IRouteMessage } from '@jfvilas/kwirth-common'\r\n\r\n// kwirthMetrics components\r\nimport { ComponentNotFound, ErrorType } from '../ComponentNotFound'\r\nimport { Options, MetricsOptions } from '../Options'\r\nimport { ClusterList } from '../ClusterList'\r\nimport { ObjectSelector } from '../ObjectSelector'\r\nimport { ShowError } from '../ShowError'\r\nimport { StatusLog } from '../StatusLog'\r\n\r\n// Material-UI\r\nimport { Box, Checkbox, FormControl, Grid, MenuItem, Select } from '@material-ui/core'\r\nimport { Card, CardHeader, CardContent } from '@material-ui/core'\r\nimport Divider from '@material-ui/core/Divider'\r\nimport IconButton from '@material-ui/core/IconButton'\r\nimport Typography from '@material-ui/core/Typography'\r\n\r\n// Icons\r\nimport PlayIcon from '@material-ui/icons/PlayArrow'\r\nimport PauseIcon from '@material-ui/icons/Pause'\r\nimport StopIcon from '@material-ui/icons/Stop'\r\nimport InfoIcon from '@material-ui/icons/Info'\r\nimport WarningIcon from '@material-ui/icons/Warning'\r\nimport ErrorIcon from '@material-ui/icons/Error'\r\nimport RefreshIcon from '@material-ui/icons/Refresh'\r\nimport KwirthMetricsLogo from '../../assets/kwirthmetrics-logo.svg'\r\n\r\nimport { Area, AreaChart, Bar, BarChart, CartesianGrid, LabelList, Legend, Line, LineChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from 'recharts'\r\n\r\nexport const EntityKwirthMetricsContent = (props:{\r\n allMetrics: boolean\r\n enableRestart: boolean\r\n }) => { \r\n const kwirthMetricsApi = useApi(kwirthMetricsApiRef)\r\n const alertApi = useApi(alertApiRef)\r\n const { entity } = useEntity()\r\n const [clusterValidPods, setClusterValidPods] = useState<ClusterValidPods[]>([])\r\n const [selectedClusterName, setSelectedClusterName] = useState('')\r\n const [selectedNamespaces, setSelectedNamespaces] = useState<string[]>([])\r\n const [selectedPodNames, setSelectedPodNames] = useState<string[]>([])\r\n const [selectedContainerNames, setSelectedContainerNames] = useState<string[]>([])\r\n const [selectedMetrics, setSelectedMetrics] = useState<string[]>([])\r\n const [showError, setShowError] = useState('')\r\n const [started, setStarted] = useState(false)\r\n const [stopped, setStopped] = useState(true)\r\n const paused=useRef<boolean>(false)\r\n const [metricsMessages, setMetricsMessages] = useState<MetricsMessage[]>([])\r\n const [statusMessages, setStatusMessages] = useState<IStatusLine[]>([])\r\n const [websocket, setWebsocket] = useState<WebSocket>()\r\n const [instance, setInstance] = useState<string>()\r\n const kwirthMetricsOptionsRef = useRef<MetricsOptions>({depth:10, width:3, interval:10, chart:'area', aggregate:false, merge:false, stack:false })\r\n const [showStatusDialog, setShowStatusDialog] = useState(false)\r\n const [statusLevel, setStatusLevel] = useState<SignalMessageLevelEnum>(SignalMessageLevelEnum.INFO)\r\n const [backendVersion, setBackendVersion ] = useState<string>('')\r\n const [_refresh,setRefresh] = useState(0)\r\n const [allMetrics, setAllMetrics] = useState<MetricDefinition[]>(\r\n [\r\n {metric:'kwirth_container_memory_percentage',help:'',eval:'',type:'counter'},\r\n {metric:'kwirth_container_cpu_percentage',help:'',eval:'',type:'counter'},\r\n {metric:'kwirth_container_transmit_percentage',help:'',eval:'',type:'counter'},\r\n {metric:'kwirth_container_receive_percentage',help:'',eval:'',type:'counter'},\r\n {metric:'kwirth_container_transmit_mbps',help:'',eval:'',type:'counter'},\r\n {metric:'kwirth_container_receive_mbps',help:'',eval:'',type:'counter'}\r\n ])\r\n const { loading, error } = useAsync ( async () => {\r\n if (backendVersion==='') setBackendVersion(await kwirthMetricsApi.getVersion())\r\n let reqScopes = [InstanceConfigScopeEnum.STREAM]\r\n if (props.enableRestart) reqScopes.push(InstanceConfigScopeEnum.RESTART)\r\n let data = await kwirthMetricsApi.requestAccess(entity,'metrics', reqScopes)\r\n setClusterValidPods(data)\r\n })\r\n\r\n const colours = [\r\n \"#6e5bb8\", // morado oscuro\r\n \"#4a9076\", // verde oscuro\r\n \"#b56c52\", // naranja oscuro\r\n \"#7f6b97\", // color lavanda oscuro\r\n \"#b0528f\", // rosa oscuro\r\n \"#b0b052\", // amarillo oscuro\r\n \"#b05252\", // rojo oscuro\r\n \"#5285b0\", // azul oscuro\r\n \"#a38ad6\", // morado pastel\r\n \"#89c1a0\", // verde pastel\r\n \"#e4a28a\", // naranja pastel\r\n \"#b09dbd\", // lavanda pastel\r\n \"#e2a4c6\", // rosa pastel\r\n \"#c5c89e\", // amarillo pastel\r\n \"#e2a4a4\", // rojo pastel\r\n \"#90b7e2\", // azul pastel\r\n \"#f8d5e1\", // rosa claro pastel\r\n \"#b2d7f0\", // azul muy claro pastel\r\n \"#f7e1b5\", // amarillo muy claro pastel\r\n \"#d0f0c0\", // verde muy claro pastel\r\n \"#f5b0a1\", // coral pastel\r\n \"#d8a7db\", // lavanda muy claro pastel\r\n \"#f4c2c2\", // rosa suave pastel\r\n \"#e6c7b9\", // marron claro pastel\r\n \"#f0e2b6\", // crema pastel\r\n \"#a7c7e7\", // azul palido pastel\r\n \"#f5e6a5\", // amarillo palido pastel\r\n \"#e3c8f5\", // lilas pastel\r\n \"#d0c4e8\", // lila palido pastel\r\n \"#b8d8b8\", // verde claro pastel\r\n \"#d2ebfa\", // azul muy claro pastel\r\n \"#f1c1d2\" // rosa bebe pastel\r\n ]\r\n \r\n const clickStart = () => {\r\n if (!paused.current) {\r\n setMetricsMessages([])\r\n setStarted(true)\r\n paused.current=false\r\n setStopped(false)\r\n startMetricsViewer()\r\n }\r\n else {\r\n paused.current=false\r\n setStarted(true)\r\n }\r\n }\r\n\r\n const clickPause = () => {\r\n setStarted(false)\r\n paused.current=true\r\n }\r\n\r\n const clickStop = () => {\r\n setStarted(false)\r\n setStopped(true)\r\n paused.current=false\r\n stopMetricsViewer()\r\n }\r\n\r\n const onSelectCluster = async (clusterName:string|undefined) => {\r\n if (clusterName) {\r\n setSelectedClusterName(clusterName)\r\n setSelectedNamespaces([])\r\n setSelectedPodNames([])\r\n setSelectedContainerNames([])\r\n setMetricsMessages([])\r\n setStatusMessages([])\r\n clickStop()\r\n let cluster = clusterValidPods.find(cluster => cluster.name === clusterName)\r\n if (cluster && cluster.metrics) {\r\n cluster.metrics.sort( (a,b) => a.metric.startsWith('kwirth')? -1:1)\r\n setAllMetrics(cluster.metrics)\r\n }\r\n }\r\n }\r\n\r\n const processMetricsMessage = (wsEvent:any) => {\r\n let instanceMessage = JSON.parse(wsEvent.data) as InstanceMessage\r\n switch (instanceMessage.type) {\r\n case InstanceMessageTypeEnum.DATA:\r\n let metricsMessage = instanceMessage as MetricsMessage\r\n if (metricsMessage.timestamp===0) { // initial metrics values\r\n metricsMessage.timestamp = Date.now()\r\n setMetricsMessages([metricsMessage])\r\n }\r\n else {\r\n setMetricsMessages((prev) => {\r\n while (prev.length>kwirthMetricsOptionsRef.current.depth) {\r\n prev.splice(0,1)\r\n }\r\n if (paused.current)\r\n return prev\r\n else\r\n return [ ...prev, metricsMessage ]\r\n })\r\n }\r\n break\r\n case InstanceMessageTypeEnum.SIGNAL:\r\n if (instanceMessage.flow === InstanceMessageFlowEnum.RESPONSE && instanceMessage.action === InstanceMessageActionEnum.START) {\r\n if (instanceMessage.instance!=='')\r\n setInstance(instanceMessage.instance)\r\n else {\r\n let signalMessage = instanceMessage as SignalMessage\r\n alertApi.post({ message: signalMessage.text, severity:'error', display:'transient' })\r\n }\r\n }\r\n else {\r\n let signalMessage = instanceMessage as SignalMessage\r\n addMessage(signalMessage.level, signalMessage.text)\r\n switch(signalMessage.level) {\r\n case SignalMessageLevelEnum.INFO:\r\n alertApi.post({ message: signalMessage.text, severity:'info', display:'transient' })\r\n break\r\n case SignalMessageLevelEnum.WARNING:\r\n alertApi.post({ message: signalMessage.text, severity:'warning', display:'transient' })\r\n break\r\n case SignalMessageLevelEnum.ERROR:\r\n alertApi.post({ message: signalMessage.text, severity:'error', display:'transient' })\r\n break\r\n default:\r\n alertApi.post({ message: signalMessage.text, severity:'success', display:'transient' })\r\n break\r\n }\r\n }\r\n break\r\n default:\r\n addMessage(SignalMessageLevelEnum.ERROR, 'Invalid message type received: ' + instanceMessage.type)\r\n alertApi.post({ message: 'Invalid message type received: ' + instanceMessage.type, severity:'error', display:'transient' })\r\n break\r\n }\r\n }\r\n \r\n const websocketOnChunk = (wsEvent:any) => {\r\n let instanceMessage:InstanceMessage\r\n try {\r\n instanceMessage = JSON.parse(wsEvent.data) as InstanceMessage\r\n }\r\n catch (err) {\r\n console.log(err)\r\n console.log(wsEvent.data)\r\n return\r\n }\r\n\r\n switch(instanceMessage.channel) {\r\n case InstanceMessageChannelEnum.METRICS:\r\n processMetricsMessage(wsEvent)\r\n break\r\n case InstanceMessageChannelEnum.OPS:\r\n let opsMessage = instanceMessage as IOpsMessageResponse\r\n if (opsMessage.data?.data) \r\n addMessage (SignalMessageLevelEnum.WARNING, 'Operations message: '+opsMessage.data.data)\r\n else\r\n addMessage (SignalMessageLevelEnum.WARNING, 'Operations message: '+JSON.stringify(opsMessage))\r\n break\r\n default:\r\n console.log('Invalid channel in message: ', instanceMessage)\r\n break\r\n }\r\n\r\n }\r\n\r\n const websocketOnOpen = (ws:WebSocket) => {\r\n let cluster=clusterValidPods.find(cluster => cluster.name===selectedClusterName)\r\n if (!cluster) {\r\n addMessage(SignalMessageLevelEnum.ERROR, 'Cluster not found')\r\n return\r\n }\r\n let pods = cluster.data.filter(p => selectedNamespaces.includes(p.namespace))\r\n if (!pods || pods.length===0) {\r\n addMessage(SignalMessageLevelEnum.ERROR, 'Pod not found')\r\n return\r\n }\r\n\r\n console.log(`WS connected`)\r\n let accessKey = cluster.accessKeys.get(InstanceConfigScopeEnum.STREAM)\r\n if (accessKey) {\r\n let containers:string[] = []\r\n if (selectedContainerNames.length>0) {\r\n for(var p of selectedPodNames) {\r\n for (var c of selectedContainerNames) {\r\n containers.push(p+'+'+c)\r\n }\r\n }\r\n }\r\n var iConfig:InstanceConfig = {\r\n channel: InstanceMessageChannelEnum.METRICS,\r\n objects: InstanceConfigObjectEnum.PODS,\r\n action: InstanceMessageActionEnum.START,\r\n flow: InstanceMessageFlowEnum.REQUEST,\r\n instance: '',\r\n accessKey: accessKeySerialize(accessKey),\r\n scope: InstanceConfigScopeEnum.STREAM,\r\n view: (selectedContainerNames.length > 0 ? InstanceConfigViewEnum.CONTAINER : InstanceConfigViewEnum.POD),\r\n namespace: selectedNamespaces.join(','),\r\n group: '',\r\n pod: selectedPodNames.join(','),\r\n container: containers.join(','),\r\n data: {\r\n mode: MetricsConfigModeEnum.STREAM,\r\n aggregate: kwirthMetricsOptionsRef.current.aggregate,\r\n metrics: selectedMetrics,\r\n interval: kwirthMetricsOptionsRef.current.interval\r\n },\r\n type: InstanceMessageTypeEnum.SIGNAL\r\n }\r\n ws.send(JSON.stringify(iConfig))\r\n }\r\n else {\r\n addMessage(SignalMessageLevelEnum.ERROR, 'AccessKey has not been obtained')\r\n return\r\n }\r\n }\r\n\r\n const startMetricsViewer = () => {\r\n let cluster=clusterValidPods.find(cluster => cluster.name===selectedClusterName)\r\n if (!cluster) {\r\n addMessage(SignalMessageLevelEnum.ERROR, 'Cluster not found')\r\n return\r\n }\r\n\r\n try {\r\n let ws = new WebSocket(cluster.url)\r\n ws.onopen = () => websocketOnOpen(ws)\r\n ws.onmessage = (event) => websocketOnChunk(event)\r\n ws.onclose = (event) => websocketOnClose(event)\r\n setWebsocket(ws)\r\n }\r\n catch (err) {\r\n addMessage(SignalMessageLevelEnum.ERROR, 'Error starting websocket')\r\n }\r\n\r\n }\r\n\r\n const websocketOnClose = (_event:any) => {\r\n console.log(`WS disconnected from remote`)\r\n setStarted(false)\r\n paused.current=false\r\n setStopped(true)\r\n }\r\n\r\n const stopMetricsViewer = () => {\r\n websocket?.close()\r\n }\r\n\r\n const onChangeOptions = (options:MetricsOptions) => {\r\n kwirthMetricsOptionsRef.current=options\r\n setRefresh(Math.random())\r\n }\r\n \r\n const actionButtons = () => {\r\n let hasStreamKey = false, hasRestartKey = false\r\n let cluster=clusterValidPods.find(cluster => cluster.name===selectedClusterName)\r\n if (cluster) {\r\n hasStreamKey = Boolean(cluster.accessKeys.has(InstanceConfigScopeEnum.STREAM))\r\n hasRestartKey = Boolean(cluster.accessKeys.get(InstanceConfigScopeEnum.RESTART))\r\n }\r\n\r\n return <>\r\n { props.enableRestart &&\r\n <IconButton title='Restart' onClick={onClickRestart} disabled={selectedPodNames.length === 0 || !hasRestartKey || !websocket || !started}>\r\n <RefreshIcon />\r\n </IconButton>\r\n }\r\n <IconButton onClick={clickStart} title=\"Play\" disabled={started || !paused || selectedPodNames.length === 0 || selectedMetrics.length==0 || !hasStreamKey}>\r\n <PlayIcon />\r\n </IconButton>\r\n <IconButton onClick={clickPause} title=\"Pause\" disabled={!((started && !paused.current) && selectedPodNames.length === 0)}>\r\n <PauseIcon />\r\n </IconButton>\r\n <IconButton onClick={clickStop} title=\"Stop\" disabled={stopped || selectedPodNames.length === 0}>\r\n <StopIcon />\r\n </IconButton>\r\n </>\r\n }\r\n\r\n const onMetricsChange = (event:any) => {\r\n setSelectedMetrics(event.target.value)\r\n }\r\n\r\n const metricsSelector = () => {\r\n let disabled = selectedClusterName === '' || selectedNamespaces.length === 0\r\n return (\r\n <FormControl style={{marginLeft:16, width:'300px'}} size='small'>\r\n <Select value={selectedMetrics} MenuProps={{variant:'menu'}} multiple onChange={onMetricsChange} renderValue={(selected) => (selected as string[]).join(', ')} disabled={disabled || started}>\r\n {\r\n allMetrics.map(m => \r\n <MenuItem key={m.metric} value={m.metric} style={{marginTop:'-6px', marginBottom:'-6px'}}>\r\n <Checkbox checked={selectedMetrics.includes(m.metric)} style={{marginTop:'-6px', marginBottom:'-6px'}}/>\r\n <Typography style={{marginTop:'-6px', marginBottom:'-6px'}}>{m.metric}</Typography>\r\n </MenuItem>\r\n )\r\n }\r\n </Select>\r\n </FormControl>\r\n )\r\n }\r\n\r\n const statusButtons = (title:string) => {\r\n const show = (level:SignalMessageLevelEnum) => {\r\n setShowStatusDialog(true)\r\n setStatusLevel(level)\r\n }\r\n\r\n return (\r\n <Grid container direction='row'>\r\n <Grid item>\r\n <Typography variant='h5'>{title}</Typography>\r\n </Grid>\r\n <Grid item style={{marginTop:'-8px'}}>\r\n <IconButton title=\"info\" disabled={!statusMessages.some(m=>m.type=== InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.INFO)} onClick={() => show(SignalMessageLevelEnum.INFO)}>\r\n <InfoIcon style={{ color:statusMessages.some(m=>m.type=== InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.INFO)?'blue':'#BDBDBD'}}/>\r\n </IconButton>\r\n <IconButton title=\"warning\" disabled={!statusMessages.some(m=>m.type=== InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.WARNING)} onClick={() => show(SignalMessageLevelEnum.WARNING)} style={{marginLeft:'-16px'}}>\r\n <WarningIcon style={{ color:statusMessages.some(m=>m.type=== InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.WARNING)?'gold':'#BDBDBD'}}/>\r\n </IconButton>\r\n <IconButton title=\"error\" disabled={!statusMessages.some(m=>m.type=== InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.ERROR)} onClick={() => show(SignalMessageLevelEnum.ERROR)} style={{marginLeft:'-16px'}}>\r\n <ErrorIcon style={{ color:statusMessages.some(m=>m.type=== InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.ERROR)?'red':'#BDBDBD'}}/>\r\n </IconButton>\r\n </Grid>\r\n <Grid item>\r\n {metricsSelector()}\r\n </Grid>\r\n </Grid>\r\n )\r\n }\r\n\r\n const statusClear = (level: SignalMessageLevelEnum) => {\r\n setStatusMessages(statusMessages.filter(m=> m.level!==level))\r\n setShowStatusDialog(false)\r\n }\r\n \r\n const mergeSeries = (names:string[], series:any[]) => {\r\n if (!names || names.length===0) return []\r\n var resultSeries:any[] = []\r\n\r\n for (var i=0; i<series[0].length; i++) {\r\n var item: { [key: string]: string|number } = {}\r\n for (var j=0; j<series.length; j++ ) {\r\n if (series[j][i]) {\r\n item['timestamp'] = series[0][i].timestamp\r\n item[names[j]] = series[j][i].value\r\n }\r\n }\r\n resultSeries.push(item)\r\n }\r\n return resultSeries\r\n }\r\n\r\n const addChart = (options: MetricsOptions, metric:string, names:string[], series:any[], colour:string) => {\r\n var result = <></>\r\n var mergedSeries = mergeSeries(names, series)\r\n\r\n const renderLabel = (data:any) => {\r\n var values:any[] = series.map (s => s[data.index])\r\n var total:number =values.reduce((acc,value) => acc+value.value, 0)\r\n return <text x={data.x + data.width/3.5} y={data.y-10}>{total.toPrecision(3).replace(/0+$/, \"\")}</text>\r\n }\r\n let height=300\r\n\r\n switch (options.chart) {\r\n case 'value':\r\n height=40+series.length*80\r\n result = (\r\n <Grid direction={'row'}>\r\n {\r\n <Typography>\r\n { series.map( (serie,index) => {\r\n return (<>\r\n <Typography >\r\n {serie[serie.length-1].value}\r\n </Typography>\r\n <Typography >\r\n {names[index]}\r\n </Typography>\r\n </>)\r\n })}\r\n </Typography>\r\n }\r\n </Grid>\r\n\r\n )\r\n break\r\n case 'line':\r\n result = (\r\n <LineChart data={mergedSeries}>\r\n <CartesianGrid strokeDasharray=\"3 3\"/>\r\n <XAxis dataKey=\"timestamp\" fontSize={8}/>\r\n <YAxis />\r\n <Tooltip />\r\n <Legend/>\r\n { series.map ((_serie,index) => <Line key={index} name={names[index]} type=\"monotone\" dataKey={names[index]} stroke={series.length===1?colour:colours[index]} activeDot={{ r: 8 }} />) }\r\n </LineChart>\r\n )\r\n break\r\n case 'area':\r\n result = (\r\n <AreaChart data={mergedSeries}>\r\n <defs>\r\n {\r\n series.map( (_serie,index) => {\r\n return (\r\n <linearGradient key={index} id={`color${series.length===1?colour:colours[index]}`} x1='0' y1='0' x2='0' y2='1'>\r\n <stop offset='7%' stopColor={series.length===1?colour:colours[index]} stopOpacity={0.8}/>\r\n <stop offset='93%' stopColor={series.length===1?colour:colours[index]} stopOpacity={0}/>\r\n </linearGradient>\r\n )\r\n })\r\n }\r\n </defs>\r\n <CartesianGrid strokeDasharray=\"3 3\"/>\r\n <XAxis dataKey=\"timestamp\" fontSize={8}/>\r\n <YAxis />\r\n <Tooltip />\r\n <Legend/>\r\n { series.map ((_serie,index) => \r\n <Area key={index} name={names[index]} type=\"monotone\" {...(options.stack? {stackId:\"1\"}:{})} dataKey={names[index]} stroke={series.length===1?colour:colours[index]} fill={`url(#color${series.length===1?colour:colours[index]})`}/> )}\r\n </AreaChart>\r\n )\r\n break\r\n case 'bar':\r\n result = (\r\n <BarChart data={mergedSeries}>\r\n <CartesianGrid strokeDasharray=\"3 3\"/>\r\n <XAxis dataKey=\"timestamp\" fontSize={8}/>\r\n <YAxis />\r\n <Tooltip/>\r\n <Legend/>\r\n { series.map ((_serie,index) =>\r\n <Bar name={names[index]} {...(options.stack? {stackId:\"1\"}:{})} dataKey={names[index]} stroke={series.length===1?colour:colours[index]} fill={series.length===1?colour:colours[index]}>\r\n { index === series.length-1 && series.length > 1 ? <LabelList dataKey={names[index]} position='insideTop' content={ renderLabel }/> : null }\r\n </Bar>\r\n )}\r\n </BarChart>\r\n )\r\n break\r\n default:\r\n break\r\n }\r\n\r\n return (\r\n <Grid direction='column' style={{width:'100%', marginBottom:8}}>\r\n <Typography align='center'>{metric}</Typography>\r\n <ResponsiveContainer height={height} key={metric+JSON.stringify(names)}>\r\n {result}\r\n </ResponsiveContainer> \r\n </Grid>\r\n )\r\n }\r\n\r\n const showMetrics = (options: MetricsOptions) => {\r\n if (!metricsMessages || metricsMessages.length === 0) {\r\n if (selectedNamespaces.length === 0) \r\n return <Typography>Select namespace chip on top.</Typography>\r\n else\r\n return <>\r\n {started?<Typography>Waiting for first data, be patient...</Typography>:<Typography>Configure <b>chart options</b>, select some <b>metrics on top</b>, and <b>press PLAY</b> on top-right button to start viewing.</Typography>}\r\n </>\r\n }\r\n\r\n let data:Map<string, Map<string, { timestamp:string, value:number}[]>> = new Map()\r\n for (let metricsMessage of metricsMessages) {\r\n let ts = new Date(metricsMessage.timestamp)\r\n let timestamp = `${ts.getHours().toString().padStart(2,'0')}:${ts.getMinutes().toString().padStart(2,'0')}:${ts.getSeconds().toString().padStart(2,'0')}`\r\n for (var i=0;i<metricsMessage.assets.length;i++) {\r\n var assetName=metricsMessage.assets[i].assetName\r\n for (var metrics of metricsMessage.assets[i].values) {\r\n if (!data.has(assetName)) data.set(assetName, new Map())\r\n if (!data.get(assetName)?.has(metrics.metricName)) data.get(assetName)?.set(metrics.metricName,[])\r\n data.get(assetName)?.get(metrics.metricName)?.push({timestamp, value:metrics.metricValue})\r\n }\r\n } \r\n }\r\n\r\n let allCharts:any[] = []\r\n if (options.merge) {\r\n var assetNames=Array.from(data.keys())\r\n var firstAsset=assetNames[0]\r\n var allMetrics:string[] = Array.from(new Set(data.get(firstAsset)!.keys()))\r\n\r\n for (let metric of allMetrics) {\r\n var series = assetNames.map(an => {\r\n return data.get(an)!.get(metric)\r\n })\r\n allCharts.push(<>{addChart(options, metric, assetNames, series, '')}</>)\r\n }\r\n\r\n let rows = []\r\n for (let i = 0; i < allCharts.length; i += options.width) {\r\n rows.push(allCharts.slice(i, i + options.width))\r\n }\r\n return (<>\r\n {rows.map((row, index) => (\r\n <div key={index} style={{ display: 'flex', justifyContent: 'space-around' }}>\r\n {row}\r\n </div>\r\n ))}\r\n </>)\r\n }\r\n else {\r\n let allCharts = Array.from(data.keys()!).map( (asset, index) => {\r\n return Array.from(data.get(asset)?.keys()!).map ( metric => {\r\n var serie:any=data.get(asset)?.get(metric)!\r\n return (<>{addChart(options, metric, [asset], [serie], colours[index])}</>)\r\n })\r\n })\r\n\r\n // convert allResults (a list of charts) into a series of rows of charts\r\n let rows = []\r\n for (var resultAsset of allCharts) {\r\n for (let i = 0; i < resultAsset.length; i += options.width) {\r\n rows.push(resultAsset.slice(i, i + options.width))\r\n }\r\n }\r\n return (<>\r\n {rows.map((row, index) => (\r\n <div key={index} style={{ display: 'flex', justifyContent: 'space-around' }}>\r\n {row}\r\n </div>\r\n ))}\r\n </>)\r\n }\r\n }\r\n\r\n const onSelectObject = (namespaces:string[], podNames:string[], containerNames:string[]) => {\r\n setSelectedNamespaces(namespaces)\r\n setSelectedPodNames(podNames)\r\n setSelectedContainerNames(containerNames)\r\n }\r\n\r\n const addMessage = (level:SignalMessageLevelEnum, text:string) => {\r\n setStatusMessages ((prev) => [...prev, {\r\n level,\r\n text,\r\n type: InstanceMessageTypeEnum.SIGNAL\r\n }])\r\n }\r\n\r\n const onClickRestart = () => {\r\n // we perform a route command from channel 'metrics' to channel 'ops'\r\n let cluster=clusterValidPods.find(cluster => cluster.name===selectedClusterName)\r\n if (!cluster) {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No cluster selected')\r\n return\r\n }\r\n let restartKey = cluster.accessKeys.get(InstanceConfigScopeEnum.RESTART)\r\n if (!restartKey) {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No access key present')\r\n return\r\n }\r\n if (!instance) {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No instance has been established')\r\n return\r\n }\r\n\r\n\r\n let pods:PodData[] = (cluster.data as PodData[]).filter(pod => selectedNamespaces.includes(pod.namespace))\r\n for (let pod of pods) {\r\n let om:IOpsMessage = {\r\n msgtype: 'opsmessage',\r\n action: InstanceMessageActionEnum.COMMAND,\r\n flow: InstanceMessageFlowEnum.IMMEDIATE,\r\n type: InstanceMessageTypeEnum.DATA,\r\n channel: InstanceMessageChannelEnum.OPS,\r\n instance: '',\r\n id: '1',\r\n accessKey: accessKeySerialize(restartKey),\r\n command: OpsCommandEnum.RESTARTPOD,\r\n namespace: pod.namespace,\r\n group: '',\r\n pod: pod.name,\r\n container: ''\r\n }\r\n let rm: IRouteMessage = {\r\n msgtype: 'routemessage',\r\n accessKey: accessKeySerialize(restartKey),\r\n destChannel: InstanceMessageChannelEnum.OPS,\r\n action: InstanceMessageActionEnum.ROUTE,\r\n flow: InstanceMessageFlowEnum.IMMEDIATE,\r\n type: InstanceMessageTypeEnum.SIGNAL,\r\n channel: InstanceMessageChannelEnum.METRICS,\r\n instance: instance,\r\n data: om\r\n }\r\n websocket?.send(JSON.stringify(rm))\r\n }\r\n }\r\n\r\n return (<>\r\n { showError!=='' && <ShowError message={showError} onClose={() => setShowError('')}/> }\r\n\r\n { loading && <Progress/> }\r\n\r\n {!isKwirthAvailable(entity) && !loading && error && (\r\n <WarningPanel title={'An error has ocurred while obtaining data from kuebernetes clusters.'} message={error?.message} />\r\n )}\r\n\r\n {!isKwirthAvailable(entity) && !loading && (\r\n <MissingAnnotationEmptyState readMoreUrl='https://github.com/jfvilas/kwirth' annotation={ANNOTATION_KWIRTH_LOCATION}/>\r\n )}\r\n\r\n { isKwirthAvailable(entity) && !loading && clusterValidPods && clusterValidPods.length===0 &&\r\n <ComponentNotFound error={ErrorType.NO_CLUSTERS} entity={entity}/>\r\n }\r\n\r\n { isKwirthAvailable(entity) && !loading && clusterValidPods && clusterValidPods.length>0 && clusterValidPods.reduce((sum,cluster) => sum+cluster.data.length, 0)===0 &&\r\n <ComponentNotFound error={ErrorType.NO_PODS} entity={entity}/>\r\n }\r\n\r\n { isKwirthAvailable(entity) && !loading && clusterValidPods && clusterValidPods.length>0 && clusterValidPods.reduce((sum,cluster) => sum+cluster.data.length, 0)>0 &&\r\n <Box sx={{ display: 'flex'}}>\r\n <Box sx={{ width: '200px'}}>\r\n <Grid container direction='column'>\r\n <Grid item>\r\n <Card>\r\n <ClusterList resources={clusterValidPods} selectedClusterName={selectedClusterName} onSelect={onSelectCluster}/>\r\n </Card>\r\n </Grid>\r\n <Grid item>\r\n <Card>\r\n <Options options={kwirthMetricsOptionsRef.current!} selectedNamespaces={selectedNamespaces} selectedPodNames={selectedPodNames} selectedContainerNames={selectedContainerNames} onChange={onChangeOptions} disabled={selectedNamespaces.length === 0 || paused.current}/>\r\n </Card>\r\n </Grid>\r\n </Grid>\r\n\r\n </Box>\r\n <Box sx={{ flexGrow: 1, p:1 }}>\r\n\r\n { !selectedClusterName && \r\n <img src={KwirthMetricsLogo} alt=\"No cluster selected\" style={{ left:'40%', marginTop:'10%', width:'20%', position:'relative' }} />\r\n }\r\n\r\n { selectedClusterName && <>\r\n <Card style={{marginTop:-8}}>\r\n <CardHeader\r\n title={statusButtons(selectedClusterName)}\r\n style={{marginTop:-4, marginBottom:4, flexShrink:0}}\r\n action={actionButtons()}\r\n />\r\n \r\n <Typography style={{marginLeft:16, marginBottom:4}}>\r\n <ObjectSelector cluster={clusterValidPods.find(cluster => cluster.name === selectedClusterName)!} onSelect={onSelectObject} disabled={selectedClusterName === '' || started || paused.current} selectedNamespaces={selectedNamespaces} selectedPodNames={selectedPodNames} selectedContainerNames={selectedContainerNames} scope={InstanceConfigScopeEnum.STREAM}/>\r\n </Typography>\r\n <Divider/>\r\n <CardContent style={{ overflow: 'auto' }}>\r\n { showMetrics(kwirthMetricsOptionsRef.current) }\r\n </CardContent>\r\n </Card>\r\n </>}\r\n </Box> \r\n </Box>\r\n }\r\n\r\n { showStatusDialog && <StatusLog level={statusLevel} onClose={() => setShowStatusDialog(false)} statusMessages={statusMessages} onClear={statusClear}/>}\r\n </>)\r\n}\r\n"],"names":["cluster","p","allMetrics","i","allCharts"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import FormControl from '@material-ui/core/FormControl';
|
|
3
|
+
import Select from '@material-ui/core/Select';
|
|
4
|
+
import MenuItem from '@material-ui/core/MenuItem';
|
|
5
|
+
import { Grid, Chip, Checkbox, ListItemText } from '@material-ui/core';
|
|
6
|
+
import { parseResources } from '@jfvilas/kwirth-common';
|
|
7
|
+
|
|
8
|
+
const ObjectSelector = (props) => {
|
|
9
|
+
const [render, setRender] = useState(false);
|
|
10
|
+
let pods = props.cluster.data;
|
|
11
|
+
let namespaceList = Array.from(new Set(pods.map((p) => p.namespace)));
|
|
12
|
+
const onNamespaceChange = (namespace) => {
|
|
13
|
+
let i = props.selectedNamespaces.indexOf(namespace);
|
|
14
|
+
if (i >= 0)
|
|
15
|
+
props.selectedNamespaces.splice(i, 1);
|
|
16
|
+
else
|
|
17
|
+
props.selectedNamespaces.push(namespace);
|
|
18
|
+
props.selectedPodNames.splice(0, props.selectedPodNames.length);
|
|
19
|
+
let pods2 = getPodList();
|
|
20
|
+
if (pods2.length === 1) props.selectedPodNames.push(...pods2.map((p) => p.name));
|
|
21
|
+
props.selectedContainerNames.splice(0, props.selectedContainerNames.length);
|
|
22
|
+
let containers = getContainerList();
|
|
23
|
+
if (containers.length === 1) props.selectedContainerNames.push(...containers);
|
|
24
|
+
props.onSelect([...props.selectedNamespaces], [...props.selectedPodNames], [...props.selectedContainerNames]);
|
|
25
|
+
setRender(!render);
|
|
26
|
+
};
|
|
27
|
+
const onPodNameChange = (event) => {
|
|
28
|
+
props.selectedPodNames.splice(0, props.selectedPodNames.length);
|
|
29
|
+
props.selectedPodNames.push(...event.target.value);
|
|
30
|
+
props.selectedContainerNames.splice(0, props.selectedContainerNames.length);
|
|
31
|
+
let containers = getContainerList();
|
|
32
|
+
if (containers.length === 1) props.selectedContainerNames.push(...containers);
|
|
33
|
+
props.onSelect([...props.selectedNamespaces], [...props.selectedPodNames], [...props.selectedContainerNames]);
|
|
34
|
+
setRender(!render);
|
|
35
|
+
};
|
|
36
|
+
const onContainerNameChange = (event) => {
|
|
37
|
+
props.selectedContainerNames.splice(0, props.selectedContainerNames.length);
|
|
38
|
+
props.selectedContainerNames.push(...event.target.value);
|
|
39
|
+
props.onSelect([...props.selectedNamespaces], [...props.selectedPodNames], [...props.selectedContainerNames]);
|
|
40
|
+
};
|
|
41
|
+
const existAccessKey = (namespace) => {
|
|
42
|
+
if (!props.cluster.accessKeys.has(props.scope)) return false;
|
|
43
|
+
let accessKey = props.cluster.accessKeys.get(props.scope);
|
|
44
|
+
if (accessKey) {
|
|
45
|
+
let resources = parseResources(accessKey.resources);
|
|
46
|
+
return resources.find((r) => r.namespaces === namespace);
|
|
47
|
+
} else return false;
|
|
48
|
+
};
|
|
49
|
+
const getPodList = () => {
|
|
50
|
+
return Array.from(pods.filter((m) => props.selectedNamespaces.includes(m.namespace)));
|
|
51
|
+
};
|
|
52
|
+
const getContainerList = () => {
|
|
53
|
+
if (props.selectedNamespaces.length === 0 || props.selectedPodNames.length === 0) return [];
|
|
54
|
+
let validpods = pods.filter((pod) => props.selectedNamespaces.includes(pod.namespace));
|
|
55
|
+
validpods = validpods.filter((p2) => props.selectedPodNames.includes(p2.name));
|
|
56
|
+
let validcontainers = [];
|
|
57
|
+
for (var p of validpods) {
|
|
58
|
+
validcontainers.push(...p.containers);
|
|
59
|
+
}
|
|
60
|
+
return Array.from(new Set(validcontainers));
|
|
61
|
+
};
|
|
62
|
+
return /* @__PURE__ */ React.createElement(Grid, { container: true, direction: "column", spacing: 0, style: { marginBottom: 6, width: "100%" } }, /* @__PURE__ */ React.createElement(Grid, { item: true }, namespaceList.map((ns, index) => {
|
|
63
|
+
if (props.disabled) {
|
|
64
|
+
if (existAccessKey(ns))
|
|
65
|
+
return /* @__PURE__ */ React.createElement(Chip, { component: "span", key: index, label: ns, variant: props.selectedNamespaces.includes(ns) ? "default" : "outlined", size: "small", color: "default" });
|
|
66
|
+
else
|
|
67
|
+
return /* @__PURE__ */ React.createElement(Chip, { component: "span", key: index, label: ns, size: "small", color: "default", variant: "outlined" });
|
|
68
|
+
} else {
|
|
69
|
+
if (existAccessKey(ns))
|
|
70
|
+
return /* @__PURE__ */ React.createElement(Chip, { component: "span", key: index, label: ns, onClick: () => onNamespaceChange(ns), variant: props.selectedNamespaces.includes(ns) ? "default" : "outlined", size: "small", color: "primary" });
|
|
71
|
+
else
|
|
72
|
+
return /* @__PURE__ */ React.createElement(Chip, { component: "span", key: index, label: ns, size: "small", color: "secondary", variant: "outlined" });
|
|
73
|
+
}
|
|
74
|
+
})), /* @__PURE__ */ React.createElement(Grid, { container: true, item: true, xs: 12, spacing: 2 }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 6 }, /* @__PURE__ */ React.createElement(FormControl, { size: "small", fullWidth: true }, /* @__PURE__ */ React.createElement(Select, { value: props.selectedPodNames, MenuProps: { variant: "menu" }, multiple: true, onChange: onPodNameChange, renderValue: (selected) => selected.join(", "), disabled: props.disabled || props.selectedNamespaces.length === 0 || getPodList().length === 1 }, getPodList().map((pod) => {
|
|
75
|
+
return /* @__PURE__ */ React.createElement(MenuItem, { key: pod.name, value: pod.name }, /* @__PURE__ */ React.createElement(Checkbox, { checked: props.selectedPodNames.includes(pod.name) }), /* @__PURE__ */ React.createElement(ListItemText, { primary: pod.name }));
|
|
76
|
+
})))), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 6 }, /* @__PURE__ */ React.createElement(FormControl, { size: "small", fullWidth: true }, /* @__PURE__ */ React.createElement(Select, { value: props.selectedContainerNames, MenuProps: { variant: "menu" }, multiple: true, onChange: onContainerNameChange, renderValue: (selected) => selected.join(", "), disabled: props.disabled || props.selectedPodNames.length === 0 || getContainerList().length === 1 }, getContainerList().map((container) => {
|
|
77
|
+
return /* @__PURE__ */ React.createElement(MenuItem, { key: container, value: container }, /* @__PURE__ */ React.createElement(Checkbox, { checked: props.selectedContainerNames.includes(container) }), /* @__PURE__ */ React.createElement(ListItemText, { primary: container }));
|
|
78
|
+
}))))));
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
export { ObjectSelector };
|
|
82
|
+
//# sourceMappingURL=ObjectSelector.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ObjectSelector.esm.js","sources":["../../../src/components/ObjectSelector/ObjectSelector.tsx"],"sourcesContent":["import React, { useState } from 'react'\r\nimport { ClusterValidPods } from '@jfvilas/plugin-kwirth-common'\r\nimport FormControl from '@material-ui/core/FormControl'\r\nimport Select from '@material-ui/core/Select'\r\nimport MenuItem from '@material-ui/core/MenuItem'\r\nimport { Checkbox, Chip, Grid, ListItemText } from '@material-ui/core'\r\nimport { InstanceConfigScopeEnum, parseResources } from '@jfvilas/kwirth-common'\r\n\r\ninterface IProps {\r\n onSelect: (namespaces:string[], podNames:string[], containerNames:string[]) => void,\r\n cluster: ClusterValidPods,\r\n selectedNamespaces: string[],\r\n selectedPodNames: string[],\r\n selectedContainerNames: string[],\r\n scope: InstanceConfigScopeEnum,\r\n disabled: boolean\r\n}\r\n\r\nconst ObjectSelector = (props: IProps) => { \r\n const [render, setRender] = useState(false)\r\n let pods = props.cluster.data\r\n let namespaceList = Array.from(new Set(pods.map(p => p.namespace)))\r\n\r\n const onNamespaceChange = (namespace:string) => {\r\n let i = props.selectedNamespaces.indexOf(namespace)\r\n if (i>=0)\r\n props.selectedNamespaces.splice(i,1)\r\n else\r\n props.selectedNamespaces.push(namespace)\r\n\r\n props.selectedPodNames.splice(0,props.selectedPodNames.length)\r\n let pods = getPodList()\r\n if (pods.length===1) props.selectedPodNames.push( ...pods.map(p => p.name) )\r\n\r\n props.selectedContainerNames.splice(0,props.selectedContainerNames.length)\r\n let containers = getContainerList()\r\n if (containers.length===1) props.selectedContainerNames.push(...containers)\r\n props.onSelect([...props.selectedNamespaces], [...props.selectedPodNames], [...props.selectedContainerNames])\r\n setRender(!render)\r\n };\r\n\r\n const onPodNameChange = (event : any) => {\r\n props.selectedPodNames.splice(0,props.selectedPodNames.length)\r\n props.selectedPodNames.push( ...event.target.value )\r\n\r\n props.selectedContainerNames.splice(0,props.selectedContainerNames.length)\r\n let containers = getContainerList()\r\n if (containers.length===1) props.selectedContainerNames.push(...containers)\r\n\r\n props.onSelect([...props.selectedNamespaces], [...props.selectedPodNames], [...props.selectedContainerNames])\r\n\r\n setRender(!render)\r\n };\r\n\r\n const onContainerNameChange = (event : any) => {\r\n props.selectedContainerNames.splice(0,props.selectedContainerNames.length)\r\n props.selectedContainerNames.push( ...event.target.value )\r\n props.onSelect([...props.selectedNamespaces], [...props.selectedPodNames], [...props.selectedContainerNames])\r\n };\r\n\r\n const existAccessKey = (namespace:string) => {\r\n if (!props.cluster.accessKeys.has(props.scope)) return false\r\n let accessKey = props.cluster.accessKeys.get(props.scope)\r\n if (accessKey) {\r\n let resources = parseResources(accessKey.resources)\r\n return (resources.find(r => r.namespaces === namespace))\r\n }\r\n else return false\r\n\r\n }\r\n\r\n const getPodList = () => {\r\n return Array.from(pods.filter(m => props.selectedNamespaces.includes(m.namespace)))\r\n }\r\n\r\n const getContainerList = () => {\r\n if (props.selectedNamespaces.length===0 || props.selectedPodNames.length===0) return []\r\n let validpods = pods.filter(pod => props.selectedNamespaces.includes(pod.namespace))\r\n validpods = validpods.filter(p => props.selectedPodNames.includes(p.name))\r\n let validcontainers:string[] = []\r\n for (var p of validpods) {\r\n validcontainers.push ( ...p.containers )\r\n }\r\n return Array.from(new Set(validcontainers))\r\n }\r\n\r\n return (\r\n <Grid container direction='column' spacing={0} style={{marginBottom:6, width:'100%'}}>\r\n <Grid item>\r\n {\r\n namespaceList.map ((ns,index) => {\r\n if (props.disabled) {\r\n if (existAccessKey(ns))\r\n return <Chip component={'span'} key={index} label={ns as string} variant={props.selectedNamespaces.includes(ns)?'default':'outlined'} size='small' color='default' />\r\n else\r\n return <Chip component={'span'} key={index} label={ns as string} size='small' color='default' variant={'outlined'}/>\r\n }\r\n else {\r\n if (existAccessKey(ns))\r\n return <Chip component={'span'} key={index} label={ns as string} onClick={() => onNamespaceChange(ns)} variant={props.selectedNamespaces.includes(ns)?'default':'outlined'} size='small' color='primary' />\r\n else\r\n return <Chip component={'span'} key={index} label={ns as string} size='small' color='secondary' variant={'outlined'}/>\r\n }\r\n })\r\n }\r\n </Grid>\r\n <Grid container item xs={12} spacing={2}>\r\n <Grid item xs={6}>\r\n <FormControl size='small' fullWidth>\r\n <Select value={props.selectedPodNames} MenuProps={{variant:'menu'}} multiple onChange={onPodNameChange} renderValue={(selected) => (selected as string[]).join(', ')} disabled={props.disabled || props.selectedNamespaces.length===0 || getPodList().length===1}>\r\n {\r\n getPodList().map(pod => {\r\n return (\r\n <MenuItem key={pod.name} value={pod.name}>\r\n <Checkbox checked={props.selectedPodNames.includes(pod.name)} />\r\n <ListItemText primary={pod.name} />\r\n </MenuItem>\r\n )\r\n })\r\n }\r\n </Select>\r\n </FormControl>\r\n </Grid>\r\n <Grid item xs={6}>\r\n <FormControl size='small' fullWidth>\r\n <Select value={props.selectedContainerNames} MenuProps={{variant:'menu'}} multiple onChange={onContainerNameChange} renderValue={(selected) => (selected as string[]).join(', ')} disabled={props.disabled || props.selectedPodNames.length===0 || getContainerList().length===1}>\r\n {\r\n getContainerList().map(container => {\r\n return (\r\n <MenuItem key={container} value={container}>\r\n <Checkbox checked={props.selectedContainerNames.includes(container)} />\r\n <ListItemText primary={container} />\r\n </MenuItem>\r\n )\r\n })\r\n }\r\n </Select>\r\n </FormControl>\r\n </Grid>\r\n </Grid>\r\n </Grid>\r\n )\r\n}\r\n\r\nexport { ObjectSelector }"],"names":["pods","p"],"mappings":";;;;;;;AAkBM,MAAA,cAAA,GAAiB,CAAC,KAAkB,KAAA;AACtC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAC1C,EAAI,IAAA,IAAA,GAAO,MAAM,OAAQ,CAAA,IAAA;AACzB,EAAI,IAAA,aAAA,GAAgB,KAAM,CAAA,IAAA,CAAK,IAAI,GAAA,CAAI,IAAK,CAAA,GAAA,CAAI,CAAK,CAAA,KAAA,CAAA,CAAE,SAAS,CAAC,CAAC,CAAA;AAElE,EAAM,MAAA,iBAAA,GAAoB,CAAC,SAAqB,KAAA;AAC5C,IAAA,IAAI,CAAI,GAAA,KAAA,CAAM,kBAAmB,CAAA,OAAA,CAAQ,SAAS,CAAA;AAClD,IAAA,IAAI,CAAG,IAAA,CAAA;AACH,MAAM,KAAA,CAAA,kBAAA,CAAmB,MAAO,CAAA,CAAA,EAAE,CAAC,CAAA;AAAA;AAEnC,MAAM,KAAA,CAAA,kBAAA,CAAmB,KAAK,SAAS,CAAA;AAE3C,IAAA,KAAA,CAAM,gBAAiB,CAAA,MAAA,CAAO,CAAE,EAAA,KAAA,CAAM,iBAAiB,MAAM,CAAA;AAC7D,IAAA,IAAIA,QAAO,UAAW,EAAA;AACtB,IAAA,IAAIA,KAAK,CAAA,MAAA,KAAS,CAAG,EAAA,KAAA,CAAM,gBAAiB,CAAA,IAAA,CAAM,GAAGA,KAAAA,CAAK,GAAI,CAAA,CAAA,CAAA,KAAK,CAAE,CAAA,IAAI,CAAE,CAAA;AAE3E,IAAA,KAAA,CAAM,sBAAuB,CAAA,MAAA,CAAO,CAAE,EAAA,KAAA,CAAM,uBAAuB,MAAM,CAAA;AACzE,IAAA,IAAI,aAAa,gBAAiB,EAAA;AAClC,IAAA,IAAI,WAAW,MAAS,KAAA,CAAA,QAAS,sBAAuB,CAAA,IAAA,CAAK,GAAG,UAAU,CAAA;AAC1E,IAAA,KAAA,CAAM,QAAS,CAAA,CAAC,GAAG,KAAA,CAAM,kBAAkB,CAAG,EAAA,CAAC,GAAG,KAAA,CAAM,gBAAgB,CAAG,EAAA,CAAC,GAAG,KAAA,CAAM,sBAAsB,CAAC,CAAA;AAC5G,IAAA,SAAA,CAAU,CAAC,MAAM,CAAA;AAAA,GACrB;AAEA,EAAM,MAAA,eAAA,GAAkB,CAAC,KAAgB,KAAA;AACrC,IAAA,KAAA,CAAM,gBAAiB,CAAA,MAAA,CAAO,CAAE,EAAA,KAAA,CAAM,iBAAiB,MAAM,CAAA;AAC7D,IAAA,KAAA,CAAM,gBAAiB,CAAA,IAAA,CAAM,GAAG,KAAA,CAAM,OAAO,KAAM,CAAA;AAEnD,IAAA,KAAA,CAAM,sBAAuB,CAAA,MAAA,CAAO,CAAE,EAAA,KAAA,CAAM,uBAAuB,MAAM,CAAA;AACzE,IAAA,IAAI,aAAa,gBAAiB,EAAA;AAClC,IAAA,IAAI,WAAW,MAAS,KAAA,CAAA,QAAS,sBAAuB,CAAA,IAAA,CAAK,GAAG,UAAU,CAAA;AAE1E,IAAA,KAAA,CAAM,QAAS,CAAA,CAAC,GAAG,KAAA,CAAM,kBAAkB,CAAG,EAAA,CAAC,GAAG,KAAA,CAAM,gBAAgB,CAAG,EAAA,CAAC,GAAG,KAAA,CAAM,sBAAsB,CAAC,CAAA;AAE5G,IAAA,SAAA,CAAU,CAAC,MAAM,CAAA;AAAA,GACrB;AAEA,EAAM,MAAA,qBAAA,GAAwB,CAAC,KAAgB,KAAA;AAC3C,IAAA,KAAA,CAAM,sBAAuB,CAAA,MAAA,CAAO,CAAE,EAAA,KAAA,CAAM,uBAAuB,MAAM,CAAA;AACzE,IAAA,KAAA,CAAM,sBAAuB,CAAA,IAAA,CAAM,GAAG,KAAA,CAAM,OAAO,KAAM,CAAA;AACzD,IAAA,KAAA,CAAM,QAAS,CAAA,CAAC,GAAG,KAAA,CAAM,kBAAkB,CAAG,EAAA,CAAC,GAAG,KAAA,CAAM,gBAAgB,CAAG,EAAA,CAAC,GAAG,KAAA,CAAM,sBAAsB,CAAC,CAAA;AAAA,GAChH;AAEA,EAAM,MAAA,cAAA,GAAiB,CAAC,SAAqB,KAAA;AACzC,IAAI,IAAA,CAAC,MAAM,OAAQ,CAAA,UAAA,CAAW,IAAI,KAAM,CAAA,KAAK,GAAU,OAAA,KAAA;AACvD,IAAA,IAAI,YAAY,KAAM,CAAA,OAAA,CAAQ,UAAW,CAAA,GAAA,CAAI,MAAM,KAAK,CAAA;AACxD,IAAA,IAAI,SAAW,EAAA;AACX,MAAI,IAAA,SAAA,GAAY,cAAe,CAAA,SAAA,CAAU,SAAS,CAAA;AAClD,MAAA,OAAQ,SAAU,CAAA,IAAA,CAAK,CAAK,CAAA,KAAA,CAAA,CAAE,eAAe,SAAS,CAAA;AAAA,WAE9C,OAAA,KAAA;AAAA,GAEhB;AAEA,EAAA,MAAM,aAAa,MAAM;AACrB,IAAO,OAAA,KAAA,CAAM,IAAK,CAAA,IAAA,CAAK,MAAO,CAAA,CAAA,CAAA,KAAK,KAAM,CAAA,kBAAA,CAAmB,QAAS,CAAA,CAAA,CAAE,SAAS,CAAC,CAAC,CAAA;AAAA,GACtF;AAEA,EAAA,MAAM,mBAAmB,MAAM;AAC3B,IAAI,IAAA,KAAA,CAAM,mBAAmB,MAAS,KAAA,CAAA,IAAK,MAAM,gBAAiB,CAAA,MAAA,KAAS,CAAG,EAAA,OAAO,EAAC;AACtF,IAAI,IAAA,SAAA,GAAY,KAAK,MAAO,CAAA,CAAA,GAAA,KAAO,MAAM,kBAAmB,CAAA,QAAA,CAAS,GAAI,CAAA,SAAS,CAAC,CAAA;AACnF,IAAY,SAAA,GAAA,SAAA,CAAU,OAAO,CAAAC,EAAAA,KAAK,MAAM,gBAAiB,CAAA,QAAA,CAASA,EAAE,CAAA,IAAI,CAAC,CAAA;AACzE,IAAA,IAAI,kBAA2B,EAAC;AAChC,IAAA,KAAA,IAAS,KAAK,SAAW,EAAA;AACrB,MAAgB,eAAA,CAAA,IAAA,CAAO,GAAG,CAAA,CAAE,UAAW,CAAA;AAAA;AAE3C,IAAA,OAAO,KAAM,CAAA,IAAA,CAAK,IAAI,GAAA,CAAI,eAAe,CAAC,CAAA;AAAA,GAC9C;AAEA,EACI,uBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,SAAS,EAAA,IAAA,EAAC,WAAU,QAAS,EAAA,OAAA,EAAS,CAAG,EAAA,KAAA,EAAO,EAAC,YAAA,EAAa,GAAG,KAAM,EAAA,MAAA,EACzE,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,QAEF,aAAc,CAAA,GAAA,CAAK,CAAC,EAAA,EAAG,KAAU,KAAA;AAC7B,IAAA,IAAI,MAAM,QAAU,EAAA;AAChB,MAAA,IAAI,eAAe,EAAE,CAAA;AACjB,QAAA,2CAAQ,IAAK,EAAA,EAAA,SAAA,EAAW,QAAQ,GAAK,EAAA,KAAA,EAAO,OAAO,EAAc,EAAA,OAAA,EAAS,MAAM,kBAAmB,CAAA,QAAA,CAAS,EAAE,CAAE,GAAA,SAAA,GAAU,YAAY,IAAK,EAAA,OAAA,EAAQ,OAAM,SAAU,EAAA,CAAA;AAAA;AAEnK,QAAA,uBAAQ,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,SAAW,EAAA,MAAA,EAAQ,GAAK,EAAA,KAAA,EAAO,KAAO,EAAA,EAAA,EAAc,IAAK,EAAA,OAAA,EAAQ,KAAM,EAAA,SAAA,EAAU,SAAS,UAAW,EAAA,CAAA;AAAA,KAErH,MAAA;AACD,MAAA,IAAI,eAAe,EAAE,CAAA;AACjB,QAAO,uBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,SAAA,EAAW,MAAQ,EAAA,GAAA,EAAK,OAAO,KAAO,EAAA,EAAA,EAAc,OAAS,EAAA,MAAM,iBAAkB,CAAA,EAAE,GAAG,OAAS,EAAA,KAAA,CAAM,kBAAmB,CAAA,QAAA,CAAS,EAAE,CAAA,GAAE,YAAU,UAAY,EAAA,IAAA,EAAK,OAAQ,EAAA,KAAA,EAAM,SAAU,EAAA,CAAA;AAAA;AAEzM,QAAA,uBAAQ,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,SAAW,EAAA,MAAA,EAAQ,GAAK,EAAA,KAAA,EAAO,KAAO,EAAA,EAAA,EAAc,IAAK,EAAA,OAAA,EAAQ,KAAM,EAAA,WAAA,EAAY,SAAS,UAAW,EAAA,CAAA;AAAA;AAC5H,GACH,CAET,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,SAAA,EAAS,IAAC,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,EAAI,EAAA,OAAA,EAAS,CAClC,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,CACX,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,WAAY,EAAA,EAAA,IAAA,EAAK,OAAQ,EAAA,SAAA,EAAS,IAC/B,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,MAAO,EAAA,EAAA,KAAA,EAAO,KAAM,CAAA,gBAAA,EAAkB,SAAW,EAAA,EAAC,OAAQ,EAAA,MAAA,EAAS,EAAA,QAAA,EAAQ,IAAC,EAAA,QAAA,EAAU,eAAiB,EAAA,WAAA,EAAa,CAAC,QAAA,KAAc,QAAsB,CAAA,IAAA,CAAK,IAAI,CAAA,EAAG,QAAU,EAAA,KAAA,CAAM,QAAY,IAAA,KAAA,CAAM,kBAAmB,CAAA,MAAA,KAAS,CAAK,IAAA,UAAA,EAAa,CAAA,MAAA,KAAS,CAEvP,EAAA,EAAA,UAAA,EAAa,CAAA,GAAA,CAAI,CAAO,GAAA,KAAA;AACpB,IACI,uBAAA,KAAA,CAAA,aAAA,CAAC,YAAS,GAAK,EAAA,GAAA,CAAI,MAAM,KAAO,EAAA,GAAA,CAAI,IAChC,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,QAAS,EAAA,EAAA,OAAA,EAAS,MAAM,gBAAiB,CAAA,QAAA,CAAS,GAAI,CAAA,IAAI,CAAG,EAAA,CAAA,sCAC7D,YAAa,EAAA,EAAA,OAAA,EAAS,GAAI,CAAA,IAAA,EAAM,CACrC,CAAA;AAAA,GAEP,CAET,CACJ,CACJ,CAAA,sCACC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,CACX,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,eAAY,IAAK,EAAA,OAAA,EAAQ,SAAS,EAAA,IAAA,EAAA,kBAC9B,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAO,OAAO,KAAM,CAAA,sBAAA,EAAwB,SAAW,EAAA,EAAC,OAAQ,EAAA,MAAA,IAAS,QAAQ,EAAA,IAAA,EAAC,QAAU,EAAA,qBAAA,EAAuB,WAAa,EAAA,CAAC,aAAc,QAAsB,CAAA,IAAA,CAAK,IAAI,CAAA,EAAG,QAAU,EAAA,KAAA,CAAM,YAAY,KAAM,CAAA,gBAAA,CAAiB,MAAS,KAAA,CAAA,IAAK,gBAAiB,EAAA,CAAE,WAAS,CAEvQ,EAAA,EAAA,gBAAA,EAAmB,CAAA,GAAA,CAAI,CAAa,SAAA,KAAA;AAChC,IAAA,2CACK,QAAS,EAAA,EAAA,GAAA,EAAK,WAAW,KAAO,EAAA,SAAA,EAAA,sCAC5B,QAAS,EAAA,EAAA,OAAA,EAAS,MAAM,sBAAuB,CAAA,QAAA,CAAS,SAAS,CAAG,EAAA,CAAA,sCACpE,YAAa,EAAA,EAAA,OAAA,EAAS,WAAW,CACtC,CAAA;AAAA,GAEP,CAET,CACJ,CACJ,CACJ,CACJ,CAAA;AAER;;;;"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import CardHeader from '@material-ui/core/CardHeader';
|
|
3
|
+
import Divider from '@material-ui/core/Divider';
|
|
4
|
+
import Grid from '@material-ui/core/Grid';
|
|
5
|
+
import MenuItem from '@material-ui/core/MenuItem';
|
|
6
|
+
import Select from '@material-ui/core/Select';
|
|
7
|
+
import { FormControlLabel, Checkbox, Typography } from '@material-ui/core';
|
|
8
|
+
|
|
9
|
+
const Options = (props) => {
|
|
10
|
+
const [options, setOptions] = useState(props.options);
|
|
11
|
+
const handleChange = (change) => {
|
|
12
|
+
var a = { ...options, ...change };
|
|
13
|
+
setOptions(a);
|
|
14
|
+
props.onChange(a);
|
|
15
|
+
};
|
|
16
|
+
const multiAssets = () => {
|
|
17
|
+
if (!props.selectedNamespaces) return false;
|
|
18
|
+
if (!props.selectedPodNames) return false;
|
|
19
|
+
if (!props.selectedContainerNames) return false;
|
|
20
|
+
if (props.selectedPodNames.length > 1) return true;
|
|
21
|
+
if (props.selectedContainerNames.length > 1) return true;
|
|
22
|
+
return false;
|
|
23
|
+
};
|
|
24
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(CardHeader, { title: "Options" }), /* @__PURE__ */ React.createElement(Divider, { style: { marginTop: 8 } }), /* @__PURE__ */ React.createElement(Grid, { container: true, direction: "column", spacing: 1 }, /* @__PURE__ */ React.createElement(Grid, { item: true, style: { marginTop: 16 } }, /* @__PURE__ */ React.createElement(FormControlLabel, { style: { marginLeft: 24 }, label: "Width\xA0\xA0\xA0", labelPlacement: "start", disabled: props.disabled, control: /* @__PURE__ */ React.createElement(Select, { value: options.width, onChange: (evt) => handleChange({ width: evt.target.value }), style: { width: 80, marginLeft: 16 }, disabled: props.disabled }, /* @__PURE__ */ React.createElement(MenuItem, { value: 1 }, "1"), /* @__PURE__ */ React.createElement(MenuItem, { value: 2 }, "2"), /* @__PURE__ */ React.createElement(MenuItem, { value: 3 }, "3"), /* @__PURE__ */ React.createElement(MenuItem, { value: 4 }, "4")) })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FormControlLabel, { style: { marginLeft: 24 }, label: "Interval", labelPlacement: "start", disabled: props.disabled, control: /* @__PURE__ */ React.createElement(Select, { value: options.interval, onChange: (evt) => handleChange({ interval: evt.target.value }), style: { width: 80, marginLeft: 16 }, disabled: props.disabled }, /* @__PURE__ */ React.createElement(MenuItem, { value: 5 }, "5"), /* @__PURE__ */ React.createElement(MenuItem, { value: 10 }, "10"), /* @__PURE__ */ React.createElement(MenuItem, { value: 30 }, "30"), /* @__PURE__ */ React.createElement(MenuItem, { value: 60 }, "60")) })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FormControlLabel, { style: { marginLeft: 24 }, label: "Depth\xA0\xA0\xA0\xA0", labelPlacement: "start", disabled: props.disabled, control: /* @__PURE__ */ React.createElement(Select, { value: options.depth, onChange: (evt) => handleChange({ depth: evt.target.value }), style: { width: 80, marginLeft: 8 }, disabled: props.disabled }, /* @__PURE__ */ React.createElement(MenuItem, { value: 10 }, "10"), /* @__PURE__ */ React.createElement(MenuItem, { value: 50 }, "50"), /* @__PURE__ */ React.createElement(MenuItem, { value: 100 }, "100")) })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FormControlLabel, { style: { marginLeft: 24 }, label: "Chart", labelPlacement: "start", disabled: props.disabled, control: /* @__PURE__ */ React.createElement(Select, { value: options.chart, onChange: (evt) => handleChange({ chart: evt.target.value }), style: { width: 80, marginLeft: 28 }, disabled: props.disabled }, /* @__PURE__ */ React.createElement(MenuItem, { value: "value" }, "Value"), /* @__PURE__ */ React.createElement(MenuItem, { value: "line" }, "Line"), /* @__PURE__ */ React.createElement(MenuItem, { value: "area" }, "Area"), /* @__PURE__ */ React.createElement(MenuItem, { value: "bar" }, "Bar")) })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FormControlLabel, { control: /* @__PURE__ */ React.createElement(Checkbox, { checked: options.aggregate, onChange: (evt) => handleChange({ aggregate: evt.target.checked }) }), disabled: !multiAssets() || options.merge, label: "Aggregate", style: { marginLeft: 12 } })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FormControlLabel, { control: /* @__PURE__ */ React.createElement(Checkbox, { checked: options.merge, onChange: (evt) => handleChange({ merge: evt.target.checked }) }), disabled: !multiAssets() || options.aggregate || !"area bar".includes(options.chart), label: "Merge", style: { marginLeft: 12 } })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(FormControlLabel, { control: /* @__PURE__ */ React.createElement(Checkbox, { checked: options.stack, onChange: (evt) => handleChange({ stack: evt.target.checked }) }), disabled: !options.merge || !"area bar".includes(options.chart), label: "Stack", style: { marginLeft: 12, marginBottom: 16 } })), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Typography, { style: { fontSize: 9, marginLeft: 22, marginTop: 4, marginBottom: 6 } }, "Powered by ", /* @__PURE__ */ React.createElement("a", { href: "https://jfvilas.github.io/kwirth/", target: "_blank", style: { color: "blue" } }, "Kwirth")))));
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export { Options };
|
|
28
|
+
//# sourceMappingURL=Options.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Options.esm.js","sources":["../../../src/components/Options/Options.tsx"],"sourcesContent":["import React, { useState } from 'react'\r\nimport CardHeader from '@material-ui/core/CardHeader'\r\nimport Divider from '@material-ui/core/Divider'\r\nimport Grid from '@material-ui/core/Grid'\r\nimport MenuItem from '@material-ui/core/MenuItem'\r\nimport Select from '@material-ui/core/Select'\r\nimport { Checkbox, FormControlLabel, Typography } from '@material-ui/core'\r\n\r\ninterface MetricsOptions {\r\n width: number\r\n depth: number\r\n interval: number\r\n chart: string\r\n aggregate: boolean\r\n merge: boolean\r\n stack: boolean\r\n}\r\n\r\ninterface IOptions {\r\n onChange: (options:MetricsOptions) => void\r\n options: MetricsOptions\r\n disabled: boolean\r\n selectedNamespaces?:string[]\r\n selectedPodNames?:string[]\r\n selectedContainerNames?:string[]\r\n}\r\n\r\n/**\r\n * \r\n * @param options A JSON with the curren toptions\r\n * @param disabled if true the options will be shown disabled\r\n * @returns onChange is fired sending back the new options JSON\r\n */\r\nconst Options = (props: IOptions) => {\r\n const [options, setOptions] = useState<any>(props.options)\r\n\r\n const handleChange = (change:any) => {\r\n var a = {...options,...change}\r\n setOptions(a)\r\n props.onChange(a)\r\n }\r\n\r\n const multiAssets = () => {\r\n if (!props.selectedNamespaces) return false\r\n if (!props.selectedPodNames) return false\r\n if (!props.selectedContainerNames) return false\r\n\r\n if (props.selectedPodNames.length>1) return true\r\n if (props.selectedContainerNames.length>1) return true\r\n return false\r\n }\r\n\r\n return (<>\r\n <CardHeader title={'Options'}/>\r\n <Divider style={{marginTop:8}}/>\r\n <Grid container direction='column' spacing={1}>\r\n <Grid item style={{marginTop:16}} >\r\n <FormControlLabel style={{marginLeft:24}} label=\"Width \" labelPlacement='start' disabled={props.disabled} control={\r\n <Select value={options.width} onChange={(evt) => handleChange({width:evt.target.value})} style={{width:80, marginLeft:16}} disabled={props.disabled}>\r\n <MenuItem value={1}>1</MenuItem>\r\n <MenuItem value={2}>2</MenuItem>\r\n <MenuItem value={3}>3</MenuItem>\r\n <MenuItem value={4}>4</MenuItem>\r\n </Select>\r\n } />\r\n </Grid>\r\n\r\n <Grid item >\r\n <FormControlLabel style={{marginLeft:24}} label=\"Interval\" labelPlacement='start' disabled={props.disabled} control={\r\n <Select value={options.interval} onChange={(evt) => handleChange({interval:evt.target.value})} style={{width:80, marginLeft:16}} disabled={props.disabled}>\r\n <MenuItem value={5}>5</MenuItem>\r\n <MenuItem value={10}>10</MenuItem>\r\n <MenuItem value={30}>30</MenuItem>\r\n <MenuItem value={60}>60</MenuItem>\r\n </Select>\r\n } />\r\n </Grid>\r\n\r\n <Grid item>\r\n <FormControlLabel style={{marginLeft:24}} label=\"Depth \" labelPlacement='start' disabled={props.disabled} control={\r\n <Select value={options.depth} onChange={(evt) => handleChange({depth:evt.target.value})} style={{width:80, marginLeft:8}} disabled={props.disabled}>\r\n <MenuItem value={10}>10</MenuItem>\r\n <MenuItem value={50}>50</MenuItem>\r\n <MenuItem value={100}>100</MenuItem>\r\n </Select>\r\n } />\r\n </Grid>\r\n\r\n <Grid item >\r\n <FormControlLabel style={{marginLeft:24}} label=\"Chart\" labelPlacement='start' disabled={props.disabled} control={\r\n <Select value={options.chart} onChange={(evt) => handleChange({chart:evt.target.value})} style={{width:80, marginLeft:28}} disabled={props.disabled}>\r\n <MenuItem value={'value'}>Value</MenuItem>\r\n <MenuItem value={'line'}>Line</MenuItem>\r\n <MenuItem value={'area'}>Area</MenuItem>\r\n <MenuItem value={'bar'}>Bar</MenuItem>\r\n </Select>\r\n } />\r\n </Grid>\r\n <Grid item>\r\n <FormControlLabel control={<Checkbox checked={options.aggregate} onChange={(evt) => handleChange({aggregate:evt.target.checked})}/>} disabled={!multiAssets() || options.merge} label='Aggregate' style={{marginLeft:12}}/>\r\n </Grid>\r\n <Grid item>\r\n <FormControlLabel control={<Checkbox checked={options.merge} onChange={(evt) => handleChange({merge:evt.target.checked})}/>} disabled={!multiAssets() || options.aggregate || !'area bar'.includes(options.chart)} label='Merge' style={{marginLeft:12}}/>\r\n </Grid>\r\n <Grid item>\r\n <FormControlLabel control={<Checkbox checked={options.stack} onChange={(evt) => handleChange({stack:evt.target.checked})}/>} disabled={!options.merge || !('area bar'.includes(options.chart))} label='Stack' style={{marginLeft:12, marginBottom:16}}/>\r\n </Grid>\r\n <Grid item>\r\n <Typography style={{fontSize:9, marginLeft:22, marginTop:4, marginBottom:6}}>Powered by <a href='https://jfvilas.github.io/kwirth/' target='_blank' style={{color:'blue'}}>Kwirth</a></Typography>\r\n </Grid>\r\n </Grid>\r\n </>)\r\n}\r\n\r\nexport type { MetricsOptions }\r\nexport { Options }"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import IconButton from '@material-ui/core/IconButton';
|
|
3
|
+
import Snackbar from '@material-ui/core/Snackbar';
|
|
4
|
+
import CloseIcon from '@material-ui/icons/Close';
|
|
5
|
+
|
|
6
|
+
const ShowError = (props) => {
|
|
7
|
+
return /* @__PURE__ */ React.createElement(
|
|
8
|
+
Snackbar,
|
|
9
|
+
{
|
|
10
|
+
message: `An error has ocurred: ${props.message}`,
|
|
11
|
+
open: true,
|
|
12
|
+
autoHideDuration: 3e3,
|
|
13
|
+
anchorOrigin: { vertical: "top", horizontal: "center" },
|
|
14
|
+
action: /* @__PURE__ */ React.createElement(IconButton, { size: "small", "aria-label": "close", color: "inherit", onClick: props.onClose }, /* @__PURE__ */ React.createElement(CloseIcon, { fontSize: "small" }))
|
|
15
|
+
}
|
|
16
|
+
);
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export { ShowError };
|
|
20
|
+
//# sourceMappingURL=ShowError.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShowError.esm.js","sources":["../../../src/components/ShowError/ShowError.tsx"],"sourcesContent":["import React from 'react'\r\nimport IconButton from '@material-ui/core/IconButton'\r\nimport Snackbar from '@material-ui/core/Snackbar'\r\nimport CloseIcon from '@material-ui/icons/Close'\r\n\r\nconst ShowError = (props: {\r\n message: string\r\n onClose:() => void\r\n }) => {\r\n\r\n return (\r\n <Snackbar \r\n message={`An error has ocurred: ${props.message}`}\r\n open={true}\r\n autoHideDuration={3000}\r\n anchorOrigin={{ vertical:'top', horizontal:'center' }}\r\n action={ \r\n <IconButton size=\"small\" aria-label=\"close\" color=\"inherit\" onClick={props.onClose}>\r\n <CloseIcon fontSize=\"small\" />\r\n </IconButton>\r\n }>\r\n </Snackbar>\r\n )\r\n}\r\n\r\nexport { ShowError }"],"names":[],"mappings":";;;;;AAKM,MAAA,SAAA,GAAY,CAAC,KAGT,KAAA;AAEN,EACI,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACG,OAAA,EAAS,CAAyB,sBAAA,EAAA,KAAA,CAAM,OAAO,CAAA,CAAA;AAAA,MAC/C,IAAM,EAAA,IAAA;AAAA,MACN,gBAAkB,EAAA,GAAA;AAAA,MAClB,YAAc,EAAA,EAAE,QAAS,EAAA,KAAA,EAAO,YAAW,QAAS,EAAA;AAAA,MACpD,wBACK,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,IAAK,EAAA,OAAA,EAAQ,cAAW,OAAQ,EAAA,KAAA,EAAM,SAAU,EAAA,OAAA,EAAS,MAAM,OACvE,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,SAAU,EAAA,EAAA,QAAA,EAAS,SAAQ,CAChC;AAAA;AAAA,GAER;AAER;;;;"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Dialog, DialogTitle, DialogContent, Typography, DialogActions, Button } from '@material-ui/core';
|
|
3
|
+
import { InstanceMessageTypeEnum } from '@jfvilas/kwirth-common';
|
|
4
|
+
|
|
5
|
+
const StatusLog = (props) => {
|
|
6
|
+
return /* @__PURE__ */ React.createElement(Dialog, { open: true }, /* @__PURE__ */ React.createElement(DialogTitle, null, "Stauts: ", props.level), /* @__PURE__ */ React.createElement(DialogContent, null, props.statusMessages.filter((m) => m.type === InstanceMessageTypeEnum.SIGNAL && m.level === props.level).map((m, index) => /* @__PURE__ */ React.createElement(Typography, { key: index }, m.text))), /* @__PURE__ */ React.createElement(DialogActions, null, /* @__PURE__ */ React.createElement(Button, { onClick: () => props.onClear(props.level), color: "primary", variant: "contained" }, "Clear"), /* @__PURE__ */ React.createElement(Button, { onClick: props.onClose, color: "primary", variant: "contained" }, "Close")));
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export { StatusLog };
|
|
10
|
+
//# sourceMappingURL=StatusLog.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusLog.esm.js","sources":["../../../src/components/StatusLog/StatusLog.tsx"],"sourcesContent":["import React from 'react';\r\nimport { Dialog, DialogTitle, DialogContent, DialogActions, Button, Typography } from '@material-ui/core'\r\nimport { InstanceMessageTypeEnum, SignalMessageLevelEnum } from '@jfvilas/kwirth-common'\r\nimport { IStatusLine } from '@jfvilas/plugin-kwirth-common';\r\n\r\ninterface IProps {\r\n level: SignalMessageLevelEnum\r\n statusMessages: IStatusLine[]\r\n onClear: (level:SignalMessageLevelEnum) => void\r\n onClose: () => void\r\n}\r\n\r\nconst StatusLog = (props:IProps) => {\r\n\r\n return (\r\n <Dialog open={true}>\r\n <DialogTitle>\r\n Stauts: {props.level} \r\n </DialogTitle>\r\n <DialogContent>\r\n { props.statusMessages.filter(m => m.type === InstanceMessageTypeEnum.SIGNAL && m.level === props.level).map( (m,index) => <Typography key={index}>{m.text}</Typography>) }\r\n </DialogContent>\r\n <DialogActions>\r\n <Button onClick={() => props.onClear(props.level)} color='primary' variant='contained'>Clear</Button>\r\n <Button onClick={props.onClose} color='primary' variant='contained'>Close</Button>\r\n </DialogActions>\r\n </Dialog>\r\n )\r\n\r\n}\r\n\r\nexport { StatusLog }"],"names":[],"mappings":";;;;AAYM,MAAA,SAAA,GAAY,CAAC,KAAiB,KAAA;AAEhC,EAAA,uBACK,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAO,IAAM,EAAA,IAAA,EAAA,kBACT,KAAA,CAAA,aAAA,CAAA,WAAA,EAAA,IAAA,EAAY,UACA,EAAA,KAAA,CAAM,KACnB,CAAA,kBACC,KAAA,CAAA,aAAA,CAAA,aAAA,EAAA,IAAA,EACK,MAAM,cAAe,CAAA,MAAA,CAAO,CAAK,CAAA,KAAA,CAAA,CAAE,IAAS,KAAA,uBAAA,CAAwB,MAAU,IAAA,CAAA,CAAE,UAAU,KAAM,CAAA,KAAK,CAAE,CAAA,GAAA,CAAK,CAAC,CAAA,EAAE,KAAU,qBAAA,KAAA,CAAA,aAAA,CAAC,cAAW,GAAK,EAAA,KAAA,EAAA,EAAQ,CAAE,CAAA,IAAK,CAAa,CAC5K,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,aACG,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,MAAO,EAAA,EAAA,OAAA,EAAS,MAAM,KAAA,CAAM,OAAQ,CAAA,KAAA,CAAM,KAAK,CAAG,EAAA,KAAA,EAAM,SAAU,EAAA,OAAA,EAAQ,WAAY,EAAA,EAAA,OAAK,CAC5F,kBAAA,KAAA,CAAA,aAAA,CAAC,UAAO,OAAS,EAAA,KAAA,CAAM,OAAS,EAAA,KAAA,EAAM,SAAU,EAAA,OAAA,EAAQ,WAAY,EAAA,EAAA,OAAK,CAC7E,CACJ,CAAA;AAGR;;;;"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import * as react from 'react';
|
|
3
|
+
import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
|
|
4
|
+
import { DiscoveryApi, FetchApi } from '@backstage/core-plugin-api';
|
|
5
|
+
import { Entity } from '@backstage/catalog-model';
|
|
6
|
+
import { InstanceConfigScopeEnum } from '@jfvilas/kwirth-common';
|
|
7
|
+
import { ClusterValidPods } from '@jfvilas/plugin-kwirth-common';
|
|
8
|
+
|
|
9
|
+
declare const kwirthMetricsPlugin: _backstage_core_plugin_api.BackstagePlugin<{
|
|
10
|
+
root: _backstage_core_plugin_api.RouteRef<undefined>;
|
|
11
|
+
}, {}, {}>;
|
|
12
|
+
declare const EntityKwirthMetricsContent: (props: {
|
|
13
|
+
allMetrics: boolean;
|
|
14
|
+
enableRestart: boolean;
|
|
15
|
+
}) => react.JSX.Element;
|
|
16
|
+
|
|
17
|
+
interface KwirthMetricsApi {
|
|
18
|
+
requestAccess(entity: Entity, channel: string, scopes: InstanceConfigScopeEnum[]): Promise<ClusterValidPods[]>;
|
|
19
|
+
getMetrics(clusterName: string): Promise<string[]>;
|
|
20
|
+
getResources(entity: Entity): Promise<ClusterValidPods>;
|
|
21
|
+
getVersion(): Promise<string>;
|
|
22
|
+
}
|
|
23
|
+
declare const kwirthMetricsApiRef: _backstage_core_plugin_api.ApiRef<KwirthMetricsApi>;
|
|
24
|
+
|
|
25
|
+
interface KwirthMetricsClientOptions {
|
|
26
|
+
discoveryApi: DiscoveryApi;
|
|
27
|
+
fetchApi: FetchApi;
|
|
28
|
+
}
|
|
29
|
+
declare class KwirthMetricsClient implements KwirthMetricsApi {
|
|
30
|
+
private readonly discoveryApi;
|
|
31
|
+
private readonly fetchApi;
|
|
32
|
+
constructor(options: KwirthMetricsClientOptions);
|
|
33
|
+
getVersion(): Promise<string>;
|
|
34
|
+
getResources(entity: Entity): Promise<ClusterValidPods>;
|
|
35
|
+
getMetrics(clusterName: string): Promise<string[]>;
|
|
36
|
+
requestAccess(entity: Entity, channel: string, scopes: InstanceConfigScopeEnum[]): Promise<ClusterValidPods[]>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export { EntityKwirthMetricsContent, KwirthMetricsClient, kwirthMetricsApiRef, kwirthMetricsPlugin };
|
|
40
|
+
export type { KwirthMetricsApi, KwirthMetricsClientOptions };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { KwirthMetricsClient } from './api/KwirthMetricsClient.esm.js';
|
|
2
|
+
import { kwirthMetricsApiRef } from './api/types.esm.js';
|
|
3
|
+
import { createPlugin, createApiFactory, fetchApiRef, discoveryApiRef, createRoutableExtension } from '@backstage/core-plugin-api';
|
|
4
|
+
import { rootRouteRef } from './routes.esm.js';
|
|
5
|
+
|
|
6
|
+
const kwirthMetricsPlugin = createPlugin({
|
|
7
|
+
id: "kwirthmetrics",
|
|
8
|
+
apis: [
|
|
9
|
+
createApiFactory({
|
|
10
|
+
api: kwirthMetricsApiRef,
|
|
11
|
+
deps: {
|
|
12
|
+
discoveryApi: discoveryApiRef,
|
|
13
|
+
fetchApi: fetchApiRef
|
|
14
|
+
},
|
|
15
|
+
factory({ discoveryApi, fetchApi }) {
|
|
16
|
+
return new KwirthMetricsClient({ discoveryApi, fetchApi });
|
|
17
|
+
}
|
|
18
|
+
})
|
|
19
|
+
],
|
|
20
|
+
routes: {
|
|
21
|
+
root: rootRouteRef
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
const EntityKwirthMetricsContent = kwirthMetricsPlugin.provide(
|
|
25
|
+
createRoutableExtension({
|
|
26
|
+
name: "EntityKwirthMetricsContent",
|
|
27
|
+
component: () => import('./components/EntityKwirthMetricsContent/index.esm.js').then((m) => m.EntityKwirthMetricsContent),
|
|
28
|
+
mountPoint: rootRouteRef
|
|
29
|
+
})
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
export { EntityKwirthMetricsContent, kwirthMetricsPlugin };
|
|
33
|
+
//# sourceMappingURL=plugin.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"sourcesContent":["/*\r\nCopyright 2024 Julio Fernandez\r\n\r\nLicensed under the Apache License, Version 2.0 (the \"License\");\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\n\r\n http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n*/\r\nimport { kwirthMetricsApiRef, KwirthMetricsClient } from './api';\r\nimport { createApiFactory, createPlugin, createRoutableExtension } from '@backstage/core-plugin-api';\r\nimport { discoveryApiRef, fetchApiRef } from '@backstage/core-plugin-api';\r\nimport { rootRouteRef } from './routes';\r\n\r\nexport const kwirthMetricsPlugin = createPlugin({\r\n id: 'kwirthmetrics', \r\n apis: [\r\n createApiFactory({\r\n api: kwirthMetricsApiRef,\r\n deps: {\r\n discoveryApi: discoveryApiRef,\r\n fetchApi: fetchApiRef,\r\n },\r\n factory({ discoveryApi, fetchApi }) {\r\n return new KwirthMetricsClient({ discoveryApi, fetchApi });\r\n },\r\n }),\r\n ],\r\n routes: {\r\n root: rootRouteRef\r\n }\r\n});\r\n\r\nexport const EntityKwirthMetricsContent = kwirthMetricsPlugin.provide(\r\n createRoutableExtension({\r\n name: 'EntityKwirthMetricsContent',\r\n component: () =>\r\n import('./components/EntityKwirthMetricsContent').then(m => m.EntityKwirthMetricsContent),\r\n mountPoint: rootRouteRef\r\n })\r\n);\r\n"],"names":[],"mappings":";;;;;AAoBO,MAAM,sBAAsB,YAAa,CAAA;AAAA,EAC9C,EAAI,EAAA,eAAA;AAAA,EACJ,IAAM,EAAA;AAAA,IACJ,gBAAiB,CAAA;AAAA,MACf,GAAK,EAAA,mBAAA;AAAA,MACL,IAAM,EAAA;AAAA,QACJ,YAAc,EAAA,eAAA;AAAA,QACd,QAAU,EAAA;AAAA,OACZ;AAAA,MACA,OAAQ,CAAA,EAAE,YAAc,EAAA,QAAA,EAAY,EAAA;AAClC,QAAA,OAAO,IAAI,mBAAA,CAAoB,EAAE,YAAA,EAAc,UAAU,CAAA;AAAA;AAC3D,KACD;AAAA,GACH;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA;AAAA;AAEV,CAAC;AAEM,MAAM,6BAA6B,mBAAoB,CAAA,OAAA;AAAA,EAC5D,uBAAwB,CAAA;AAAA,IACtB,IAAM,EAAA,4BAAA;AAAA,IACN,SAAA,EAAW,MACT,OAAO,sDAAyC,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,0BAA0B,CAAA;AAAA,IAC1F,UAAY,EAAA;AAAA,GACb;AACH;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.esm.js","sources":["../src/routes.ts"],"sourcesContent":["/*\r\nCopyright 2024 Julio Fernandez\r\n\r\nLicensed under the Apache License, Version 2.0 (the \"License\");\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\n\r\n http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n*/\r\nimport { createRouteRef } from '@backstage/core-plugin-api';\r\n\r\nexport const rootRouteRef = createRouteRef({\r\n id: 'kwirth',\r\n});\r\n"],"names":[],"mappings":";;AAiBO,MAAM,eAAe,cAAe,CAAA;AAAA,EACzC,EAAI,EAAA;AACN,CAAC;;;;"}
|
package/package.json
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@jfvilas/plugin-kwirth-metrics",
|
|
3
|
+
"version": "0.12.5",
|
|
4
|
+
"description": "Frontend plugin for viewing Kubernetes resource usage (metrics) in Backstage",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"Backstage",
|
|
7
|
+
"Kubernetes",
|
|
8
|
+
"resource",
|
|
9
|
+
"metrics",
|
|
10
|
+
"observability",
|
|
11
|
+
"Kwirth",
|
|
12
|
+
"plugin"
|
|
13
|
+
],
|
|
14
|
+
"backstage": {
|
|
15
|
+
"role": "frontend-plugin",
|
|
16
|
+
"pluginId": "kwirt",
|
|
17
|
+
"pluginPackages": [
|
|
18
|
+
"@jfvilas/plugin-kwirth-metrics",
|
|
19
|
+
"@jfvilas/plugin-kwirth-common",
|
|
20
|
+
"@jfvilas/plugin-kwirth-backend"
|
|
21
|
+
]
|
|
22
|
+
},
|
|
23
|
+
"repository": {
|
|
24
|
+
"type": "git",
|
|
25
|
+
"url": "https://github.com/jfvilas/plugin-kwirth-metrics"
|
|
26
|
+
},
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public"
|
|
29
|
+
},
|
|
30
|
+
"license": "Apache-2.0",
|
|
31
|
+
"author": {
|
|
32
|
+
"name": "Julio Fernandez",
|
|
33
|
+
"url": "https://github.com/jfvilas",
|
|
34
|
+
"email": "jfvilas@outlook.com"
|
|
35
|
+
},
|
|
36
|
+
"sideEffects": false,
|
|
37
|
+
"exports": {
|
|
38
|
+
".": {
|
|
39
|
+
"import": "./dist/index.esm.js",
|
|
40
|
+
"types": "./dist/index.d.ts",
|
|
41
|
+
"default": "./dist/index.esm.js"
|
|
42
|
+
},
|
|
43
|
+
"./package.json": "./package.json"
|
|
44
|
+
},
|
|
45
|
+
"main": "./dist/index.esm.js",
|
|
46
|
+
"types": "./dist/index.d.ts",
|
|
47
|
+
"files": [
|
|
48
|
+
"dist"
|
|
49
|
+
],
|
|
50
|
+
"scripts": {
|
|
51
|
+
"build": "backstage-cli package build",
|
|
52
|
+
"clean": "backstage-cli package clean",
|
|
53
|
+
"lint": "backstage-cli package lint",
|
|
54
|
+
"prepack": "backstage-cli package prepack",
|
|
55
|
+
"postpack": "backstage-cli package postpack",
|
|
56
|
+
"start": "backstage-cli package start",
|
|
57
|
+
"test": "backstage-cli package test"
|
|
58
|
+
},
|
|
59
|
+
"dependencies": {
|
|
60
|
+
"@backstage/catalog-model": "^1.5.0",
|
|
61
|
+
"@backstage/core-components": "^0.14.9",
|
|
62
|
+
"@backstage/core-plugin-api": "^1.9.3",
|
|
63
|
+
"@backstage/frontend-plugin-api": "^0.7.0",
|
|
64
|
+
"@backstage/integration-react": "^1.1.29",
|
|
65
|
+
"@backstage/plugin-auth-react": "^0.1.4",
|
|
66
|
+
"@backstage/plugin-catalog-react": "^1.12.2",
|
|
67
|
+
"@material-ui/core": "^4.12.2",
|
|
68
|
+
"@material-ui/icons": "^4.9.1",
|
|
69
|
+
"@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0",
|
|
70
|
+
"react-use": "^17.2.4",
|
|
71
|
+
"recharts": "^2.15.1"
|
|
72
|
+
},
|
|
73
|
+
"devDependencies": {
|
|
74
|
+
"@backstage/cli": "^0.26.11",
|
|
75
|
+
"@testing-library/dom": "^10.0.0",
|
|
76
|
+
"@testing-library/jest-dom": "^6.0.0",
|
|
77
|
+
"@testing-library/react": "^15.0.0",
|
|
78
|
+
"@types/lodash": "^4.14.151",
|
|
79
|
+
"@types/react-dom": "^18.2.19",
|
|
80
|
+
"canvas": "^2.11.2",
|
|
81
|
+
"react": "^16.13.1 || ^17.0.0 || ^18.0.0",
|
|
82
|
+
"react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0",
|
|
83
|
+
"react-router-dom": "6.0.0-beta.0 || ^6.3.0"
|
|
84
|
+
},
|
|
85
|
+
"peerDependencies": {
|
|
86
|
+
"react": "^16.13.1 || ^17.0.0 || ^18.0.0",
|
|
87
|
+
"react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0",
|
|
88
|
+
"react-router-dom": "6.0.0-beta.0 || ^6.3.0"
|
|
89
|
+
},
|
|
90
|
+
"module": "./dist/index.esm.js"
|
|
91
|
+
}
|