import "./crd-list.scss"; import React from "react"; import { Trans } from "@lingui/macro"; import { computed } from "mobx"; import { observer } from "mobx-react"; import { Link } from "react-router-dom"; import { stopPropagation } from "../../utils"; import { KubeObjectListLayout } from "../kube-object"; import { crdStore } from "./crd.store"; import { CustomResourceDefinition } from "../../api/endpoints/crd.api"; import { Select, SelectOption } from "../select"; import { createPageParam } from "../../navigation"; import { Icon } from "../icon"; export const crdGroupsUrlParam = createPageParam({ name: "groups", multiValues: true, isSystem: true, defaultValue: [], }); enum sortBy { kind = "kind", group = "group", version = "version", scope = "scope", age = "age", } @observer export class CrdList extends React.Component { @computed get groups(): string[] { return crdGroupsUrlParam.get(); } onSelectGroup(group: string) { const groups = new Set(this.groups); if (groups.has(group)) { groups.delete(group); // toggle selection } else { groups.add(group); } crdGroupsUrlParam.set(Array.from(groups)); } render() { const selectedGroups = this.groups; const sortingCallbacks = { [sortBy.kind]: (crd: CustomResourceDefinition) => crd.getResourceKind(), [sortBy.group]: (crd: CustomResourceDefinition) => crd.getGroup(), [sortBy.version]: (crd: CustomResourceDefinition) => crd.getVersion(), [sortBy.scope]: (crd: CustomResourceDefinition) => crd.getScope(), }; return ( { return selectedGroups.length ? items.filter(item => selectedGroups.includes(item.getGroup())) : items; } ]} renderHeaderTitle={Custom Resources} customizeHeader={() => { let placeholder = All groups; if (selectedGroups.length == 1) placeholder = <>Group: {selectedGroups[0]}; if (selectedGroups.length >= 2) placeholder = <>Groups: {selectedGroups.join(", ")}; return { // todo: move to global filters filters: (