@@ -56,24 +56,31 @@ export interface ITunnelViewModel {
5656 readonly forwarded : TunnelItem [ ] ;
5757 readonly detected : TunnelItem [ ] ;
5858 readonly candidates : Promise < TunnelItem [ ] > ;
59- readonly input : ITunnelItem | ITunnelGroup | undefined ;
59+ readonly input : TunnelItem ;
6060 groups ( ) : Promise < ITunnelGroup [ ] > ;
6161}
6262
6363export class TunnelViewModel extends Disposable implements ITunnelViewModel {
6464 private _onForwardedPortsChanged : Emitter < void > = new Emitter ( ) ;
6565 public onForwardedPortsChanged : Event < void > = this . _onForwardedPortsChanged . event ;
6666 private model : TunnelModel ;
67- private _input : ITunnelItem | ITunnelGroup | undefined ;
67+ private _input : TunnelItem ;
6868
6969 constructor (
70- @IRemoteExplorerService remoteExplorerService : IRemoteExplorerService ) {
70+ @IRemoteExplorerService private readonly remoteExplorerService : IRemoteExplorerService ) {
7171 super ( ) ;
7272 this . model = remoteExplorerService . tunnelModel ;
7373 this . _register ( this . model . onForwardPort ( ( ) => this . _onForwardedPortsChanged . fire ( ) ) ) ;
7474 this . _register ( this . model . onClosePort ( ( ) => this . _onForwardedPortsChanged . fire ( ) ) ) ;
7575 this . _register ( this . model . onPortName ( ( ) => this . _onForwardedPortsChanged . fire ( ) ) ) ;
7676 this . _register ( this . model . onCandidatesChanged ( ( ) => this . _onForwardedPortsChanged . fire ( ) ) ) ;
77+ this . _input = {
78+ label : nls . localize ( 'remote.tunnelsView.add' , "Forward a Port..." ) ,
79+ tunnelType : TunnelType . Add ,
80+ remoteHost : 'localhost' ,
81+ remotePort : 0 ,
82+ description : ''
83+ } ;
7784 }
7885
7986 async groups ( ) : Promise < ITunnelGroup [ ] > {
@@ -100,20 +107,20 @@ export class TunnelViewModel extends Disposable implements ITunnelViewModel {
100107 items : candidates
101108 } ) ;
102109 }
103- if ( ! this . _input ) {
104- this . _input = {
105- label : nls . localize ( 'remote.tunnelsView.add' , "Forward a Port..." ) ,
106- tunnelType : TunnelType . Add ,
107- } ;
110+ if ( groups . length === 0 ) {
111+ groups . push ( this . _input ) ;
108112 }
109- groups . push ( this . _input ) ;
110113 return groups ;
111114 }
112115
113116 get forwarded ( ) : TunnelItem [ ] {
114- return Array . from ( this . model . forwarded . values ( ) ) . map ( tunnel => {
117+ const forwarded = Array . from ( this . model . forwarded . values ( ) ) . map ( tunnel => {
115118 return new TunnelItem ( TunnelType . Forwarded , tunnel . remoteHost , tunnel . remotePort , tunnel . localAddress , tunnel . closeable , tunnel . name , tunnel . description ) ;
116119 } ) ;
120+ if ( this . remoteExplorerService . getEditableData ( undefined ) ) {
121+ forwarded . push ( this . _input ) ;
122+ }
123+ return forwarded ;
117124 }
118125
119126 get detected ( ) : TunnelItem [ ] {
@@ -135,7 +142,7 @@ export class TunnelViewModel extends Disposable implements ITunnelViewModel {
135142 } ) ;
136143 }
137144
138- get input ( ) : ITunnelItem | ITunnelGroup | undefined {
145+ get input ( ) : TunnelItem {
139146 return this . _input ;
140147 }
141148
@@ -522,6 +529,7 @@ export class TunnelPanel extends ViewPane {
522529 this . tunnelCloseableContext . set ( ! ! node . closeable ) ;
523530 } else {
524531 this . tunnelTypeContext . set ( TunnelType . Add ) ;
532+ this . tunnelCloseableContext . set ( false ) ;
525533 }
526534
527535 const actions : IAction [ ] = [ ] ;
0 commit comments