@@ -5,6 +5,11 @@ var format = require('util').format;
55var $ = require ( 'jquery' ) ;
66var app = require ( 'ampersand-app' ) ;
77
8+ // var debug = require('debug')('scout:connect:index');
9+
10+ require ( 'bootstrap/js/popover' ) ;
11+ require ( 'bootstrap/js/tooltip' ) ;
12+
813var ConnectionView = View . extend ( {
914 props : {
1015 model : Connection ,
@@ -14,7 +19,7 @@ var ConnectionView = View.extend({
1419 }
1520 } ,
1621 events : {
17- click : 'onClick' ,
22+ ' click a' : 'onClick' ,
1823 dblclick : 'onDoubleClick' ,
1924 mouseover : 'onMouseOver' ,
2025 mouseout : 'onMouseOut' ,
@@ -34,9 +39,8 @@ var ConnectionView = View.extend({
3439 event . stopPropagation ( ) ;
3540 event . preventDefault ( ) ;
3641
37- $ ( '[name=hostname]' ) . val ( this . model . hostname ) ;
38- $ ( '[name=port]' ) . val ( this . model . port ) ;
39- $ ( '[name=name]' ) . val ( this . model . name ) ;
42+ // fill in the form with the clicked connection details
43+ this . parent . parent . displayedConnection . set ( this . model . serialize ( ) ) ;
4044 } ,
4145 onDoubleClick : function ( event ) {
4246 this . onClick ( event ) ;
@@ -55,6 +59,7 @@ var ConnectionView = View.extend({
5559 }
5660} ) ;
5761
62+
5863var SidebarView = View . extend ( {
5964 template : require ( './sidebar.jade' ) ,
6065 render : function ( ) {
@@ -67,6 +72,10 @@ var SidebarView = View.extend({
6772 * @todo (imlucas) Use ampersand-form-view.
6873 */
6974var ConnectView = View . extend ( {
75+ template : require ( './index.jade' ) ,
76+ children : {
77+ displayedConnection : Connection
78+ } ,
7079 collections : {
7180 connections : ConnectionCollection
7281 } ,
@@ -81,6 +90,18 @@ var ConnectView = View.extend({
8190 }
8291 } ,
8392 bindings : {
93+ 'displayedConnection.name' : {
94+ type : 'value' ,
95+ hook : 'name'
96+ } ,
97+ 'displayedConnection.hostname' : {
98+ type : 'value' ,
99+ hook : 'hostname'
100+ } ,
101+ 'displayedConnection.port' : {
102+ type : 'value' ,
103+ hook : 'port'
104+ } ,
84105 has_error : {
85106 hook : 'message' ,
86107 type : 'booleanClass' ,
@@ -98,38 +119,88 @@ var ConnectView = View.extend({
98119 ]
99120 } ,
100121 events : {
122+ 'input [data-hook=name]' : 'onNameChanged' ,
123+ 'input [data-hook=port]' : 'onPortChanged' ,
124+ 'input [data-hook=hostname]' : 'onHostNameChanged' ,
101125 'submit form' : 'onSubmit'
102126 } ,
127+ onNameChanged : function ( evt ) {
128+ this . displayedConnection . name = evt . target . value ;
129+ } ,
130+ onPortChanged : function ( evt ) {
131+ this . displayedConnection . portString = evt . target . value ;
132+ } ,
133+ onHostNameChanged : function ( evt ) {
134+ this . displayedConnection . hostname = evt . target . value ;
135+ } ,
103136 initialize : function ( ) {
104137 document . title = 'Connect to MongoDB' ;
138+ this . displayedConnection . set ( {
139+ name : '' ,
140+ portString : '' ,
141+ hostname : ''
142+ } ) ;
105143 this . connections . fetch ( ) ;
106144 } ,
107145 onSubmit : function ( event ) {
108146 event . stopPropagation ( ) ;
109147 event . preventDefault ( ) ;
110- app . statusbar . show ( ) ;
111- this . message = format ( 'Testing connection...' ) ;
148+
149+ // choose default connection values if unset
150+ if ( ! this . displayedConnection . hostname ) {
151+ this . displayedConnection . unset ( 'hostname' ) ;
152+ }
153+ if ( ! this . displayedConnection . portString ) {
154+ this . displayedConnection . unset ( 'portString' ) ;
155+ }
156+
112157 this . has_error = false ;
113158
114- var hostname = $ ( this . el ) . find ( '[name=hostname]' ) . val ( ) || 'localhost' ;
115- var port = parseInt ( $ ( this . el ) . find ( '[name=port]' ) . val ( ) || 27017 , 10 ) ;
116- var name = $ ( this . el ) . find ( '[name=name]' ) . val ( ) || 'Local' ;
159+ var existingConnection = this . connections . get ( this . displayedConnection . uri ) ;
160+ if ( this . displayedConnection . name !== ''
161+ && existingConnection
162+ && existingConnection . name !== this . displayedConnection . name ) {
163+ // the connection uri (`host:port`) exists already, but under a different name
164+ app . statusbar . hide ( ) ;
165+ this . has_error = true ;
166+ this . message = format ( 'This connection already exists '
167+ + 'under the name "%s". Click "Connect" again to use this connection.' ,
168+ existingConnection . name ) ;
169+ this . displayedConnection . name = existingConnection . name ;
170+ return ;
171+ }
117172
118- new Connection ( {
119- name : name ,
120- hostname : hostname ,
121- port : port
122- } ) . test ( this . onConnectionTested . bind ( this ) ) ;
173+ // now test if the connection name already exists with another uri
174+ existingConnection = this . connections . get ( this . displayedConnection . name , 'name' ) ;
175+ if ( this . displayedConnection . name !== ''
176+ && existingConnection
177+ && existingConnection . uri !== this . displayedConnection . uri ) {
178+ // the connection name exists already, but with a different uri
179+ app . statusbar . hide ( ) ;
180+ this . has_error = true ;
181+ this . message = format ( 'Another connection with the name "%s" already exists. Please '
182+ + 'choose a different name.' ,
183+ existingConnection . name ) ;
184+ return ;
185+ }
186+
187+ // now test if the server is reachable
188+ app . statusbar . show ( ) ;
189+ this . message = '' ;
190+ this . displayedConnection . test ( this . onConnectionTested . bind ( this ) ) ;
123191 } ,
124192 onConnectionTested : function ( err , model ) {
125193 app . statusbar . hide ( ) ;
126194 if ( err ) {
127195 this . has_error = true ;
128- this . message = format ( 'Could not connect to %s' , model . uri ) ;
196+ this . message = format ( 'Could not connect to %s, please check that a MongoDB instance '
197+ + 'is running there.' , model . uri ) ;
129198 } else {
130- model . save ( ) ;
131- this . connections . add ( model ) ;
132- this . message = 'Connected!' ;
199+ if ( model . name !== '' ) {
200+ // only store if the user chose a name to save the connection
201+ model . save ( ) ;
202+ this . connections . add ( model ) ;
203+ }
133204 window . open ( format ( '%s?uri=%s#schema' , window . location . origin , model . uri ) ) ;
134205
135206 setTimeout ( this . set . bind ( this , {
@@ -138,7 +209,16 @@ var ConnectView = View.extend({
138209 setTimeout ( window . close , 1000 ) ;
139210 }
140211 } ,
141- template : require ( './index.jade' ) ,
212+ render : function ( ) {
213+ this . renderWithTemplate ( this ) ;
214+ // enable popovers
215+ $ ( this . query ( '[data-toggle="popover"]' ) )
216+ . popover ( {
217+ container : 'body' ,
218+ placement : 'top' ,
219+ trigger : 'hover'
220+ } ) ;
221+ } ,
142222 subviews : {
143223 sidebar : {
144224 waitFor : 'connections' ,
0 commit comments