@k8slens/extensions 5.4.0-git.9ea3c94c5a.0 → 5.4.0-git.d4d2da1d28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/common/cluster/authorization-review.injectable.d.ts +13 -0
- package/dist/src/common/cluster/cluster.d.ts +11 -21
- package/dist/src/common/cluster/list-namespaces.injectable.d.ts +10 -0
- package/dist/src/common/item.store.d.ts +3 -1
- package/dist/src/common/k8s-api/kube-object.store.d.ts +1 -0
- package/dist/src/extensions/extension-api.js +5 -5
- package/dist/src/main/create-cluster/create-cluster.injectable.d.ts +1 -2
- package/dist/src/renderer/components/+custom-resources/route-tabs.injectable.d.ts +1 -1
- package/dist/src/renderer/components/+custom-resources/route.d.ts +1 -4
- package/dist/src/renderer/components/item-object-list/content.d.ts +1 -1
- package/dist/src/renderer/components/item-object-list/list-layout.d.ts +1 -2
- package/dist/src/renderer/components/layout/tab-routes-sidebar-items.d.ts +8 -4
- package/dist/src/renderer/create-cluster/create-cluster.injectable.d.ts +1 -2
- package/dist/src/renderer/port-forward/port-forward-store/port-forward-store.d.ts +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) OpenLens Authors. All rights reserved.
|
|
3
|
+
* Licensed under MIT License. See LICENSE in root directory for more information.
|
|
4
|
+
*/
|
|
5
|
+
/// <reference types="@ogre-tools/injectable" />
|
|
6
|
+
import { KubeConfig, V1ResourceAttributes } from "@kubernetes/client-node";
|
|
7
|
+
export declare type CanI = (resourceAttributes: V1ResourceAttributes) => Promise<boolean>;
|
|
8
|
+
/**
|
|
9
|
+
* @param proxyConfig This config's `currentContext` field must be set, and will be used as the target cluster
|
|
10
|
+
*/
|
|
11
|
+
export declare function authorizationReview(proxyConfig: KubeConfig): CanI;
|
|
12
|
+
declare const authorizationReviewInjectable: import("@ogre-tools/injectable").Injectable<import("@ogre-tools/injectable").InjectionToken<typeof authorizationReview, unknown>, typeof authorizationReview, unknown>;
|
|
13
|
+
export default authorizationReviewInjectable;
|
|
@@ -3,17 +3,21 @@
|
|
|
3
3
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
|
4
4
|
*/
|
|
5
5
|
import type { ContextHandler } from "../../main/context-handler/context-handler";
|
|
6
|
-
import { KubeConfig
|
|
6
|
+
import { KubeConfig } from "@kubernetes/client-node";
|
|
7
7
|
import type { Kubectl } from "../../main/kubectl/kubectl";
|
|
8
8
|
import type { KubeconfigManager } from "../../main/kubeconfig-manager/kubeconfig-manager";
|
|
9
9
|
import { KubeResource } from "../rbac";
|
|
10
10
|
import type { ClusterState, ClusterRefreshOptions, ClusterMetricsResourceType, ClusterId, ClusterMetadata, ClusterModel, ClusterPreferences, ClusterPrometheusPreferences, UpdateClusterModel } from "../cluster-types";
|
|
11
11
|
import { ClusterStatus } from "../cluster-types";
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
import type { CanI } from "./authorization-review.injectable";
|
|
13
|
+
import type { ListNamespaces } from "./list-namespaces.injectable";
|
|
14
|
+
export interface ClusterDependencies {
|
|
15
|
+
readonly directoryForKubeConfigs: string;
|
|
14
16
|
createKubeconfigManager: (cluster: Cluster) => KubeconfigManager;
|
|
15
17
|
createContextHandler: (cluster: Cluster) => ContextHandler;
|
|
16
18
|
createKubectl: (clusterVersion: string) => Kubectl;
|
|
19
|
+
createAuthorizationReview: (config: KubeConfig) => CanI;
|
|
20
|
+
createListNamespaces: (config: KubeConfig) => ListNamespaces;
|
|
17
21
|
}
|
|
18
22
|
/**
|
|
19
23
|
* Cluster
|
|
@@ -21,7 +25,7 @@ interface Dependencies {
|
|
|
21
25
|
* @beta
|
|
22
26
|
*/
|
|
23
27
|
export declare class Cluster implements ClusterModel, ClusterState {
|
|
24
|
-
private dependencies;
|
|
28
|
+
private readonly dependencies;
|
|
25
29
|
/** Unique id for a cluster */
|
|
26
30
|
readonly id: ClusterId;
|
|
27
31
|
private kubeCtl;
|
|
@@ -175,7 +179,7 @@ export declare class Cluster implements ClusterModel, ClusterState {
|
|
|
175
179
|
* @internal
|
|
176
180
|
*/
|
|
177
181
|
get defaultNamespace(): string;
|
|
178
|
-
constructor(dependencies:
|
|
182
|
+
constructor(dependencies: ClusterDependencies, model: ClusterModel);
|
|
179
183
|
/**
|
|
180
184
|
* Update cluster data model
|
|
181
185
|
*
|
|
@@ -234,19 +238,6 @@ export declare class Cluster implements ClusterModel, ClusterState {
|
|
|
234
238
|
*/
|
|
235
239
|
getProxyKubeconfigPath(): Promise<string>;
|
|
236
240
|
protected getConnectionStatus(): Promise<ClusterStatus>;
|
|
237
|
-
/**
|
|
238
|
-
* @internal
|
|
239
|
-
* @param resourceAttributes resource attributes
|
|
240
|
-
*/
|
|
241
|
-
canI(resourceAttributes: V1ResourceAttributes): Promise<boolean>;
|
|
242
|
-
/**
|
|
243
|
-
* @internal
|
|
244
|
-
*/
|
|
245
|
-
isClusterAdmin(): Promise<boolean>;
|
|
246
|
-
/**
|
|
247
|
-
* @internal
|
|
248
|
-
*/
|
|
249
|
-
canUseWatchApi(customizeResource?: V1ResourceAttributes): Promise<boolean>;
|
|
250
241
|
toJSON(): ClusterModel;
|
|
251
242
|
/**
|
|
252
243
|
* Serializable cluster-state used for sync btw main <-> renderer
|
|
@@ -275,12 +266,11 @@ export declare class Cluster implements ClusterModel, ClusterState {
|
|
|
275
266
|
* @internal
|
|
276
267
|
*/
|
|
277
268
|
broadcastConnectUpdate(message: string, isError?: boolean): void;
|
|
278
|
-
protected getAllowedNamespaces(): Promise<string[]>;
|
|
279
|
-
protected getAllowedResources(): Promise<KubeResource[]>;
|
|
269
|
+
protected getAllowedNamespaces(proxyConfig: KubeConfig): Promise<string[]>;
|
|
270
|
+
protected getAllowedResources(canI: CanI): Promise<KubeResource[]>;
|
|
280
271
|
isAllowedResource(kind: string): boolean;
|
|
281
272
|
isMetricHidden(resource: ClusterMetricsResourceType): boolean;
|
|
282
273
|
get nodeShellImage(): string;
|
|
283
274
|
get imagePullSecret(): string | undefined;
|
|
284
275
|
isInLocalKubeconfig(): boolean;
|
|
285
276
|
}
|
|
286
|
-
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/// <reference types="@ogre-tools/injectable" />
|
|
2
|
+
/**
|
|
3
|
+
* Copyright (c) OpenLens Authors. All rights reserved.
|
|
4
|
+
* Licensed under MIT License. See LICENSE in root directory for more information.
|
|
5
|
+
*/
|
|
6
|
+
import { KubeConfig } from "@kubernetes/client-node";
|
|
7
|
+
export declare type ListNamespaces = () => Promise<string[]>;
|
|
8
|
+
export declare function listNamespaces(config: KubeConfig): ListNamespaces;
|
|
9
|
+
declare const listNamespacesInjectable: import("@ogre-tools/injectable").Injectable<import("@ogre-tools/injectable").InjectionToken<typeof listNamespaces, unknown>, typeof listNamespaces, unknown>;
|
|
10
|
+
export default listNamespacesInjectable;
|
|
@@ -13,9 +13,10 @@ export declare abstract class ItemStore<Item extends ItemObject> {
|
|
|
13
13
|
isLoading: boolean;
|
|
14
14
|
isLoaded: boolean;
|
|
15
15
|
items: import("mobx").IObservableArray<Item>;
|
|
16
|
-
selectedItemsIds: import("mobx").
|
|
16
|
+
selectedItemsIds: import("mobx").ObservableSet<string>;
|
|
17
17
|
constructor();
|
|
18
18
|
get selectedItems(): Item[];
|
|
19
|
+
pickOnlySelected(items: Item[]): Item[];
|
|
19
20
|
getItems(): Item[];
|
|
20
21
|
getTotalCount(): number;
|
|
21
22
|
getByName(name: string, ...args: any[]): Item;
|
|
@@ -44,5 +45,6 @@ export declare abstract class ItemStore<Item extends ItemObject> {
|
|
|
44
45
|
resetSelection(): void;
|
|
45
46
|
reset(): void;
|
|
46
47
|
removeSelectedItems?(): Promise<any>;
|
|
48
|
+
removeItems?(items: Item[]): Promise<void>;
|
|
47
49
|
[Symbol.iterator](): Generator<Item, void, undefined>;
|
|
48
50
|
}
|
|
@@ -104,6 +104,7 @@ export declare abstract class KubeObjectStore<T extends KubeObject> extends Item
|
|
|
104
104
|
update(item: T, data: Partial<T>): Promise<T>;
|
|
105
105
|
remove(item: T): Promise<void>;
|
|
106
106
|
removeSelectedItems(): Promise<void[]>;
|
|
107
|
+
removeItems(items: T[]): Promise<void>;
|
|
107
108
|
protected eventsBuffer: import("mobx").IObservableArray<IKubeWatchEvent<KubeJsonApiData>>;
|
|
108
109
|
protected bindWatchEventsUpdater(delay?: number): void;
|
|
109
110
|
subscribe({ onLoadFailure, abortController }?: KubeObjectStoreSubscribeParams): Disposer;
|
|
@@ -38760,7 +38760,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
|
|
|
38760
38760
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
38761
38761
|
|
|
38762
38762
|
"use strict";
|
|
38763
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Cluster\", function() { return Cluster; });\n/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! electron */ \"electron\");\n/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var mobx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! mobx */ \"./node_modules/mobx/dist/mobx.esm.js\");\n/* harmony import */ var _ipc__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ipc */ \"./src/common/ipc/index.ts\");\n/* harmony import */ var _kubernetes_client_node__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @kubernetes/client-node */ \"./node_modules/@kubernetes/client-node/dist/index.js\");\n/* harmony import */ var _kubernetes_client_node__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_kubernetes_client_node__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _kube_helpers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../kube-helpers */ \"./src/common/kube-helpers.ts\");\n/* harmony import */ var _rbac__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../rbac */ \"./src/common/rbac.ts\");\n/* harmony import */ var _main_logger__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../main/logger */ \"./src/main/logger.ts\");\n/* harmony import */ var _main_cluster_detectors_version_detector__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../main/cluster-detectors/version-detector */ \"./src/main/cluster-detectors/version-detector.ts\");\n/* harmony import */ var _main_cluster_detectors_detector_registry__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../main/cluster-detectors/detector-registry */ \"./src/main/cluster-detectors/detector-registry.ts\");\n/* harmony import */ var p_limit__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! p-limit */ \"./node_modules/p-limit/index.js\");\n/* harmony import */ var p_limit__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(p_limit__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _cluster_types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../cluster-types */ \"./src/common/cluster-types.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../utils */ \"./src/common/utils/index.ts\");\n/* harmony import */ var _ipc_cluster__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../ipc/cluster */ \"./src/common/ipc/cluster.ts\");\n/**\n * Copyright (c) OpenLens Authors. All rights reserved.\n * Licensed under MIT License. See LICENSE in root directory for more information.\n */\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (undefined && undefined.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Cluster\n *\n * @beta\n */\nclass Cluster {\n constructor(dependencies, model) {\n Object.defineProperty(this, \"dependencies\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: dependencies\n });\n /** Unique id for a cluster */\n Object.defineProperty(this, \"id\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"kubeCtl\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n /**\n * Context handler\n *\n * @internal\n */\n Object.defineProperty(this, \"contextHandler\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"proxyKubeconfigManager\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"eventsDisposer\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: Object(_utils__WEBPACK_IMPORTED_MODULE_11__[\"disposer\"])()\n });\n Object.defineProperty(this, \"activated\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n Object.defineProperty(this, \"resourceAccessStatuses\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: new Map()\n });\n /**\n * Kubeconfig context name\n *\n * @observable\n */\n Object.defineProperty(this, \"contextName\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n /**\n * Path to kubeconfig\n *\n * @observable\n */\n Object.defineProperty(this, \"kubeConfigPath\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n /**\n * @deprecated\n */\n Object.defineProperty(this, \"workspace\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n /**\n * @deprecated\n */\n Object.defineProperty(this, \"workspaces\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n /**\n * Kubernetes API server URL\n *\n * @observable\n */\n Object.defineProperty(this, \"apiUrl\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n }); // cluster server url\n /**\n * Is cluster online\n *\n * @observable\n */\n Object.defineProperty(this, \"online\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n }); // describes if we can detect that cluster is online\n /**\n * Can user access cluster resources\n *\n * @observable\n */\n Object.defineProperty(this, \"accessible\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n }); // if user is able to access cluster resources\n /**\n * Is cluster instance in usable state\n *\n * @observable\n */\n Object.defineProperty(this, \"ready\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n }); // cluster is in usable state\n /**\n * Is cluster currently reconnecting\n *\n * @observable\n */\n Object.defineProperty(this, \"reconnecting\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n /**\n * Is cluster disconnected. False if user has selected to connect.\n *\n * @observable\n */\n Object.defineProperty(this, \"disconnected\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: true\n });\n /**\n * Does user have admin like access\n *\n * @observable\n */\n Object.defineProperty(this, \"isAdmin\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n /**\n * Global watch-api accessibility , e.g. \"/api/v1/services?watch=1\"\n *\n * @observable\n */\n Object.defineProperty(this, \"isGlobalWatchEnabled\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n /**\n * Preferences\n *\n * @observable\n */\n Object.defineProperty(this, \"preferences\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: {}\n });\n /**\n * Metadata\n *\n * @observable\n */\n Object.defineProperty(this, \"metadata\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: {}\n });\n /**\n * List of allowed namespaces verified via K8S::SelfSubjectAccessReview api\n *\n * @observable\n */\n Object.defineProperty(this, \"allowedNamespaces\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: []\n });\n /**\n * List of allowed resources\n *\n * @observable\n * @internal\n */\n Object.defineProperty(this, \"allowedResources\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: []\n });\n /**\n * List of accessible namespaces provided by user in the Cluster Settings\n *\n * @observable\n */\n Object.defineProperty(this, \"accessibleNamespaces\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: []\n });\n /**\n * Labels for the catalog entity\n */\n Object.defineProperty(this, \"labels\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: {}\n });\n Object(mobx__WEBPACK_IMPORTED_MODULE_1__[\"makeObservable\"])(this);\n this.id = model.id;\n this.updateModel(model);\n const { config } = Object(_kube_helpers__WEBPACK_IMPORTED_MODULE_4__[\"loadConfigFromFileSync\"])(this.kubeConfigPath);\n const validationError = Object(_kube_helpers__WEBPACK_IMPORTED_MODULE_4__[\"validateKubeConfig\"])(config, this.contextName);\n if (validationError) {\n throw validationError;\n }\n this.apiUrl = config.getCluster(config.getContextObject(this.contextName).cluster).server;\n if (electron__WEBPACK_IMPORTED_MODULE_0__[\"ipcMain\"]) {\n // for the time being, until renderer gets its own cluster type\n this.contextHandler = this.dependencies.createContextHandler(this);\n this.proxyKubeconfigManager = this.dependencies.createKubeconfigManager(this);\n _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].debug(`[CLUSTER]: Cluster init success`, {\n id: this.id,\n context: this.contextName,\n apiUrl: this.apiUrl,\n });\n }\n }\n get whenReady() {\n return Object(mobx__WEBPACK_IMPORTED_MODULE_1__[\"when\"])(() => this.ready);\n }\n /**\n * Is cluster available\n *\n * @computed\n */\n get available() {\n return this.accessible && !this.disconnected;\n }\n /**\n * Cluster name\n *\n * @computed\n */\n get name() {\n return this.preferences.clusterName || this.contextName;\n }\n /**\n * The detected kubernetes distribution\n */\n get distribution() {\n var _a;\n return ((_a = this.metadata[_cluster_types__WEBPACK_IMPORTED_MODULE_10__[\"ClusterMetadataKey\"].DISTRIBUTION]) === null || _a === void 0 ? void 0 : _a.toString()) || \"unknown\";\n }\n /**\n * The detected kubernetes version\n */\n get version() {\n var _a;\n return ((_a = this.metadata[_cluster_types__WEBPACK_IMPORTED_MODULE_10__[\"ClusterMetadataKey\"].VERSION]) === null || _a === void 0 ? void 0 : _a.toString()) || \"unknown\";\n }\n /**\n * Prometheus preferences\n *\n * @computed\n * @internal\n */\n get prometheusPreferences() {\n const { prometheus, prometheusProvider } = this.preferences;\n return Object(_utils__WEBPACK_IMPORTED_MODULE_11__[\"toJS\"])({ prometheus, prometheusProvider });\n }\n /**\n * defaultNamespace preference\n *\n * @computed\n * @internal\n */\n get defaultNamespace() {\n return this.preferences.defaultNamespace;\n }\n /**\n * Update cluster data model\n *\n * @param model\n */\n updateModel(model) {\n // Note: do not assign ID as that should never be updated\n this.kubeConfigPath = model.kubeConfigPath;\n if (model.workspace) {\n this.workspace = model.workspace;\n }\n if (model.workspaces) {\n this.workspaces = model.workspaces;\n }\n if (model.contextName) {\n this.contextName = model.contextName;\n }\n if (model.preferences) {\n this.preferences = model.preferences;\n }\n if (model.metadata) {\n this.metadata = model.metadata;\n }\n if (model.accessibleNamespaces) {\n this.accessibleNamespaces = model.accessibleNamespaces;\n }\n if (model.labels) {\n this.labels = model.labels;\n }\n }\n /**\n * @internal\n */\n bindEvents() {\n _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].info(`[CLUSTER]: bind events`, this.getMeta());\n const refreshTimer = setInterval(() => !this.disconnected && this.refresh(), 30000); // every 30s\n const refreshMetadataTimer = setInterval(() => !this.disconnected && this.refreshMetadata(), 900000); // every 15 minutes\n this.eventsDisposer.push(Object(mobx__WEBPACK_IMPORTED_MODULE_1__[\"reaction\"])(() => this.getState(), state => this.pushState(state)), Object(mobx__WEBPACK_IMPORTED_MODULE_1__[\"reaction\"])(() => this.prometheusPreferences, prefs => this.contextHandler.setupPrometheus(prefs), { equals: mobx__WEBPACK_IMPORTED_MODULE_1__[\"comparer\"].structural }), () => clearInterval(refreshTimer), () => clearInterval(refreshMetadataTimer), Object(mobx__WEBPACK_IMPORTED_MODULE_1__[\"reaction\"])(() => this.defaultNamespace, () => this.recreateProxyKubeconfig()));\n }\n /**\n * @internal\n */\n async recreateProxyKubeconfig() {\n _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].info(\"[CLUSTER]: Recreating proxy kubeconfig\");\n try {\n await this.proxyKubeconfigManager.clear();\n await this.getProxyKubeconfig();\n }\n catch (error) {\n _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].error(`[CLUSTER]: failed to recreate proxy kubeconfig`, error);\n }\n }\n /**\n * @param force force activation\n * @internal\n */\n async activate(force = false) {\n if (this.activated && !force) {\n return this.pushState();\n }\n _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].info(`[CLUSTER]: activate`, this.getMeta());\n if (!this.eventsDisposer.length) {\n this.bindEvents();\n }\n if (this.disconnected || !this.accessible) {\n await this.reconnect();\n }\n this.broadcastConnectUpdate(\"Refreshing connection status ...\");\n await this.refreshConnectionStatus();\n if (this.accessible) {\n this.broadcastConnectUpdate(\"Refreshing cluster accessibility ...\");\n await this.refreshAccessibility();\n // download kubectl in background, so it's not blocking dashboard\n this.ensureKubectl()\n .catch(error => _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].warn(`[CLUSTER]: failed to download kubectl for clusterId=${this.id}`, error));\n this.broadcastConnectUpdate(\"Connected, waiting for view to load ...\");\n }\n this.activated = true;\n this.pushState();\n }\n /**\n * @internal\n */\n async ensureKubectl() {\n var _a;\n (_a = this.kubeCtl) !== null && _a !== void 0 ? _a : (this.kubeCtl = this.dependencies.createKubectl(this.version));\n await this.kubeCtl.ensureKubectl();\n return this.kubeCtl;\n }\n /**\n * @internal\n */\n async reconnect() {\n var _a, _b;\n _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].info(`[CLUSTER]: reconnect`, this.getMeta());\n (_a = this.contextHandler) === null || _a === void 0 ? void 0 : _a.stopServer();\n await ((_b = this.contextHandler) === null || _b === void 0 ? void 0 : _b.ensureServer());\n this.disconnected = false;\n }\n /**\n * @internal\n */\n disconnect() {\n var _a;\n _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].info(`[CLUSTER]: disconnecting`, { id: this.id });\n this.eventsDisposer();\n (_a = this.contextHandler) === null || _a === void 0 ? void 0 : _a.stopServer();\n this.disconnected = true;\n this.online = false;\n this.accessible = false;\n this.ready = false;\n this.activated = false;\n this.allowedNamespaces = [];\n this.resourceAccessStatuses.clear();\n this.pushState();\n _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].info(`[CLUSTER]: disconnected`, { id: this.id });\n }\n /**\n * @internal\n * @param opts refresh options\n */\n async refresh(opts = {}) {\n _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].info(`[CLUSTER]: refresh`, this.getMeta());\n await this.refreshConnectionStatus();\n if (this.accessible) {\n await this.refreshAccessibility();\n if (opts.refreshMetadata) {\n this.refreshMetadata();\n }\n }\n this.pushState();\n }\n /**\n * @internal\n */\n async refreshMetadata() {\n _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].info(`[CLUSTER]: refreshMetadata`, this.getMeta());\n const metadata = await _main_cluster_detectors_detector_registry__WEBPACK_IMPORTED_MODULE_8__[\"DetectorRegistry\"].getInstance().detectForCluster(this);\n const existingMetadata = this.metadata;\n this.metadata = Object.assign(existingMetadata, metadata);\n }\n /**\n * @internal\n */\n async refreshAccessibility() {\n this.isAdmin = await this.isClusterAdmin();\n this.isGlobalWatchEnabled = await this.canUseWatchApi({ resource: \"*\" });\n this.allowedNamespaces = await this.getAllowedNamespaces();\n this.allowedResources = await this.getAllowedResources();\n this.ready = true;\n }\n /**\n * @internal\n */\n async refreshConnectionStatus() {\n const connectionStatus = await this.getConnectionStatus();\n this.online = connectionStatus > _cluster_types__WEBPACK_IMPORTED_MODULE_10__[\"ClusterStatus\"].Offline;\n this.accessible = connectionStatus == _cluster_types__WEBPACK_IMPORTED_MODULE_10__[\"ClusterStatus\"].AccessGranted;\n }\n async getKubeconfig() {\n const { config } = await Object(_kube_helpers__WEBPACK_IMPORTED_MODULE_4__[\"loadConfigFromFile\"])(this.kubeConfigPath);\n return config;\n }\n /**\n * @internal\n */\n async getProxyKubeconfig() {\n const proxyKCPath = await this.getProxyKubeconfigPath();\n const { config } = await Object(_kube_helpers__WEBPACK_IMPORTED_MODULE_4__[\"loadConfigFromFile\"])(proxyKCPath);\n return config;\n }\n /**\n * @internal\n */\n async getProxyKubeconfigPath() {\n return this.proxyKubeconfigManager.getPath();\n }\n async getConnectionStatus() {\n try {\n const versionDetector = new _main_cluster_detectors_version_detector__WEBPACK_IMPORTED_MODULE_7__[\"VersionDetector\"](this);\n const versionData = await versionDetector.detect();\n this.metadata.version = versionData.value;\n return _cluster_types__WEBPACK_IMPORTED_MODULE_10__[\"ClusterStatus\"].AccessGranted;\n }\n catch (error) {\n _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].error(`[CLUSTER]: Failed to connect to \"${this.contextName}\": ${error}`);\n if (error.statusCode) {\n if (error.statusCode >= 400 && error.statusCode < 500) {\n this.broadcastConnectUpdate(\"Invalid credentials\", true);\n return _cluster_types__WEBPACK_IMPORTED_MODULE_10__[\"ClusterStatus\"].AccessDenied;\n }\n this.broadcastConnectUpdate(error.error || error.message, true);\n return _cluster_types__WEBPACK_IMPORTED_MODULE_10__[\"ClusterStatus\"].Offline;\n }\n if (error.failed === true) {\n if (error.timedOut === true) {\n this.broadcastConnectUpdate(\"Connection timed out\", true);\n return _cluster_types__WEBPACK_IMPORTED_MODULE_10__[\"ClusterStatus\"].Offline;\n }\n this.broadcastConnectUpdate(\"Failed to fetch credentials\", true);\n return _cluster_types__WEBPACK_IMPORTED_MODULE_10__[\"ClusterStatus\"].AccessDenied;\n }\n this.broadcastConnectUpdate(error.message, true);\n return _cluster_types__WEBPACK_IMPORTED_MODULE_10__[\"ClusterStatus\"].Offline;\n }\n }\n /**\n * @internal\n * @param resourceAttributes resource attributes\n */\n async canI(resourceAttributes) {\n const authApi = (await this.getProxyKubeconfig()).makeApiClient(_kubernetes_client_node__WEBPACK_IMPORTED_MODULE_3__[\"AuthorizationV1Api\"]);\n try {\n const accessReview = await authApi.createSelfSubjectAccessReview({\n apiVersion: \"authorization.k8s.io/v1\",\n kind: \"SelfSubjectAccessReview\",\n spec: { resourceAttributes },\n });\n return accessReview.body.status.allowed;\n }\n catch (error) {\n _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].error(`failed to request selfSubjectAccessReview: ${error}`);\n return false;\n }\n }\n /**\n * @internal\n */\n async isClusterAdmin() {\n return this.canI({\n namespace: \"kube-system\",\n resource: \"*\",\n verb: \"create\",\n });\n }\n /**\n * @internal\n */\n async canUseWatchApi(customizeResource = {}) {\n return this.canI(Object.assign({ verb: \"watch\", resource: \"*\" }, customizeResource));\n }\n toJSON() {\n return Object(_utils__WEBPACK_IMPORTED_MODULE_11__[\"toJS\"])({\n id: this.id,\n contextName: this.contextName,\n kubeConfigPath: this.kubeConfigPath,\n workspace: this.workspace,\n workspaces: this.workspaces,\n preferences: this.preferences,\n metadata: this.metadata,\n accessibleNamespaces: this.accessibleNamespaces,\n labels: this.labels,\n });\n }\n /**\n * Serializable cluster-state used for sync btw main <-> renderer\n */\n getState() {\n return Object(_utils__WEBPACK_IMPORTED_MODULE_11__[\"toJS\"])({\n apiUrl: this.apiUrl,\n online: this.online,\n ready: this.ready,\n disconnected: this.disconnected,\n accessible: this.accessible,\n isAdmin: this.isAdmin,\n allowedNamespaces: this.allowedNamespaces,\n allowedResources: this.allowedResources,\n isGlobalWatchEnabled: this.isGlobalWatchEnabled,\n });\n }\n /**\n * @internal\n * @param state cluster state\n */\n setState(state) {\n Object.assign(this, state);\n }\n /**\n * @internal\n * @param state cluster state\n */\n pushState(state = this.getState()) {\n _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].silly(`[CLUSTER]: push-state`, state);\n Object(_ipc__WEBPACK_IMPORTED_MODULE_2__[\"broadcastMessage\"])(\"cluster:state\", this.id, state);\n }\n // get cluster system meta, e.g. use in \"logger\"\n getMeta() {\n return {\n id: this.id,\n name: this.contextName,\n ready: this.ready,\n online: this.online,\n accessible: this.accessible,\n disconnected: this.disconnected,\n };\n }\n /**\n * broadcast an authentication update concerning this cluster\n * @internal\n */\n broadcastConnectUpdate(message, isError = false) {\n const update = { message, isError };\n _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].debug(`[CLUSTER]: broadcasting connection update`, Object.assign(Object.assign({}, update), { meta: this.getMeta() }));\n Object(_ipc__WEBPACK_IMPORTED_MODULE_2__[\"broadcastMessage\"])(`cluster:${this.id}:connection-update`, update);\n }\n async getAllowedNamespaces() {\n if (this.accessibleNamespaces.length) {\n return this.accessibleNamespaces;\n }\n const api = (await this.getProxyKubeconfig()).makeApiClient(_kubernetes_client_node__WEBPACK_IMPORTED_MODULE_3__[\"CoreV1Api\"]);\n try {\n const { body: { items } } = await api.listNamespace();\n const namespaces = items.map(ns => ns.metadata.name);\n return namespaces;\n }\n catch (error) {\n const ctx = (await this.getProxyKubeconfig()).getContextObject(this.contextName);\n const namespaceList = [ctx.namespace].filter(Boolean);\n if (namespaceList.length === 0 && error instanceof _kubernetes_client_node__WEBPACK_IMPORTED_MODULE_3__[\"HttpError\"] && error.statusCode === 403) {\n const { response } = error;\n _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].info(\"[CLUSTER]: listing namespaces is forbidden, broadcasting\", { clusterId: this.id, error: response.body });\n Object(_ipc__WEBPACK_IMPORTED_MODULE_2__[\"broadcastMessage\"])(_ipc_cluster__WEBPACK_IMPORTED_MODULE_12__[\"clusterListNamespaceForbiddenChannel\"], this.id);\n }\n return namespaceList;\n }\n }\n async getAllowedResources() {\n try {\n if (!this.allowedNamespaces.length) {\n return [];\n }\n const resources = _rbac__WEBPACK_IMPORTED_MODULE_5__[\"apiResources\"].filter((resource) => this.resourceAccessStatuses.get(resource) === undefined);\n const apiLimit = p_limit__WEBPACK_IMPORTED_MODULE_9___default()(5); // 5 concurrent api requests\n const requests = [];\n for (const apiResource of resources) {\n requests.push(apiLimit(async () => {\n for (const namespace of this.allowedNamespaces.slice(0, 10)) {\n if (!this.resourceAccessStatuses.get(apiResource)) {\n const result = await this.canI({\n resource: apiResource.apiName,\n group: apiResource.group,\n verb: \"list\",\n namespace,\n });\n this.resourceAccessStatuses.set(apiResource, result);\n }\n }\n }));\n }\n await Promise.all(requests);\n return _rbac__WEBPACK_IMPORTED_MODULE_5__[\"apiResources\"]\n .filter((resource) => this.resourceAccessStatuses.get(resource))\n .map(apiResource => apiResource.apiName);\n }\n catch (error) {\n return [];\n }\n }\n isAllowedResource(kind) {\n if (kind in _rbac__WEBPACK_IMPORTED_MODULE_5__[\"apiResourceRecord\"]) {\n return this.allowedResources.includes(kind);\n }\n const apiResource = _rbac__WEBPACK_IMPORTED_MODULE_5__[\"apiResources\"].find(resource => resource.kind === kind);\n if (apiResource) {\n return this.allowedResources.includes(apiResource.apiName);\n }\n return true; // allowed by default for other resources\n }\n isMetricHidden(resource) {\n var _a;\n return Boolean((_a = this.preferences.hiddenMetrics) === null || _a === void 0 ? void 0 : _a.includes(resource));\n }\n get nodeShellImage() {\n var _a;\n return ((_a = this.preferences) === null || _a === void 0 ? void 0 : _a.nodeShellImage) || _cluster_types__WEBPACK_IMPORTED_MODULE_10__[\"initialNodeShellImage\"];\n }\n get imagePullSecret() {\n var _a;\n return (_a = this.preferences) === null || _a === void 0 ? void 0 : _a.imagePullSecret;\n }\n isInLocalKubeconfig() {\n return this.kubeConfigPath.startsWith(this.dependencies.directoryForKubeConfigs);\n }\n}\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", String)\n], Cluster.prototype, \"contextName\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", String)\n], Cluster.prototype, \"kubeConfigPath\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", String)\n], Cluster.prototype, \"workspace\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", Array)\n], Cluster.prototype, \"workspaces\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", String)\n], Cluster.prototype, \"apiUrl\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", Object)\n], Cluster.prototype, \"online\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", Object)\n], Cluster.prototype, \"accessible\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", Object)\n], Cluster.prototype, \"ready\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", Object)\n], Cluster.prototype, \"reconnecting\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", Object)\n], Cluster.prototype, \"disconnected\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", Object)\n], Cluster.prototype, \"isAdmin\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", Object)\n], Cluster.prototype, \"isGlobalWatchEnabled\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", Object)\n], Cluster.prototype, \"preferences\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", Object)\n], Cluster.prototype, \"metadata\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", Array)\n], Cluster.prototype, \"allowedNamespaces\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", Array)\n], Cluster.prototype, \"allowedResources\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", Array)\n], Cluster.prototype, \"accessibleNamespaces\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", Object)\n], Cluster.prototype, \"labels\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"computed\"],\n __metadata(\"design:type\", Object),\n __metadata(\"design:paramtypes\", [])\n], Cluster.prototype, \"available\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"computed\"],\n __metadata(\"design:type\", Object),\n __metadata(\"design:paramtypes\", [])\n], Cluster.prototype, \"name\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"computed\"],\n __metadata(\"design:type\", String),\n __metadata(\"design:paramtypes\", [])\n], Cluster.prototype, \"distribution\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"computed\"],\n __metadata(\"design:type\", String),\n __metadata(\"design:paramtypes\", [])\n], Cluster.prototype, \"version\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"computed\"],\n __metadata(\"design:type\", Object),\n __metadata(\"design:paramtypes\", [])\n], Cluster.prototype, \"prometheusPreferences\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"computed\"],\n __metadata(\"design:type\", String),\n __metadata(\"design:paramtypes\", [])\n], Cluster.prototype, \"defaultNamespace\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Object]),\n __metadata(\"design:returntype\", void 0)\n], Cluster.prototype, \"updateModel\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Object]),\n __metadata(\"design:returntype\", Promise)\n], Cluster.prototype, \"activate\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", []),\n __metadata(\"design:returntype\", Promise)\n], Cluster.prototype, \"reconnect\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", []),\n __metadata(\"design:returntype\", void 0)\n], Cluster.prototype, \"disconnect\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Object]),\n __metadata(\"design:returntype\", Promise)\n], Cluster.prototype, \"refresh\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", []),\n __metadata(\"design:returntype\", Promise)\n], Cluster.prototype, \"refreshMetadata\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", []),\n __metadata(\"design:returntype\", Promise)\n], Cluster.prototype, \"refreshConnectionStatus\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Object]),\n __metadata(\"design:returntype\", void 0)\n], Cluster.prototype, \"setState\", null);\n\n\n//# sourceURL=webpack:///./src/common/cluster/cluster.ts?");
|
|
38763
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Cluster\", function() { return Cluster; });\n/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! electron */ \"electron\");\n/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var mobx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! mobx */ \"./node_modules/mobx/dist/mobx.esm.js\");\n/* harmony import */ var _ipc__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../ipc */ \"./src/common/ipc/index.ts\");\n/* harmony import */ var _kubernetes_client_node__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @kubernetes/client-node */ \"./node_modules/@kubernetes/client-node/dist/index.js\");\n/* harmony import */ var _kubernetes_client_node__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_kubernetes_client_node__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _kube_helpers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../kube-helpers */ \"./src/common/kube-helpers.ts\");\n/* harmony import */ var _rbac__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../rbac */ \"./src/common/rbac.ts\");\n/* harmony import */ var _main_logger__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../main/logger */ \"./src/main/logger.ts\");\n/* harmony import */ var _main_cluster_detectors_version_detector__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../main/cluster-detectors/version-detector */ \"./src/main/cluster-detectors/version-detector.ts\");\n/* harmony import */ var _main_cluster_detectors_detector_registry__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../main/cluster-detectors/detector-registry */ \"./src/main/cluster-detectors/detector-registry.ts\");\n/* harmony import */ var p_limit__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! p-limit */ \"./node_modules/p-limit/index.js\");\n/* harmony import */ var p_limit__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(p_limit__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _cluster_types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../cluster-types */ \"./src/common/cluster-types.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../utils */ \"./src/common/utils/index.ts\");\n/* harmony import */ var _ipc_cluster__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../ipc/cluster */ \"./src/common/ipc/cluster.ts\");\n/**\n * Copyright (c) OpenLens Authors. All rights reserved.\n * Licensed under MIT License. See LICENSE in root directory for more information.\n */\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (undefined && undefined.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Cluster\n *\n * @beta\n */\nclass Cluster {\n constructor(dependencies, model) {\n Object.defineProperty(this, \"dependencies\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: dependencies\n });\n /** Unique id for a cluster */\n Object.defineProperty(this, \"id\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"kubeCtl\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n /**\n * Context handler\n *\n * @internal\n */\n Object.defineProperty(this, \"contextHandler\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"proxyKubeconfigManager\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"eventsDisposer\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: Object(_utils__WEBPACK_IMPORTED_MODULE_11__[\"disposer\"])()\n });\n Object.defineProperty(this, \"activated\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n Object.defineProperty(this, \"resourceAccessStatuses\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: new Map()\n });\n /**\n * Kubeconfig context name\n *\n * @observable\n */\n Object.defineProperty(this, \"contextName\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n /**\n * Path to kubeconfig\n *\n * @observable\n */\n Object.defineProperty(this, \"kubeConfigPath\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n /**\n * @deprecated\n */\n Object.defineProperty(this, \"workspace\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n /**\n * @deprecated\n */\n Object.defineProperty(this, \"workspaces\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n /**\n * Kubernetes API server URL\n *\n * @observable\n */\n Object.defineProperty(this, \"apiUrl\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n }); // cluster server url\n /**\n * Is cluster online\n *\n * @observable\n */\n Object.defineProperty(this, \"online\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n }); // describes if we can detect that cluster is online\n /**\n * Can user access cluster resources\n *\n * @observable\n */\n Object.defineProperty(this, \"accessible\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n }); // if user is able to access cluster resources\n /**\n * Is cluster instance in usable state\n *\n * @observable\n */\n Object.defineProperty(this, \"ready\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n }); // cluster is in usable state\n /**\n * Is cluster currently reconnecting\n *\n * @observable\n */\n Object.defineProperty(this, \"reconnecting\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n /**\n * Is cluster disconnected. False if user has selected to connect.\n *\n * @observable\n */\n Object.defineProperty(this, \"disconnected\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: true\n });\n /**\n * Does user have admin like access\n *\n * @observable\n */\n Object.defineProperty(this, \"isAdmin\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n /**\n * Global watch-api accessibility , e.g. \"/api/v1/services?watch=1\"\n *\n * @observable\n */\n Object.defineProperty(this, \"isGlobalWatchEnabled\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n /**\n * Preferences\n *\n * @observable\n */\n Object.defineProperty(this, \"preferences\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: {}\n });\n /**\n * Metadata\n *\n * @observable\n */\n Object.defineProperty(this, \"metadata\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: {}\n });\n /**\n * List of allowed namespaces verified via K8S::SelfSubjectAccessReview api\n *\n * @observable\n */\n Object.defineProperty(this, \"allowedNamespaces\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: []\n });\n /**\n * List of allowed resources\n *\n * @observable\n * @internal\n */\n Object.defineProperty(this, \"allowedResources\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: []\n });\n /**\n * List of accessible namespaces provided by user in the Cluster Settings\n *\n * @observable\n */\n Object.defineProperty(this, \"accessibleNamespaces\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: []\n });\n /**\n * Labels for the catalog entity\n */\n Object.defineProperty(this, \"labels\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: {}\n });\n Object(mobx__WEBPACK_IMPORTED_MODULE_1__[\"makeObservable\"])(this);\n this.id = model.id;\n this.updateModel(model);\n const { config } = Object(_kube_helpers__WEBPACK_IMPORTED_MODULE_4__[\"loadConfigFromFileSync\"])(this.kubeConfigPath);\n const validationError = Object(_kube_helpers__WEBPACK_IMPORTED_MODULE_4__[\"validateKubeConfig\"])(config, this.contextName);\n if (validationError) {\n throw validationError;\n }\n this.apiUrl = config.getCluster(config.getContextObject(this.contextName).cluster).server;\n if (electron__WEBPACK_IMPORTED_MODULE_0__[\"ipcMain\"]) {\n // for the time being, until renderer gets its own cluster type\n this.contextHandler = this.dependencies.createContextHandler(this);\n this.proxyKubeconfigManager = this.dependencies.createKubeconfigManager(this);\n _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].debug(`[CLUSTER]: Cluster init success`, {\n id: this.id,\n context: this.contextName,\n apiUrl: this.apiUrl,\n });\n }\n }\n get whenReady() {\n return Object(mobx__WEBPACK_IMPORTED_MODULE_1__[\"when\"])(() => this.ready);\n }\n /**\n * Is cluster available\n *\n * @computed\n */\n get available() {\n return this.accessible && !this.disconnected;\n }\n /**\n * Cluster name\n *\n * @computed\n */\n get name() {\n return this.preferences.clusterName || this.contextName;\n }\n /**\n * The detected kubernetes distribution\n */\n get distribution() {\n var _a;\n return ((_a = this.metadata[_cluster_types__WEBPACK_IMPORTED_MODULE_10__[\"ClusterMetadataKey\"].DISTRIBUTION]) === null || _a === void 0 ? void 0 : _a.toString()) || \"unknown\";\n }\n /**\n * The detected kubernetes version\n */\n get version() {\n var _a;\n return ((_a = this.metadata[_cluster_types__WEBPACK_IMPORTED_MODULE_10__[\"ClusterMetadataKey\"].VERSION]) === null || _a === void 0 ? void 0 : _a.toString()) || \"unknown\";\n }\n /**\n * Prometheus preferences\n *\n * @computed\n * @internal\n */\n get prometheusPreferences() {\n const { prometheus, prometheusProvider } = this.preferences;\n return Object(_utils__WEBPACK_IMPORTED_MODULE_11__[\"toJS\"])({ prometheus, prometheusProvider });\n }\n /**\n * defaultNamespace preference\n *\n * @computed\n * @internal\n */\n get defaultNamespace() {\n return this.preferences.defaultNamespace;\n }\n /**\n * Update cluster data model\n *\n * @param model\n */\n updateModel(model) {\n // Note: do not assign ID as that should never be updated\n this.kubeConfigPath = model.kubeConfigPath;\n if (model.workspace) {\n this.workspace = model.workspace;\n }\n if (model.workspaces) {\n this.workspaces = model.workspaces;\n }\n if (model.contextName) {\n this.contextName = model.contextName;\n }\n if (model.preferences) {\n this.preferences = model.preferences;\n }\n if (model.metadata) {\n this.metadata = model.metadata;\n }\n if (model.accessibleNamespaces) {\n this.accessibleNamespaces = model.accessibleNamespaces;\n }\n if (model.labels) {\n this.labels = model.labels;\n }\n }\n /**\n * @internal\n */\n bindEvents() {\n _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].info(`[CLUSTER]: bind events`, this.getMeta());\n const refreshTimer = setInterval(() => !this.disconnected && this.refresh(), 30000); // every 30s\n const refreshMetadataTimer = setInterval(() => !this.disconnected && this.refreshMetadata(), 900000); // every 15 minutes\n this.eventsDisposer.push(Object(mobx__WEBPACK_IMPORTED_MODULE_1__[\"reaction\"])(() => this.getState(), state => this.pushState(state)), Object(mobx__WEBPACK_IMPORTED_MODULE_1__[\"reaction\"])(() => this.prometheusPreferences, prefs => this.contextHandler.setupPrometheus(prefs), { equals: mobx__WEBPACK_IMPORTED_MODULE_1__[\"comparer\"].structural }), () => clearInterval(refreshTimer), () => clearInterval(refreshMetadataTimer), Object(mobx__WEBPACK_IMPORTED_MODULE_1__[\"reaction\"])(() => this.defaultNamespace, () => this.recreateProxyKubeconfig()));\n }\n /**\n * @internal\n */\n async recreateProxyKubeconfig() {\n _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].info(\"[CLUSTER]: Recreating proxy kubeconfig\");\n try {\n await this.proxyKubeconfigManager.clear();\n await this.getProxyKubeconfig();\n }\n catch (error) {\n _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].error(`[CLUSTER]: failed to recreate proxy kubeconfig`, error);\n }\n }\n /**\n * @param force force activation\n * @internal\n */\n async activate(force = false) {\n if (this.activated && !force) {\n return this.pushState();\n }\n _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].info(`[CLUSTER]: activate`, this.getMeta());\n if (!this.eventsDisposer.length) {\n this.bindEvents();\n }\n if (this.disconnected || !this.accessible) {\n await this.reconnect();\n }\n this.broadcastConnectUpdate(\"Refreshing connection status ...\");\n await this.refreshConnectionStatus();\n if (this.accessible) {\n this.broadcastConnectUpdate(\"Refreshing cluster accessibility ...\");\n await this.refreshAccessibility();\n // download kubectl in background, so it's not blocking dashboard\n this.ensureKubectl()\n .catch(error => _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].warn(`[CLUSTER]: failed to download kubectl for clusterId=${this.id}`, error));\n this.broadcastConnectUpdate(\"Connected, waiting for view to load ...\");\n }\n this.activated = true;\n this.pushState();\n }\n /**\n * @internal\n */\n async ensureKubectl() {\n var _a;\n (_a = this.kubeCtl) !== null && _a !== void 0 ? _a : (this.kubeCtl = this.dependencies.createKubectl(this.version));\n await this.kubeCtl.ensureKubectl();\n return this.kubeCtl;\n }\n /**\n * @internal\n */\n async reconnect() {\n var _a, _b;\n _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].info(`[CLUSTER]: reconnect`, this.getMeta());\n (_a = this.contextHandler) === null || _a === void 0 ? void 0 : _a.stopServer();\n await ((_b = this.contextHandler) === null || _b === void 0 ? void 0 : _b.ensureServer());\n this.disconnected = false;\n }\n /**\n * @internal\n */\n disconnect() {\n var _a;\n _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].info(`[CLUSTER]: disconnecting`, { id: this.id });\n this.eventsDisposer();\n (_a = this.contextHandler) === null || _a === void 0 ? void 0 : _a.stopServer();\n this.disconnected = true;\n this.online = false;\n this.accessible = false;\n this.ready = false;\n this.activated = false;\n this.allowedNamespaces = [];\n this.resourceAccessStatuses.clear();\n this.pushState();\n _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].info(`[CLUSTER]: disconnected`, { id: this.id });\n }\n /**\n * @internal\n * @param opts refresh options\n */\n async refresh(opts = {}) {\n _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].info(`[CLUSTER]: refresh`, this.getMeta());\n await this.refreshConnectionStatus();\n if (this.accessible) {\n await this.refreshAccessibility();\n if (opts.refreshMetadata) {\n this.refreshMetadata();\n }\n }\n this.pushState();\n }\n /**\n * @internal\n */\n async refreshMetadata() {\n _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].info(`[CLUSTER]: refreshMetadata`, this.getMeta());\n const metadata = await _main_cluster_detectors_detector_registry__WEBPACK_IMPORTED_MODULE_8__[\"DetectorRegistry\"].getInstance().detectForCluster(this);\n const existingMetadata = this.metadata;\n this.metadata = Object.assign(existingMetadata, metadata);\n }\n /**\n * @internal\n */\n async refreshAccessibility() {\n const proxyConfig = await this.getProxyKubeconfig();\n const canI = this.dependencies.createAuthorizationReview(proxyConfig);\n this.isAdmin = await canI({\n namespace: \"kube-system\",\n resource: \"*\",\n verb: \"create\",\n });\n this.isGlobalWatchEnabled = await canI({\n verb: \"watch\",\n resource: \"*\",\n });\n this.allowedNamespaces = await this.getAllowedNamespaces(proxyConfig);\n this.allowedResources = await this.getAllowedResources(canI);\n this.ready = true;\n }\n /**\n * @internal\n */\n async refreshConnectionStatus() {\n const connectionStatus = await this.getConnectionStatus();\n this.online = connectionStatus > _cluster_types__WEBPACK_IMPORTED_MODULE_10__[\"ClusterStatus\"].Offline;\n this.accessible = connectionStatus == _cluster_types__WEBPACK_IMPORTED_MODULE_10__[\"ClusterStatus\"].AccessGranted;\n }\n async getKubeconfig() {\n const { config } = await Object(_kube_helpers__WEBPACK_IMPORTED_MODULE_4__[\"loadConfigFromFile\"])(this.kubeConfigPath);\n return config;\n }\n /**\n * @internal\n */\n async getProxyKubeconfig() {\n const proxyKCPath = await this.getProxyKubeconfigPath();\n const { config } = await Object(_kube_helpers__WEBPACK_IMPORTED_MODULE_4__[\"loadConfigFromFile\"])(proxyKCPath);\n return config;\n }\n /**\n * @internal\n */\n async getProxyKubeconfigPath() {\n return this.proxyKubeconfigManager.getPath();\n }\n async getConnectionStatus() {\n try {\n const versionDetector = new _main_cluster_detectors_version_detector__WEBPACK_IMPORTED_MODULE_7__[\"VersionDetector\"](this);\n const versionData = await versionDetector.detect();\n this.metadata.version = versionData.value;\n return _cluster_types__WEBPACK_IMPORTED_MODULE_10__[\"ClusterStatus\"].AccessGranted;\n }\n catch (error) {\n _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].error(`[CLUSTER]: Failed to connect to \"${this.contextName}\": ${error}`);\n if (error.statusCode) {\n if (error.statusCode >= 400 && error.statusCode < 500) {\n this.broadcastConnectUpdate(\"Invalid credentials\", true);\n return _cluster_types__WEBPACK_IMPORTED_MODULE_10__[\"ClusterStatus\"].AccessDenied;\n }\n this.broadcastConnectUpdate(error.error || error.message, true);\n return _cluster_types__WEBPACK_IMPORTED_MODULE_10__[\"ClusterStatus\"].Offline;\n }\n if (error.failed === true) {\n if (error.timedOut === true) {\n this.broadcastConnectUpdate(\"Connection timed out\", true);\n return _cluster_types__WEBPACK_IMPORTED_MODULE_10__[\"ClusterStatus\"].Offline;\n }\n this.broadcastConnectUpdate(\"Failed to fetch credentials\", true);\n return _cluster_types__WEBPACK_IMPORTED_MODULE_10__[\"ClusterStatus\"].AccessDenied;\n }\n this.broadcastConnectUpdate(error.message, true);\n return _cluster_types__WEBPACK_IMPORTED_MODULE_10__[\"ClusterStatus\"].Offline;\n }\n }\n toJSON() {\n return Object(_utils__WEBPACK_IMPORTED_MODULE_11__[\"toJS\"])({\n id: this.id,\n contextName: this.contextName,\n kubeConfigPath: this.kubeConfigPath,\n workspace: this.workspace,\n workspaces: this.workspaces,\n preferences: this.preferences,\n metadata: this.metadata,\n accessibleNamespaces: this.accessibleNamespaces,\n labels: this.labels,\n });\n }\n /**\n * Serializable cluster-state used for sync btw main <-> renderer\n */\n getState() {\n return Object(_utils__WEBPACK_IMPORTED_MODULE_11__[\"toJS\"])({\n apiUrl: this.apiUrl,\n online: this.online,\n ready: this.ready,\n disconnected: this.disconnected,\n accessible: this.accessible,\n isAdmin: this.isAdmin,\n allowedNamespaces: this.allowedNamespaces,\n allowedResources: this.allowedResources,\n isGlobalWatchEnabled: this.isGlobalWatchEnabled,\n });\n }\n /**\n * @internal\n * @param state cluster state\n */\n setState(state) {\n Object.assign(this, state);\n }\n /**\n * @internal\n * @param state cluster state\n */\n pushState(state = this.getState()) {\n _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].silly(`[CLUSTER]: push-state`, state);\n Object(_ipc__WEBPACK_IMPORTED_MODULE_2__[\"broadcastMessage\"])(\"cluster:state\", this.id, state);\n }\n // get cluster system meta, e.g. use in \"logger\"\n getMeta() {\n return {\n id: this.id,\n name: this.contextName,\n ready: this.ready,\n online: this.online,\n accessible: this.accessible,\n disconnected: this.disconnected,\n };\n }\n /**\n * broadcast an authentication update concerning this cluster\n * @internal\n */\n broadcastConnectUpdate(message, isError = false) {\n const update = { message, isError };\n _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].debug(`[CLUSTER]: broadcasting connection update`, Object.assign(Object.assign({}, update), { meta: this.getMeta() }));\n Object(_ipc__WEBPACK_IMPORTED_MODULE_2__[\"broadcastMessage\"])(`cluster:${this.id}:connection-update`, update);\n }\n async getAllowedNamespaces(proxyConfig) {\n if (this.accessibleNamespaces.length) {\n return this.accessibleNamespaces;\n }\n try {\n const listNamespaces = this.dependencies.createListNamespaces(proxyConfig);\n return await listNamespaces();\n }\n catch (error) {\n const ctx = proxyConfig.getContextObject(this.contextName);\n const namespaceList = [ctx.namespace].filter(Boolean);\n if (namespaceList.length === 0 && error instanceof _kubernetes_client_node__WEBPACK_IMPORTED_MODULE_3__[\"HttpError\"] && error.statusCode === 403) {\n const { response } = error;\n _main_logger__WEBPACK_IMPORTED_MODULE_6__[\"default\"].info(\"[CLUSTER]: listing namespaces is forbidden, broadcasting\", { clusterId: this.id, error: response.body });\n Object(_ipc__WEBPACK_IMPORTED_MODULE_2__[\"broadcastMessage\"])(_ipc_cluster__WEBPACK_IMPORTED_MODULE_12__[\"clusterListNamespaceForbiddenChannel\"], this.id);\n }\n return namespaceList;\n }\n }\n async getAllowedResources(canI) {\n try {\n if (!this.allowedNamespaces.length) {\n return [];\n }\n const resources = _rbac__WEBPACK_IMPORTED_MODULE_5__[\"apiResources\"].filter((resource) => this.resourceAccessStatuses.get(resource) === undefined);\n const apiLimit = p_limit__WEBPACK_IMPORTED_MODULE_9___default()(5); // 5 concurrent api requests\n const requests = [];\n for (const apiResource of resources) {\n requests.push(apiLimit(async () => {\n for (const namespace of this.allowedNamespaces.slice(0, 10)) {\n if (!this.resourceAccessStatuses.get(apiResource)) {\n const result = await canI({\n resource: apiResource.apiName,\n group: apiResource.group,\n verb: \"list\",\n namespace,\n });\n this.resourceAccessStatuses.set(apiResource, result);\n }\n }\n }));\n }\n await Promise.all(requests);\n return _rbac__WEBPACK_IMPORTED_MODULE_5__[\"apiResources\"]\n .filter((resource) => this.resourceAccessStatuses.get(resource))\n .map(apiResource => apiResource.apiName);\n }\n catch (error) {\n return [];\n }\n }\n isAllowedResource(kind) {\n if (kind in _rbac__WEBPACK_IMPORTED_MODULE_5__[\"apiResourceRecord\"]) {\n return this.allowedResources.includes(kind);\n }\n const apiResource = _rbac__WEBPACK_IMPORTED_MODULE_5__[\"apiResources\"].find(resource => resource.kind === kind);\n if (apiResource) {\n return this.allowedResources.includes(apiResource.apiName);\n }\n return true; // allowed by default for other resources\n }\n isMetricHidden(resource) {\n var _a;\n return Boolean((_a = this.preferences.hiddenMetrics) === null || _a === void 0 ? void 0 : _a.includes(resource));\n }\n get nodeShellImage() {\n var _a;\n return ((_a = this.preferences) === null || _a === void 0 ? void 0 : _a.nodeShellImage) || _cluster_types__WEBPACK_IMPORTED_MODULE_10__[\"initialNodeShellImage\"];\n }\n get imagePullSecret() {\n var _a;\n return (_a = this.preferences) === null || _a === void 0 ? void 0 : _a.imagePullSecret;\n }\n isInLocalKubeconfig() {\n return this.kubeConfigPath.startsWith(this.dependencies.directoryForKubeConfigs);\n }\n}\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", String)\n], Cluster.prototype, \"contextName\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", String)\n], Cluster.prototype, \"kubeConfigPath\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", String)\n], Cluster.prototype, \"workspace\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", Array)\n], Cluster.prototype, \"workspaces\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", String)\n], Cluster.prototype, \"apiUrl\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", Object)\n], Cluster.prototype, \"online\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", Object)\n], Cluster.prototype, \"accessible\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", Object)\n], Cluster.prototype, \"ready\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", Object)\n], Cluster.prototype, \"reconnecting\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", Object)\n], Cluster.prototype, \"disconnected\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", Object)\n], Cluster.prototype, \"isAdmin\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", Object)\n], Cluster.prototype, \"isGlobalWatchEnabled\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", Object)\n], Cluster.prototype, \"preferences\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", Object)\n], Cluster.prototype, \"metadata\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", Array)\n], Cluster.prototype, \"allowedNamespaces\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", Array)\n], Cluster.prototype, \"allowedResources\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", Array)\n], Cluster.prototype, \"accessibleNamespaces\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"observable\"],\n __metadata(\"design:type\", Object)\n], Cluster.prototype, \"labels\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"computed\"],\n __metadata(\"design:type\", Object),\n __metadata(\"design:paramtypes\", [])\n], Cluster.prototype, \"available\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"computed\"],\n __metadata(\"design:type\", Object),\n __metadata(\"design:paramtypes\", [])\n], Cluster.prototype, \"name\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"computed\"],\n __metadata(\"design:type\", String),\n __metadata(\"design:paramtypes\", [])\n], Cluster.prototype, \"distribution\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"computed\"],\n __metadata(\"design:type\", String),\n __metadata(\"design:paramtypes\", [])\n], Cluster.prototype, \"version\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"computed\"],\n __metadata(\"design:type\", Object),\n __metadata(\"design:paramtypes\", [])\n], Cluster.prototype, \"prometheusPreferences\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"computed\"],\n __metadata(\"design:type\", String),\n __metadata(\"design:paramtypes\", [])\n], Cluster.prototype, \"defaultNamespace\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Object]),\n __metadata(\"design:returntype\", void 0)\n], Cluster.prototype, \"updateModel\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Object]),\n __metadata(\"design:returntype\", Promise)\n], Cluster.prototype, \"activate\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", []),\n __metadata(\"design:returntype\", Promise)\n], Cluster.prototype, \"reconnect\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", []),\n __metadata(\"design:returntype\", void 0)\n], Cluster.prototype, \"disconnect\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Object]),\n __metadata(\"design:returntype\", Promise)\n], Cluster.prototype, \"refresh\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", []),\n __metadata(\"design:returntype\", Promise)\n], Cluster.prototype, \"refreshMetadata\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", []),\n __metadata(\"design:returntype\", Promise)\n], Cluster.prototype, \"refreshConnectionStatus\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_1__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Object]),\n __metadata(\"design:returntype\", void 0)\n], Cluster.prototype, \"setState\", null);\n\n\n//# sourceURL=webpack:///./src/common/cluster/cluster.ts?");
|
|
38764
38764
|
|
|
38765
38765
|
/***/ }),
|
|
38766
38766
|
|
|
@@ -38976,7 +38976,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
|
|
|
38976
38976
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
38977
38977
|
|
|
38978
38978
|
"use strict";
|
|
38979
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ItemStore\", function() { return ItemStore; });\n/* harmony import */ var lodash_orderBy__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash/orderBy */ \"./node_modules/lodash/orderBy.js\");\n/* harmony import */ var lodash_orderBy__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_orderBy__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ \"./src/common/utils/index.ts\");\n/* harmony import */ var mobx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! mobx */ \"./node_modules/mobx/dist/mobx.esm.js\");\n/**\n * Copyright (c) OpenLens Authors. All rights reserved.\n * Licensed under MIT License. See LICENSE in root directory for more information.\n */\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (undefined && undefined.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n\n\n\nclass ItemStore {\n constructor() {\n Object.defineProperty(this, \"defaultSorting\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: (item) => item.getName()\n });\n Object.defineProperty(this, \"failedLoading\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n Object.defineProperty(this, \"isLoading\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n Object.defineProperty(this, \"isLoaded\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n Object.defineProperty(this, \"items\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: mobx__WEBPACK_IMPORTED_MODULE_2__[\"observable\"].array([], { deep: false })\n });\n Object.defineProperty(this, \"selectedItemsIds\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: mobx__WEBPACK_IMPORTED_MODULE_2__[\"observable\"].map()\n });\n Object(mobx__WEBPACK_IMPORTED_MODULE_2__[\"makeObservable\"])(this);\n Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"autoBind\"])(this);\n }\n get selectedItems() {\n return this.items.filter(item => this.selectedItemsIds.get(item.getId()));\n }\n getItems() {\n return Array.from(this.items);\n }\n getTotalCount() {\n return this.items.length;\n }\n getByName(name) {\n return this.items.find(item => item.getName() === name);\n }\n getIndexById(id) {\n return this.items.findIndex(item => item.getId() === id);\n }\n /**\n * Return `items` sorted by the given ordering functions. If two elements of\n * `items` are sorted to the same \"index\" then the next sorting function is used\n * to determine where to place them relative to each other. Once the `sorting`\n * functions have been all exhausted then the order is unchanged (ie a stable sort).\n * @param items the items to be sorted (default: the current items in this store)\n * @param sorting list of functions to determine sort order (default: sorting by name)\n * @param order whether to sort from least to greatest (`\"asc\"` (default)) or vice-versa (`\"desc\"`)\n */\n sortItems(items = this.items, sorting = [this.defaultSorting], order) {\n return lodash_orderBy__WEBPACK_IMPORTED_MODULE_0___default()(items, sorting, order);\n }\n async createItem(request) {\n const newItem = await request();\n const item = this.items.find(item => item.getId() === newItem.getId());\n if (item) {\n return item;\n }\n else {\n const items = this.sortItems([...this.items, newItem]);\n this.items.replace(items);\n return newItem;\n }\n }\n /**\n * Load items to this.items\n * @param request Function to return the items to be loaded.\n * @param sortItems If true, items will be sorted.\n * @param concurrency If true, concurrent loadItems() calls will all be executed. If false, only the first.\n * @returns\n */\n async loadItems(request, sortItems = true, concurrency = false) {\n if (this.isLoading) {\n await Object(mobx__WEBPACK_IMPORTED_MODULE_2__[\"when\"])(() => !this.isLoading);\n // If concurrency for loading is disabled, return instead of loading\n if (!concurrency) {\n return;\n }\n }\n this.isLoading = true;\n try {\n let items = await request();\n if (sortItems)\n items = this.sortItems(items);\n this.items.replace(items);\n this.isLoaded = true;\n }\n finally {\n this.isLoading = false;\n }\n }\n async loadItem(request, sortItems = true) {\n const item = await Promise.resolve(request()).catch(() => null);\n if (item) {\n const existingItem = this.items.find(el => el.getId() === item.getId());\n if (existingItem) {\n const index = this.items.findIndex(item => item === existingItem);\n this.items.splice(index, 1, item);\n }\n else {\n let items = [...this.items, item];\n if (sortItems)\n items = this.sortItems(items);\n this.items.replace(items);\n }\n return item;\n }\n }\n async updateItem(item, request) {\n const updatedItem = await request();\n const index = this.items.findIndex(i => i.getId() === item.getId());\n this.items.splice(index, 1, updatedItem);\n return updatedItem;\n }\n async removeItem(item, request) {\n await request();\n this.items.remove(item);\n this.selectedItemsIds.delete(item.getId());\n }\n isSelected(item) {\n return !!this.selectedItemsIds.get(item.getId());\n }\n select(item) {\n this.selectedItemsIds.set(item.getId(), true);\n }\n unselect(item) {\n this.selectedItemsIds.delete(item.getId());\n }\n toggleSelection(item) {\n if (this.isSelected(item)) {\n this.unselect(item);\n }\n else {\n this.select(item);\n }\n }\n toggleSelectionAll(visibleItems = this.items) {\n const allSelected = visibleItems.every(this.isSelected);\n if (allSelected) {\n visibleItems.forEach(this.unselect);\n }\n else {\n visibleItems.forEach(this.select);\n }\n }\n isSelectedAll(visibleItems = this.items) {\n if (!visibleItems.length)\n return false;\n return visibleItems.every(this.isSelected);\n }\n resetSelection() {\n this.selectedItemsIds.clear();\n }\n reset() {\n this.resetSelection();\n this.items.clear();\n this.selectedItemsIds.clear();\n this.isLoaded = false;\n this.isLoading = false;\n }\n *[Symbol.iterator]() {\n yield* this.items;\n }\n}\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"observable\"],\n __metadata(\"design:type\", Object)\n], ItemStore.prototype, \"failedLoading\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"observable\"],\n __metadata(\"design:type\", Object)\n], ItemStore.prototype, \"isLoading\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"observable\"],\n __metadata(\"design:type\", Object)\n], ItemStore.prototype, \"isLoaded\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"observable\"],\n __metadata(\"design:type\", Object)\n], ItemStore.prototype, \"items\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"observable\"],\n __metadata(\"design:type\", Object)\n], ItemStore.prototype, \"selectedItemsIds\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"computed\"],\n __metadata(\"design:type\", Array),\n __metadata(\"design:paramtypes\", [])\n], ItemStore.prototype, \"selectedItems\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Array, Array, String]),\n __metadata(\"design:returntype\", Array)\n], ItemStore.prototype, \"sortItems\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Function]),\n __metadata(\"design:returntype\", Promise)\n], ItemStore.prototype, \"createItem\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Function, Object, Object]),\n __metadata(\"design:returntype\", Promise)\n], ItemStore.prototype, \"loadItems\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Function, Object]),\n __metadata(\"design:returntype\", Promise)\n], ItemStore.prototype, \"loadItem\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Object, Function]),\n __metadata(\"design:returntype\", Promise)\n], ItemStore.prototype, \"updateItem\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Object, Function]),\n __metadata(\"design:returntype\", Promise)\n], ItemStore.prototype, \"removeItem\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Object]),\n __metadata(\"design:returntype\", void 0)\n], ItemStore.prototype, \"select\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Object]),\n __metadata(\"design:returntype\", void 0)\n], ItemStore.prototype, \"unselect\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Object]),\n __metadata(\"design:returntype\", void 0)\n], ItemStore.prototype, \"toggleSelection\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Array]),\n __metadata(\"design:returntype\", void 0)\n], ItemStore.prototype, \"toggleSelectionAll\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", []),\n __metadata(\"design:returntype\", void 0)\n], ItemStore.prototype, \"resetSelection\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", []),\n __metadata(\"design:returntype\", void 0)\n], ItemStore.prototype, \"reset\", null);\n\n\n//# sourceURL=webpack:///./src/common/item.store.ts?");
|
|
38979
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ItemStore\", function() { return ItemStore; });\n/* harmony import */ var lodash_orderBy__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash/orderBy */ \"./node_modules/lodash/orderBy.js\");\n/* harmony import */ var lodash_orderBy__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_orderBy__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ \"./src/common/utils/index.ts\");\n/* harmony import */ var mobx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! mobx */ \"./node_modules/mobx/dist/mobx.esm.js\");\n/**\n * Copyright (c) OpenLens Authors. All rights reserved.\n * Licensed under MIT License. See LICENSE in root directory for more information.\n */\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (undefined && undefined.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n\n\n\nclass ItemStore {\n constructor() {\n Object.defineProperty(this, \"defaultSorting\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: (item) => item.getName()\n });\n Object.defineProperty(this, \"failedLoading\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n Object.defineProperty(this, \"isLoading\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n Object.defineProperty(this, \"isLoaded\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: false\n });\n Object.defineProperty(this, \"items\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: mobx__WEBPACK_IMPORTED_MODULE_2__[\"observable\"].array([], { deep: false })\n });\n Object.defineProperty(this, \"selectedItemsIds\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: mobx__WEBPACK_IMPORTED_MODULE_2__[\"observable\"].set()\n });\n Object(mobx__WEBPACK_IMPORTED_MODULE_2__[\"makeObservable\"])(this);\n Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"autoBind\"])(this);\n }\n get selectedItems() {\n return this.pickOnlySelected(this.items);\n }\n pickOnlySelected(items) {\n return items.filter(item => this.selectedItemsIds.has(item.getId()));\n }\n getItems() {\n return Array.from(this.items);\n }\n getTotalCount() {\n return this.items.length;\n }\n getByName(name) {\n return this.items.find(item => item.getName() === name);\n }\n getIndexById(id) {\n return this.items.findIndex(item => item.getId() === id);\n }\n /**\n * Return `items` sorted by the given ordering functions. If two elements of\n * `items` are sorted to the same \"index\" then the next sorting function is used\n * to determine where to place them relative to each other. Once the `sorting`\n * functions have been all exhausted then the order is unchanged (ie a stable sort).\n * @param items the items to be sorted (default: the current items in this store)\n * @param sorting list of functions to determine sort order (default: sorting by name)\n * @param order whether to sort from least to greatest (`\"asc\"` (default)) or vice-versa (`\"desc\"`)\n */\n sortItems(items = this.items, sorting = [this.defaultSorting], order) {\n return lodash_orderBy__WEBPACK_IMPORTED_MODULE_0___default()(items, sorting, order);\n }\n async createItem(request) {\n const newItem = await request();\n const item = this.items.find(item => item.getId() === newItem.getId());\n if (item) {\n return item;\n }\n else {\n const items = this.sortItems([...this.items, newItem]);\n this.items.replace(items);\n return newItem;\n }\n }\n /**\n * Load items to this.items\n * @param request Function to return the items to be loaded.\n * @param sortItems If true, items will be sorted.\n * @param concurrency If true, concurrent loadItems() calls will all be executed. If false, only the first.\n * @returns\n */\n async loadItems(request, sortItems = true, concurrency = false) {\n if (this.isLoading) {\n await Object(mobx__WEBPACK_IMPORTED_MODULE_2__[\"when\"])(() => !this.isLoading);\n // If concurrency for loading is disabled, return instead of loading\n if (!concurrency) {\n return;\n }\n }\n this.isLoading = true;\n try {\n let items = await request();\n if (sortItems)\n items = this.sortItems(items);\n this.items.replace(items);\n this.isLoaded = true;\n }\n finally {\n this.isLoading = false;\n }\n }\n async loadItem(request, sortItems = true) {\n const item = await Promise.resolve(request()).catch(() => null);\n if (item) {\n const existingItem = this.items.find(el => el.getId() === item.getId());\n if (existingItem) {\n const index = this.items.findIndex(item => item === existingItem);\n this.items.splice(index, 1, item);\n }\n else {\n let items = [...this.items, item];\n if (sortItems)\n items = this.sortItems(items);\n this.items.replace(items);\n }\n return item;\n }\n }\n async updateItem(item, request) {\n const updatedItem = await request();\n const index = this.items.findIndex(i => i.getId() === item.getId());\n this.items.splice(index, 1, updatedItem);\n return updatedItem;\n }\n async removeItem(item, request) {\n await request();\n this.items.remove(item);\n this.selectedItemsIds.delete(item.getId());\n }\n isSelected(item) {\n return this.selectedItemsIds.has(item.getId());\n }\n select(item) {\n this.selectedItemsIds.add(item.getId());\n }\n unselect(item) {\n this.selectedItemsIds.delete(item.getId());\n }\n toggleSelection(item) {\n if (this.isSelected(item)) {\n this.unselect(item);\n }\n else {\n this.select(item);\n }\n }\n toggleSelectionAll(visibleItems = this.items) {\n const allSelected = visibleItems.every(this.isSelected);\n if (allSelected) {\n visibleItems.forEach(this.unselect);\n }\n else {\n visibleItems.forEach(this.select);\n }\n }\n isSelectedAll(visibleItems = this.items) {\n if (!visibleItems.length)\n return false;\n return visibleItems.every(this.isSelected);\n }\n resetSelection() {\n this.selectedItemsIds.clear();\n }\n reset() {\n this.resetSelection();\n this.items.clear();\n this.selectedItemsIds.clear();\n this.isLoaded = false;\n this.isLoading = false;\n }\n *[Symbol.iterator]() {\n yield* this.items;\n }\n}\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"observable\"],\n __metadata(\"design:type\", Object)\n], ItemStore.prototype, \"failedLoading\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"observable\"],\n __metadata(\"design:type\", Object)\n], ItemStore.prototype, \"isLoading\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"observable\"],\n __metadata(\"design:type\", Object)\n], ItemStore.prototype, \"isLoaded\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"observable\"],\n __metadata(\"design:type\", Object)\n], ItemStore.prototype, \"items\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"observable\"],\n __metadata(\"design:type\", Object)\n], ItemStore.prototype, \"selectedItemsIds\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"computed\"],\n __metadata(\"design:type\", Array),\n __metadata(\"design:paramtypes\", [])\n], ItemStore.prototype, \"selectedItems\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Array, Array, String]),\n __metadata(\"design:returntype\", Array)\n], ItemStore.prototype, \"sortItems\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Function]),\n __metadata(\"design:returntype\", Promise)\n], ItemStore.prototype, \"createItem\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Function, Object, Object]),\n __metadata(\"design:returntype\", Promise)\n], ItemStore.prototype, \"loadItems\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Function, Object]),\n __metadata(\"design:returntype\", Promise)\n], ItemStore.prototype, \"loadItem\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Object, Function]),\n __metadata(\"design:returntype\", Promise)\n], ItemStore.prototype, \"updateItem\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Object, Function]),\n __metadata(\"design:returntype\", Promise)\n], ItemStore.prototype, \"removeItem\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Object]),\n __metadata(\"design:returntype\", void 0)\n], ItemStore.prototype, \"select\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Object]),\n __metadata(\"design:returntype\", void 0)\n], ItemStore.prototype, \"unselect\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Object]),\n __metadata(\"design:returntype\", void 0)\n], ItemStore.prototype, \"toggleSelection\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Array]),\n __metadata(\"design:returntype\", void 0)\n], ItemStore.prototype, \"toggleSelectionAll\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", []),\n __metadata(\"design:returntype\", void 0)\n], ItemStore.prototype, \"resetSelection\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", []),\n __metadata(\"design:returntype\", void 0)\n], ItemStore.prototype, \"reset\", null);\n\n\n//# sourceURL=webpack:///./src/common/item.store.ts?");
|
|
38980
38980
|
|
|
38981
38981
|
/***/ }),
|
|
38982
38982
|
|
|
@@ -39516,7 +39516,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
|
|
|
39516
39516
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
39517
39517
|
|
|
39518
39518
|
"use strict";
|
|
39519
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"KubeObjectStore\", function() { return KubeObjectStore; });\n/* harmony import */ var mobx__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! mobx */ \"./node_modules/mobx/dist/mobx.esm.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils */ \"./src/common/utils/index.ts\");\n/* harmony import */ var _kube_object__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./kube-object */ \"./src/common/k8s-api/kube-object.ts\");\n/* harmony import */ var _item_store__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../item.store */ \"./src/common/item.store.ts\");\n/* harmony import */ var _kube_api__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./kube-api */ \"./src/common/k8s-api/kube-api.ts\");\n/* harmony import */ var _kube_api_parse__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./kube-api-parse */ \"./src/common/k8s-api/kube-api-parse.ts\");\n/* harmony import */ var abort_controller__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! abort-controller */ \"./node_modules/abort-controller/browser.js\");\n/* harmony import */ var abort_controller__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(abort_controller__WEBPACK_IMPORTED_MODULE_6__);\n/**\n * Copyright (c) OpenLens Authors. All rights reserved.\n * Licensed under MIT License. See LICENSE in root directory for more information.\n */\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (undefined && undefined.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar __rest = (undefined && undefined.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\n\n\n\n\n\n\n// BUG: https://github.com/mysticatea/abort-controller/pull/22\n// eslint-disable-next-line import/no-named-as-default\n\nclass KubeObjectStore extends _item_store__WEBPACK_IMPORTED_MODULE_3__[\"ItemStore\"] {\n constructor(api) {\n super();\n Object.defineProperty(this, \"api\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"limit\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"bufferSize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 50000\n });\n Object.defineProperty(this, \"loadedNamespaces\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"create\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: async (params, data) => {\n const newItem = await this.createItem(params, data);\n const items = this.sortItems([...this.items, newItem]);\n this.items.replace(items);\n return newItem;\n }\n });\n // collect items from watch-api events to avoid UI blowing up with huge streams of data\n Object.defineProperty(this, \"eventsBuffer\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: mobx__WEBPACK_IMPORTED_MODULE_0__[\"observable\"].array([], { deep: false })\n });\n if (api)\n this.api = api;\n Object(mobx__WEBPACK_IMPORTED_MODULE_0__[\"makeObservable\"])(this);\n Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"autoBind\"])(this);\n this.bindWatchEventsUpdater();\n }\n get contextReady() {\n return Object(mobx__WEBPACK_IMPORTED_MODULE_0__[\"when\"])(() => Boolean(this.context));\n }\n get namespacesReady() {\n return Object(mobx__WEBPACK_IMPORTED_MODULE_0__[\"when\"])(() => Boolean(this.loadedNamespaces));\n }\n get context() {\n return KubeObjectStore.defaultContext.get();\n }\n // TODO: Circular dependency: KubeObjectStore -> ClusterFrameContext -> NamespaceStore -> KubeObjectStore\n get contextItems() {\n var _a, _b;\n const namespaces = (_b = (_a = this.context) === null || _a === void 0 ? void 0 : _a.contextNamespaces) !== null && _b !== void 0 ? _b : [];\n return this.items.filter(item => {\n const itemNamespace = item.getNs();\n return !itemNamespace /* cluster-wide */ || namespaces.includes(itemNamespace);\n });\n }\n getTotalCount() {\n return this.contextItems.length;\n }\n get query() {\n const { limit } = this;\n if (!limit) {\n return {};\n }\n return { limit };\n }\n getAllByNs(namespace, strict = false) {\n const namespaces = [].concat(namespace);\n if (namespaces.length) {\n return this.items.filter(item => namespaces.includes(item.getNs()));\n }\n if (!strict) {\n return this.items;\n }\n return [];\n }\n getById(id) {\n return this.items.find(item => item.getId() === id);\n }\n getByName(name, namespace) {\n return this.items.find(item => {\n return item.getName() === name && (namespace ? item.getNs() === namespace : true);\n });\n }\n getByPath(path) {\n return this.items.find(item => item.selfLink === path);\n }\n getByLabel(labels) {\n if (Array.isArray(labels)) {\n return this.items.filter((item) => {\n const itemLabels = item.getLabels();\n return labels.every(label => itemLabels.includes(label));\n });\n }\n else {\n return this.items.filter((item) => {\n const itemLabels = item.metadata.labels || {};\n return Object.entries(labels)\n .every(([key, value]) => itemLabels[key] === value);\n });\n }\n }\n async loadItems({ namespaces, reqInit, onLoadFailure }) {\n var _a, _b;\n if (!((_a = this.context) === null || _a === void 0 ? void 0 : _a.cluster.isAllowedResource(this.api.kind))) {\n return [];\n }\n const isLoadingAll = ((_b = this.context.allNamespaces) === null || _b === void 0 ? void 0 : _b.length) > 1\n && this.context.cluster.accessibleNamespaces.length === 0\n && this.context.allNamespaces.every(ns => namespaces.includes(ns));\n if (!this.api.isNamespaced || isLoadingAll) {\n if (this.api.isNamespaced) {\n this.loadedNamespaces = [];\n }\n const res = this.api.list({ reqInit }, this.query);\n if (onLoadFailure) {\n try {\n return await res;\n }\n catch (error) {\n onLoadFailure((error === null || error === void 0 ? void 0 : error.message) || (error === null || error === void 0 ? void 0 : error.toString()) || \"Unknown error\");\n // reset the store because we are loading all, so that nothing is displayed\n this.items.clear();\n this.selectedItemsIds.clear();\n return [];\n }\n }\n return res;\n }\n this.loadedNamespaces = namespaces;\n const results = await Promise.allSettled(namespaces.map(namespace => this.api.list({ namespace, reqInit }, this.query)));\n const res = [];\n for (const result of results) {\n switch (result.status) {\n case \"fulfilled\":\n res.push(...result.value);\n break;\n case \"rejected\":\n if (onLoadFailure) {\n onLoadFailure(result.reason.message || result.reason);\n }\n else {\n // if onLoadFailure is not provided then preserve old behaviour\n throw result.reason;\n }\n }\n }\n return res;\n }\n filterItemsOnLoad(items) {\n return items;\n }\n async loadAll({ namespaces, merge = true, reqInit, onLoadFailure } = {}) {\n await this.contextReady;\n namespaces !== null && namespaces !== void 0 ? namespaces : (namespaces = this.context.contextNamespaces);\n this.isLoading = true;\n try {\n const items = await this.loadItems({ namespaces, reqInit, onLoadFailure });\n this.mergeItems(items, { merge });\n this.isLoaded = true;\n this.failedLoading = false;\n return items;\n }\n catch (error) {\n console.warn(\"[KubeObjectStore] loadAll failed\", this.api.apiBase, error);\n this.resetOnError(error);\n this.failedLoading = true;\n }\n finally {\n this.isLoading = false;\n }\n }\n async reloadAll(opts = {}) {\n const { force = false } = opts, loadingOptions = __rest(opts, [\"force\"]);\n if (this.isLoading || (this.isLoaded && !force)) {\n return;\n }\n return this.loadAll(loadingOptions);\n }\n mergeItems(partialItems, { merge = true, updateStore = true, sort = true, filter = true } = {}) {\n let items = partialItems;\n // update existing items\n if (merge) {\n const namespaces = partialItems.map(item => item.getNs());\n items = [\n ...this.items.filter(existingItem => !namespaces.includes(existingItem.getNs())),\n ...partialItems,\n ];\n }\n if (filter)\n items = this.filterItemsOnLoad(items);\n if (sort)\n items = this.sortItems(items);\n if (updateStore)\n this.items.replace(items);\n return items;\n }\n resetOnError(error) {\n if (error)\n this.reset();\n }\n async loadItem(params) {\n return this.api.get(params);\n }\n async load(params) {\n const { name, namespace } = params;\n let item = this.getByName(name, namespace);\n if (!item) {\n item = await this.loadItem(params);\n const newItems = this.sortItems([...this.items, item]);\n this.items.replace(newItems);\n }\n return item;\n }\n async loadFromPath(resourcePath) {\n const { namespace, name } = Object(_kube_api_parse__WEBPACK_IMPORTED_MODULE_5__[\"parseKubeApi\"])(resourcePath);\n return this.load({ name, namespace });\n }\n async createItem(params, data) {\n return this.api.create(params, data);\n }\n postUpdate(rawItem) {\n const newItem = new this.api.objectConstructor(rawItem);\n const index = this.items.findIndex(item => item.getId() === newItem.getId());\n Object(_kube_api__WEBPACK_IMPORTED_MODULE_4__[\"ensureObjectSelfLink\"])(this.api, newItem);\n if (index < 0) {\n this.items.push(newItem);\n }\n else {\n this.items[index] = newItem;\n }\n return newItem;\n }\n async patch(item, patch) {\n return this.postUpdate(await this.api.patch({\n name: item.getName(), namespace: item.getNs(),\n }, patch, \"json\"));\n }\n async update(item, data) {\n return this.postUpdate(await this.api.update({\n name: item.getName(),\n namespace: item.getNs(),\n }, data));\n }\n async remove(item) {\n await this.api.delete({ name: item.getName(), namespace: item.getNs() });\n this.selectedItemsIds.delete(item.getId());\n }\n async removeSelectedItems() {\n return Promise.all(this.selectedItems.map(this.remove));\n }\n bindWatchEventsUpdater(delay = 1000) {\n Object(mobx__WEBPACK_IMPORTED_MODULE_0__[\"reaction\"])(() => this.eventsBuffer.length, this.updateFromEventsBuffer, {\n delay,\n });\n }\n subscribe({ onLoadFailure, abortController = new abort_controller__WEBPACK_IMPORTED_MODULE_6___default.a() } = {}) {\n if (this.api.isNamespaced) {\n Promise.race([Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"rejectPromiseBy\"])(abortController.signal), Promise.all([this.contextReady, this.namespacesReady])])\n .then(() => {\n if (this.context.cluster.isGlobalWatchEnabled && this.loadedNamespaces.length === 0) {\n return this.watchNamespace(\"\", abortController, { onLoadFailure });\n }\n for (const namespace of this.loadedNamespaces) {\n this.watchNamespace(namespace, abortController, { onLoadFailure });\n }\n })\n .catch(_utils__WEBPACK_IMPORTED_MODULE_1__[\"noop\"]); // ignore DOMExceptions\n }\n else {\n this.watchNamespace(\"\", abortController, { onLoadFailure });\n }\n return () => abortController.abort();\n }\n watchNamespace(namespace, abortController, opts) {\n if (!this.api.getResourceVersion(namespace)) {\n return;\n }\n let timedRetry;\n const watch = () => this.api.watch({\n namespace,\n abortController,\n callback,\n });\n const { signal } = abortController;\n const callback = (data, error) => {\n if (!this.isLoaded || (error === null || error === void 0 ? void 0 : error.type) === \"aborted\")\n return;\n if (error instanceof Response) {\n if (error.status === 404 || error.status === 401) {\n // api has gone, or credentials are not permitted, let's not retry\n return;\n }\n // not sure what to do, best to retry\n clearTimeout(timedRetry);\n timedRetry = setTimeout(watch, 5000);\n }\n else if (error instanceof _kube_object__WEBPACK_IMPORTED_MODULE_2__[\"KubeStatus\"] && error.code === 410) {\n clearTimeout(timedRetry);\n // resourceVersion has gone, let's try to reload\n timedRetry = setTimeout(() => {\n (namespace\n ? this.loadAll(Object.assign({ namespaces: [namespace], reqInit: { signal } }, opts))\n : this.loadAll(Object.assign({ merge: false, reqInit: { signal } }, opts))).then(watch);\n }, 1000);\n }\n else if (error) { // not sure what to do, best to retry\n clearTimeout(timedRetry);\n timedRetry = setTimeout(watch, 5000);\n }\n if (data) {\n this.eventsBuffer.push(data);\n }\n };\n signal.addEventListener(\"abort\", () => clearTimeout(timedRetry));\n watch();\n }\n updateFromEventsBuffer() {\n const items = this.getItems();\n for (const { type, object } of this.eventsBuffer.clear()) {\n const index = items.findIndex(item => { var _a; return item.getId() === ((_a = object.metadata) === null || _a === void 0 ? void 0 : _a.uid); });\n const item = items[index];\n switch (type) {\n case \"ADDED\":\n // falls through\n case \"MODIFIED\": {\n const newItem = new this.api.objectConstructor(object);\n if (!item) {\n items.push(newItem);\n }\n else {\n items[index] = newItem;\n }\n break;\n }\n case \"DELETED\":\n if (item) {\n items.splice(index, 1);\n }\n break;\n }\n }\n // update items\n this.items.replace(this.sortItems(items.slice(-this.bufferSize)));\n }\n}\nObject.defineProperty(KubeObjectStore, \"defaultContext\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: mobx__WEBPACK_IMPORTED_MODULE_0__[\"observable\"].box()\n}); // TODO: support multiple cluster contexts\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_0__[\"observable\"],\n __metadata(\"design:type\", Array)\n], KubeObjectStore.prototype, \"loadedNamespaces\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_0__[\"computed\"],\n __metadata(\"design:type\", Array),\n __metadata(\"design:paramtypes\", [])\n], KubeObjectStore.prototype, \"contextItems\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_0__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Object]),\n __metadata(\"design:returntype\", Promise)\n], KubeObjectStore.prototype, \"loadAll\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_0__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Object]),\n __metadata(\"design:returntype\", Promise)\n], KubeObjectStore.prototype, \"reloadAll\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_0__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Array, Object]),\n __metadata(\"design:returntype\", Array)\n], KubeObjectStore.prototype, \"mergeItems\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_0__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Object]),\n __metadata(\"design:returntype\", Promise)\n], KubeObjectStore.prototype, \"load\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_0__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [String]),\n __metadata(\"design:returntype\", Promise)\n], KubeObjectStore.prototype, \"loadFromPath\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_0__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", []),\n __metadata(\"design:returntype\", void 0)\n], KubeObjectStore.prototype, \"updateFromEventsBuffer\", null);\n\n\n//# sourceURL=webpack:///./src/common/k8s-api/kube-object.store.ts?");
|
|
39519
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"KubeObjectStore\", function() { return KubeObjectStore; });\n/* harmony import */ var mobx__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! mobx */ \"./node_modules/mobx/dist/mobx.esm.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils */ \"./src/common/utils/index.ts\");\n/* harmony import */ var _kube_object__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./kube-object */ \"./src/common/k8s-api/kube-object.ts\");\n/* harmony import */ var _item_store__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../item.store */ \"./src/common/item.store.ts\");\n/* harmony import */ var _kube_api__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./kube-api */ \"./src/common/k8s-api/kube-api.ts\");\n/* harmony import */ var _kube_api_parse__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./kube-api-parse */ \"./src/common/k8s-api/kube-api-parse.ts\");\n/* harmony import */ var abort_controller__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! abort-controller */ \"./node_modules/abort-controller/browser.js\");\n/* harmony import */ var abort_controller__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(abort_controller__WEBPACK_IMPORTED_MODULE_6__);\n/**\n * Copyright (c) OpenLens Authors. All rights reserved.\n * Licensed under MIT License. See LICENSE in root directory for more information.\n */\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (undefined && undefined.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar __rest = (undefined && undefined.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\n\n\n\n\n\n\n// BUG: https://github.com/mysticatea/abort-controller/pull/22\n// eslint-disable-next-line import/no-named-as-default\n\nclass KubeObjectStore extends _item_store__WEBPACK_IMPORTED_MODULE_3__[\"ItemStore\"] {\n constructor(api) {\n super();\n Object.defineProperty(this, \"api\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"limit\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"bufferSize\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: 50000\n });\n Object.defineProperty(this, \"loadedNamespaces\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: void 0\n });\n Object.defineProperty(this, \"create\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: async (params, data) => {\n const newItem = await this.createItem(params, data);\n const items = this.sortItems([...this.items, newItem]);\n this.items.replace(items);\n return newItem;\n }\n });\n // collect items from watch-api events to avoid UI blowing up with huge streams of data\n Object.defineProperty(this, \"eventsBuffer\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: mobx__WEBPACK_IMPORTED_MODULE_0__[\"observable\"].array([], { deep: false })\n });\n if (api)\n this.api = api;\n Object(mobx__WEBPACK_IMPORTED_MODULE_0__[\"makeObservable\"])(this);\n Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"autoBind\"])(this);\n this.bindWatchEventsUpdater();\n }\n get contextReady() {\n return Object(mobx__WEBPACK_IMPORTED_MODULE_0__[\"when\"])(() => Boolean(this.context));\n }\n get namespacesReady() {\n return Object(mobx__WEBPACK_IMPORTED_MODULE_0__[\"when\"])(() => Boolean(this.loadedNamespaces));\n }\n get context() {\n return KubeObjectStore.defaultContext.get();\n }\n // TODO: Circular dependency: KubeObjectStore -> ClusterFrameContext -> NamespaceStore -> KubeObjectStore\n get contextItems() {\n var _a, _b;\n const namespaces = (_b = (_a = this.context) === null || _a === void 0 ? void 0 : _a.contextNamespaces) !== null && _b !== void 0 ? _b : [];\n return this.items.filter(item => {\n const itemNamespace = item.getNs();\n return !itemNamespace /* cluster-wide */ || namespaces.includes(itemNamespace);\n });\n }\n getTotalCount() {\n return this.contextItems.length;\n }\n get query() {\n const { limit } = this;\n if (!limit) {\n return {};\n }\n return { limit };\n }\n getAllByNs(namespace, strict = false) {\n const namespaces = [].concat(namespace);\n if (namespaces.length) {\n return this.items.filter(item => namespaces.includes(item.getNs()));\n }\n if (!strict) {\n return this.items;\n }\n return [];\n }\n getById(id) {\n return this.items.find(item => item.getId() === id);\n }\n getByName(name, namespace) {\n return this.items.find(item => {\n return item.getName() === name && (namespace ? item.getNs() === namespace : true);\n });\n }\n getByPath(path) {\n return this.items.find(item => item.selfLink === path);\n }\n getByLabel(labels) {\n if (Array.isArray(labels)) {\n return this.items.filter((item) => {\n const itemLabels = item.getLabels();\n return labels.every(label => itemLabels.includes(label));\n });\n }\n else {\n return this.items.filter((item) => {\n const itemLabels = item.metadata.labels || {};\n return Object.entries(labels)\n .every(([key, value]) => itemLabels[key] === value);\n });\n }\n }\n async loadItems({ namespaces, reqInit, onLoadFailure }) {\n var _a, _b;\n if (!((_a = this.context) === null || _a === void 0 ? void 0 : _a.cluster.isAllowedResource(this.api.kind))) {\n return [];\n }\n const isLoadingAll = ((_b = this.context.allNamespaces) === null || _b === void 0 ? void 0 : _b.length) > 1\n && this.context.cluster.accessibleNamespaces.length === 0\n && this.context.allNamespaces.every(ns => namespaces.includes(ns));\n if (!this.api.isNamespaced || isLoadingAll) {\n if (this.api.isNamespaced) {\n this.loadedNamespaces = [];\n }\n const res = this.api.list({ reqInit }, this.query);\n if (onLoadFailure) {\n try {\n return await res;\n }\n catch (error) {\n onLoadFailure((error === null || error === void 0 ? void 0 : error.message) || (error === null || error === void 0 ? void 0 : error.toString()) || \"Unknown error\");\n // reset the store because we are loading all, so that nothing is displayed\n this.items.clear();\n this.selectedItemsIds.clear();\n return [];\n }\n }\n return res;\n }\n this.loadedNamespaces = namespaces;\n const results = await Promise.allSettled(namespaces.map(namespace => this.api.list({ namespace, reqInit }, this.query)));\n const res = [];\n for (const result of results) {\n switch (result.status) {\n case \"fulfilled\":\n res.push(...result.value);\n break;\n case \"rejected\":\n if (onLoadFailure) {\n onLoadFailure(result.reason.message || result.reason);\n }\n else {\n // if onLoadFailure is not provided then preserve old behaviour\n throw result.reason;\n }\n }\n }\n return res;\n }\n filterItemsOnLoad(items) {\n return items;\n }\n async loadAll({ namespaces, merge = true, reqInit, onLoadFailure } = {}) {\n await this.contextReady;\n namespaces !== null && namespaces !== void 0 ? namespaces : (namespaces = this.context.contextNamespaces);\n this.isLoading = true;\n try {\n const items = await this.loadItems({ namespaces, reqInit, onLoadFailure });\n this.mergeItems(items, { merge });\n this.isLoaded = true;\n this.failedLoading = false;\n return items;\n }\n catch (error) {\n console.warn(\"[KubeObjectStore] loadAll failed\", this.api.apiBase, error);\n this.resetOnError(error);\n this.failedLoading = true;\n }\n finally {\n this.isLoading = false;\n }\n }\n async reloadAll(opts = {}) {\n const { force = false } = opts, loadingOptions = __rest(opts, [\"force\"]);\n if (this.isLoading || (this.isLoaded && !force)) {\n return;\n }\n return this.loadAll(loadingOptions);\n }\n mergeItems(partialItems, { merge = true, updateStore = true, sort = true, filter = true } = {}) {\n let items = partialItems;\n // update existing items\n if (merge) {\n const namespaces = partialItems.map(item => item.getNs());\n items = [\n ...this.items.filter(existingItem => !namespaces.includes(existingItem.getNs())),\n ...partialItems,\n ];\n }\n if (filter)\n items = this.filterItemsOnLoad(items);\n if (sort)\n items = this.sortItems(items);\n if (updateStore)\n this.items.replace(items);\n return items;\n }\n resetOnError(error) {\n if (error)\n this.reset();\n }\n async loadItem(params) {\n return this.api.get(params);\n }\n async load(params) {\n const { name, namespace } = params;\n let item = this.getByName(name, namespace);\n if (!item) {\n item = await this.loadItem(params);\n const newItems = this.sortItems([...this.items, item]);\n this.items.replace(newItems);\n }\n return item;\n }\n async loadFromPath(resourcePath) {\n const { namespace, name } = Object(_kube_api_parse__WEBPACK_IMPORTED_MODULE_5__[\"parseKubeApi\"])(resourcePath);\n return this.load({ name, namespace });\n }\n async createItem(params, data) {\n return this.api.create(params, data);\n }\n postUpdate(rawItem) {\n const newItem = new this.api.objectConstructor(rawItem);\n const index = this.items.findIndex(item => item.getId() === newItem.getId());\n Object(_kube_api__WEBPACK_IMPORTED_MODULE_4__[\"ensureObjectSelfLink\"])(this.api, newItem);\n if (index < 0) {\n this.items.push(newItem);\n }\n else {\n this.items[index] = newItem;\n }\n return newItem;\n }\n async patch(item, patch) {\n return this.postUpdate(await this.api.patch({\n name: item.getName(), namespace: item.getNs(),\n }, patch, \"json\"));\n }\n async update(item, data) {\n return this.postUpdate(await this.api.update({\n name: item.getName(),\n namespace: item.getNs(),\n }, data));\n }\n async remove(item) {\n await this.api.delete({ name: item.getName(), namespace: item.getNs() });\n this.selectedItemsIds.delete(item.getId());\n }\n async removeSelectedItems() {\n return Promise.all(this.selectedItems.map(this.remove));\n }\n async removeItems(items) {\n await Promise.all(items.map(this.remove));\n }\n bindWatchEventsUpdater(delay = 1000) {\n Object(mobx__WEBPACK_IMPORTED_MODULE_0__[\"reaction\"])(() => this.eventsBuffer.length, this.updateFromEventsBuffer, {\n delay,\n });\n }\n subscribe({ onLoadFailure, abortController = new abort_controller__WEBPACK_IMPORTED_MODULE_6___default.a() } = {}) {\n if (this.api.isNamespaced) {\n Promise.race([Object(_utils__WEBPACK_IMPORTED_MODULE_1__[\"rejectPromiseBy\"])(abortController.signal), Promise.all([this.contextReady, this.namespacesReady])])\n .then(() => {\n if (this.context.cluster.isGlobalWatchEnabled && this.loadedNamespaces.length === 0) {\n return this.watchNamespace(\"\", abortController, { onLoadFailure });\n }\n for (const namespace of this.loadedNamespaces) {\n this.watchNamespace(namespace, abortController, { onLoadFailure });\n }\n })\n .catch(_utils__WEBPACK_IMPORTED_MODULE_1__[\"noop\"]); // ignore DOMExceptions\n }\n else {\n this.watchNamespace(\"\", abortController, { onLoadFailure });\n }\n return () => abortController.abort();\n }\n watchNamespace(namespace, abortController, opts) {\n if (!this.api.getResourceVersion(namespace)) {\n return;\n }\n let timedRetry;\n const watch = () => this.api.watch({\n namespace,\n abortController,\n callback,\n });\n const { signal } = abortController;\n const callback = (data, error) => {\n if (!this.isLoaded || (error === null || error === void 0 ? void 0 : error.type) === \"aborted\")\n return;\n if (error instanceof Response) {\n if (error.status === 404 || error.status === 401) {\n // api has gone, or credentials are not permitted, let's not retry\n return;\n }\n // not sure what to do, best to retry\n clearTimeout(timedRetry);\n timedRetry = setTimeout(watch, 5000);\n }\n else if (error instanceof _kube_object__WEBPACK_IMPORTED_MODULE_2__[\"KubeStatus\"] && error.code === 410) {\n clearTimeout(timedRetry);\n // resourceVersion has gone, let's try to reload\n timedRetry = setTimeout(() => {\n (namespace\n ? this.loadAll(Object.assign({ namespaces: [namespace], reqInit: { signal } }, opts))\n : this.loadAll(Object.assign({ merge: false, reqInit: { signal } }, opts))).then(watch);\n }, 1000);\n }\n else if (error) { // not sure what to do, best to retry\n clearTimeout(timedRetry);\n timedRetry = setTimeout(watch, 5000);\n }\n if (data) {\n this.eventsBuffer.push(data);\n }\n };\n signal.addEventListener(\"abort\", () => clearTimeout(timedRetry));\n watch();\n }\n updateFromEventsBuffer() {\n const items = this.getItems();\n for (const { type, object } of this.eventsBuffer.clear()) {\n const index = items.findIndex(item => { var _a; return item.getId() === ((_a = object.metadata) === null || _a === void 0 ? void 0 : _a.uid); });\n const item = items[index];\n switch (type) {\n case \"ADDED\":\n // falls through\n case \"MODIFIED\": {\n const newItem = new this.api.objectConstructor(object);\n if (!item) {\n items.push(newItem);\n }\n else {\n items[index] = newItem;\n }\n break;\n }\n case \"DELETED\":\n if (item) {\n items.splice(index, 1);\n }\n break;\n }\n }\n // update items\n this.items.replace(this.sortItems(items.slice(-this.bufferSize)));\n }\n}\nObject.defineProperty(KubeObjectStore, \"defaultContext\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: mobx__WEBPACK_IMPORTED_MODULE_0__[\"observable\"].box()\n}); // TODO: support multiple cluster contexts\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_0__[\"observable\"],\n __metadata(\"design:type\", Array)\n], KubeObjectStore.prototype, \"loadedNamespaces\", void 0);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_0__[\"computed\"],\n __metadata(\"design:type\", Array),\n __metadata(\"design:paramtypes\", [])\n], KubeObjectStore.prototype, \"contextItems\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_0__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Object]),\n __metadata(\"design:returntype\", Promise)\n], KubeObjectStore.prototype, \"loadAll\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_0__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Object]),\n __metadata(\"design:returntype\", Promise)\n], KubeObjectStore.prototype, \"reloadAll\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_0__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Array, Object]),\n __metadata(\"design:returntype\", Array)\n], KubeObjectStore.prototype, \"mergeItems\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_0__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Object]),\n __metadata(\"design:returntype\", Promise)\n], KubeObjectStore.prototype, \"load\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_0__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [String]),\n __metadata(\"design:returntype\", Promise)\n], KubeObjectStore.prototype, \"loadFromPath\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_0__[\"action\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", []),\n __metadata(\"design:returntype\", void 0)\n], KubeObjectStore.prototype, \"updateFromEventsBuffer\", null);\n\n\n//# sourceURL=webpack:///./src/common/k8s-api/kube-object.store.ts?");
|
|
39520
39520
|
|
|
39521
39521
|
/***/ }),
|
|
39522
39522
|
|
|
@@ -43235,7 +43235,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) *
|
|
|
43235
43235
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
43236
43236
|
|
|
43237
43237
|
"use strict";
|
|
43238
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ItemListLayoutContent\", function() { return ItemListLayoutContent; });\n/* harmony import */ var _item_list_layout_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./item-list-layout.scss */ \"./src/renderer/components/item-object-list/item-list-layout.scss\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var mobx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! mobx */ \"./node_modules/mobx/dist/mobx.esm.js\");\n/* harmony import */ var mobx_react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! mobx-react */ \"./node_modules/mobx-react/dist/mobxreact.esm.js\");\n/* harmony import */ var _confirm_dialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../confirm-dialog */ \"./src/renderer/components/confirm-dialog/index.ts\");\n/* harmony import */ var _table__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../table */ \"./src/renderer/components/table/index.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../utils */ \"./src/renderer/utils/index.ts\");\n/* harmony import */ var _add_remove_buttons__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../add-remove-buttons */ \"./src/renderer/components/add-remove-buttons/index.ts\");\n/* harmony import */ var _no_items__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../no-items */ \"./src/renderer/components/no-items/index.ts\");\n/* harmony import */ var _spinner__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../spinner */ \"./src/renderer/components/spinner/index.ts\");\n/* harmony import */ var _page_filters_store__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./page-filters.store */ \"./src/renderer/components/item-object-list/page-filters.store.ts\");\n/* harmony import */ var _theme_store__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../theme.store */ \"./src/renderer/theme.store.ts\");\n/* harmony import */ var _menu_menu_actions__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../menu/menu-actions */ \"./src/renderer/components/menu/menu-actions.tsx\");\n/* harmony import */ var _menu__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../menu */ \"./src/renderer/components/menu/index.ts\");\n/* harmony import */ var _checkbox__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../checkbox */ \"./src/renderer/components/checkbox/index.ts\");\n/* harmony import */ var _common_user_store__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../../common/user-store */ \"./src/common/user-store/index.ts\");\n/**\n * Copyright (c) OpenLens Authors. All rights reserved.\n * Licensed under MIT License. See LICENSE in root directory for more information.\n */\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (undefined && undefined.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nlet ItemListLayoutContent = class ItemListLayoutContent extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {\n constructor(props) {\n super(props);\n Object(mobx__WEBPACK_IMPORTED_MODULE_2__[\"makeObservable\"])(this);\n }\n get failedToLoad() {\n return this.props.store.failedLoading;\n }\n getRow(uid) {\n return (react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"div\", { key: uid },\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(mobx_react__WEBPACK_IMPORTED_MODULE_3__[\"Observer\"], null, () => {\n const { isSelectable, renderTableHeader, renderTableContents, renderItemMenu, store, hasDetailsView, onDetails, copyClassNameFromHeadCells, customizeTableRowProps, detailsItem, } = this.props;\n const { isSelected } = store;\n const item = this.props.getItems().find(item => item.getId() == uid);\n if (!item)\n return null;\n const itemId = item.getId();\n return (react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_table__WEBPACK_IMPORTED_MODULE_5__[\"TableRow\"], Object.assign({ nowrap: true, searchItem: item, sortItem: item, selected: detailsItem && detailsItem.getId() === itemId, onClick: hasDetailsView ? Object(_utils__WEBPACK_IMPORTED_MODULE_6__[\"prevDefault\"])(() => onDetails(item)) : undefined }, customizeTableRowProps(item)),\n isSelectable && (react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_table__WEBPACK_IMPORTED_MODULE_5__[\"TableCell\"], { checkbox: true, isChecked: isSelected(item), onClick: Object(_utils__WEBPACK_IMPORTED_MODULE_6__[\"prevDefault\"])(() => store.toggleSelection(item)) })),\n renderTableContents(item).map((content, index) => {\n const cellProps = Object(_utils__WEBPACK_IMPORTED_MODULE_6__[\"isReactNode\"])(content)\n ? { children: content }\n : content;\n const headCell = renderTableHeader === null || renderTableHeader === void 0 ? void 0 : renderTableHeader[index];\n if (copyClassNameFromHeadCells && headCell) {\n cellProps.className = Object(_utils__WEBPACK_IMPORTED_MODULE_6__[\"cssNames\"])(cellProps.className, headCell.className);\n }\n if (!headCell || this.showColumn(headCell)) {\n return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_table__WEBPACK_IMPORTED_MODULE_5__[\"TableCell\"], Object.assign({ key: index }, cellProps));\n }\n return null;\n }),\n renderItemMenu && (react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_table__WEBPACK_IMPORTED_MODULE_5__[\"TableCell\"], { className: \"menu\" },\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"div\", { onClick: _utils__WEBPACK_IMPORTED_MODULE_6__[\"stopPropagation\"] }, renderItemMenu(item, store))))));\n })));\n }\n removeItemsDialog() {\n const { customizeRemoveDialog, store } = this.props;\n const { selectedItems, removeSelectedItems } = store;\n const visibleMaxNamesCount = 5;\n const selectedNames = selectedItems.map(ns => ns.getName()).slice(0, visibleMaxNamesCount).join(\", \");\n const dialogCustomProps = customizeRemoveDialog ? customizeRemoveDialog(selectedItems) : {};\n const selectedCount = selectedItems.length;\n const tailCount = selectedCount > visibleMaxNamesCount ? selectedCount - visibleMaxNamesCount : 0;\n const tail = tailCount > 0 ? react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_1___default.a.Fragment, null,\n \", and \",\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"b\", null, tailCount),\n \" more\") : null;\n const message = selectedCount <= 1 ? react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"p\", null,\n \"Remove item \",\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"b\", null, selectedNames),\n \"?\") : react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"p\", null,\n \"Remove \",\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"b\", null, selectedCount),\n \" items \",\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"b\", null, selectedNames),\n tail,\n \"?\");\n _confirm_dialog__WEBPACK_IMPORTED_MODULE_4__[\"ConfirmDialog\"].open(Object.assign({ ok: removeSelectedItems, labelOk: \"Remove\", message }, dialogCustomProps));\n }\n renderNoItems() {\n if (this.failedToLoad) {\n return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_no_items__WEBPACK_IMPORTED_MODULE_8__[\"NoItems\"], null, this.props.failedToLoadMessage);\n }\n if (!this.props.getIsReady()) {\n return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_spinner__WEBPACK_IMPORTED_MODULE_9__[\"Spinner\"], { center: true });\n }\n if (this.props.getFilters().length > 0) {\n return (react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_no_items__WEBPACK_IMPORTED_MODULE_8__[\"NoItems\"], null,\n \"No items found.\",\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"p\", null,\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"a\", { onClick: () => _page_filters_store__WEBPACK_IMPORTED_MODULE_10__[\"pageFilters\"].reset(), className: \"contrast\" }, \"Reset filters?\"))));\n }\n return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_no_items__WEBPACK_IMPORTED_MODULE_8__[\"NoItems\"], null);\n }\n renderItems() {\n if (this.props.virtual) {\n return null;\n }\n return this.props.getItems().map(item => this.getRow(item.getId()));\n }\n renderTableHeader() {\n const { customizeTableRowProps, renderTableHeader, isSelectable, isConfigurable, store } = this.props;\n if (!renderTableHeader) {\n return null;\n }\n const enabledItems = this.props.getItems().filter(item => !customizeTableRowProps(item).disabled);\n return (react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_table__WEBPACK_IMPORTED_MODULE_5__[\"TableHead\"], { showTopLine: true, nowrap: true },\n isSelectable && (react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(mobx_react__WEBPACK_IMPORTED_MODULE_3__[\"Observer\"], null, () => (react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_table__WEBPACK_IMPORTED_MODULE_5__[\"TableCell\"], { checkbox: true, isChecked: store.isSelectedAll(enabledItems), onClick: Object(_utils__WEBPACK_IMPORTED_MODULE_6__[\"prevDefault\"])(() => store.toggleSelectionAll(enabledItems)) })))),\n renderTableHeader.map((cellProps, index) => {\n var _a;\n return (this.showColumn(cellProps) && (react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_table__WEBPACK_IMPORTED_MODULE_5__[\"TableCell\"], Object.assign({ key: (_a = cellProps.id) !== null && _a !== void 0 ? _a : index }, cellProps))));\n }),\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_table__WEBPACK_IMPORTED_MODULE_5__[\"TableCell\"], { className: \"menu\" }, isConfigurable && this.renderColumnVisibilityMenu())));\n }\n render() {\n const { store, hasDetailsView, addRemoveButtons = {}, virtual, sortingCallbacks, detailsItem, className, tableProps = {}, tableId, } = this.props;\n const selectedItemId = detailsItem && detailsItem.getId();\n const classNames = Object(_utils__WEBPACK_IMPORTED_MODULE_6__[\"cssNames\"])(className, \"box\", \"grow\", _theme_store__WEBPACK_IMPORTED_MODULE_11__[\"ThemeStore\"].getInstance().activeTheme.type);\n return (react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"div\", { className: \"items box grow flex column\" },\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_table__WEBPACK_IMPORTED_MODULE_5__[\"Table\"], Object.assign({ tableId: tableId, virtual: virtual, selectable: hasDetailsView, sortable: sortingCallbacks, getTableRow: this.getRow, items: this.props.getItems(), selectedItemId: selectedItemId, noItems: this.renderNoItems(), className: classNames }, tableProps),\n this.renderTableHeader(),\n this.renderItems()),\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(mobx_react__WEBPACK_IMPORTED_MODULE_3__[\"Observer\"], null, () => (react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_add_remove_buttons__WEBPACK_IMPORTED_MODULE_7__[\"AddRemoveButtons\"], Object.assign({ onRemove: store.selectedItems.length ? this.removeItemsDialog : null, removeTooltip: `Remove selected items (${store.selectedItems.length})` }, addRemoveButtons))))));\n }\n showColumn({ id: columnId, showWithColumn }) {\n const { tableId, isConfigurable } = this.props;\n return !isConfigurable || !_common_user_store__WEBPACK_IMPORTED_MODULE_15__[\"UserStore\"].getInstance().isTableColumnHidden(tableId, columnId, showWithColumn);\n }\n renderColumnVisibilityMenu() {\n const { renderTableHeader, tableId } = this.props;\n return (react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_menu_menu_actions__WEBPACK_IMPORTED_MODULE_12__[\"MenuActions\"], { className: \"ItemListLayoutVisibilityMenu\", toolbar: false, autoCloseOnSelect: false }, renderTableHeader.map((cellProps, index) => {\n var _a;\n return (!cellProps.showWithColumn && (react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_menu__WEBPACK_IMPORTED_MODULE_13__[\"MenuItem\"], { key: index, className: \"input\" },\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_checkbox__WEBPACK_IMPORTED_MODULE_14__[\"Checkbox\"], { label: (_a = cellProps.title) !== null && _a !== void 0 ? _a : `<${cellProps.className}>`, value: this.showColumn(cellProps), onChange: () => _common_user_store__WEBPACK_IMPORTED_MODULE_15__[\"UserStore\"].getInstance().toggleTableColumnVisibility(tableId, cellProps.id) }))));\n })));\n }\n};\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"computed\"],\n __metadata(\"design:type\", Object),\n __metadata(\"design:paramtypes\", [])\n], ItemListLayoutContent.prototype, \"failedToLoad\", null);\n__decorate([\n _utils__WEBPACK_IMPORTED_MODULE_6__[\"boundMethod\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [String]),\n __metadata(\"design:returntype\", void 0)\n], ItemListLayoutContent.prototype, \"getRow\", null);\n__decorate([\n _utils__WEBPACK_IMPORTED_MODULE_6__[\"boundMethod\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", []),\n __metadata(\"design:returntype\", void 0)\n], ItemListLayoutContent.prototype, \"removeItemsDialog\", null);\nItemListLayoutContent = __decorate([\n mobx_react__WEBPACK_IMPORTED_MODULE_3__[\"observer\"],\n __metadata(\"design:paramtypes\", [Object])\n], ItemListLayoutContent);\n\n\n\n//# sourceURL=webpack:///./src/renderer/components/item-object-list/content.tsx?");
|
|
43238
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ItemListLayoutContent\", function() { return ItemListLayoutContent; });\n/* harmony import */ var _item_list_layout_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./item-list-layout.scss */ \"./src/renderer/components/item-object-list/item-list-layout.scss\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var mobx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! mobx */ \"./node_modules/mobx/dist/mobx.esm.js\");\n/* harmony import */ var mobx_react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! mobx-react */ \"./node_modules/mobx-react/dist/mobxreact.esm.js\");\n/* harmony import */ var _confirm_dialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../confirm-dialog */ \"./src/renderer/components/confirm-dialog/index.ts\");\n/* harmony import */ var _table__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../table */ \"./src/renderer/components/table/index.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../utils */ \"./src/renderer/utils/index.ts\");\n/* harmony import */ var _add_remove_buttons__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../add-remove-buttons */ \"./src/renderer/components/add-remove-buttons/index.ts\");\n/* harmony import */ var _no_items__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../no-items */ \"./src/renderer/components/no-items/index.ts\");\n/* harmony import */ var _spinner__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../spinner */ \"./src/renderer/components/spinner/index.ts\");\n/* harmony import */ var _page_filters_store__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./page-filters.store */ \"./src/renderer/components/item-object-list/page-filters.store.ts\");\n/* harmony import */ var _theme_store__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../theme.store */ \"./src/renderer/theme.store.ts\");\n/* harmony import */ var _menu_menu_actions__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../menu/menu-actions */ \"./src/renderer/components/menu/menu-actions.tsx\");\n/* harmony import */ var _menu__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../menu */ \"./src/renderer/components/menu/index.ts\");\n/* harmony import */ var _checkbox__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../checkbox */ \"./src/renderer/components/checkbox/index.ts\");\n/* harmony import */ var _common_user_store__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../../common/user-store */ \"./src/common/user-store/index.ts\");\n/**\n * Copyright (c) OpenLens Authors. All rights reserved.\n * Licensed under MIT License. See LICENSE in root directory for more information.\n */\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (undefined && undefined.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nlet ItemListLayoutContent = class ItemListLayoutContent extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {\n constructor(props) {\n super(props);\n Object(mobx__WEBPACK_IMPORTED_MODULE_2__[\"makeObservable\"])(this);\n }\n get failedToLoad() {\n return this.props.store.failedLoading;\n }\n getRow(uid) {\n return (react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"div\", { key: uid },\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(mobx_react__WEBPACK_IMPORTED_MODULE_3__[\"Observer\"], null, () => {\n const { isSelectable, renderTableHeader, renderTableContents, renderItemMenu, store, hasDetailsView, onDetails, copyClassNameFromHeadCells, customizeTableRowProps, detailsItem, } = this.props;\n const { isSelected } = store;\n const item = this.props.getItems().find(item => item.getId() == uid);\n if (!item)\n return null;\n const itemId = item.getId();\n return (react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_table__WEBPACK_IMPORTED_MODULE_5__[\"TableRow\"], Object.assign({ nowrap: true, searchItem: item, sortItem: item, selected: detailsItem && detailsItem.getId() === itemId, onClick: hasDetailsView ? Object(_utils__WEBPACK_IMPORTED_MODULE_6__[\"prevDefault\"])(() => onDetails(item)) : undefined }, customizeTableRowProps(item)),\n isSelectable && (react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_table__WEBPACK_IMPORTED_MODULE_5__[\"TableCell\"], { checkbox: true, isChecked: isSelected(item), onClick: Object(_utils__WEBPACK_IMPORTED_MODULE_6__[\"prevDefault\"])(() => store.toggleSelection(item)) })),\n renderTableContents(item).map((content, index) => {\n const cellProps = Object(_utils__WEBPACK_IMPORTED_MODULE_6__[\"isReactNode\"])(content)\n ? { children: content }\n : content;\n const headCell = renderTableHeader === null || renderTableHeader === void 0 ? void 0 : renderTableHeader[index];\n if (copyClassNameFromHeadCells && headCell) {\n cellProps.className = Object(_utils__WEBPACK_IMPORTED_MODULE_6__[\"cssNames\"])(cellProps.className, headCell.className);\n }\n if (!headCell || this.showColumn(headCell)) {\n return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_table__WEBPACK_IMPORTED_MODULE_5__[\"TableCell\"], Object.assign({ key: index }, cellProps));\n }\n return null;\n }),\n renderItemMenu && (react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_table__WEBPACK_IMPORTED_MODULE_5__[\"TableCell\"], { className: \"menu\" },\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"div\", { onClick: _utils__WEBPACK_IMPORTED_MODULE_6__[\"stopPropagation\"] }, renderItemMenu(item, store))))));\n })));\n }\n removeItemsDialog(selectedItems) {\n const { customizeRemoveDialog, store } = this.props;\n const visibleMaxNamesCount = 5;\n const selectedNames = selectedItems.map(ns => ns.getName()).slice(0, visibleMaxNamesCount).join(\", \");\n const dialogCustomProps = customizeRemoveDialog ? customizeRemoveDialog(selectedItems) : {};\n const selectedCount = selectedItems.length;\n const tailCount = selectedCount > visibleMaxNamesCount\n ? selectedCount - visibleMaxNamesCount\n : 0;\n const tail = tailCount > 0\n ? react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_1___default.a.Fragment, null,\n \", and \",\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"b\", null, tailCount),\n \" more\")\n : null;\n const message = selectedCount <= 1\n ? react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"p\", null,\n \"Remove item \",\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"b\", null, selectedNames),\n \"?\")\n : react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"p\", null,\n \"Remove \",\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"b\", null, selectedCount),\n \" items \",\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"b\", null, selectedNames),\n tail,\n \"?\");\n const onConfirm = store.removeItems\n ? () => store.removeItems(selectedItems)\n : store.removeSelectedItems;\n _confirm_dialog__WEBPACK_IMPORTED_MODULE_4__[\"ConfirmDialog\"].open(Object.assign({ ok: onConfirm, labelOk: \"Remove\", message }, dialogCustomProps));\n }\n renderNoItems() {\n if (this.failedToLoad) {\n return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_no_items__WEBPACK_IMPORTED_MODULE_8__[\"NoItems\"], null, this.props.failedToLoadMessage);\n }\n if (!this.props.getIsReady()) {\n return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_spinner__WEBPACK_IMPORTED_MODULE_9__[\"Spinner\"], { center: true });\n }\n if (this.props.getFilters().length > 0) {\n return (react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_no_items__WEBPACK_IMPORTED_MODULE_8__[\"NoItems\"], null,\n \"No items found.\",\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"p\", null,\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"a\", { onClick: () => _page_filters_store__WEBPACK_IMPORTED_MODULE_10__[\"pageFilters\"].reset(), className: \"contrast\" }, \"Reset filters?\"))));\n }\n return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_no_items__WEBPACK_IMPORTED_MODULE_8__[\"NoItems\"], null);\n }\n renderItems() {\n if (this.props.virtual) {\n return null;\n }\n return this.props.getItems().map(item => this.getRow(item.getId()));\n }\n renderTableHeader() {\n const { customizeTableRowProps, renderTableHeader, isSelectable, isConfigurable, store } = this.props;\n if (!renderTableHeader) {\n return null;\n }\n const enabledItems = this.props.getItems().filter(item => !customizeTableRowProps(item).disabled);\n return (react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_table__WEBPACK_IMPORTED_MODULE_5__[\"TableHead\"], { showTopLine: true, nowrap: true },\n isSelectable && (react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(mobx_react__WEBPACK_IMPORTED_MODULE_3__[\"Observer\"], null, () => (react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_table__WEBPACK_IMPORTED_MODULE_5__[\"TableCell\"], { checkbox: true, isChecked: store.isSelectedAll(enabledItems), onClick: Object(_utils__WEBPACK_IMPORTED_MODULE_6__[\"prevDefault\"])(() => store.toggleSelectionAll(enabledItems)) })))),\n renderTableHeader.map((cellProps, index) => {\n var _a;\n return (this.showColumn(cellProps) && (react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_table__WEBPACK_IMPORTED_MODULE_5__[\"TableCell\"], Object.assign({ key: (_a = cellProps.id) !== null && _a !== void 0 ? _a : index }, cellProps))));\n }),\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_table__WEBPACK_IMPORTED_MODULE_5__[\"TableCell\"], { className: \"menu\" }, isConfigurable && this.renderColumnVisibilityMenu())));\n }\n render() {\n const { store, hasDetailsView, addRemoveButtons = {}, virtual, sortingCallbacks, detailsItem, className, tableProps = {}, tableId, getItems, } = this.props;\n const selectedItemId = detailsItem && detailsItem.getId();\n const classNames = Object(_utils__WEBPACK_IMPORTED_MODULE_6__[\"cssNames\"])(className, \"box\", \"grow\", _theme_store__WEBPACK_IMPORTED_MODULE_11__[\"ThemeStore\"].getInstance().activeTheme.type);\n const items = getItems();\n const selectedItems = store.pickOnlySelected(items);\n return (react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"div\", { className: \"items box grow flex column\" },\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_table__WEBPACK_IMPORTED_MODULE_5__[\"Table\"], Object.assign({ tableId: tableId, virtual: virtual, selectable: hasDetailsView, sortable: sortingCallbacks, getTableRow: this.getRow, items: items, selectedItemId: selectedItemId, noItems: this.renderNoItems(), className: classNames }, tableProps),\n this.renderTableHeader(),\n this.renderItems()),\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(mobx_react__WEBPACK_IMPORTED_MODULE_3__[\"Observer\"], null, () => (react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_add_remove_buttons__WEBPACK_IMPORTED_MODULE_7__[\"AddRemoveButtons\"], Object.assign({ onRemove: (store.removeItems || store.removeSelectedItems) && selectedItems.length > 0\n ? () => this.removeItemsDialog(selectedItems)\n : null, removeTooltip: `Remove selected items (${selectedItems.length})` }, addRemoveButtons))))));\n }\n showColumn({ id: columnId, showWithColumn }) {\n const { tableId, isConfigurable } = this.props;\n return !isConfigurable || !_common_user_store__WEBPACK_IMPORTED_MODULE_15__[\"UserStore\"].getInstance().isTableColumnHidden(tableId, columnId, showWithColumn);\n }\n renderColumnVisibilityMenu() {\n const { renderTableHeader, tableId } = this.props;\n return (react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_menu_menu_actions__WEBPACK_IMPORTED_MODULE_12__[\"MenuActions\"], { className: \"ItemListLayoutVisibilityMenu\", toolbar: false, autoCloseOnSelect: false }, renderTableHeader.map((cellProps, index) => {\n var _a;\n return (!cellProps.showWithColumn && (react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_menu__WEBPACK_IMPORTED_MODULE_13__[\"MenuItem\"], { key: index, className: \"input\" },\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_checkbox__WEBPACK_IMPORTED_MODULE_14__[\"Checkbox\"], { label: (_a = cellProps.title) !== null && _a !== void 0 ? _a : `<${cellProps.className}>`, value: this.showColumn(cellProps), onChange: () => _common_user_store__WEBPACK_IMPORTED_MODULE_15__[\"UserStore\"].getInstance().toggleTableColumnVisibility(tableId, cellProps.id) }))));\n })));\n }\n};\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"computed\"],\n __metadata(\"design:type\", Object),\n __metadata(\"design:paramtypes\", [])\n], ItemListLayoutContent.prototype, \"failedToLoad\", null);\n__decorate([\n _utils__WEBPACK_IMPORTED_MODULE_6__[\"boundMethod\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [String]),\n __metadata(\"design:returntype\", void 0)\n], ItemListLayoutContent.prototype, \"getRow\", null);\n__decorate([\n _utils__WEBPACK_IMPORTED_MODULE_6__[\"boundMethod\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", [Array]),\n __metadata(\"design:returntype\", void 0)\n], ItemListLayoutContent.prototype, \"removeItemsDialog\", null);\nItemListLayoutContent = __decorate([\n mobx_react__WEBPACK_IMPORTED_MODULE_3__[\"observer\"],\n __metadata(\"design:paramtypes\", [Object])\n], ItemListLayoutContent);\n\n\n\n//# sourceURL=webpack:///./src/renderer/components/item-object-list/content.tsx?");
|
|
43239
43239
|
|
|
43240
43240
|
/***/ }),
|
|
43241
43241
|
|
|
@@ -43295,7 +43295,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _nod
|
|
|
43295
43295
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
43296
43296
|
|
|
43297
43297
|
"use strict";
|
|
43298
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ItemListLayout\", function() { return ItemListLayout; });\n/* harmony import */ var _item_list_layout_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./item-list-layout.scss */ \"./src/renderer/components/item-object-list/item-list-layout.scss\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var mobx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! mobx */ \"./node_modules/mobx/dist/mobx.esm.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils */ \"./src/renderer/utils/index.ts\");\n/* harmony import */ var _page_filters_store__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./page-filters.store */ \"./src/renderer/components/item-object-list/page-filters.store.ts\");\n/* harmony import */ var _page_filters_list__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./page-filters-list */ \"./src/renderer/components/item-object-list/page-filters-list.tsx\");\n/* harmony import */ var _namespaces_namespace_store_namespace_store_injectable__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../+namespaces/namespace-store/namespace-store.injectable */ \"./src/renderer/components/+namespaces/namespace-store/namespace-store.injectable.ts\");\n/* harmony import */ var _ogre_tools_injectable_react__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @ogre-tools/injectable-react */ \"./node_modules/@ogre-tools/injectable-react/build/index.js\");\n/* harmony import */ var _ogre_tools_injectable_react__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_ogre_tools_injectable_react__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _storage_injectable__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./storage.injectable */ \"./src/renderer/components/item-object-list/storage.injectable.ts\");\n/* harmony import */ var _content__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./content */ \"./src/renderer/components/item-object-list/content.tsx\");\n/* harmony import */ var _header__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./header */ \"./src/renderer/components/item-object-list/header.tsx\");\n/* harmony import */ var lodash_groupBy__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! lodash/groupBy */ \"./node_modules/lodash/groupBy.js\");\n/* harmony import */ var lodash_groupBy__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(lodash_groupBy__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var _filters__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./filters */ \"./src/renderer/components/item-object-list/filters.tsx\");\n/* harmony import */ var mobx_react__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! mobx-react */ \"./node_modules/mobx-react/dist/mobxreact.esm.js\");\n/**\n * Copyright (c) OpenLens Authors. All rights reserved.\n * Licensed under MIT License. See LICENSE in root directory for more information.\n */\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (undefined && undefined.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst defaultProps = {\n showHeader: true,\n isSelectable: true,\n isConfigurable: false,\n copyClassNameFromHeadCells: true,\n preloadStores: true,\n dependentStores: [],\n searchFilters: [],\n customizeHeader: [],\n filterItems: [],\n hasDetailsView: true,\n onDetails: _utils__WEBPACK_IMPORTED_MODULE_3__[\"noop\"],\n virtual: true,\n customizeTableRowProps: () => ({}),\n failedToLoadMessage: \"Failed to load items\",\n};\nlet NonInjectedItemListLayout = class NonInjectedItemListLayout extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {\n constructor(props) {\n super(props);\n Object.defineProperty(this, \"filterCallbacks\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: {\n [_page_filters_store__WEBPACK_IMPORTED_MODULE_4__[\"FilterType\"].SEARCH]: items => {\n const { searchFilters } = this.props;\n const search = _page_filters_store__WEBPACK_IMPORTED_MODULE_4__[\"pageFilters\"].getValues(_page_filters_store__WEBPACK_IMPORTED_MODULE_4__[\"FilterType\"].SEARCH)[0] || \"\";\n if (search && searchFilters.length) {\n const normalizeText = (text) => String(text).toLowerCase();\n const searchTexts = [search].map(normalizeText);\n return items.filter(item => {\n return searchFilters.some(getTexts => {\n const sourceTexts = [getTexts(item)].flat().map(normalizeText);\n return sourceTexts.some(source => searchTexts.some(search => source.includes(search)));\n });\n });\n }\n return items;\n },\n }\n });\n Object(mobx__WEBPACK_IMPORTED_MODULE_2__[\"makeObservable\"])(this);\n }\n async componentDidMount() {\n const { isConfigurable, tableId, preloadStores } = this.props;\n if (isConfigurable && !tableId) {\n throw new Error(\"[ItemListLayout]: configurable list require props.tableId to be specified\");\n }\n if (preloadStores) {\n this.loadStores();\n }\n }\n loadStores() {\n const { store, dependentStores } = this.props;\n const stores = Array.from(new Set([store, ...dependentStores]));\n stores.forEach(store => store.loadAll(this.props.namespaceStore.contextNamespaces));\n }\n get showFilters() {\n return this.props.itemListLayoutStorage.get().showFilters;\n }\n set showFilters(showFilters) {\n this.props.itemListLayoutStorage.merge({ showFilters });\n }\n get filters() {\n let { activeFilters } = _page_filters_store__WEBPACK_IMPORTED_MODULE_4__[\"pageFilters\"];\n const { searchFilters } = this.props;\n if (searchFilters.length === 0) {\n activeFilters = activeFilters.filter(({ type }) => type !== _page_filters_store__WEBPACK_IMPORTED_MODULE_4__[\"FilterType\"].SEARCH);\n }\n return activeFilters;\n }\n toggleFilters() {\n this.showFilters = !this.showFilters;\n }\n get isReady() {\n var _a;\n return (_a = this.props.isReady) !== null && _a !== void 0 ? _a : this.props.store.isLoaded;\n }\n renderFilters() {\n const { hideFilters } = this.props;\n const { isReady, filters } = this;\n if (!isReady || !filters.length || hideFilters || !this.showFilters) {\n return null;\n }\n return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_page_filters_list__WEBPACK_IMPORTED_MODULE_5__[\"PageFiltersList\"], { filters: filters });\n }\n get items() {\n var _a;\n const filterGroups = lodash_groupBy__WEBPACK_IMPORTED_MODULE_11___default()(this.filters, ({ type }) => type);\n const filterItems = [];\n Object.entries(filterGroups).forEach(([type, filtersGroup]) => {\n var _a, _b;\n const filterCallback = (_a = this.filterCallbacks[type]) !== null && _a !== void 0 ? _a : (_b = this.props.filterCallbacks) === null || _b === void 0 ? void 0 : _b[type];\n if (filterCallback && filtersGroup.length > 0) {\n filterItems.push(filterCallback);\n }\n });\n const items = this.props.getItems ? this.props.getItems() : ((_a = this.props.items) !== null && _a !== void 0 ? _a : this.props.store.items);\n return applyFilters(filterItems.concat(this.props.filterItems), items);\n }\n render() {\n return Object(mobx__WEBPACK_IMPORTED_MODULE_2__[\"untracked\"])(() => {\n var _a, _b;\n return (react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"div\", { className: Object(_utils__WEBPACK_IMPORTED_MODULE_3__[\"cssNames\"])(\"ItemListLayout flex column\", this.props.className) },\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_header__WEBPACK_IMPORTED_MODULE_10__[\"ItemListLayoutHeader\"], { getItems: () => this.items, getFilters: () => this.filters, toggleFilters: this.toggleFilters, store: this.props.store, searchFilters: this.props.searchFilters, showHeader: this.props.showHeader, headerClassName: this.props.headerClassName, renderHeaderTitle: this.props.renderHeaderTitle, customizeHeader: this.props.customizeHeader }),\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_filters__WEBPACK_IMPORTED_MODULE_12__[\"ItemListLayoutFilters\"], { getIsReady: () => this.isReady, getFilters: () => this.filters, getFiltersAreShown: () => this.showFilters, hideFilters: this.props.hideFilters }),\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_content__WEBPACK_IMPORTED_MODULE_9__[\"ItemListLayoutContent\"], { getItems: () => this.items, getFilters: () => this.filters, tableId: this.props.tableId, className: this.props.className, store: this.props.store, getIsReady: () => this.isReady, isSelectable: this.props.isSelectable, isConfigurable: this.props.isConfigurable, copyClassNameFromHeadCells: this.props.copyClassNameFromHeadCells, sortingCallbacks: this.props.sortingCallbacks, tableProps: this.props.tableProps, renderTableHeader: this.props.renderTableHeader, renderTableContents: this.props.renderTableContents, renderItemMenu: this.props.renderItemMenu, customizeTableRowProps: this.props.customizeTableRowProps, addRemoveButtons: this.props.addRemoveButtons, virtual: this.props.virtual, hasDetailsView: this.props.hasDetailsView, detailsItem: this.props.detailsItem, onDetails: this.props.onDetails, customizeRemoveDialog: this.props.customizeRemoveDialog, failedToLoadMessage: this.props.failedToLoadMessage }), (_b = (_a = this.props).renderFooter) === null || _b === void 0 ? void 0 :\n _b.call(_a, this)));\n });\n }\n};\nObject.defineProperty(NonInjectedItemListLayout, \"defaultProps\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: defaultProps\n});\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"computed\"],\n __metadata(\"design:type\", Object),\n __metadata(\"design:paramtypes\", [])\n], NonInjectedItemListLayout.prototype, \"filters\", null);\n__decorate([\n _utils__WEBPACK_IMPORTED_MODULE_3__[\"boundMethod\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", []),\n __metadata(\"design:returntype\", void 0)\n], NonInjectedItemListLayout.prototype, \"toggleFilters\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"computed\"],\n __metadata(\"design:type\", Object),\n __metadata(\"design:paramtypes\", [])\n], NonInjectedItemListLayout.prototype, \"isReady\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"computed\"],\n __metadata(\"design:type\", Object),\n __metadata(\"design:paramtypes\", [])\n], NonInjectedItemListLayout.prototype, \"items\", null);\nNonInjectedItemListLayout = __decorate([\n mobx_react__WEBPACK_IMPORTED_MODULE_13__[\"observer\"],\n __metadata(\"design:paramtypes\", [Object])\n], NonInjectedItemListLayout);\nconst InjectedItemListLayout = Object(_ogre_tools_injectable_react__WEBPACK_IMPORTED_MODULE_7__[\"withInjectables\"])(NonInjectedItemListLayout, {\n getProps: (di, props) => (Object.assign({ namespaceStore: di.inject(_namespaces_namespace_store_namespace_store_injectable__WEBPACK_IMPORTED_MODULE_6__[\"default\"]), itemListLayoutStorage: di.inject(_storage_injectable__WEBPACK_IMPORTED_MODULE_8__[\"default\"]) }, props)),\n});\nfunction ItemListLayout(props) {\n return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(InjectedItemListLayout, Object.assign({}, props));\n}\nfunction applyFilters(filters, items) {\n if (!filters || !filters.length) {\n return items;\n }\n return filters.reduce((items, filter) => filter(items), items);\n}\n\n\n//# sourceURL=webpack:///./src/renderer/components/item-object-list/list-layout.tsx?");
|
|
43298
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ItemListLayout\", function() { return ItemListLayout; });\n/* harmony import */ var _item_list_layout_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./item-list-layout.scss */ \"./src/renderer/components/item-object-list/item-list-layout.scss\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var mobx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! mobx */ \"./node_modules/mobx/dist/mobx.esm.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils */ \"./src/renderer/utils/index.ts\");\n/* harmony import */ var _page_filters_store__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./page-filters.store */ \"./src/renderer/components/item-object-list/page-filters.store.ts\");\n/* harmony import */ var _page_filters_list__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./page-filters-list */ \"./src/renderer/components/item-object-list/page-filters-list.tsx\");\n/* harmony import */ var _namespaces_namespace_store_namespace_store_injectable__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../+namespaces/namespace-store/namespace-store.injectable */ \"./src/renderer/components/+namespaces/namespace-store/namespace-store.injectable.ts\");\n/* harmony import */ var _ogre_tools_injectable_react__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @ogre-tools/injectable-react */ \"./node_modules/@ogre-tools/injectable-react/build/index.js\");\n/* harmony import */ var _ogre_tools_injectable_react__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_ogre_tools_injectable_react__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _storage_injectable__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./storage.injectable */ \"./src/renderer/components/item-object-list/storage.injectable.ts\");\n/* harmony import */ var _content__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./content */ \"./src/renderer/components/item-object-list/content.tsx\");\n/* harmony import */ var _header__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./header */ \"./src/renderer/components/item-object-list/header.tsx\");\n/* harmony import */ var lodash_groupBy__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! lodash/groupBy */ \"./node_modules/lodash/groupBy.js\");\n/* harmony import */ var lodash_groupBy__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(lodash_groupBy__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var _filters__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./filters */ \"./src/renderer/components/item-object-list/filters.tsx\");\n/* harmony import */ var mobx_react__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! mobx-react */ \"./node_modules/mobx-react/dist/mobxreact.esm.js\");\n/**\n * Copyright (c) OpenLens Authors. All rights reserved.\n * Licensed under MIT License. See LICENSE in root directory for more information.\n */\nvar __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (undefined && undefined.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst defaultProps = {\n showHeader: true,\n isSelectable: true,\n isConfigurable: false,\n copyClassNameFromHeadCells: true,\n preloadStores: true,\n dependentStores: [],\n searchFilters: [],\n customizeHeader: [],\n filterItems: [],\n hasDetailsView: true,\n onDetails: _utils__WEBPACK_IMPORTED_MODULE_3__[\"noop\"],\n virtual: true,\n customizeTableRowProps: () => ({}),\n failedToLoadMessage: \"Failed to load items\",\n};\nlet NonInjectedItemListLayout = class NonInjectedItemListLayout extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {\n constructor(props) {\n super(props);\n Object.defineProperty(this, \"filterCallbacks\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: {\n [_page_filters_store__WEBPACK_IMPORTED_MODULE_4__[\"FilterType\"].SEARCH]: items => {\n const { searchFilters } = this.props;\n const search = _page_filters_store__WEBPACK_IMPORTED_MODULE_4__[\"pageFilters\"].getValues(_page_filters_store__WEBPACK_IMPORTED_MODULE_4__[\"FilterType\"].SEARCH)[0] || \"\";\n if (search && searchFilters.length) {\n const normalizeText = (text) => String(text).toLowerCase();\n const searchTexts = [search].map(normalizeText);\n return items.filter(item => {\n return searchFilters.some(getTexts => {\n const sourceTexts = [getTexts(item)].flat().map(normalizeText);\n return sourceTexts.some(source => searchTexts.some(search => source.includes(search)));\n });\n });\n }\n return items;\n },\n }\n });\n Object(mobx__WEBPACK_IMPORTED_MODULE_2__[\"makeObservable\"])(this);\n }\n async componentDidMount() {\n const { isConfigurable, tableId, preloadStores } = this.props;\n if (isConfigurable && !tableId) {\n throw new Error(\"[ItemListLayout]: configurable list require props.tableId to be specified\");\n }\n if (preloadStores) {\n this.loadStores();\n }\n }\n loadStores() {\n const { store, dependentStores } = this.props;\n const stores = Array.from(new Set([store, ...dependentStores]));\n stores.forEach(store => store.loadAll(this.props.namespaceStore.contextNamespaces));\n }\n get showFilters() {\n return this.props.itemListLayoutStorage.get().showFilters;\n }\n set showFilters(showFilters) {\n this.props.itemListLayoutStorage.merge({ showFilters });\n }\n get filters() {\n let { activeFilters } = _page_filters_store__WEBPACK_IMPORTED_MODULE_4__[\"pageFilters\"];\n const { searchFilters } = this.props;\n if (searchFilters.length === 0) {\n activeFilters = activeFilters.filter(({ type }) => type !== _page_filters_store__WEBPACK_IMPORTED_MODULE_4__[\"FilterType\"].SEARCH);\n }\n return activeFilters;\n }\n toggleFilters() {\n this.showFilters = !this.showFilters;\n }\n get isReady() {\n var _a;\n return (_a = this.props.isReady) !== null && _a !== void 0 ? _a : this.props.store.isLoaded;\n }\n renderFilters() {\n const { hideFilters } = this.props;\n const { isReady, filters } = this;\n if (!isReady || !filters.length || hideFilters || !this.showFilters) {\n return null;\n }\n return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_page_filters_list__WEBPACK_IMPORTED_MODULE_5__[\"PageFiltersList\"], { filters: filters });\n }\n get items() {\n var _a, _b, _c, _d, _e, _f;\n const filterGroups = lodash_groupBy__WEBPACK_IMPORTED_MODULE_11___default()(this.filters, ({ type }) => type);\n const filterItems = [];\n for (const [type, filtersGroup] of Object.entries(filterGroups)) {\n const filterCallback = (_a = this.filterCallbacks[type]) !== null && _a !== void 0 ? _a : (_b = this.props.filterCallbacks) === null || _b === void 0 ? void 0 : _b[type];\n if (filterCallback && filtersGroup.length > 0) {\n filterItems.push(filterCallback);\n }\n }\n const items = (_f = (_e = (_d = (_c = this.props).getItems) === null || _d === void 0 ? void 0 : _d.call(_c)) !== null && _e !== void 0 ? _e : this.props.items) !== null && _f !== void 0 ? _f : this.props.store.items;\n return applyFilters(filterItems.concat(this.props.filterItems), items);\n }\n render() {\n return Object(mobx__WEBPACK_IMPORTED_MODULE_2__[\"untracked\"])(() => {\n var _a, _b;\n return (react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"div\", { className: Object(_utils__WEBPACK_IMPORTED_MODULE_3__[\"cssNames\"])(\"ItemListLayout flex column\", this.props.className) },\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_header__WEBPACK_IMPORTED_MODULE_10__[\"ItemListLayoutHeader\"], { getItems: () => this.items, getFilters: () => this.filters, toggleFilters: this.toggleFilters, store: this.props.store, searchFilters: this.props.searchFilters, showHeader: this.props.showHeader, headerClassName: this.props.headerClassName, renderHeaderTitle: this.props.renderHeaderTitle, customizeHeader: this.props.customizeHeader }),\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_filters__WEBPACK_IMPORTED_MODULE_12__[\"ItemListLayoutFilters\"], { getIsReady: () => this.isReady, getFilters: () => this.filters, getFiltersAreShown: () => this.showFilters, hideFilters: this.props.hideFilters }),\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_content__WEBPACK_IMPORTED_MODULE_9__[\"ItemListLayoutContent\"], { getItems: () => this.items, getFilters: () => this.filters, tableId: this.props.tableId, className: this.props.className, store: this.props.store, getIsReady: () => this.isReady, isSelectable: this.props.isSelectable, isConfigurable: this.props.isConfigurable, copyClassNameFromHeadCells: this.props.copyClassNameFromHeadCells, sortingCallbacks: this.props.sortingCallbacks, tableProps: this.props.tableProps, renderTableHeader: this.props.renderTableHeader, renderTableContents: this.props.renderTableContents, renderItemMenu: this.props.renderItemMenu, customizeTableRowProps: this.props.customizeTableRowProps, addRemoveButtons: this.props.addRemoveButtons, virtual: this.props.virtual, hasDetailsView: this.props.hasDetailsView, detailsItem: this.props.detailsItem, onDetails: this.props.onDetails, customizeRemoveDialog: this.props.customizeRemoveDialog, failedToLoadMessage: this.props.failedToLoadMessage }), (_b = (_a = this.props).renderFooter) === null || _b === void 0 ? void 0 :\n _b.call(_a, this)));\n });\n }\n};\nObject.defineProperty(NonInjectedItemListLayout, \"defaultProps\", {\n enumerable: true,\n configurable: true,\n writable: true,\n value: defaultProps\n});\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"computed\"],\n __metadata(\"design:type\", Object),\n __metadata(\"design:paramtypes\", [])\n], NonInjectedItemListLayout.prototype, \"filters\", null);\n__decorate([\n _utils__WEBPACK_IMPORTED_MODULE_3__[\"boundMethod\"],\n __metadata(\"design:type\", Function),\n __metadata(\"design:paramtypes\", []),\n __metadata(\"design:returntype\", void 0)\n], NonInjectedItemListLayout.prototype, \"toggleFilters\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"computed\"],\n __metadata(\"design:type\", Object),\n __metadata(\"design:paramtypes\", [])\n], NonInjectedItemListLayout.prototype, \"isReady\", null);\n__decorate([\n mobx__WEBPACK_IMPORTED_MODULE_2__[\"computed\"],\n __metadata(\"design:type\", Object),\n __metadata(\"design:paramtypes\", [])\n], NonInjectedItemListLayout.prototype, \"items\", null);\nNonInjectedItemListLayout = __decorate([\n mobx_react__WEBPACK_IMPORTED_MODULE_13__[\"observer\"],\n __metadata(\"design:paramtypes\", [Object])\n], NonInjectedItemListLayout);\nconst InjectedItemListLayout = Object(_ogre_tools_injectable_react__WEBPACK_IMPORTED_MODULE_7__[\"withInjectables\"])(NonInjectedItemListLayout, {\n getProps: (di, props) => (Object.assign({ namespaceStore: di.inject(_namespaces_namespace_store_namespace_store_injectable__WEBPACK_IMPORTED_MODULE_6__[\"default\"]), itemListLayoutStorage: di.inject(_storage_injectable__WEBPACK_IMPORTED_MODULE_8__[\"default\"]) }, props)),\n});\nfunction ItemListLayout(props) {\n return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(InjectedItemListLayout, Object.assign({}, props));\n}\nfunction applyFilters(filters, items) {\n if (!filters || !filters.length) {\n return items;\n }\n return filters.reduce((items, filter) => filter(items), items);\n}\n\n\n//# sourceURL=webpack:///./src/renderer/components/item-object-list/list-layout.tsx?");
|
|
43299
43299
|
|
|
43300
43300
|
/***/ }),
|
|
43301
43301
|
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
/// <reference types="@ogre-tools/injectable" />
|
|
2
|
-
import type { ClusterModel } from "../../common/cluster-types";
|
|
3
2
|
import { Cluster } from "../../common/cluster/cluster";
|
|
4
|
-
declare const createClusterInjectable: import("@ogre-tools/injectable").Injectable<import("@ogre-tools/injectable").InjectionToken<(model: ClusterModel) => Cluster, void>, (model: ClusterModel) => Cluster, void>;
|
|
3
|
+
declare const createClusterInjectable: import("@ogre-tools/injectable").Injectable<import("@ogre-tools/injectable").InjectionToken<(model: import("../../common/cluster-types").ClusterModel) => Cluster, void>, (model: import("../../common/cluster-types").ClusterModel) => Cluster, void>;
|
|
5
4
|
export default createClusterInjectable;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/// <reference types="@ogre-tools/injectable" />
|
|
2
2
|
import { IComputedValue } from "mobx";
|
|
3
3
|
import type { TabLayoutRoute } from "../layout/tab-layout";
|
|
4
|
-
export interface CustomResourceTabLayoutRoute extends TabLayoutRoute {
|
|
4
|
+
export interface CustomResourceTabLayoutRoute extends Omit<TabLayoutRoute, "component"> {
|
|
5
5
|
id: string;
|
|
6
6
|
}
|
|
7
7
|
export interface CustomResourceGroupTabLayoutRoute extends CustomResourceTabLayoutRoute {
|
|
@@ -2,7 +2,4 @@
|
|
|
2
2
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
|
3
3
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
|
-
export declare const CustomResourcesRoute: React.ForwardRefExoticComponent<React.RefAttributes<any> & {
|
|
7
|
-
children?: React.ReactNode;
|
|
8
|
-
}>;
|
|
5
|
+
export declare const CustomResourcesRoute: () => JSX.Element;
|
|
@@ -43,7 +43,7 @@ export declare class ItemListLayoutContent<I extends ItemObject> extends React.C
|
|
|
43
43
|
constructor(props: ItemListLayoutContentProps<I>);
|
|
44
44
|
get failedToLoad(): boolean;
|
|
45
45
|
getRow(uid: string): JSX.Element;
|
|
46
|
-
removeItemsDialog(): void;
|
|
46
|
+
removeItemsDialog(selectedItems: I[]): void;
|
|
47
47
|
renderNoItems(): JSX.Element;
|
|
48
48
|
renderItems(): JSX.Element[];
|
|
49
49
|
renderTableHeader(): JSX.Element;
|
|
@@ -10,7 +10,6 @@ import { IClassName, StorageHelper } from "../../utils";
|
|
|
10
10
|
import type { AddRemoveButtonsProps } from "../add-remove-buttons";
|
|
11
11
|
import type { ItemObject, ItemStore } from "../../../common/item.store";
|
|
12
12
|
import type { SearchInputUrlProps } from "../input";
|
|
13
|
-
import { Filter } from "./page-filters.store";
|
|
14
13
|
import type { NamespaceStore } from "../+namespaces/namespace-store/namespace.store";
|
|
15
14
|
export declare type SearchFilter<I extends ItemObject> = (item: I) => string | number | (string | number)[];
|
|
16
15
|
export declare type SearchFilters<I extends ItemObject> = Record<string, SearchFilter<I>>;
|
|
@@ -77,7 +76,7 @@ declare class NonInjectedItemListLayout<I extends ItemObject> extends React.Comp
|
|
|
77
76
|
private loadStores;
|
|
78
77
|
get showFilters(): boolean;
|
|
79
78
|
set showFilters(showFilters: boolean);
|
|
80
|
-
get filters(): Filter[];
|
|
79
|
+
get filters(): import("./page-filters.store").Filter[];
|
|
81
80
|
toggleFilters(): void;
|
|
82
81
|
get isReady(): boolean;
|
|
83
82
|
renderFilters(): JSX.Element;
|
|
@@ -3,7 +3,11 @@
|
|
|
3
3
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
|
4
4
|
*/
|
|
5
5
|
import type { TabLayoutRoute } from "./tab-layout";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Renders a sidebar item for each route
|
|
8
|
+
*
|
|
9
|
+
* NOTE: this cannot be a component because then the `<SidebarItem>.isExandable`
|
|
10
|
+
* check will always return true because a component that renders to `null` is
|
|
11
|
+
* still a present child to the parent `<SidebarItem>`
|
|
12
|
+
*/
|
|
13
|
+
export declare const renderTabRoutesSidebarItems: (routes: TabLayoutRoute[]) => JSX.Element[];
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
/// <reference types="@ogre-tools/injectable" />
|
|
2
|
-
import type { ClusterModel } from "../../common/cluster-types";
|
|
3
2
|
import { Cluster } from "../../common/cluster/cluster";
|
|
4
|
-
declare const createClusterInjectable: import("@ogre-tools/injectable").Injectable<import("@ogre-tools/injectable").InjectionToken<(model: ClusterModel) => Cluster, void>, (model: ClusterModel) => Cluster, void>;
|
|
3
|
+
declare const createClusterInjectable: import("@ogre-tools/injectable").Injectable<import("@ogre-tools/injectable").InjectionToken<(model: import("../../common/cluster-types").ClusterModel) => Cluster, void>, (model: import("../../common/cluster-types").ClusterModel) => Cluster, void>;
|
|
5
4
|
export default createClusterInjectable;
|
|
@@ -15,7 +15,7 @@ export declare class PortForwardStore extends ItemStore<PortForwardItem> {
|
|
|
15
15
|
private init;
|
|
16
16
|
watch(): import("../../utils").ExtendableDisposer;
|
|
17
17
|
loadAll(): Promise<any>;
|
|
18
|
-
|
|
18
|
+
removeItems(items: PortForwardItem[]): Promise<void>;
|
|
19
19
|
getById(id: string): PortForwardItem;
|
|
20
20
|
/**
|
|
21
21
|
* add a port-forward to the store and optionally start it
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@k8slens/extensions",
|
|
3
3
|
"productName": "OpenLens extensions",
|
|
4
4
|
"description": "OpenLens - Open Source Kubernetes IDE: extensions",
|
|
5
|
-
"version": "5.4.0-git.
|
|
5
|
+
"version": "5.4.0-git.d4d2da1d28.0",
|
|
6
6
|
"copyright": "© 2021 OpenLens Authors",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"main": "dist/src/extensions/extension-api.js",
|