From f9b8a593678d1429ab407ac65cfefb6375f3751f Mon Sep 17 00:00:00 2001 From: "Hung-Han (Henry) Chen" Date: Fri, 1 Oct 2021 16:42:14 +0300 Subject: [PATCH] Move CatalogEntityItem to a separate folder (easier to mock) Signed-off-by: Hung-Han (Henry) Chen --- .../+catalog/catalog-entity-item.tsx | 116 ++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 src/renderer/components/+catalog/catalog-entity-item.tsx diff --git a/src/renderer/components/+catalog/catalog-entity-item.tsx b/src/renderer/components/+catalog/catalog-entity-item.tsx new file mode 100644 index 0000000000..e5b8d71cfd --- /dev/null +++ b/src/renderer/components/+catalog/catalog-entity-item.tsx @@ -0,0 +1,116 @@ +/** + * Copyright (c) 2021 OpenLens Authors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import styles from "./catalog.module.css"; + +import React from "react"; +import { action, computed } from "mobx"; +import type { CatalogEntity, CatalogEntityActionContext } from "../../api/catalog-entity"; +import type { ItemObject } from "../../../common/item.store"; +import { Badge } from "../badge"; +import { navigation } from "../../navigation"; +import { searchUrlParam } from "../input"; +import { makeCss } from "../../../common/utils/makeCss"; +import { KubeObject } from "../../../common/k8s-api/kube-object"; + +const css = makeCss(styles); + +export class CatalogEntityItem implements ItemObject { + constructor(public entity: T) {} + + get kind() { + return this.entity.kind; + } + + get apiVersion() { + return this.entity.apiVersion; + } + + get name() { + return this.entity.metadata.name; + } + + getName() { + return this.entity.metadata.name; + } + + get id() { + return this.entity.metadata.uid; + } + + getId() { + return this.id; + } + + @computed get phase() { + return this.entity.status.phase; + } + + get enabled() { + return this.entity.status.enabled ?? true; + } + + get labels() { + return KubeObject.stringifyLabels(this.entity.metadata.labels); + } + + getLabelBadges(onClick?: React.MouseEventHandler) { + return this.labels + .map(label => ( + { + navigation.searchParams.set(searchUrlParam.name, label); + onClick?.(event); + event.stopPropagation(); + }} + expandable={false} + /> + )); + } + + get source() { + return this.entity.metadata.source || "unknown"; + } + + get searchFields() { + return [ + this.name, + this.id, + this.phase, + `source=${this.source}`, + ...this.labels, + ]; + } + + onRun(ctx: CatalogEntityActionContext) { + this.entity.onRun(ctx); + } + + @action + async onContextMenuOpen(ctx: any) { + return this.entity.onContextMenuOpen(ctx); + } +} +