@jfvilas/plugin-kwirth-log
Version:
Frontend plugin for viewing real-time Kubernetes logs in Backstage
85 lines (82 loc) • 5.98 kB
JavaScript
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