1
1
var AmpersandView = require ( 'ampersand-view' ) ;
2
2
var EJSON = require ( 'mongodb-extended-json' ) ;
3
+ var EditableQuery = require ( '../models/editable-query' ) ;
3
4
var _ = require ( 'lodash' ) ;
5
+ var $ = require ( 'jquery' ) ;
4
6
var Query = require ( 'mongodb-language-model' ) . Query ;
5
- // var debug = require('debug')('scout:refine-view:index');
7
+ var debug = require ( 'debug' ) ( 'scout:refine-view:index' ) ;
6
8
7
9
module . exports = AmpersandView . extend ( {
8
10
template : require ( './index.jade' ) ,
9
- props : {
10
- valid : {
11
- type : 'boolean' ,
12
- default : true
13
- }
14
- } ,
15
11
derived : {
16
12
notEmpty : {
17
- deps : [ 'model .queryString' ] ,
13
+ deps : [ 'editableQuery .queryString' ] ,
18
14
fn : function ( ) {
19
- return this . model . queryString !== '{}' ;
15
+ return this . editableQuery . queryString !== '{}' ;
20
16
}
21
17
}
22
18
} ,
19
+ children : {
20
+ editableQuery : EditableQuery
21
+ } ,
23
22
bindings : {
24
- 'model.queryString ' : {
23
+ 'editableQuery.rawString ' : {
25
24
type : 'value' ,
26
25
hook : 'refine-input'
27
26
} ,
27
+ // @todo , rethink these
28
28
notEmpty : [ {
29
29
type : 'toggle' ,
30
30
hook : 'reset-button'
@@ -34,7 +34,7 @@ module.exports = AmpersandView.extend({
34
34
yes : 'btn-info' ,
35
35
no : 'btn-default'
36
36
} ] ,
37
- valid : [
37
+ 'editableQuery. valid' : [
38
38
// red input border while query is invalid
39
39
{
40
40
type : 'booleanClass' ,
@@ -57,50 +57,33 @@ module.exports = AmpersandView.extend({
57
57
'input [data-hook=refine-input]' : 'inputChanged' ,
58
58
'submit form' : 'submit'
59
59
} ,
60
- _cleanupInput : function ( input ) {
61
- var output = input ;
62
- // accept whitespace-only input as empty query
63
- if ( _ . trim ( output ) === '' ) {
64
- output = '{}' ;
65
- }
66
- // replace single quotes with double quotes
67
- output = output . replace ( / ' / g, '"' ) ;
68
- // wrap field names in double quotes
69
- output = output . replace ( / ( [ { , ] ) \s * ( [ ^ , { \s \' " ] + ) \s * : / g, ' $1 "$2" : ' ) ;
70
- return output ;
60
+ initialize : function ( ) {
61
+ this . listenTo ( this . model , 'change:queryString' , this . onQueryChanged ) ;
62
+ } ,
63
+ onQueryChanged : function ( ) {
64
+ this . editableQuery . rawString = this . model . queryString ;
71
65
} ,
72
- /*eslint no-new: 0*/
73
66
inputChanged : function ( ) {
74
- // validate user input on the fly
75
- var queryStr = this . _cleanupInput ( this . queryByHook ( 'refine-input' ) . value ) ;
76
- try {
77
- // is it valid eJSON?
78
- var queryObj = EJSON . parse ( queryStr ) ;
79
- // is it a valid parsable Query according to the language?
80
- new Query ( queryObj , {
81
- parse : true
82
- } ) ;
83
- } catch ( e ) {
84
- this . valid = false ;
85
- return ;
86
- }
87
- this . valid = true ;
67
+ this . editableQuery . rawString = this . queryByHook ( 'refine-input' ) . value ;
88
68
} ,
89
69
resetClicked : function ( ) {
90
70
this . model . query = new Query ( ) ;
71
+ this . editableQuery . rawString = this . model . queryString ;
91
72
this . trigger ( 'submit' , this ) ;
92
73
} ,
93
74
refineClicked : function ( ) {
94
- var queryStr = this . _cleanupInput ( this . queryByHook ( 'refine-input' ) . value ) ;
95
- var queryObj = new Query ( EJSON . parse ( queryStr ) , {
75
+ var queryObj = new Query ( EJSON . parse ( this . editableQuery . cleanString ) , {
96
76
parse : true
97
77
} ) ;
98
78
this . model . query = queryObj ;
79
+ this . editableQuery . rawString = this . model . queryString ;
99
80
this . trigger ( 'submit' , this ) ;
100
81
} ,
101
82
submit : function ( evt ) {
102
83
evt . preventDefault ( ) ;
103
- if ( this . valid ) {
84
+ // lose focus on input field first, see http://ampersandjs.com/docs#ampersand-dom-bindings-value
85
+ $ ( evt . delegateTarget ) . find ( 'input' ) . blur ( ) ;
86
+ if ( this . editableQuery . valid ) {
104
87
this . refineClicked ( ) ;
105
88
}
106
89
}
0 commit comments