Skip to content

Commit 5a36751

Browse files
stefwaltermvollmer
authored andcommitted
Revealable text, both password masking and ellipsizing details
This manually cherry-picks: kubernetes-ui/object-describer#21 Closes #2383 Reviewed-by: Marius Vollmer <[email protected]>
1 parent 6f76a44 commit 5a36751

File tree

6 files changed

+75
-35
lines changed

6 files changed

+75
-35
lines changed

pkg/kubernetes/Makefile.am

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ kubernetesdebug_DATA = \
2626
pkg/kubernetes/node.js \
2727
pkg/kubernetes/object-describer.js \
2828
pkg/kubernetes/deploy.js \
29+
pkg/kubernetes/revealable.css \
2930
pkg/kubernetes/topology.css \
3031
pkg/kubernetes/topology.js \
3132
pkg/kubernetes/topology-graph.css \

pkg/kubernetes/app.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
@import url('details.css');
22
@import url('topology-graph.css');
33
@import url('topology.css');
4+
@import url('revealable.css');
45

56
#graphs {
67
display: block;

pkg/kubernetes/cluster.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ <h3 class="panel-title"><span class="fa fa-cube"></span> {{container.spec.name}}
265265
<div class="col-sm-6 kube-more">
266266
<dl>
267267
<dt class="header full" ng-if="container.spec.env.length">Environment</dt>
268-
<dd class="kube-id full" ng-repeat="env in container.spec.env">{{env.name}}={{env.value}}</dd>
268+
<dd class="kube-id full" revealable-text ng-repeat="env in container.spec.env">{{env.name}}=<span ng-class="{masked: should_mask(env.name)}">{{env.value}}</span></dd>
269269
</dl>
270270
</div>
271271
</div>

pkg/kubernetes/details.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,10 @@ define([
3434

3535
angular.extend($scope, {
3636
client: client,
37-
selection: list
37+
selection: list,
38+
should_mask: function(name) {
39+
return name.toLowerCase().indexOf("password") !== -1;
40+
}
3841
});
3942

4043
/*

pkg/kubernetes/object-describer.js

Lines changed: 22 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,12 @@ angular.module('kubernetesUI')
144144
scope: {
145145
containers: '='
146146
},
147-
templateUrl: 'views/containers.html'
147+
templateUrl: 'views/containers.html',
148+
link: function($scope, element, attrs) {
149+
$scope.shouldMask = function(name) {
150+
return name.toLowerCase().indexOf('password') !== -1;
151+
};
152+
}
148153
}
149154
})
150155
.directive("kubernetesObjectDescribeContainerStatuses", function() {
@@ -165,26 +170,19 @@ angular.module('kubernetesUI')
165170
templateUrl: 'views/container-state.html'
166171
};
167172
})
168-
.directive("collapseLongText", function() {
173+
.directive("revealableText", function() {
169174
return {
170175
restrict: 'A',
171-
scope: {
172-
value: '@',
173-
enableCollapse: '=?' // not intended to be passed in, it will be set depending on jquery availability
174-
},
175-
controller: ["$scope", function($scope) {
176-
// If jquery is available
177-
$scope.enableCollapse = !!window.$;
178-
}],
179176
link: function($scope, element, attrs) {
180-
if ($scope.enableCollapse) {
181-
$('.reveal-contents-link', element).click(function (evt) {
182-
$(this).hide();
183-
$('.reveal-contents', element).show();
184-
});
185-
}
186-
},
187-
templateUrl: 'views/_collapse-long-text.html'
177+
element.addClass('revealable');
178+
$(element).on("mouseover", function() {
179+
var clickable = element[0].scrollWidth > element[0].clientWidth || element.find(".masked")[0];
180+
element.toggleClass("clickable", clickable);
181+
});
182+
$(element).on("click", function() {
183+
element.toggleClass("revealed");
184+
});
185+
}
188186
}
189187
})
190188
.filter("isEmptyObj", function() {
@@ -196,28 +194,19 @@ angular.module('kubernetesUI')
196194
angular.module('kubernetesUI').run(['$templateCache', function($templateCache) {
197195
'use strict';
198196

199-
$templateCache.put('views/_collapse-long-text.html',
200-
"<span ng-hide=\"enableCollapse && value.length > 120\">{{value}}</span>\n" +
201-
"<span ng-show=\"enableCollapse && value.length > 120\">\n" +
202-
" <span class=\"reveal-contents-link\" style=\"cursor: pointer;\" title=\"Expand\">{{value.substring(0, 120)}}<a href=\"javascript:;\">...</a></span>\n" +
203-
" <span style=\"display: none;\" class=\"reveal-contents\">{{value}}</span>\n" +
204-
"</span>"
205-
);
206-
207-
208197
$templateCache.put('views/annotations.html',
209198
" <h3>Annotations</h3>\n" +
210199
" <span ng-if=\"!resource.metadata.annotations\"><em>none</em></span>\n" +
211200
" <dl class=\"dl-horizontal\" ng-if=\"resource.metadata.annotations\">\n" +
212201
" <dt ng-repeat-start=\"(annotationKey, annotationValue) in resource.metadata.annotations\" title=\"{{annotationKey}}\">{{annotationKey}}</dt>\n" +
213-
" <dd ng-repeat-end collapse-long-text value=\"{{annotationValue}}\"></dd>\n" +
202+
" <dd ng-repeat-end revealable-text>{{annotationValue}}</dd>\n" +
214203
" </dl>"
215204
);
216205

217206

218207
$templateCache.put('views/container-state.html',
219208
"<span ng-if=\"containerState | isEmptyObj\"><em>none</em></span>\n" +
220-
"<span ng-repeat=\"(state, stateDescription) in containerState | limitTo: 1\">\n" +
209+
"<span ng-repeat=\"(state, stateDescription) in containerState | limitTo: 1\" revealable-text>\n" +
221210
" <span ng-switch=\"state\">\n" +
222211
" <span ng-switch-when=\"waiting\">\n" +
223212
" Waiting\n" +
@@ -243,7 +232,7 @@ angular.module('kubernetesUI').run(['$templateCache', function($templateCache) {
243232
"<div ng-if=\"!containerStatuses\"><em>none</em></div>\n" +
244233
"<dl ng-repeat=\"containerStatus in containerStatuses | orderBy:'name'\" class=\"dl-horizontal\">\n" +
245234
" <dt>Name</dt>\n" +
246-
" <dd>{{containerStatus.name}}</dd>\n" +
235+
" <dd revealable-text>{{containerStatus.name}}</dd>\n" +
247236
" <dt>State</dt>\n" +
248237
" <dd>\n" +
249238
" <kubernetes-object-describe-container-state container-state=\"containerStatus.state\"></container-state>\n" +
@@ -264,9 +253,9 @@ angular.module('kubernetesUI').run(['$templateCache', function($templateCache) {
264253
"<div ng-if=\"!containers.length\"><em>none</em></div>\n" +
265254
"<dl class=\"dl-horizontal\" ng-repeat=\"container in containers\">\n" +
266255
"<dt>Name</dt>\n" +
267-
"<dd>{{container.name}}</dd>\n" +
256+
"<dd revealable-text>{{container.name}}</dd>\n" +
268257
"<dt>Image</dt>\n" +
269-
"<dd>{{container.image}}</dd>\n" +
258+
"<dd revealable-text>{{container.image}}</dd>\n" +
270259
"<dt>Ports</dt>\n" +
271260
"<dd>\n" +
272261
" <div ng-if=\"!container.ports.length\"><em>none</em></div>\n" +
@@ -277,7 +266,7 @@ angular.module('kubernetesUI').run(['$templateCache', function($templateCache) {
277266
"<dt>Env vars</dt>\n" +
278267
"<dd>\n" +
279268
" <div ng-if=\"!container.env.length\"><em>none</em></div>\n" +
280-
" <div ng-repeat=\"env in container.env | orderBy:'name'\" collapse-long-text value=\"{{env.name}}={{env.value}}\"></div>\n" +
269+
" <div ng-repeat=\"env in container.env | orderBy:'name'\" revealable-text>{{env.name}}=<span ng-class=\"{masked: shouldMask(env.name)}\">{{env.value}}</span></div>\n" +
281270
"</dd>\n" +
282271
"</dl>\n" +
283272
"<div ng-if=\"$index != 0\" style=\"margin-bottom: 10px;\"></div>\n"

pkg/kubernetes/revealable.css

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
.revealable {
2+
white-space: nowrap !important;
3+
text-overflow: ellipsis;
4+
overflow: hidden !important;
5+
}
6+
7+
.revealable.clickable {
8+
cursor: pointer;
9+
}
10+
11+
.revealed {
12+
white-space: normal !important;
13+
overflow: visible !important;
14+
cursor: pointer;
15+
overflow-wrap: break-word;
16+
}
17+
18+
.masked {
19+
color: transparent;
20+
position: relative;
21+
text-ellipsis: none !important;
22+
cursor: pointer;
23+
max-width: 1;
24+
display: inline-block;
25+
}
26+
27+
.masked:after {
28+
content: "●●●●";
29+
position: absolute;
30+
left: 0px;
31+
font-weight: bold;
32+
letter-spacing: 2px;
33+
padding-left: 2px;
34+
color: black;
35+
cursor: pointer;
36+
line-height: 1.5;
37+
opacity: 0.5;
38+
}
39+
40+
.revealed .masked:after {
41+
display: none;
42+
}
43+
44+
.revealed .masked {
45+
color: black;
46+
}

0 commit comments

Comments
 (0)