1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

navigate to created resource details from notification

Signed-off-by: Roman <ixrock@gmail.com>
This commit is contained in:
Roman 2021-11-25 16:43:31 +02:00
parent 47b9496e1d
commit 03847fcd55
3 changed files with 36 additions and 19 deletions

View File

@ -95,10 +95,10 @@ export class ApiManager {
return this.stores.get(this.resolveApi(api)?.apiBase) as S; return this.stores.get(this.resolveApi(api)?.apiBase) as S;
} }
lookupApiLink(ref: IKubeObjectRef, parentObject: KubeObject): string { lookupApiLink(ref: IKubeObjectRef, parentObject?: KubeObject): string {
const { const {
kind, apiVersion, name, kind, apiVersion, name,
namespace = parentObject.getNs(), namespace = parentObject?.getNs(),
} = ref; } = ref;
if (!kind) return ""; if (!kind) return "";

View File

@ -35,6 +35,11 @@ import { InfoPanel } from "./info-panel";
import * as resourceApplierApi from "../../../common/k8s-api/endpoints/resource-applier.api"; import * as resourceApplierApi from "../../../common/k8s-api/endpoints/resource-applier.api";
import { Notifications } from "../notifications"; import { Notifications } from "../notifications";
import logger from "../../../common/logger"; import logger from "../../../common/logger";
import type { KubeJsonApiData, KubeJsonApiError } from "../../../common/k8s-api/kube-json-api";
import { getDetailsUrl } from "../kube-detail-params";
import { apiManager } from "../../../common/k8s-api/api-manager";
import { prevDefault } from "../../utils";
import { navigate } from "../../navigation";
interface Props { interface Props {
tab: DockTab; tab: DockTab;
@ -103,28 +108,40 @@ export class CreateResource extends React.Component<Props> {
// skip empty documents // skip empty documents
const resources = yaml.loadAll(this.data).filter(Boolean); const resources = yaml.loadAll(this.data).filter(Boolean);
const createdResources: string[] = [];
if (resources.length === 0) { if (resources.length === 0) {
return void logger.info("Nothing to create"); return void logger.info("Nothing to create");
} }
for (const result of await Promise.allSettled(resources.map(resourceApplierApi.update))) { const creatingResources = resources.map(async (resource: string) => {
if (result.status === "fulfilled") { try {
createdResources.push(result.value.metadata.name); const data: KubeJsonApiData = await resourceApplierApi.update(resource);
} else { const resourceName = data.metadata.name;
Notifications.error(result.reason.toString()); const resourceLink = apiManager.lookupApiLink({
} kind: data.kind,
} apiVersion: data.apiVersion,
name: resourceName,
namespace: data.metadata.namespace,
});
if (createdResources.length > 0) { const showDetails = () => {
Notifications.ok(( navigate(getDetailsUrl(resourceLink));
<p> close();
{createdResources.length === 1 ? "Resource" : "Resources"}{" "} };
<b>{createdResources.join(", ")}</b> successfully created
</p> const close = Notifications.ok(
)); <p>
} Resource <a onClick={prevDefault(showDetails)}>{resourceName}</a> successfully created.
</p>,
);
} catch (error) {
const failureReason = (error as KubeJsonApiError).reason.toString();
Notifications.error(failureReason);
}
});
await Promise.allSettled(creatingResources);
return undefined; return undefined;
}; };

View File

@ -35,7 +35,7 @@ export class Notifications extends React.Component {
public elem: HTMLElement; public elem: HTMLElement;
static ok(message: NotificationMessage) { static ok(message: NotificationMessage) {
notificationsStore.add({ return notificationsStore.add({
message, message,
timeout: 2_500, timeout: 2_500,
status: NotificationStatus.OK, status: NotificationStatus.OK,