diff --git a/htrace-core/src/web/app/setup.js b/htrace-core/src/web/app/setup.js index 90915e3..f7b393c 100644 --- a/htrace-core/src/web/app/setup.js +++ b/htrace-core/src/web/app/setup.js @@ -28,7 +28,7 @@ var BaseView = Backbone.Marionette.LayoutView.extend({ var Router = Backbone.Marionette.AppRouter.extend({ "routes": { "": "init", - "!/search(/:query)": "search", + "!/search(?:query)": "search", "!/spans/:id": "span", "!/swimlane/:id": "swimlane", "!/swimlane/:id:?:lim": "swimlane" @@ -37,7 +37,6 @@ var Router = Backbone.Marionette.AppRouter.extend({ "initialize": function() { // Collection this.spansCollection = new app.Spans(); - this.spansCollection.fetch(); }, "init": function() { @@ -48,9 +47,31 @@ var Router = Backbone.Marionette.AppRouter.extend({ var top = new app.SearchView(); app.root.app.show(top); + var predicates; + if (query) { + predicates = _(query.split(";")) + .map(function(predicate) { + return _(predicate.split('&')) + .reduce(function(mem, op) { + var op = op.split('='); + mem[op[0]] = op[1]; + return mem; + }, {}); + }); + this.spansCollection.fullCollection.reset(); + this.spansCollection.setPredicates(predicates); + } + else { + this.spansCollection.fullCollection.reset(); + this.spansCollection.setPredicates([{"op":"cn","field":"description","val":""}]); + } + this.spansCollection.fetch(); + top.controls.show(new app.SearchControlsView({ - "collection": this.spansCollection + "collection": this.spansCollection, + "predicates": predicates })); + top.main.show(new Backgrid.Grid({ "collection": this.spansCollection, "columns": [{ diff --git a/htrace-core/src/web/app/views/search/field.js b/htrace-core/src/web/app/views/search/field.js index 34b0110..c9f048a 100644 --- a/htrace-core/src/web/app/views/search/field.js +++ b/htrace-core/src/web/app/views/search/field.js @@ -35,6 +35,7 @@ app.SearchFieldView = Backbone.View.extend({ 'render': function() { this.$el.html(this.template({ field: this.field })); this.showSearchField(); + if (this.options.value) this.setValue(); return this; }, @@ -106,5 +107,18 @@ app.SearchFieldView = Backbone.View.extend({ default: return ''; } + }, + + 'setValue': function() { + switch (this.field) { + case 'begin': + case 'end': + this.$('select.op').val(this.options.op); + this.$('input.start-end-date-time').val(moment.unix(this.options.value).format('YYYY-MM-DD HH:mm')); + case 'duration': + this.$("input.duration").val(this.options.value); + case 'description': + this.$('input.description').val(this.options.value); + } } }); diff --git a/htrace-core/src/web/app/views/search/search.js b/htrace-core/src/web/app/views/search/search.js index 3b74b01..b497034 100644 --- a/htrace-core/src/web/app/views/search/search.js +++ b/htrace-core/src/web/app/views/search/search.js @@ -33,7 +33,8 @@ app.SearchControlsView = Backbone.Marionette.View.extend({ "click button.search": "search", }, - "initialize": function() { + "initialize": function(options) { + this.options = options; this.predicates = []; this.searchFields = []; this.searchFields.push(new app.SearchFieldView({ @@ -41,23 +42,38 @@ app.SearchControlsView = Backbone.Marionette.View.extend({ manager: this, field: 'description' })); + + + this.on('removeSearchField', this.removeSearchField, this); }, "render": function() { this.$el.html(this.template()); this.$el.find('.search-fields').append(this.searchFields[0].render().$el); + + _(this.options.predicates).each(function(pred) { + if (pred.field === 'description') { + this.$el.find('input.description').val(pred.val); + } else { + this.addSearchField(pred); + } + }.bind(this)); + return this; }, "addSearchField": function(e) { - var target = $(e.target); - $('button.field').text(target.text()); - var newSearchField = new app.SearchFieldView({ + var target = e.target ? $(e.target) : e; + if (e.target) $('button.field').text(target.text()); + var searchOptions = { predicates: this.predicates, manager: this, - field: target.data('field') - }); + field: target.data ? target.data('field') : target.field, + } + if (!e.target) _.extend(searchOptions, { value: target.val, op: target.op}) + + var newSearchField = new app.SearchFieldView(searchOptions); this.$el.find('.search-fields').append(newSearchField.render().$el); this.searchFields.push(newSearchField); }, @@ -70,10 +86,13 @@ app.SearchControlsView = Backbone.Marionette.View.extend({ "search": function(e) { this.predicates = _(this.searchFields).map(function(field) { return field.getPredicate(); - }).filter(function(predicate) { - return predicate.val; }); + this.searchParams = _(this.predicates).map(function(predicate) { + return $.param(predicate); + }).join(';'); + Backbone.history.navigate('!/search?' + this.searchParams, { trigger: false }); + this.collection.switchMode("infinite", { fetch: false, resetState: true