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;
}
lookupApiLink(ref: IKubeObjectRef, parentObject: KubeObject): string {
lookupApiLink(ref: IKubeObjectRef, parentObject?: KubeObject): string {
const {
kind, apiVersion, name,
namespace = parentObject.getNs(),
namespace = parentObject?.getNs(),
} = ref;
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 { Notifications } from "../notifications";
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 {
tab: DockTab;
@ -103,28 +108,40 @@ export class CreateResource extends React.Component<Props> {
// skip empty documents
const resources = yaml.loadAll(this.data).filter(Boolean);
const createdResources: string[] = [];
if (resources.length === 0) {
return void logger.info("Nothing to create");
}
for (const result of await Promise.allSettled(resources.map(resourceApplierApi.update))) {
if (result.status === "fulfilled") {
createdResources.push(result.value.metadata.name);
} else {
Notifications.error(result.reason.toString());
}
}
const creatingResources = resources.map(async (resource: string) => {
try {
const data: KubeJsonApiData = await resourceApplierApi.update(resource);
const resourceName = data.metadata.name;
const resourceLink = apiManager.lookupApiLink({
kind: data.kind,
apiVersion: data.apiVersion,
name: resourceName,
namespace: data.metadata.namespace,
});
if (createdResources.length > 0) {
Notifications.ok((
<p>
{createdResources.length === 1 ? "Resource" : "Resources"}{" "}
<b>{createdResources.join(", ")}</b> successfully created
</p>
));
}
const showDetails = () => {
navigate(getDetailsUrl(resourceLink));
close();
};
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;
};

View File

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