@@ -411,17 +411,17 @@ export default {
411411 }
412412
413413 // Build labels as map[string]string as expected by the API.
414+ // An empty value means: filter by key regardless of value.
414415 const labels = {};
415416 const seen = new Set ();
416417 for (const label of this .selectedLabels ) {
417- if (label .key && label .value ) {
418- const pairKey = ` ${ label .key } ::${ label .value } ` ;
419- if (seen .has (pairKey)) {
418+ if (label .key ) {
419+ if (seen .has (label .key )) {
420420 continue ;
421421 }
422422
423- seen .add (pairKey );
424- labels[label .key ] = label .value ;
423+ seen .add (label . key );
424+ labels[label .key ] = label .value || " " ;
425425 }
426426 }
427427 if (Object .keys (labels).length > 0 ) {
@@ -535,6 +535,21 @@ export default {
535535
536536 async onLabelKeyChange (index ) {
537537 const labelKey = this .selectedLabels [index].key ;
538+
539+ const isDuplicateKey = this .selectedLabels .some ((selectedLabel , selectedIndex ) => {
540+ if (selectedIndex === index || ! labelKey) {
541+ return false ;
542+ }
543+
544+ return selectedLabel .key === labelKey;
545+ });
546+
547+ if (isDuplicateKey) {
548+ this .selectedLabels [index].key = null ;
549+ this .selectedLabels [index].value = null ;
550+ return ;
551+ }
552+
538553 if (labelKey) {
539554 await this .getLabelValues (labelKey);
540555 }
@@ -564,7 +579,7 @@ export default {
564579 canAddNewLabelRow () {
565580 // Don't allow adding a new row if the last row is incomplete
566581 const lastLabel = this .selectedLabels [this .selectedLabels .length - 1 ];
567- return lastLabel .key && lastLabel . value ;
582+ return !! lastLabel .key ;
568583 },
569584
570585 addLabelRow () {
0 commit comments