diff --git a/src/common/catalog-entities/web-link.ts b/src/common/catalog-entities/web-link.ts index be59135ae1..a014b22aa4 100644 --- a/src/common/catalog-entities/web-link.ts +++ b/src/common/catalog-entities/web-link.ts @@ -38,9 +38,9 @@ export class WebLink extends CatalogEntity WeblinkStore.getInstance().removeById(this.metadata.uid), + onClick: async () => WeblinkStore.getInstance().removeById(this.getId()), confirm: { - message: `Remove Web Link "${this.metadata.name}" from ${productName}?`, + message: `Remove Web Link "${this.getName()}" from ${productName}?`, }, }); } diff --git a/src/common/catalog/catalog-entity.ts b/src/common/catalog/catalog-entity.ts index 46ce8228ff..7f5f8bbe73 100644 --- a/src/common/catalog/catalog-entity.ts +++ b/src/common/catalog/catalog-entity.ts @@ -315,11 +315,24 @@ export abstract class CatalogEntity< @observable status: Status; @observable spec: Spec; - constructor(data: CatalogEntityData) { + constructor({ metadata, status, spec }: CatalogEntityData) { makeObservable(this); - this.metadata = data.metadata; - this.status = data.status; - this.spec = data.spec; + + if (!metadata || typeof metadata !== "object") { + throw new TypeError("CatalogEntity's metadata must be a defined object"); + } + + if (!status || typeof status !== "object") { + throw new TypeError("CatalogEntity's status must be a defined object"); + } + + if (!spec || typeof spec !== "object") { + throw new TypeError("CatalogEntity's spec must be a defined object"); + } + + this.metadata = metadata; + this.status = status; + this.spec = spec; } /** diff --git a/src/common/hotbar-store.ts b/src/common/hotbar-store.ts index 9375ba7231..16d1b87e4e 100644 --- a/src/common/hotbar-store.ts +++ b/src/common/hotbar-store.ts @@ -153,28 +153,28 @@ export class HotbarStore extends BaseStore { @action addToHotbar(item: CatalogEntity, cellIndex?: number) { const hotbar = this.getActive(); - const uid = item.metadata?.uid; - const name = item.metadata?.name; + const uid = item.getId(); + const name = item.getName(); if (typeof uid !== "string") { - throw new TypeError("CatalogEntity.metadata.uid must be a string"); + throw new TypeError("CatalogEntity's ID must be a string"); } if (typeof name !== "string") { - throw new TypeError("CatalogEntity.metadata.name must be a string"); + throw new TypeError("CatalogEntity's NAME must be a string"); } - const newItem = { entity: { - uid, - name, - source: item.metadata.source, - }}; - - if (this.isAddedToActive(item)) { return; } + const entity = { + uid, + name, + source: item.metadata.source, + }; + const newItem = { entity }; + if (cellIndex === undefined) { // Add item to empty cell const emptyCellIndex = hotbar.items.indexOf(null); @@ -277,11 +277,14 @@ export class HotbarStore extends BaseStore { } /** - * Checks if entity already pinned to hotbar - * @returns boolean + * Checks if entity already pinned to the active hotbar */ - isAddedToActive(entity: CatalogEntity) { - return !!this.getActive().items.find(item => item?.entity.uid === entity.metadata.uid); + isAddedToActive(entity: CatalogEntity | null | undefined): boolean { + if (!entity) { + return false; + } + + return this.getActive().items.findIndex(item => item?.entity.uid === entity.getId()) >= 0; } getDisplayLabel(hotbar: Hotbar): string { diff --git a/src/renderer/components/+catalog/catalog-entity-item.tsx b/src/renderer/components/+catalog/catalog-entity-item.tsx deleted file mode 100644 index f909eaf602..0000000000 --- a/src/renderer/components/+catalog/catalog-entity-item.tsx +++ /dev/null @@ -1,100 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import styles from "./catalog.module.scss"; -import React from "react"; -import { action, computed } from "mobx"; -import { CatalogEntity } from "../../api/catalog-entity"; -import type { ItemObject } from "../../../common/item.store"; -import { Badge } from "../badge"; -import { navigation } from "../../navigation"; -import { searchUrlParam } from "../input"; -import { KubeObject } from "../../../common/k8s-api/kube-object"; -import type { CatalogEntityRegistry } from "../../api/catalog-entity-registry"; - -export class CatalogEntityItem implements ItemObject { - constructor(public entity: T, private registry: CatalogEntityRegistry) { - if (!(entity instanceof CatalogEntity)) { - throw Object.assign(new TypeError("CatalogEntityItem cannot wrap a non-CatalogEntity type"), { typeof: typeof entity, prototype: Object.getPrototypeOf(entity) }); - } - } - - 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() { - this.registry.onRun(this.entity); - } - - @action - async onContextMenuOpen(ctx: any) { - return this.entity.onContextMenuOpen(ctx); - } -} diff --git a/src/renderer/components/+entity-settings/entity-settings.tsx b/src/renderer/components/+entity-settings/entity-settings.tsx index 7b5e9c816e..6bfa97195f 100644 --- a/src/renderer/components/+entity-settings/entity-settings.tsx +++ b/src/renderer/components/+entity-settings/entity-settings.tsx @@ -81,14 +81,14 @@ export class EntitySettings extends React.Component { <>
- {this.entity.metadata.name} + {this.entity.getName()}
diff --git a/src/renderer/components/cluster-settings/components/cluster-icon-settings.tsx b/src/renderer/components/cluster-settings/components/cluster-icon-settings.tsx index 7300dc92e0..afd23b221f 100644 --- a/src/renderer/components/cluster-settings/components/cluster-icon-settings.tsx +++ b/src/renderer/components/cluster-settings/components/cluster-icon-settings.tsx @@ -75,8 +75,8 @@ export class ClusterIconSetting extends React.Component { accept="image/*" label={ diff --git a/src/renderer/components/cluster-settings/components/cluster-name-setting.tsx b/src/renderer/components/cluster-settings/components/cluster-name-setting.tsx index 3e80fdbb1f..4802d79d41 100644 --- a/src/renderer/components/cluster-settings/components/cluster-name-setting.tsx +++ b/src/renderer/components/cluster-settings/components/cluster-name-setting.tsx @@ -29,7 +29,7 @@ export class ClusterNameSetting extends React.Component { componentDidMount() { disposeOnUnmount(this, autorun(() => { - this.name = this.props.cluster.preferences.clusterName || this.props.entity.metadata.name; + this.name = this.props.cluster.preferences.clusterName || this.props.entity.getName(); }), ); } diff --git a/src/renderer/components/hotbar/hotbar-entity-icon.tsx b/src/renderer/components/hotbar/hotbar-entity-icon.tsx index 63bf7dc6c9..a20160f8df 100644 --- a/src/renderer/components/hotbar/hotbar-entity-icon.tsx +++ b/src/renderer/components/hotbar/hotbar-entity-icon.tsx @@ -73,7 +73,7 @@ export class HotbarEntityIcon extends React.Component { menuItems.unshift({ title: "Remove from Hotbar", - onClick: () => this.props.remove(this.props.entity.metadata.uid), + onClick: () => this.props.remove(this.props.entity.getId()), }); this.contextMenu.menuItems = menuItems; @@ -90,8 +90,8 @@ export class HotbarEntityIcon extends React.Component { return ( { onMenuOpen={() => this.onMenuOpen()} disabled={!entity} menuItems={this.contextMenu.menuItems} - tooltip={`${entity.metadata.name} (${entity.metadata.source})`} + tooltip={`${entity.getName()} (${entity.metadata.source})`} {...elemProps} > { this.ledIcon } diff --git a/src/renderer/components/layout/sidebar-cluster.tsx b/src/renderer/components/layout/sidebar-cluster.tsx index 0126059468..58cae55c99 100644 --- a/src/renderer/components/layout/sidebar-cluster.tsx +++ b/src/renderer/components/layout/sidebar-cluster.tsx @@ -73,7 +73,7 @@ export function SidebarCluster({ clusterEntity }: { clusterEntity: CatalogEntity ? "Remove from Hotbar" : "Add to Hotbar"; const onClick = isAddedToActive - ? () => hotbarStore.removeFromHotbar(metadata.uid) + ? () => hotbarStore.removeFromHotbar(clusterEntity.getId()) : () => hotbarStore.addToHotbar(clusterEntity); contextMenu.menuItems = [{ title, onClick }]; @@ -92,8 +92,7 @@ export function SidebarCluster({ clusterEntity }: { clusterEntity: CatalogEntity setOpened(!opened); }; - const { metadata, spec } = clusterEntity; - const id = `cluster-${metadata.uid}`; + const id = `cluster-${clusterEntity.getId()}`; const tooltipId = `tooltip-${id}`; return ( @@ -106,17 +105,17 @@ export function SidebarCluster({ clusterEntity }: { clusterEntity: CatalogEntity data-testid="sidebar-cluster-dropdown" >
- {metadata.name} + {clusterEntity.getName()}
- {metadata.name} + {clusterEntity.getName()}