1
1
// Licensed to the .NET Foundation under one or more agreements.
2
2
// The .NET Foundation licenses this file to you under the MIT license.
3
3
4
+ using System . Diagnostics ;
4
5
using Aspire . Dashboard . Model ;
5
6
using Google . Protobuf . WellKnownTypes ;
6
7
using Microsoft . AspNetCore . Components ;
@@ -23,28 +24,29 @@ public partial class ResourceDetails
23
24
24
25
private bool _showAll ;
25
26
private ResourceViewModel ? _resource ;
27
+ private readonly HashSet < string > _unmaskedItemNames = new ( ) ;
26
28
27
- private IQueryable < EnvironmentVariableViewModel > FilteredEnvironmentVariables =>
29
+ internal IQueryable < EnvironmentVariableViewModel > FilteredEnvironmentVariables =>
28
30
Resource . Environment
29
31
. Where ( vm => ( _showAll || vm . FromSpec ) && ( ( IPropertyGridItem ) vm ) . MatchesFilter ( _filter ) )
30
32
. AsQueryable ( ) ;
31
33
32
- private IQueryable < DisplayedEndpoint > FilteredEndpoints =>
34
+ internal IQueryable < DisplayedEndpoint > FilteredEndpoints =>
33
35
GetEndpoints ( )
34
36
. Where ( vm => vm . MatchesFilter ( _filter ) )
35
37
. AsQueryable ( ) ;
36
38
37
- private IQueryable < VolumeViewModel > FilteredVolumes =>
39
+ internal IQueryable < VolumeViewModel > FilteredVolumes =>
38
40
Resource . Volumes
39
41
. Where ( vm => vm . MatchesFilter ( _filter ) )
40
42
. AsQueryable ( ) ;
41
43
42
- private IQueryable < HealthReportViewModel > FilteredHealthReports =>
44
+ internal IQueryable < HealthReportViewModel > FilteredHealthReports =>
43
45
Resource . HealthReports
44
46
. Where ( vm => vm . MatchesFilter ( _filter ) )
45
47
. AsQueryable ( ) ;
46
48
47
- private IQueryable < ResourcePropertyViewModel > FilteredResourceProperties =>
49
+ internal IQueryable < ResourcePropertyViewModel > FilteredResourceProperties =>
48
50
GetResourceProperties ( ordered : true )
49
51
. Where ( vm => ( _showAll || vm . KnownProperty != null ) && vm . MatchesFilter ( _filter ) )
50
52
. AsQueryable ( ) ;
@@ -55,14 +57,27 @@ public partial class ResourceDetails
55
57
private bool _isHealthChecksExpanded ;
56
58
57
59
private string _filter = "" ;
58
- private bool _isMaskAllChecked = true ;
60
+ private bool ? _isMaskAllChecked ;
61
+
62
+ private bool IsMaskAllChecked
63
+ {
64
+ get => _isMaskAllChecked ?? false ;
65
+ set { _isMaskAllChecked = value ; }
66
+ }
59
67
60
68
private readonly GridSort < DisplayedEndpoint > _endpointValueSort = GridSort < DisplayedEndpoint > . ByAscending ( vm => vm . Url ?? vm . Text ) ;
61
69
62
70
protected override void OnParametersSet ( )
63
71
{
64
72
if ( ! ReferenceEquals ( Resource , _resource ) )
65
73
{
74
+ // Reset masking when the resource changes.
75
+ if ( ! string . Equals ( Resource . Name , _resource ? . Name , StringComparisons . ResourceName ) )
76
+ {
77
+ _isMaskAllChecked = true ;
78
+ _unmaskedItemNames . Clear ( ) ;
79
+ }
80
+
66
81
_resource = Resource ;
67
82
68
83
// Collapse details sections when they have no data.
@@ -73,7 +88,14 @@ protected override void OnParametersSet()
73
88
74
89
foreach ( var item in SensitiveGridItems )
75
90
{
76
- item . IsValueMasked = _isMaskAllChecked ;
91
+ if ( _isMaskAllChecked != null )
92
+ {
93
+ item . IsValueMasked = _isMaskAllChecked . Value ;
94
+ }
95
+ else if ( _unmaskedItemNames . Count > 0 )
96
+ {
97
+ item . IsValueMasked = ! _unmaskedItemNames . Contains ( item . Name ) ;
98
+ }
77
99
}
78
100
}
79
101
}
@@ -95,25 +117,37 @@ private IEnumerable<ResourcePropertyViewModel> GetResourceProperties(bool ordere
95
117
96
118
private void OnMaskAllCheckedChanged ( )
97
119
{
120
+ Debug . Assert ( _isMaskAllChecked != null ) ;
121
+
122
+ _unmaskedItemNames . Clear ( ) ;
123
+
98
124
foreach ( var vm in SensitiveGridItems )
99
125
{
100
- vm . IsValueMasked = _isMaskAllChecked ;
126
+ vm . IsValueMasked = _isMaskAllChecked . Value ;
101
127
}
102
128
}
103
129
104
- private void OnValueMaskedChanged ( )
130
+ private void OnValueMaskedChanged ( IPropertyGridItem vm )
105
131
{
106
132
// Check the "Mask All" checkbox if all sensitive values are masked.
107
-
108
- foreach ( var item in SensitiveGridItems )
133
+ var valueMaskedValues = SensitiveGridItems . Select ( i => i . IsValueMasked ) . Distinct ( ) . ToList ( ) ;
134
+ if ( valueMaskedValues . Count == 1 )
135
+ {
136
+ _isMaskAllChecked = valueMaskedValues [ 0 ] ;
137
+ _unmaskedItemNames . Clear ( ) ;
138
+ }
139
+ else
109
140
{
110
- if ( ! item . IsValueMasked )
141
+ _isMaskAllChecked = null ;
142
+
143
+ if ( vm . IsValueMasked )
111
144
{
112
- _isMaskAllChecked = false ;
113
- return ;
145
+ _unmaskedItemNames . Remove ( vm . Name ) ;
146
+ }
147
+ else
148
+ {
149
+ _unmaskedItemNames . Add ( vm . Name ) ;
114
150
}
115
151
}
116
-
117
- _isMaskAllChecked = true ;
118
152
}
119
153
}
0 commit comments