1- import { CodeObjectUsageStatus , UsageStatusResults } from "../../../services/analyticsProvider" ;
1+ import { CodeObjectUsageStatus , EnvironmentUsageStatus , UsageStatusResults } from "../../../services/analyticsProvider" ;
22import { Settings } from "../../../settings" ;
33import { WebViewUris } from "../../webViewUtils" ;
44import * as os from 'os' ;
5+ import moment = require( "moment" ) ;
56
67export interface IRenderCodeObjectGroupEnvironments {
78
@@ -42,18 +43,40 @@ export class CodeObjectGroupEnvironments implements IRenderCodeObjectGroupEnviro
4243 return environment . toLowerCase ( ) . startsWith ( os . hostname ( ) ) ;
4344 }
4445
45- private getEnvironmentHtml ( envName : string , envDisplayName : string , envClass : string , codeObjectStatuses : CodeObjectUsageStatus [ ] ) {
46- let firstUpdateTimes = codeObjectStatuses . map ( x => x . firstRecordedTime ) . sort ( ) . firstOrDefault ( ) ;
47- let lastUpdateTimes = codeObjectStatuses . map ( x => x . lastRecordedTime ) . sort ( ) . reverse ( ) . firstOrDefault ( ) ;
46+ private getEnvironmentHtml ( envName : string , envDisplayName : string , isLocal : boolean ,
47+ isused :boolean ,
48+ codeObjectStatuses : CodeObjectUsageStatus [ ] ,
49+ environmentStatus : EnvironmentUsageStatus ) {
50+
51+ let firstUpdateTime = "" ;
52+ let lastUpdateTime = "" ;
53+
54+ if ( isLocal ) {
55+ firstUpdateTime = environmentStatus . environmentFirstRecordedTime . fromNow ( ) ;
56+ lastUpdateTime = environmentStatus . environmentLastRecordedTime . fromNow ( ) ;
57+
58+ }
59+ else {
60+ firstUpdateTime = codeObjectStatuses . map ( x => x . firstRecordedTime ) . sort ( ) . firstOrDefault ( ) ?. fromNow ( ) ;
61+ lastUpdateTime = codeObjectStatuses . map ( x => x . lastRecordedTime ) . sort ( ) . reverse ( ) . firstOrDefault ( ) ?. fromNow ( ) ;
62+
63+ }
64+
65+ let envClass :string = "" ;
66+ if ( isLocal ) {
67+ envClass = "codeobj-local-environment" ;
68+ }
69+
70+ const image = isused ? 'used.png' : 'unused.png' ;
4871 return `
4972 <span class="codeobj-environment-usage" >
50- <img style="align-self:center;vertical-align:baseline" src="${ this . _viewUris . image ( "used.png" ) } " width="8" height="8"
51- title="Last data received: ${ lastUpdateTimes ?. fromNow ( ) } \nFirst data received: ${ firstUpdateTimes ?. fromNow ( ) } ">
73+ <img style="align-self:center;vertical-align:baseline" src="${ this . _viewUris . image ( image ) } " width="8" height="8"
74+ title="Last data received: ${ lastUpdateTime } \nFirst data received: ${ firstUpdateTime } ">
5275 <span class="${ this . getSelectedOrUnselectedTag ( envName ) } ${ envClass } " data-env-name="${ envName } ">${ envDisplayName } </span>
5376 </span>` ;
5477 }
5578
56- private getUsedEnvironmentHtml ( item : string | undefined , type :string | undefined , usageResults : UsageStatusResults ) {
79+ private getUsedEnvironmentsHtml ( item : string | undefined , type :string | undefined , usageResults : UsageStatusResults ) {
5780
5881 let usageItems = this . filterByTypeAndName ( item , type , usageResults ) ;
5982 let usageByEnv = usageItems . groupBy ( x => x . environment ) ;
@@ -62,44 +85,53 @@ export class CodeObjectGroupEnvironments implements IRenderCodeObjectGroupEnviro
6285 let html = `` ;
6386
6487 if ( localEnvironment ) {
65- const envSpecialClass = "codeobj-local-environment" ;
88+ let environmentUsage = usageResults . environmentStatuses . filter ( x => x . name === localEnvironment ) . single ( ) ;
6689 let items = usageByEnv [ localEnvironment ] ;
67- html += this . getEnvironmentHtml ( localEnvironment , "LOCAL" , envSpecialClass , items ) ;
90+ html += this . getEnvironmentHtml ( localEnvironment , "LOCAL" , true , true , items , environmentUsage ) ;
6891 }
6992
7093 for ( const env of environments . sort ( ) ) {
7194 if ( this . isEnvironmentLocal ( env ) ) {
7295 continue ;
7396 }
97+ let environmentUsage = usageResults . environmentStatuses . filter ( x => x . name === env ) . single ( ) ;
7498 let items = usageByEnv [ env ] ;
75- html += this . getEnvironmentHtml ( env , env , "" , items ) ;
99+ html += this . getEnvironmentHtml ( env , env , false , true , items , environmentUsage ) ;
76100
77101 }
78102 return html ;
79103 }
80104
81- private getUnusedEnvironmentHtml ( item : string | undefined , type :string | undefined , usageResults : UsageStatusResults ) {
82- let usageItems = this . filterByTypeAndName ( item , type , usageResults ) . map ( x => x . environment ) ;
105+ private getUnusedEnvironmentsHtml ( item : string | undefined , type :string | undefined , usageResults : UsageStatusResults ) {
106+ let usedEnvironments = this . filterByTypeAndName ( item , type , usageResults ) . map ( x => x . environment ) ;
107+ let unusedEnvs = usageResults . environmentStatuses . filter ( x => ! usedEnvironments . includes ( x . name ) ) ;
108+
83109 let html = `` ;
110+ let localEnvironment = unusedEnvs . filter ( x => this . isLocalEnvironmentMine ( x . name ) ) . firstOrDefault ( ) ;
84111
85- let unusedEnvs = usageResults . environmentStatuses . filter ( x => ! usageItems . includes ( x . name ) ) ;
86- for ( const env of unusedEnvs ) {
87- html += `
88- <span class="codeobj-environment-usage" >
89- <img style="align-self:center;vertical-align:baseline" src="${ this . _viewUris . image ( "unused.png" ) } " width="8" height="8"
90- title="Last data received from env: ${ env . environmentLastRecordedTime . fromNow ( ) } \nFirst data received: ${ env . environmentFirstRecordedTime . fromNow ( ) } ">
91- <span class="${ this . getSelectedOrUnselectedTag ( env . name ) } " data-env-name="${ env . name } ">${ env . name } </span>
92- </span>` ;
112+
113+ if ( localEnvironment ) {
114+ let environmentUsage = usageResults . environmentStatuses . filter ( x => x . name === localEnvironment . name ) . single ( ) ;
115+ html += this . getEnvironmentHtml ( localEnvironment . name , "LOCAL" , true , false , [ ] , environmentUsage ) ;
116+ }
117+
118+ for ( const env of unusedEnvs . sort ( ) ) {
119+ if ( this . isEnvironmentLocal ( env . name ) ) {
120+ continue ;
121+ }
122+ let environmentUsage = usageResults . environmentStatuses . filter ( x => x . name === env . name ) . single ( ) ;
123+ html += this . getEnvironmentHtml ( env . name , env . name , false , false , [ ] , environmentUsage ) ;
93124
94125 }
95126 return html ;
96-
127+
128+
97129
98130 }
99131
100132 public getUsageHtml ( item : string | undefined , type :string | undefined , usageResults : UsageStatusResults ) {
101133
102- if ( usageResults . environmentStatuses . length <= 1 ) {
134+ if ( usageResults . environmentStatuses . length < 1 ) {
103135 return '' ;
104136 }
105137
@@ -109,8 +141,8 @@ export class CodeObjectGroupEnvironments implements IRenderCodeObjectGroupEnviro
109141
110142 return `
111143 <div class="codeobj-environment-usage-group">
112- ${ this . getUsedEnvironmentHtml ( item , type , usageResults ) }
113- ${ this . getUnusedEnvironmentHtml ( item , type , usageResults ) }
144+ ${ this . getUsedEnvironmentsHtml ( item , type , usageResults ) }
145+ ${ this . getUnusedEnvironmentsHtml ( item , type , usageResults ) }
114146 </div>` ;
115147 }
116148
0 commit comments