This is an automated email from the ASF dual-hosted git repository.

gongchao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hertzbeat.git


The following commit(s) were added to refs/heads/master by this push:
     new a8b0c1024d [Improve] Optimise and use the label-selector component for 
label selection within pages (#3762)
a8b0c1024d is described below

commit a8b0c1024d617ec38518912f033b53ddd4bca19e
Author: DeleiGuo <[email protected]>
AuthorDate: Sat Sep 20 19:16:32 2025 +0800

    [Improve] Optimise and use the label-selector component for label selection 
within pages (#3762)
    
    Co-authored-by: Calvin <[email protected]>
    Co-authored-by: Tom <[email protected]>
---
 .../alert-inhibit/alert-inhibit.component.html     |  4 +-
 .../alert-notice-rule.component.html               |  2 +-
 .../alert-setting/alert-setting.component.html     |  2 +-
 .../alert-silence/alert-silence.component.html     |  2 +-
 .../app/routes/bulletin/bulletin.component.html    |  2 +-
 .../monitor-edit/monitor-edit.component.html       |  1 +
 .../monitor/monitor-edit/monitor-edit.component.ts |  1 +
 .../monitor-form/monitor-form.component.html       |  3 +-
 .../monitor/monitor-form/monitor-form.component.ts |  1 +
 .../monitor/monitor-new/monitor-new.component.html |  1 +
 .../monitor/monitor-new/monitor-new.component.ts   | 36 +----------------
 .../routes/setting/status/status.component.html    |  2 +-
 .../form-field/form-field.component.html           |  1 +
 .../label-selector/label-selector.component.html   |  4 +-
 .../label-selector/label-selector.component.ts     | 47 +++++++++++++++++++++-
 15 files changed, 63 insertions(+), 46 deletions(-)

diff --git 
a/web-app/src/app/routes/alert/alert-inhibit/alert-inhibit.component.html 
b/web-app/src/app/routes/alert/alert-inhibit/alert-inhibit.component.html
index 18158ca200..3076eb1979 100644
--- a/web-app/src/app/routes/alert/alert-inhibit/alert-inhibit.component.html
+++ b/web-app/src/app/routes/alert/alert-inhibit/alert-inhibit.component.html
@@ -166,7 +166,7 @@
           <app-form-field
             [item]="{
               field: 'labels',
-              type: 'labels',
+              type: 'label-selector',
               required: true
             }"
             [name]="'sourceLabels'"
@@ -182,7 +182,7 @@
           <app-form-field
             [item]="{
               field: 'labels',
-              type: 'labels',
+              type: 'label-selector',
               required: true
             }"
             [name]="'targetLabels'"
diff --git 
a/web-app/src/app/routes/alert/alert-notice/alert-notice-rule/alert-notice-rule.component.html
 
b/web-app/src/app/routes/alert/alert-notice/alert-notice-rule/alert-notice-rule.component.html
index 0f4bc5faa5..bf53bb5747 100644
--- 
a/web-app/src/app/routes/alert/alert-notice/alert-notice-rule/alert-notice-rule.component.html
+++ 
b/web-app/src/app/routes/alert/alert-notice/alert-notice-rule/alert-notice-rule.component.html
@@ -189,7 +189,7 @@
           <app-form-field
             [item]="{
               field: 'labels',
-              type: 'labels',
+              type: 'label-selector',
               required: true
             }"
             [name]="'labels'"
diff --git 
a/web-app/src/app/routes/alert/alert-setting/alert-setting.component.html 
b/web-app/src/app/routes/alert/alert-setting/alert-setting.component.html
index 13bd055b58..aff46ec48c 100644
--- a/web-app/src/app/routes/alert/alert-setting/alert-setting.component.html
+++ b/web-app/src/app/routes/alert/alert-setting/alert-setting.component.html
@@ -570,7 +570,7 @@
           <app-form-field
             [item]="{
               field: 'labels',
-              type: 'labels'
+              type: 'label-selector'
             }"
             [name]="'labels'"
             [(ngModel)]="define.labels"
diff --git 
a/web-app/src/app/routes/alert/alert-silence/alert-silence.component.html 
b/web-app/src/app/routes/alert/alert-silence/alert-silence.component.html
index a1776a4789..19faec25d2 100755
--- a/web-app/src/app/routes/alert/alert-silence/alert-silence.component.html
+++ b/web-app/src/app/routes/alert/alert-silence/alert-silence.component.html
@@ -182,7 +182,7 @@
           <app-form-field
             [item]="{
               field: 'labels',
-              type: 'labels',
+              type: 'label-selector',
               required: true
             }"
             [name]="'labels'"
diff --git a/web-app/src/app/routes/bulletin/bulletin.component.html 
b/web-app/src/app/routes/bulletin/bulletin.component.html
index d98bcef2aa..cb7479f64f 100644
--- a/web-app/src/app/routes/bulletin/bulletin.component.html
+++ b/web-app/src/app/routes/bulletin/bulletin.component.html
@@ -187,7 +187,7 @@
           <app-form-field
             [item]="{
               field: 'labels',
-              type: 'labels'
+              type: 'label-selector',
             }"
             [name]="'labels'"
             [(ngModel)]="filterLabels"
diff --git 
a/web-app/src/app/routes/monitor/monitor-edit/monitor-edit.component.html 
b/web-app/src/app/routes/monitor/monitor-edit/monitor-edit.component.html
index 90d9fc6d20..3b1fd65653 100644
--- a/web-app/src/app/routes/monitor/monitor-edit/monitor-edit.component.html
+++ b/web-app/src/app/routes/monitor/monitor-edit/monitor-edit.component.html
@@ -41,6 +41,7 @@
   [collectors]="collectors"
   [labelKeys]="labelKeys"
   [labelMap]="labelMap"
+  [labelIsCustom]="labelIsCustom"
   [sdParams]="sdParams"
   [sdDefines]="sdDefines"
   (scrapeChange)="onScrapeChange($event)"
diff --git 
a/web-app/src/app/routes/monitor/monitor-edit/monitor-edit.component.ts 
b/web-app/src/app/routes/monitor/monitor-edit/monitor-edit.component.ts
index 2d511930ee..25f6317374 100644
--- a/web-app/src/app/routes/monitor/monitor-edit/monitor-edit.component.ts
+++ b/web-app/src/app/routes/monitor/monitor-edit/monitor-edit.component.ts
@@ -72,6 +72,7 @@ export class MonitorEditComponent implements OnInit {
   spinningTip: string = 'Loading...';
   labelKeys: string[] = [];
   labelMap: { [key: string]: string[] } = {};
+  labelIsCustom: boolean = true;
 
   ngOnInit(): void {
     this.route.paramMap
diff --git 
a/web-app/src/app/routes/monitor/monitor-form/monitor-form.component.html 
b/web-app/src/app/routes/monitor/monitor-form/monitor-form.component.html
index 9a90897738..341a8cb6df 100644
--- a/web-app/src/app/routes/monitor/monitor-form/monitor-form.component.html
+++ b/web-app/src/app/routes/monitor/monitor-form/monitor-form.component.html
@@ -184,7 +184,8 @@
             }"
             [extra]="{
               labelKeys: labelKeys,
-              labelMap: labelMap
+              labelMap: labelMap,
+              labelIsCustom: labelIsCustom
             }"
             [name]="'labels'"
             [(ngModel)]="monitor.labels"
diff --git 
a/web-app/src/app/routes/monitor/monitor-form/monitor-form.component.ts 
b/web-app/src/app/routes/monitor/monitor-form/monitor-form.component.ts
index 8914a63fa0..3de0ea45ef 100644
--- a/web-app/src/app/routes/monitor/monitor-form/monitor-form.component.ts
+++ b/web-app/src/app/routes/monitor/monitor-form/monitor-form.component.ts
@@ -50,6 +50,7 @@ export class MonitorFormComponent implements OnChanges {
   @Input() sdParams!: Param[];
   @Input() labelKeys!: string[];
   @Input() labelMap!: { [key: string]: string[] };
+  @Input() labelIsCustom!: boolean;
 
   @Output() readonly formSubmit = new EventEmitter<any>();
   @Output() readonly formCancel = new EventEmitter<any>();
diff --git 
a/web-app/src/app/routes/monitor/monitor-new/monitor-new.component.html 
b/web-app/src/app/routes/monitor/monitor-new/monitor-new.component.html
index b209c27a4c..dce6d0e5c8 100644
--- a/web-app/src/app/routes/monitor/monitor-new/monitor-new.component.html
+++ b/web-app/src/app/routes/monitor/monitor-new/monitor-new.component.html
@@ -40,6 +40,7 @@
   [collectors]="collectors"
   [labelKeys]="labelKeys"
   [labelMap]="labelMap"
+  [labelIsCustom]="labelIsCustom"
   [sdParams]="sdParams"
   [sdDefines]="sdDefines"
   (scrapeChange)="onScrapeChange($event)"
diff --git 
a/web-app/src/app/routes/monitor/monitor-new/monitor-new.component.ts 
b/web-app/src/app/routes/monitor/monitor-new/monitor-new.component.ts
index a0efb1eb70..f3cac9734a 100644
--- a/web-app/src/app/routes/monitor/monitor-new/monitor-new.component.ts
+++ b/web-app/src/app/routes/monitor/monitor-new/monitor-new.component.ts
@@ -33,7 +33,6 @@ import { Param } from '../../../pojo/Param';
 import { ParamDefine } from '../../../pojo/ParamDefine';
 import { AppDefineService } from '../../../service/app-define.service';
 import { CollectorService } from '../../../service/collector.service';
-import { LabelService } from '../../../service/label.service';
 import { MonitorService } from '../../../service/monitor.service';
 import { generateReadableRandomString } from 
'../../../shared/utils/common-util';
 
@@ -59,6 +58,7 @@ export class MonitorNewComponent implements OnInit {
   spinningTip: string = 'Loading...';
   labelKeys: string[] = [];
   labelMap: { [key: string]: string[] } = {};
+  labelIsCustom: boolean = true;
   constructor(
     private appDefineSvc: AppDefineService,
     private monitorSvc: MonitorService,
@@ -67,8 +67,7 @@ export class MonitorNewComponent implements OnInit {
     private notifySvc: NzNotificationService,
     @Inject(ALAIN_I18N_TOKEN) private i18nSvc: I18NService,
     private titleSvc: TitleService,
-    private collectorSvc: CollectorService,
-    private labelSvc: LabelService
+    private collectorSvc: CollectorService
   ) {
     this.monitor = new Monitor();
     this.grafanaDashboard = new GrafanaDashboard();
@@ -214,7 +213,6 @@ export class MonitorNewComponent implements OnInit {
           this.isSpinning = false;
         }
       );
-    this.loadLabels();
   }
 
   onScrapeChange(scrapeValue: string) {
@@ -333,34 +331,4 @@ export class MonitorNewComponent implements OnInit {
   onCancel() {
     this.router.navigateByUrl(`/monitors`);
   }
-
-  loadLabels() {
-    let labelsInit$ = this.labelSvc.loadLabels(undefined, undefined, 0, 
9999).subscribe(
-      message => {
-        if (message.code === 0) {
-          let page = message.data;
-          this.labelKeys = [...new Set(page.content.map(label => label.name))];
-
-          this.labelMap = {};
-
-          page.content.forEach(label => {
-            if (!this.labelMap[label.name]) {
-              this.labelMap[label.name] = [];
-            }
-
-            if (label.tagValue && 
!this.labelMap[label.name].includes(label.tagValue)) {
-              this.labelMap[label.name].push(label.tagValue);
-            }
-          });
-        } else {
-          console.warn(message.msg);
-        }
-        labelsInit$.unsubscribe();
-      },
-      error => {
-        labelsInit$.unsubscribe();
-        console.error(error.msg);
-      }
-    );
-  }
 }
diff --git a/web-app/src/app/routes/setting/status/status.component.html 
b/web-app/src/app/routes/setting/status/status.component.html
index 133f50b9ad..edbd709228 100644
--- a/web-app/src/app/routes/setting/status/status.component.html
+++ b/web-app/src/app/routes/setting/status/status.component.html
@@ -417,7 +417,7 @@
           <app-form-field
             [item]="{
               field: 'labels',
-              type: 'labels',
+              type: 'label-selector',
               required: true
             }"
             [name]="'sourceLabels'"
diff --git 
a/web-app/src/app/shared/components/form-field/form-field.component.html 
b/web-app/src/app/shared/components/form-field/form-field.component.html
index 078d8fadd5..148b5e78ef 100644
--- a/web-app/src/app/shared/components/form-field/form-field.component.html
+++ b/web-app/src/app/shared/components/form-field/form-field.component.html
@@ -224,5 +224,6 @@
     [id]="item.field"
     [labelKeys]="extra.labelKeys"
     [labelMap]="extra.labelMap"
+    [labelIsCustom]="extra.labelIsCustom"
   />
 </ng-container>
diff --git 
a/web-app/src/app/shared/components/label-selector/label-selector.component.html
 
b/web-app/src/app/shared/components/label-selector/label-selector.component.html
index e17fb6407f..0e34b7161b 100644
--- 
a/web-app/src/app/shared/components/label-selector/label-selector.component.html
+++ 
b/web-app/src/app/shared/components/label-selector/label-selector.component.html
@@ -32,7 +32,7 @@
     >
       <nz-option *ngFor="let keyOption of labelKeys" [nzLabel]="keyOption" 
[nzValue]="keyOption"></nz-option>
       <nz-option
-        *ngIf="customInputKey && !hasMatchingOption(customInputKey, labelKeys)"
+        *ngIf="labelIsCustom && customInputKey && 
!hasMatchingOption(customInputKey, labelKeys)"
         [nzLabel]="customInputKey"
         [nzValue]="customInputKey"
       ></nz-option>
@@ -53,7 +53,7 @@
     >
       <nz-option *ngFor="let valueOption of getLabelValues(value[i].key)" 
[nzLabel]="valueOption" [nzValue]="valueOption"></nz-option>
       <nz-option
-        *ngIf="customInputValue && !hasMatchingOption(customInputValue, 
getLabelValues(value[i].key))"
+        *ngIf="labelIsCustom && customInputValue && 
!hasMatchingOption(customInputValue, getLabelValues(value[i].key))"
         [nzLabel]="customInputValue"
         [nzValue]="customInputValue"
       ></nz-option>
diff --git 
a/web-app/src/app/shared/components/label-selector/label-selector.component.ts 
b/web-app/src/app/shared/components/label-selector/label-selector.component.ts
index 4c9708ac9b..031be73dfd 100644
--- 
a/web-app/src/app/shared/components/label-selector/label-selector.component.ts
+++ 
b/web-app/src/app/shared/components/label-selector/label-selector.component.ts
@@ -17,9 +17,11 @@
  * under the License.
  */
 
-import { Component, Input, forwardRef, Output, EventEmitter } from 
'@angular/core';
+import { Component, Input, forwardRef, OnInit } from '@angular/core';
 import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
 
+import { LabelService } from '../../../service/label.service';
+
 @Component({
   selector: 'app-label-selector',
   templateUrl: './label-selector.component.html',
@@ -32,11 +34,14 @@ import { ControlValueAccessor, NG_VALUE_ACCESSOR } from 
'@angular/forms';
     }
   ]
 })
-export class LabelSelectorComponent implements ControlValueAccessor {
+export class LabelSelectorComponent implements ControlValueAccessor, OnInit {
   @Input() name!: string;
   @Input() id!: string;
   @Input() labelKeys: string[] = [];
   @Input() labelMap: { [key: string]: string[] } = {};
+  @Input() labelIsCustom: boolean = false;
+
+  constructor(private labelSvc: LabelService) {}
 
   value: Array<{ key: string; value: string }> = [];
   customInputKey: string = '';
@@ -99,4 +104,42 @@ export class LabelSelectorComponent implements 
ControlValueAccessor {
   registerOnTouched(fn: any): void {
     this._onTouched = fn;
   }
+
+  ngOnInit(): void {
+    if (!this.labelKeys || this.labelKeys.length == 0) {
+      this.labelMap = {};
+      this.labelKeys = [];
+      this.loadLabels();
+    }
+  }
+
+  loadLabels() {
+    let labelsInit$ = this.labelSvc.loadLabels(undefined, undefined, 0, 
9999).subscribe(
+      message => {
+        if (message.code === 0) {
+          let page = message.data;
+          this.labelKeys = [...new Set(page.content.map(label => label.name))];
+
+          this.labelMap = {};
+
+          page.content.forEach(label => {
+            if (!this.labelMap[label.name]) {
+              this.labelMap[label.name] = [];
+            }
+
+            if (label.tagValue && 
!this.labelMap[label.name].includes(label.tagValue)) {
+              this.labelMap[label.name].push(label.tagValue);
+            }
+          });
+        } else {
+          console.warn(message.msg);
+        }
+        labelsInit$.unsubscribe();
+      },
+      error => {
+        labelsInit$.unsubscribe();
+        console.error(error.msg);
+      }
+    );
+  }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to