UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

487 lines 79.4 kB
import { HttpClient } from '@angular/common/http'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, TemplateRef, } from '@angular/core'; import { memoize, partition, uniq } from 'lodash-es'; import { ReplaySubject, combineLatest, forkJoin, of, catchError, finalize, map, startWith, switchMap, takeUntil, tap, } from 'rxjs'; import { API_GATEWAY, K8sUtilService, publishRef, getDomainAnnotation, DISPLAY_NAME, } from '../../../../core/public-api'; import { CommonLayoutContextService } from '../../../../page-scaffold/public-api'; import { ResourceListBase } from '../../base-list'; import { ResourceSelectContextService } from '../../context.service'; import { getDisplayArch, getWorkspaceParams } from '../../utils'; import { K8sApiService } from './../../../../api/public-api'; import * as i0 from "@angular/core"; import * as i1 from "../../../../page-scaffold/public-api"; import * as i2 from "./../../../../api/public-api"; import * as i3 from "@angular/common/http"; import * as i4 from "../../context.service"; import * as i5 from "../../../../core/public-api"; import * as i6 from "@angular/common"; import * as i7 from "@angular/forms"; import * as i8 from "../../../../effect-directive/e2e-attribute-binding.directive"; import * as i9 from "@alauda/ui"; import * as i10 from "../../../../core/directives/declare.directive"; import * as i11 from "../../internals/data-grid/component"; import * as i12 from "../../helpers.directive"; import * as i13 from "../../../../core/pipes/pure.pipe"; import * as i14 from "../../../../core/pipes/k8s-util.pipe"; import * as i15 from "../../../../translate/translate.pipe"; const _c0 = ["*"]; const _c1 = () => []; const _c2 = (a0, a1) => ({ name: a0, displayName: a1 }); function NamespaceListComponent_aui_option_6_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "aui-option", 7); i0.ɵɵpipe(1, "aclUnionDisplayName"); i0.ɵɵtext(2); i0.ɵɵpipe(3, "aclUnionDisplayName"); i0.ɵɵelementEnd(); } if (rf & 2) { const project_r2 = ctx.$implicit; i0.ɵɵproperty("value", project_r2)("label", i0.ɵɵpipeBind1(1, 3, project_r2)); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(3, 5, project_r2), " "); } } function NamespaceListComponent_aui_form_item_10_aui_option_5_ng_container_4_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainerStart(0); i0.ɵɵtext(1); i0.ɵɵelementContainerEnd(); } if (rf & 2) { const mesh_r5 = i0.ɵɵnextContext().$implicit; i0.ɵɵadvance(); i0.ɵɵtextInterpolate1(" (Istio ", mesh_r5.spec.istioVersion, ") "); } } function NamespaceListComponent_aui_form_item_10_aui_option_5_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "aui-option", 7); i0.ɵɵpipe(1, "aclName"); i0.ɵɵtext(2); i0.ɵɵpipe(3, "aclName"); i0.ɵɵtemplate(4, NamespaceListComponent_aui_form_item_10_aui_option_5_ng_container_4_Template, 2, 1, "ng-container", 5); i0.ɵɵelementEnd(); } if (rf & 2) { const mesh_r5 = ctx.$implicit; i0.ɵɵproperty("value", mesh_r5)("label", i0.ɵɵpipeBind1(1, 4, mesh_r5) + ((mesh_r5.spec == null ? null : mesh_r5.spec.istioVersion) ? " (Istio " + mesh_r5.spec.istioVersion + ")" : "")); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(3, 6, mesh_r5), " "); i0.ɵɵadvance(2); i0.ɵɵproperty("ngIf", mesh_r5.spec == null ? null : mesh_r5.spec.istioVersion); } } function NamespaceListComponent_aui_form_item_10_Template(rf, ctx) { if (rf & 1) { const _r3 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "aui-form-item")(1, "label", 2); i0.ɵɵtext(2); i0.ɵɵpipe(3, "translate"); i0.ɵɵelementEnd(); i0.ɵɵelementStart(4, "aui-select", 11); i0.ɵɵtwoWayListener("ngModelChange", function NamespaceListComponent_aui_form_item_10_Template_aui_select_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r3 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r3.selectedServiceMesh, $event) || (ctx_r3.selectedServiceMesh = $event); return i0.ɵɵresetView($event); }); i0.ɵɵlistener("valueChange", function NamespaceListComponent_aui_form_item_10_Template_aui_select_valueChange_4_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.selectServiceMesh($event)); }); i0.ɵɵtemplate(5, NamespaceListComponent_aui_form_item_10_aui_option_5_Template, 5, 8, "aui-option", 4); i0.ɵɵelementStart(6, "aui-option-placeholder"); i0.ɵɵtext(7); i0.ɵɵpipe(8, "translate"); i0.ɵɵelementEnd()()(); } if (rf & 2) { const ctx_r3 = i0.ɵɵnextContext(); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 6, "service_mesh")); i0.ɵɵadvance(2); i0.ɵɵtwoWayProperty("ngModel", ctx_r3.selectedServiceMesh); i0.ɵɵproperty("trackFn", ctx_r3.serviceMeshTrackFn)("loading", !ctx_r3.projects.length && ctx_r3.projectsLoading); i0.ɵɵadvance(); i0.ɵɵproperty("ngForOf", ctx_r3.projectServiceMeshes); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(8, 8, "no_data"), " "); } } function NamespaceListComponent_ng_container_20_aui_option_1_ng_container_6_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainer(0); } } function NamespaceListComponent_ng_container_20_aui_option_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "aui-option", 13); i0.ɵɵpipe(1, "pure"); i0.ɵɵpipe(2, "async"); i0.ɵɵpipe(3, "translate"); i0.ɵɵpipe(4, "pure"); i0.ɵɵpipe(5, "async"); i0.ɵɵtemplate(6, NamespaceListComponent_ng_container_20_aui_option_1_ng_container_6_Template, 1, 0, "ng-container", 14); i0.ɵɵelementEnd(); } if (rf & 2) { const cluster_r6 = ctx.declare; const clusterName_r7 = i0.ɵɵnextContext().$implicit; const ctx_r3 = i0.ɵɵnextContext(); const clusterLabel_r8 = i0.ɵɵreference(25); i0.ɵɵproperty("value", clusterName_r7)("label", clusterLabel_r8)("labelContext", cluster_r6)("disabled", i0.ɵɵpipeBind1(2, 11, i0.ɵɵpipeBind2(1, 8, clusterName_r7, ctx_r3.checkClusterError$)))("auiTooltip", i0.ɵɵpipeBind1(3, 13, "current_cluster_status_abnormal"))("auiTooltipDisabled", !i0.ɵɵpipeBind1(5, 18, i0.ɵɵpipeBind2(4, 15, clusterName_r7, ctx_r3.checkClusterError$))); i0.ɵɵadvance(6); i0.ɵɵproperty("ngTemplateOutlet", clusterLabel_r8)("ngTemplateOutletContext", cluster_r6); } } function NamespaceListComponent_ng_container_20_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainerStart(0); i0.ɵɵtemplate(1, NamespaceListComponent_ng_container_20_aui_option_1_Template, 7, 20, "aui-option", 12); i0.ɵɵpipe(2, "pure"); i0.ɵɵpipe(3, "async"); i0.ɵɵelementContainerEnd(); } if (rf & 2) { const clusterName_r7 = ctx.$implicit; const ctx_r3 = i0.ɵɵnextContext(); i0.ɵɵadvance(); i0.ɵɵproperty("declare", i0.ɵɵpureFunction2(6, _c2, clusterName_r7, i0.ɵɵpipeBind1(3, 4, i0.ɵɵpipeBind2(2, 1, clusterName_r7, ctx_r3.getClusterDisplayName$)))); } } function NamespaceListComponent_ng_template_24_ng_container_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainerStart(0); i0.ɵɵtext(1); i0.ɵɵelementContainerEnd(); } if (rf & 2) { const displayName_r9 = i0.ɵɵnextContext().displayName; i0.ɵɵadvance(); i0.ɵɵtextInterpolate1("(", displayName_r9, ")"); } } function NamespaceListComponent_ng_template_24_Template(rf, ctx) { if (rf & 1) { i0.ɵɵtext(0); i0.ɵɵtemplate(1, NamespaceListComponent_ng_template_24_ng_container_1_Template, 2, 1, "ng-container", 5); } if (rf & 2) { const name_r10 = ctx.name; const displayName_r9 = ctx.displayName; i0.ɵɵtextInterpolate1(" ", name_r10, " "); i0.ɵɵadvance(); i0.ɵɵproperty("ngIf", displayName_r9); } } export class NamespaceListComponent extends ResourceListBase { constructor(commonLayoutService, k8sService, http, contextService, cdr, k8sUtil) { super(cdr, k8sUtil, contextService); this.commonLayoutService = commonLayoutService; this.k8sService = k8sService; this.http = http; this.displayServiceMesh = false; this.clusterChange = new EventEmitter(); this.projectChange = new EventEmitter(); this.projects = []; this.clusters = []; this.projectsLoading = true; this.serviceMeshes = []; this.projectServiceMeshes = []; this.type = 'namespace'; this.displayedData = []; this.namespaceClusterMap = {}; this.gridStateMap = {}; this.load$$ = new ReplaySubject(1); this.serviceMeshes$ = this.k8sService .getGlobalResourceList({ definition: { apiGroup: 'asm.alauda.io', apiVersion: 'v1alpha1', type: 'servicemeshgroups', }, namespaced: true, }) .pipe(map(res => res.items)); this.clusters$ = this.http .get(`${API_GATEWAY}/auth/v1/clusters?availableClusters=false`) .pipe(map(res => res?.items), catchError(() => of([])), publishRef()); this.getClusterDisplayName$ = memoize((cluster) => this.clusters$.pipe(map(clusters => this.k8sUtil.getDisplayName(clusters.find(i => this.k8sUtil.getName(i) === cluster))))); this.checkClusterError$ = memoize((cluster) => this.clusters$.pipe(map(clusters => this.checkClusterError(clusters, cluster)))); this.namespaces$ = combineLatest([ this.load$$.pipe(startWith({ project: null, cluster: '' })), this.reload$$.pipe(startWith(null)), ]).pipe(switchMap(([{ project, cluster }]) => { if (!project || !cluster) { return of([]); } const clusters = cluster === '__all' ? this.clusters : [cluster]; return clusters.length ? forkJoin(clusters.map(cluster => this.commonLayoutService .getClusterNamespaces(project.metadata.name, cluster) .pipe(catchError(() => of([]))))).pipe(tap(lists => { this.namespaceClusterMap = lists.reduce((acc, cur, i) => ({ ...acc, ...cur.reduce((subAcc, subCurr) => ({ ...subAcc, [subCurr.metadata.uid]: clusters[i], }), {}), }), {}); }), map((lists) => lists.flat())) : of([]); }), takeUntil(this.destroy$$), publishRef()); this.projectFilterFn = (keyword = '', option) => { const k = keyword.toLowerCase(); return (option.value.metadata.name.includes(k) || getDomainAnnotation(DISPLAY_NAME, option.value) ?.toLowerCase() ?.includes(k)); }; this.clusterFilterFn = (keyword = '', option) => { const k = keyword.toLowerCase(); if (option.value === '__all') { return option.label.toLowerCase().includes(k); } const { name, displayName } = option.labelContext; return name.includes(k) || displayName?.toLowerCase()?.includes(k); }; this.serviceMeshFilterFn = (keyword = '', option) => { const k = keyword.toLowerCase(); const version = option.value.spec?.istioVersion ? `Istio ${option.value.spec.istioVersion}` : ''; return (option.value.metadata.name.includes(k) || version.toLowerCase()?.includes(k)); }; this.projectTrackFn = (project) => project?.metadata.name; this.serviceMeshTrackFn = (mesh) => mesh?.metadata.name; this.mapResource = (list, { isMultiArch, clusters, }) => list.map(item => { const cluster = this.namespaceClusterMap[item.metadata.uid]; const itemDisabled = this.disableFn ? this.disableFn(item) : null; const cachedItem = this.displayedData.find(ns => ns.__origin.metadata.uid === item.metadata.uid); const servicemesh = this.serviceMeshes.find(item => item.spec.clusters.includes(cachedItem?.cluster || cluster)); return { name: this.k8sUtil.getName(item), displayName: this.k8sUtil.getDisplayName(item), cluster: cachedItem?.cluster || cluster, clusterDisplayName: cachedItem?.clusterDisplayName || this.k8sUtil.getDisplayName(clusters.find(c => c.metadata.name === cluster)), clusterArch: cachedItem?.clusterArch || isMultiArch ? this.getClusterArch(clusters.find(c => c.metadata.name === cluster)) : null, serviceMeshName: servicemesh ? this.k8sUtil.getName(servicemesh) : '', serviceMeshClusters: servicemesh ? servicemesh.spec.clusters : [], serviceMeshIstioVersion: servicemesh ? servicemesh.spec.istioVersion : '', admin: cachedItem?.admin || '-', timestamp: this.k8sUtil.getCreationTimestamp(item), state: { disabled: this.gridStateMap[cluster]?.disabled || itemDisabled?.disabled || this.checkClusterError(clusters, cachedItem?.cluster || cluster) || false, tooltip: this.gridStateMap[cluster]?.disabled ? this.gridStateMap[cluster]?.tooltip || '' : itemDisabled?.tooltip, }, __origin: item, }; }); } ngOnInit() { // From cache this.projects = this.contextService.cachedProjectResources; this.serviceMeshes = this.contextService.cachedServiceMeshGroupResources; if (this.projects.length) { this.initProject(this.projects); } // Get latest data in the background forkJoin([ this.commonLayoutService .getProjects() .pipe(catchError(() => of([]))), this.displayServiceMesh ? this.serviceMeshes$ : of([]), ]) .pipe(finalize(() => { this.projectsLoading = false; this.cdr.markForCheck(); }), takeUntil(this.destroy$$)) .subscribe(([projects, serviceMeshes]) => { if (this.displayServiceMesh) { this.serviceMeshes = serviceMeshes; this.contextService.cachedServiceMeshGroupResources = serviceMeshes; } this.projects = projects; if (!this.contextService.cachedProjectResources?.length) { this.initProject(projects); } this.contextService.cachedProjectResources = this.projects; }); combineLatest([this.clusters$, this.namespaces$]).subscribe(([clusters, data]) => { const isMultiArch = uniq(clusters.map(c => this.k8sUtil.getLabel(c, 'arch'))).length > 1; this.displayedData = this.mapResource(data, { clusters, isMultiArch, }).filter(ns => this.context === 'page' || !ns.state?.disabled); this.setSelectedNamespace(this.displayedData); if (this.selectedUid) { this.displayedData = this.getSortedNamespace(this.displayedData, this.value.name); } this.loading = false; this.forceLoading = false; this.storeNamespaces(); this.cdr.markForCheck(); }); } getSortedNamespace(rawData, namespace) { if (!namespace) { return rawData; } const [selected, others] = partition(this.displayedData, item => item.name === namespace); return [...selected, ...others]; } storeNamespaces() { if (!this.selectedProject) { return; } if (this.selectedCluster === '__all') { for (const cluster of this.clusters) { this.contextService.storeNamespaces(this.selectedProject.metadata.name, cluster, this.displayedData.filter(item => item.cluster === cluster)); } } this.contextService.storeNamespaces(this.selectedProject.metadata.name, this.selectedCluster, this.displayedData); } initProject(projects) { this.selectProject((projects || []).length ? projects.find(item => item.metadata.name === this.value?.project) || projects[0] : null, true); this.load.emit({ project: projects.length, cluster: uniq(projects.reduce((acc, cur) => [...acc, ...(cur.spec.clusters || []).map(c => c.name)], [])).length, }); } selectServiceMesh(serviceMesh) { this.selectedServiceMesh = serviceMesh; this.clusters = (this.selectedProject.spec.clusters || []) .map(c => c.name) .filter(cluster => this.serviceMeshes .find(mesh => this.k8sUtil.getName(mesh) === this.k8sUtil.getName(serviceMesh)) .spec.clusters.includes(cluster)); this.selectCluster('__all'); } selectProject(project, initial = false) { this.projectChange.emit(project?.metadata.name); this.selectedProject = project; this.clusters = project ? (project.spec.clusters || []).map(c => c.name) : []; if (this.displayServiceMesh) { this.projectServiceMeshes = this.serviceMeshes.filter(mesh => mesh.spec.clusters.some(cluster => this.clusters.includes(cluster))); if (this.projectServiceMeshes?.length) { let meshName = this.value?.servicemesh; if (!meshName) { this.auth.getAccountInfo().subscribe(({ email }) => { meshName = getWorkspaceParams(email)?.servicemesh; }); } const selectedServiceMesh = this.projectServiceMeshes.find(mesh => this.k8sUtil.getName(mesh) === meshName) || this.projectServiceMeshes[0]; this.selectServiceMesh(selectedServiceMesh); } else { this.selectedServiceMesh = null; this.clusters = []; } } this.selectCluster('__all', initial); } selectCluster(clusterName, initial = false) { this.selectedCluster = clusterName; const displayedData = this.contextService.getCachedNamespaces(this.selectedProject?.metadata.name, this.selectedCluster) || []; this.displayedData = this.getSortedNamespace(displayedData, initial ? this.value?.name : null); this.setSelectedNamespace(this.displayedData); this.clusterChange.emit(this.selectedCluster === '__all' ? null : clusterName); this.loading = true; this.load$$.next({ project: this.selectedProject, cluster: clusterName, }); } setSelectedNamespace(data) { const selectedNamespace = this.value ? data.find(item => item.name === this.value.name && this.value.cluster === item.cluster) : null; this.selectedUid = selectedNamespace ? selectedNamespace.__origin.metadata.uid : null; } getClusterArch(cluster) { return getDisplayArch(this.k8sUtil.getLabel(cluster, 'arch')); } checkClusterError(clusters, cluster) { return (clusters .find(i => this.k8sUtil.getName(i) === cluster) ?.status.conditions.find(c => c.type === 'NodeNotReady')?.status !== 'False'); } static { this.ɵfac = function NamespaceListComponent_Factory(t) { return new (t || NamespaceListComponent)(i0.ɵɵdirectiveInject(i1.CommonLayoutContextService), i0.ɵɵdirectiveInject(i2.K8sApiService), i0.ɵɵdirectiveInject(i3.HttpClient), i0.ɵɵdirectiveInject(i4.ResourceSelectContextService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i5.K8sUtilService)); }; } static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: NamespaceListComponent, selectors: [["acl-namespace-list"]], inputs: { actionTemplateRef: "actionTemplateRef", disableFn: "disableFn", value: "value", displayServiceMesh: "displayServiceMesh" }, outputs: { clusterChange: "clusterChange", projectChange: "projectChange" }, features: [i0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c0, decls: 29, vars: 38, consts: [["clusterLabel", ""], [1, "filter"], ["auiFormItemLabel", ""], ["auiFormItemControl", "", "name", "project", 3, "ngModelChange", "valueChange", "ngClass", "ngModel", "filterFn", "trackFn", "loading"], [3, "value", "label", 4, "ngFor", "ngForOf"], [4, "ngIf"], ["auiFormItemControl", "", "name", "cluster", 3, "ngModelChange", "valueChange", "ngClass", "filterFn", "loading", "ngModel"], [3, "value", "label"], [4, "ngFor", "ngForOf"], [3, "selectItem", "reload", "data", "fields", "context", "actionTemplateRef", "selectedUid", "loading"], ["aclResourceGridHeader", ""], ["auiFormItemControl", "", "name", "serviceMeshProject", 1, "lang-not-zh:!tw-w-[230px]", 3, "ngModelChange", "valueChange", "ngModel", "trackFn", "loading"], [3, "value", "label", "labelContext", "disabled", "auiTooltip", "auiTooltipDisabled", 4, "declare"], [3, "value", "label", "labelContext", "disabled", "auiTooltip", "auiTooltipDisabled"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"]], template: function NamespaceListComponent_Template(rf, ctx) { if (rf & 1) { const _r1 = i0.ɵɵgetCurrentView(); i0.ɵɵprojectionDef(); i0.ɵɵelementStart(0, "div", 1)(1, "aui-form-item")(2, "label", 2); i0.ɵɵtext(3); i0.ɵɵpipe(4, "translate"); i0.ɵɵelementEnd(); i0.ɵɵelementStart(5, "aui-select", 3); i0.ɵɵtwoWayListener("ngModelChange", function NamespaceListComponent_Template_aui_select_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.selectedProject, $event) || (ctx.selectedProject = $event); return i0.ɵɵresetView($event); }); i0.ɵɵlistener("valueChange", function NamespaceListComponent_Template_aui_select_valueChange_5_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.selectProject($event)); }); i0.ɵɵtemplate(6, NamespaceListComponent_aui_option_6_Template, 4, 7, "aui-option", 4); i0.ɵɵelementStart(7, "aui-option-placeholder"); i0.ɵɵtext(8); i0.ɵɵpipe(9, "translate"); i0.ɵɵelementEnd()()(); i0.ɵɵtemplate(10, NamespaceListComponent_aui_form_item_10_Template, 9, 10, "aui-form-item", 5); i0.ɵɵelementStart(11, "aui-form-item")(12, "label", 2); i0.ɵɵtext(13); i0.ɵɵpipe(14, "translate"); i0.ɵɵelementEnd(); i0.ɵɵelementStart(15, "aui-select", 6); i0.ɵɵtwoWayListener("ngModelChange", function NamespaceListComponent_Template_aui_select_ngModelChange_15_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.selectedCluster, $event) || (ctx.selectedCluster = $event); return i0.ɵɵresetView($event); }); i0.ɵɵlistener("valueChange", function NamespaceListComponent_Template_aui_select_valueChange_15_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.selectCluster($event)); }); i0.ɵɵelementStart(16, "aui-option", 7); i0.ɵɵpipe(17, "translate"); i0.ɵɵtext(18); i0.ɵɵpipe(19, "translate"); i0.ɵɵelementEnd(); i0.ɵɵtemplate(20, NamespaceListComponent_ng_container_20_Template, 4, 9, "ng-container", 8); i0.ɵɵelementStart(21, "aui-option-placeholder"); i0.ɵɵtext(22); i0.ɵɵpipe(23, "translate"); i0.ɵɵelementEnd(); i0.ɵɵtemplate(24, NamespaceListComponent_ng_template_24_Template, 2, 2, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor); i0.ɵɵelementEnd()()(); i0.ɵɵelementStart(26, "acl-resource-data-grid", 9); i0.ɵɵlistener("selectItem", function NamespaceListComponent_Template_acl_resource_data_grid_selectItem_26_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onSelect($event)); })("reload", function NamespaceListComponent_Template_acl_resource_data_grid_reload_26_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.reload()); }); i0.ɵɵelementContainerStart(27, 10); i0.ɵɵprojection(28); i0.ɵɵelementContainerEnd(); i0.ɵɵelementEnd(); } if (rf & 2) { i0.ɵɵadvance(3); i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 25, "project")); i0.ɵɵadvance(2); i0.ɵɵproperty("ngClass", ctx.displayServiceMesh ? "lang-not-zh:!tw-w-[230px]" : ""); i0.ɵɵtwoWayProperty("ngModel", ctx.selectedProject); i0.ɵɵproperty("filterFn", ctx.projectFilterFn)("trackFn", ctx.projectTrackFn)("loading", !ctx.projects.length && ctx.projectsLoading); i0.ɵɵadvance(); i0.ɵɵproperty("ngForOf", ctx.projects); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(9, 27, "no_data"), " "); i0.ɵɵadvance(2); i0.ɵɵproperty("ngIf", ctx.displayServiceMesh); i0.ɵɵadvance(3); i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(14, 29, "cluster")); i0.ɵɵadvance(2); i0.ɵɵproperty("ngClass", ctx.displayServiceMesh ? "lang-not-zh:!tw-w-[230px]" : "")("filterFn", ctx.clusterFilterFn)("loading", !ctx.projects.length && ctx.projectsLoading); i0.ɵɵtwoWayProperty("ngModel", ctx.selectedCluster); i0.ɵɵadvance(); i0.ɵɵproperty("value", "__all")("label", i0.ɵɵpipeBind1(17, 31, "all")); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(19, 33, "all"), " "); i0.ɵɵadvance(2); i0.ɵɵproperty("ngForOf", ctx.clusters); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(23, 35, "no_data"), " "); i0.ɵɵadvance(4); i0.ɵɵproperty("data", ctx.displayedData || i0.ɵɵpureFunction0(37, _c1))("fields", ctx.fields)("context", ctx.context)("actionTemplateRef", ctx.actionTemplateRef)("selectedUid", ctx.selectedUid)("loading", ctx.forceLoading || !(ctx.displayedData == null ? null : ctx.displayedData.length) && ctx.loading); } }, dependencies: [i6.NgClass, i6.NgForOf, i6.NgIf, i6.NgTemplateOutlet, i7.NgControlStatus, i7.NgModel, i8.E2eAttributeBindingDirective, i9.FormItemComponent, i9.FormItemLabelDirective, i9.FormItemControlDirective, i9.SelectComponent, i9.OptionComponent, i9.OptionPlaceholderComponent, i9.TooltipDirective, i10.DeclareDirective, i11.ResourceDataGridComponent, i12.ResourceGridHeaderDirective, i6.AsyncPipe, i13.PurePipe, i14.K8sNamePipe, i14.K8sUnionDisplayNamePipe, i15.TranslatePipe], styles: ["[_nghost-%COMP%]{display:flex;flex:1;flex-direction:column}.filter[_ngcontent-%COMP%]{display:flex;padding:20px;margin-bottom:20px;box-shadow:0 0 4px rgba(var(--aui-color-n-1),.16);background-color:rgb(var(--aui-color-n-10));border-radius:4px}.filter[_ngcontent-%COMP%] aui-form-item[_ngcontent-%COMP%]{margin-right:20px}.filter[_ngcontent-%COMP%] aui-form-item[_ngcontent-%COMP%] .aui-form-item{margin-bottom:0}.filter[_ngcontent-%COMP%] aui-form-item[_ngcontent-%COMP%] .aui-form-item__label-wrapper{width:auto!important}.filter[_ngcontent-%COMP%] aui-form-item[_ngcontent-%COMP%] .aui-input{color:rgb(var(--aui-color-n-2))}.filter[_ngcontent-%COMP%] label[_ngcontent-%COMP%]{font-weight:500}.filter[_ngcontent-%COMP%] aui-select[_ngcontent-%COMP%]{width:260px}"], changeDetection: 0 }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(NamespaceListComponent, [{ type: Component, args: [{ selector: 'acl-namespace-list', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"filter\">\n <aui-form-item>\n <label auiFormItemLabel>{{ 'project' | translate }}</label>\n <aui-select\n [ngClass]=\"displayServiceMesh ? 'lang-not-zh:!tw-w-[230px]' : ''\"\n auiFormItemControl\n name=\"project\"\n [(ngModel)]=\"selectedProject\"\n [filterFn]=\"projectFilterFn\"\n [trackFn]=\"projectTrackFn\"\n (valueChange)=\"selectProject($event)\"\n [loading]=\"!projects.length && projectsLoading\"\n >\n <aui-option\n *ngFor=\"let project of projects\"\n [value]=\"project\"\n [label]=\"project | aclUnionDisplayName\"\n >\n {{ project | aclUnionDisplayName }}\n </aui-option>\n <aui-option-placeholder>\n {{ 'no_data' | translate }}\n </aui-option-placeholder>\n </aui-select>\n </aui-form-item>\n <!-- ASM \u9009\u62E9\u7F51\u683C\u8FC7\u6EE4\u96C6\u7FA4\u9009\u9879 -->\n <aui-form-item *ngIf=\"displayServiceMesh\">\n <label auiFormItemLabel>{{ 'service_mesh' | translate }}</label>\n <aui-select\n class=\"lang-not-zh:!tw-w-[230px]\"\n auiFormItemControl\n name=\"serviceMeshProject\"\n [(ngModel)]=\"selectedServiceMesh\"\n [trackFn]=\"serviceMeshTrackFn\"\n (valueChange)=\"selectServiceMesh($event)\"\n [loading]=\"!projects.length && projectsLoading\"\n >\n <aui-option\n *ngFor=\"let mesh of projectServiceMeshes\"\n [value]=\"mesh\"\n [label]=\"\n (mesh | aclName) +\n (mesh.spec?.istioVersion\n ? ' (Istio ' + mesh.spec.istioVersion + ')'\n : '')\n \"\n >\n {{ mesh | aclName }}\n <ng-container *ngIf=\"mesh.spec?.istioVersion\">\n (Istio {{ mesh.spec.istioVersion }})\n </ng-container>\n </aui-option>\n <aui-option-placeholder>\n {{ 'no_data' | translate }}\n </aui-option-placeholder>\n </aui-select>\n </aui-form-item>\n <aui-form-item>\n <label auiFormItemLabel>{{ 'cluster' | translate }}</label>\n <aui-select\n [ngClass]=\"displayServiceMesh ? 'lang-not-zh:!tw-w-[230px]' : ''\"\n auiFormItemControl\n name=\"cluster\"\n [filterFn]=\"clusterFilterFn\"\n [loading]=\"!projects.length && projectsLoading\"\n [(ngModel)]=\"selectedCluster\"\n (valueChange)=\"selectCluster($event)\"\n >\n <aui-option\n [value]=\"'__all'\"\n [label]=\"'all' | translate\"\n >\n {{ 'all' | translate }}\n </aui-option>\n <ng-container *ngFor=\"let clusterName of clusters\">\n <aui-option\n *declare=\"{\n name: clusterName,\n displayName: clusterName | pure: getClusterDisplayName$ | async,\n } as cluster\"\n [value]=\"clusterName\"\n [label]=\"clusterLabel\"\n [labelContext]=\"cluster\"\n [disabled]=\"clusterName | pure: checkClusterError$ | async\"\n [auiTooltip]=\"'current_cluster_status_abnormal' | translate\"\n [auiTooltipDisabled]=\"\n !(clusterName | pure: checkClusterError$ | async)\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"clusterLabel; context: cluster\"\n ></ng-container>\n </aui-option>\n </ng-container>\n <aui-option-placeholder>\n {{ 'no_data' | translate }}\n </aui-option-placeholder>\n <ng-template\n #clusterLabel\n let-name=\"name\"\n let-displayName=\"displayName\"\n >\n {{ name }}\n <ng-container *ngIf=\"displayName\">({{ displayName }})</ng-container>\n </ng-template>\n </aui-select>\n </aui-form-item>\n</div>\n<acl-resource-data-grid\n [data]=\"displayedData || []\"\n [fields]=\"fields\"\n [context]=\"context\"\n (selectItem)=\"onSelect($event)\"\n [actionTemplateRef]=\"actionTemplateRef\"\n [selectedUid]=\"selectedUid\"\n [loading]=\"forceLoading || (!displayedData?.length && loading)\"\n (reload)=\"reload()\"\n>\n <ng-container aclResourceGridHeader>\n <ng-content></ng-content>\n </ng-container>\n</acl-resource-data-grid>\n", styles: [":host{display:flex;flex:1;flex-direction:column}.filter{display:flex;padding:20px;margin-bottom:20px;box-shadow:0 0 4px rgba(var(--aui-color-n-1),.16);background-color:rgb(var(--aui-color-n-10));border-radius:4px}.filter aui-form-item{margin-right:20px}.filter aui-form-item ::ng-deep .aui-form-item{margin-bottom:0}.filter aui-form-item ::ng-deep .aui-form-item__label-wrapper{width:auto!important}.filter aui-form-item ::ng-deep .aui-input{color:rgb(var(--aui-color-n-2))}.filter label{font-weight:500}.filter aui-select{width:260px}\n"] }] }], () => [{ type: i1.CommonLayoutContextService }, { type: i2.K8sApiService }, { type: i3.HttpClient }, { type: i4.ResourceSelectContextService }, { type: i0.ChangeDetectorRef }, { type: i5.K8sUtilService }], { actionTemplateRef: [{ type: Input }], disableFn: [{ type: Input }], value: [{ type: Input }], displayServiceMesh: [{ type: Input }], clusterChange: [{ type: Output }], projectChange: [{ type: Output }] }); })(); (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(NamespaceListComponent, { className: "NamespaceListComponent" }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2J1c2luZXNzL3Jlc291cmNlLXNlbGVjdC9leHBvcnRzL25hbWVzcGFjZS1saXN0L2NvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9idXNpbmVzcy9yZXNvdXJjZS1zZWxlY3QvZXhwb3J0cy9uYW1lc3BhY2UtbGlzdC90ZW1wbGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sV0FBVyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyRCxPQUFPLEVBQ0wsYUFBYSxFQUNiLGFBQWEsRUFDYixRQUFRLEVBQ1IsRUFBRSxFQUNGLFVBQVUsRUFDVixRQUFRLEVBQ1IsR0FBRyxFQUNILFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULEdBQUcsR0FDSixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFDTCxXQUFXLEVBRVgsY0FBYyxFQUVkLFVBQVUsRUFJVixtQkFBbUIsRUFDbkIsWUFBWSxHQUNiLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDbEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckUsT0FBTyxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFB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