UNPKG

@jfvilas/plugin-kwirth-log

Version:

Frontend plugin for viewing real-time Kubernetes logs in Backstage

85 lines (82 loc) 5.98 kB
import React, { useState } from 'react'; import FormControl from '@material-ui/core/FormControl'; import Select from '@material-ui/core/Select'; import MenuItem from '@material-ui/core/MenuItem'; import { Grid, Chip, Input, Checkbox, ListItemText } from '@material-ui/core'; import { InstanceConfigScopeEnum, parseResources } from '@jfvilas/kwirth-common'; const ObjectSelector = (props) => { const [render, setRender] = useState(false); let pods = props.cluster.data; let namespaceList = Array.from(new Set(pods.map((p) => p.namespace))); const onNamespaceChange = (namespace) => { let i = props.selectedNamespaces.indexOf(namespace); if (i >= 0) props.selectedNamespaces.splice(i, 1); else props.selectedNamespaces.push(namespace); props.selectedPodNames.splice(0, props.selectedPodNames.length); let pods2 = getPodList(); if (pods2.length === 1) props.selectedPodNames.push(...pods2.map((p) => p.name)); props.selectedContainerNames.splice(0, props.selectedContainerNames.length); let containers = getContainerList(); if (containers.length === 1) { props.selectedContainerNames.push(...containers); props.onSelect([...props.selectedNamespaces], [...props.selectedPodNames], [...props.selectedContainerNames]); } setRender(!render); }; const onPodNameChange = (event) => { props.selectedPodNames.splice(0, props.selectedPodNames.length); props.selectedPodNames.push(...event.target.value); props.selectedContainerNames.splice(0, props.selectedContainerNames.length); let containers = getContainerList(); if (containers.length === 1) props.selectedContainerNames.push(...containers); props.onSelect([...props.selectedNamespaces], [...props.selectedPodNames], [...props.selectedContainerNames]); setRender(!render); }; const onContainerNameChange = (event) => { props.selectedContainerNames.splice(0, props.selectedContainerNames.length); props.selectedContainerNames.push(...event.target.value); props.onSelect([...props.selectedNamespaces], [...props.selectedPodNames], [...props.selectedContainerNames]); }; const existAccessKey = (namespace) => { if (!props.cluster.accessKeys.has(InstanceConfigScopeEnum.VIEW)) return false; let accessKey = props.cluster.accessKeys.get(InstanceConfigScopeEnum.VIEW); if (accessKey) { let resources = parseResources(accessKey?.resource); return resources.find((r) => r.namespace === namespace); } else return false; }; const getPodList = () => { return Array.from(pods.filter((m) => props.selectedNamespaces.includes(m.namespace))); }; const getContainerList = () => { if (props.selectedNamespaces.length === 0 || props.selectedPodNames.length === 0) return []; let validpods = pods.filter((pod) => props.selectedNamespaces.includes(pod.namespace)); validpods = validpods.filter((p2) => props.selectedPodNames.includes(p2.name)); let validcontainers = []; for (var p of validpods) { validcontainers.push(...p.containers); } return Array.from(new Set(validcontainers)); }; 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) => { if (props.disabled) { if (existAccessKey(ns)) return /* @__PURE__ */ React.createElement(Chip, { component: "span", key: index, label: ns, variant: props.selectedNamespaces.includes(ns) ? "default" : "outlined", size: "small", color: "default" }); else return /* @__PURE__ */ React.createElement(Chip, { component: "span", key: index, label: ns, size: "small", color: "default", variant: "outlined" }); } else { if (existAccessKey(ns)) 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" }); else return /* @__PURE__ */ React.createElement(Chip, { component: "span", key: index, label: ns, size: "small", color: "secondary", variant: "outlined" }); } })), /* @__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, input: /* @__PURE__ */ React.createElement(Input, null), multiple: true, onChange: onPodNameChange, renderValue: (selected) => selected.join(", "), disabled: props.disabled || props.selectedNamespaces.length === 0 || getPodList().length === 1 }, getPodList().map((pod) => { 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 })); })))), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 6 }, /* @__PURE__ */ React.createElement(FormControl, { size: "small", fullWidth: true }, /* @__PURE__ */ React.createElement(Select, { value: props.selectedContainerNames, multiple: true, onChange: onContainerNameChange, renderValue: (selected) => selected.join(", "), disabled: props.disabled || props.selectedPodNames.length === 0 || getContainerList().length === 1 }, getContainerList().map((container) => { return /* @__PURE__ */ React.createElement(MenuItem, { key: container, value: container }, /* @__PURE__ */ React.createElement(Checkbox, { checked: props.selectedContainerNames.includes(container) }), /* @__PURE__ */ React.createElement(ListItemText, { primary: container })); })))))); }; export { ObjectSelector }; //# sourceMappingURL=ObjectSelector.esm.js.map