blob: d5458bd14d84aa2be582043e13c65ebf26f13c9f [file] [log] [blame]
<!-- The <search-controls-sk> custom element declaration.
This is a general element to be used by all pages that
call a search endpoint on the backend.
It encapsulates the state of the query. When that state
is changed through some of the controls it updates the URL
and send an update to the host element to reload data based
on the new query state.
The state object contains these fiels:
- pos: show positive (boolean).
- neg: show negative (boolean).
- unt: show untriaged (boolean).
- include: show ignored digests (boolean).
- head: only digests that are currently in HEAD.
- query: query string to select configuration.
Attributes:
state - The current query state.
orientation - Orientation of the controls. Values: 'horizontal', 'vertical'
disabled - Boolean to indicate whether to disable all the controls.
beta - Boolean to enable beta-level functions.
Events:
'state-change' - Fired when the state of the query changes and
it needs to be reloaded. The 'detail' field of the event contains
the new state represented by the controls.
Methods:
setState(state) - Set the state of the controls to 'state'.
setParamSet(params) - Sets the parameters of the enclosed query-dialog-sk element
and enables the controls accordingly.
setCommitInfo(commitinfo) - Where commitinfo is an array of objects of the form:
{
author: "foo@example.org"
commit_time: 1428574804
hash: "d9f8862ab6bed4195cbfe5dda48693e1062b01e2"
}
-->
<link rel="import" href="bower_components/polymer/polymer.html">
<link rel="import" href="bower_components/iron-flex-layout/iron-flex-layout-classes.html">
<link rel="import" href="bower_components/paper-toggle-button/paper-toggle-button.html">
<link rel="import" href="bower_components/iron-icons/iron-icons.html">
<link rel="import" href="bower_components/iron-icons/image-icons.html">
<link rel="import" href="bower_components/paper-button/paper-button.html">
<link rel="import" href="query-dialog-sk.html">
<link rel="import" href="filter-dialog-sk.html">
<link rel="import" href="shared-styles.html">
<dom-module id="search-controls-sk">
<template>
<style include="iron-flex iron-flex-alignment"></style>
<style include="shared-styles">
.horizontalTopControl, .verticalTopControl {
font-weight: bold;
}
.verticalTopControl {
margin: 0 0 1em 0;
}
.horizontalTopControl {
margin: 0 2em 0 0;
}
.buttonContainer {
width: 8em;
}
.buttonContainer.verticalTopControl {
margin-top: 2em;
}
.horizontal.currSelection {
margin-left: 1em;
margin-right: 3em;
max-width: 20em;
}
.vertical.currSelection {
padding-top: 1em;
max-width: 10em;
}
</style>
<div class$="[[orientation]] layout">
<paper-toggle-button class$="{{_tcClass(orientation)}}" checked="{{state.pos}}" disabled={{disabled}}>Positive</paper-toggle-button>
<paper-toggle-button class$="{{_tcClass(orientation)}}" checked="{{state.neg}}" disabled={{disabled}}>Negative</paper-toggle-button>
<paper-toggle-button class$="{{_tcClass(orientation)}}" checked="{{state.unt}}" disabled={{disabled}}>Untriaged</paper-toggle-button>
<paper-toggle-button class$="{{_tcClass(orientation)}}" checked="{{state.head}}" disabled={{disabled}}>Head</paper-toggle-button>
<paper-toggle-button class$="{{_tcClass(orientation)}}" checked="{{state.include}}" disabled={{disabled}}>Ignored</paper-toggle-button>
<div class="buttonContainer">
<paper-button id="searchButton" class$="topControl" raised disabled="[[disabled]]"
title="Filter Traces"><iron-icon icon="image:tune"></iron-icon></paper-button>
</div>
<!-- TODO(stephana): Enable filter button when backend is ready -->
<div class$="{{_tcClass(orientation)}} buttonContainer">
<paper-button id="filterButton" class$="topControl" raised disabled="[[disabled]]"
title="Metrics Filter"><iron-icon icon="icons:filter-list"></iron-icon>
</paper-button>
</div>
<div class$="[[orientation]] currSelection">
[[_splitAmp(state.query, orientation)]]
</div>
</div>
<query-dialog-sk id="queryDialog" trigger="searchButton"></query-dialog-sk>
<filter-dialog-sk id="filterDialog" trigger="filterButton"></filter-dialog-sk>
</template>
<script>
Polymer({
is: "search-controls-sk",
properties: {
state: {
type: Object
},
orientation: {
type: String,
value: "horizontal"
},
disabled: {
type: Boolean,
value: false
},
beta: {
type: Boolean,
value: false
}
},
observers: [
'_fireStateChange(state.*)'
],
ready: function() {
this.listen(this.$.searchButton, 'tap', '_handleSearchButton');
this.listen(this.$.filterButton, 'tap', '_handleFilterButton');
this.listen(this.$.queryDialog, 'edit', '_handleQueryEdit');
this.listen(this.$.filterDialog, 'edit', '_handleFilterEdit');
// If the corpus changes make sure we do cleanup work.
this.async(function() {
this._statusEle = $$$("gold-status-sk");
if (this._statusEle) {
this.listen(this._statusEle, 'corpus-change', '_handleCorpusChange');
}
});
},
setState: function(state, fireEvent) {
this._noFire = !fireEvent;
this.set('state', sk.object.shallowCopy(state));
this.$.filterDialog.setValue(this.state);
},
setParamSet: function(params) {
this.$.queryDialog.queryEle.setParamSet(params);
this.$.filterDialog.setParamSet(params);
},
setCommitInfo: function(commits) {
this.$.filterDialog.setCommitInfo(commits);
},
_handleQueryEdit: function(ev) {
ev.stopPropagation();
this.set('state.query', ev.detail);
},
_handleFilterEdit: function(ev) {
ev.stopPropagation();
// merge filter into state
var newState = sk.object.applyDelta(ev.detail, this.state);
this.set('state', newState);
},
_handleSearchButton: function(ev) {
ev.stopPropagation();
this.$.queryDialog.open(this.state.query);
},
_handleFilterButton: function(ev) {
ev.stopPropagation();
this.$.filterDialog.open(this.state.filter);
},
_handleCorpusChange: function(ev) {
this.$.queryDialog.close();
},
_fireStateChange: function() {
if (this._noFire) {
this._noFire = false;
return;
}
var detail = sk.object.shallowCopy(this.state);
this.fire('state-change', detail);
},
_tcClass: function(orientation) {
return (orientation==='horizontal') ? "horizontalTopControl" : "verticalTopControl";
},
_splitAmp: function(qStr, orientation) {
return sk.query.splitAmp(qStr, (orientation === 'horizontal') ? ', ':' \n');
}
});
</script>
</dom-module>