summaryrefslogtreecommitdiffstats
path: root/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/queryFilter/queryFilter.js
diff options
context:
space:
mode:
Diffstat (limited to 'sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/queryFilter/queryFilter.js')
-rw-r--r--sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/queryFilter/queryFilter.js277
1 files changed, 277 insertions, 0 deletions
diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/queryFilter/queryFilter.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/queryFilter/queryFilter.js
new file mode 100644
index 000000000..bd449a0b7
--- /dev/null
+++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/queryFilter/queryFilter.js
@@ -0,0 +1,277 @@
+(function( $, app, i18n ) {
+
+ var ui = app.ns("ui");
+ var ut = app.ns("ut");
+
+ ui.QueryFilter = ui.AbstractWidget.extend({
+ defaults: {
+ metadata: null, // (required) instanceof app.data.MetaData
+ query: null // (required) instanceof app.data.Query that the filters will act apon
+ },
+ init: function() {
+ this._super();
+ this.metadata = this.config.metadata;
+ this.query = this.config.query;
+ this.el = $(this._main_template());
+ },
+ helpTypeMap: {
+ "date" : "QueryFilter.DateRangeHelp"
+ },
+ requestUpdate: function(jEv) {
+ if(jEv && jEv.originalEvent) { // we only want to update on real user interaction not generated events
+ this.query.setPage(1);
+ this.query.query();
+ }
+ },
+ getSpec: function(fieldName) {
+ return this.metadata.fields[fieldName];
+ },
+ _selectAlias_handler: function(jEv) {
+ var indices = (jEv.target.selectedIndex === 0) ? [] : this.metadata.getIndices($(jEv.target).val());
+ $(".uiQueryFilter-index").each(function(i, el) {
+ var jEl = $(el);
+ if(indices.contains(jEl.text()) !== jEl.hasClass("selected")) {
+ jEl.click();
+ }
+ });
+ this.requestUpdate(jEv);
+ },
+ _selectIndex_handler: function(jEv) {
+ var jEl = $(jEv.target).closest(".uiQueryFilter-index");
+ jEl.toggleClass("selected");
+ var selected = jEl.hasClass("selected");
+ this.query.setIndex(jEl.text(), selected);
+ if(selected) {
+ var types = this.metadata.getTypes(this.query.indices);
+ this.el.find("DIV.uiQueryFilter-type.selected").each(function(n, el) {
+ if(! types.contains($(el).text())) {
+ $(el).click();
+ }
+ });
+ }
+ this.requestUpdate(jEv);
+ },
+ _selectType_handler: function(jEv) {
+ var jEl = $(jEv.target).closest(".uiQueryFilter-type");
+ jEl.toggleClass("selected");
+ var type = jEl.text(), selected = jEl.hasClass("selected");
+ this.query.setType(type, selected);
+ if(selected) {
+ var indices = this.metadata.types[type].indices;
+ // es throws a 500 if searching an index for a type it does not contain - so we prevent that
+ this.el.find("DIV.uiQueryFilter-index.selected").each(function(n, el) {
+ if(! indices.contains($(el).text())) {
+ $(el).click();
+ }
+ });
+ // es throws a 500 if you specify types from different indices with _all
+ jEl.siblings(".uiQueryFilter-type.selected").forEach(function(el) {
+ if(this.metadata.types[$(el).text()].indices.intersection(indices).length === 0) {
+ $(el).click();
+ }
+ }, this);
+ }
+ this.requestUpdate(jEv);
+ },
+ _openFilter_handler: function(section) {
+ var field_name = section.config.title;
+ if(! section.loaded) {
+ var spec = this.getSpec(field_name);
+ if(spec.core_type === "string") {
+ section.body.append(this._textFilter_template(spec));
+ } else if(spec.core_type === "date") {
+ section.body.append(this._dateFilter_template(spec));
+ section.body.append(new ui.DateHistogram({ printEl: section.body.find("INPUT"), cluster: this.cluster, query: this.query, spec: spec }));
+ } else if(spec.core_type === "number") {
+ section.body.append(this._numericFilter_template(spec));
+ } else if(spec.core_type === 'boolean') {
+ section.body.append(this._booleanFilter_template(spec));
+ } else if (spec.core_type === 'multi_field') {
+ section.body.append(this._multiFieldFilter_template(section, spec));
+ }
+ section.loaded = true;
+ }
+ section.on("animComplete", function(section) { section.body.find("INPUT").focus(); });
+ },
+ _textFilterChange_handler: function(jEv) {
+ var jEl = $(jEv.target).closest("INPUT");
+ var val = jEl.val();
+ var spec = jEl.data("spec");
+ var uqids = jEl.data("uqids") || [];
+ uqids.forEach(function(uqid) {
+ uqid && this.query.removeClause(uqid);
+ }, this);
+ if(val.length) {
+ if(jEl[0] === document.activeElement && jEl[0].selectionStart === jEl[0].selectionEnd) {
+ val = val.replace(new RegExp("(.{"+jEl[0].selectionStart+"})"), "$&*");
+ }
+ uqids = val.split(/\s+/).map(function(term) {
+ // Figure out the actual field name - needed for multi_field, because
+ // querying for "field.field" will not work. Simply "field" must be used
+ // if nothing is aliased.
+ var fieldNameParts = spec.field_name.split('.');
+ var part = fieldNameParts.length - 1;
+ var name = fieldNameParts[part];
+ while (part >= 1) {
+ if (fieldNameParts[part] !== fieldNameParts[part - 1]) {
+ name = fieldNameParts[part - 1] + "." + name;
+ }
+ part--;
+ }
+ return term && this.query.addClause(term, name, "wildcard", "must");
+ }, this);
+ }
+ jEl.data("uqids", uqids);
+ this.requestUpdate(jEv);
+ },
+ _dateFilterChange_handler: function(jEv) {
+ var jEl = $(jEv.target).closest("INPUT");
+ var val = jEl.val();
+ var spec = jEl.data("spec");
+ var uqid = jEl.data("uqid") || null;
+ var range = window.dateRangeParser.parse(val);
+ var lastRange = jEl.data("lastRange");
+ if(!range || (lastRange && lastRange.start === range.start && lastRange.end === range.end)) {
+ return;
+ }
+ uqid && this.query.removeClause(uqid);
+ if((range.start && range.end) === null) {
+ uqid = null;
+ } else {
+ var value = {};
+ if( range.start ) {
+ value["gte"] = range.start;
+ }
+ if( range.end ) {
+ value["lte"] = range.end;
+ }
+ uqid = this.query.addClause( value, spec.field_name, "range", "must");
+ }
+ jEl.data("lastRange", range);
+ jEl.siblings(".uiQueryFilter-rangeHintFrom")
+ .text(i18n.text("QueryFilter.DateRangeHint.from", range.start && new Date(range.start).toUTCString()));
+ jEl.siblings(".uiQueryFilter-rangeHintTo")
+ .text(i18n.text("QueryFilter.DateRangeHint.to", range.end && new Date(range.end).toUTCString()));
+ jEl.data("uqid", uqid);
+ this.requestUpdate(jEv);
+ },
+ _numericFilterChange_handler: function(jEv) {
+ var jEl = $(jEv.target).closest("INPUT");
+ var val = jEl.val();
+ var spec = jEl.data("spec");
+ var uqid = jEl.data("uqid") || null;
+ var lastRange = jEl.data("lastRange");
+ var range = (function(val) {
+ var ops = val.split(/->|<>|</).map( function(v) { return parseInt(v.trim(), 10); });
+ if(/<>/.test(val)) {
+ return { gte: (ops[0] - ops[1]), lte: (ops[0] + ops[1]) };
+ } else if(/->|</.test(val)) {
+ return { gte: ops[0], lte: ops[1] };
+ } else {
+ return { gte: ops[0], lte: ops[0] };
+ }
+ })(val || "");
+ if(!range || (lastRange && lastRange.lte === range.lte && lastRange.gte === range.gte)) {
+ return;
+ }
+ jEl.data("lastRange", range);
+ uqid && this.query.removeClause(uqid);
+ uqid = this.query.addClause( range, spec.field_name, "range", "must");
+ jEl.data("uqid", uqid);
+ this.requestUpdate(jEv);
+ },
+ _booleanFilterChange_handler: function( jEv ) {
+ var jEl = $(jEv.target).closest("SELECT");
+ var val = jEl.val();
+ var spec = jEl.data("spec");
+ var uqid = jEl.data("uqid") || null;
+ uqid && this.query.removeClause(uqid);
+ if(val === "true" || val === "false") {
+ jEl.data("uqid", this.query.addClause(val, spec.field_name, "term", "must") );
+ }
+ this.requestUpdate(jEv);
+ },
+ _main_template: function() {
+ return { tag: "DIV", id: this.id(), cls: "uiQueryFilter", children: [
+ this._aliasSelector_template(),
+ this._indexSelector_template(),
+ this._typesSelector_template(),
+ this._filters_template()
+ ] };
+ },
+ _aliasSelector_template: function() {
+ var aliases = Object.keys(this.metadata.aliases).sort();
+ aliases.unshift( i18n.text("QueryFilter.AllIndices") );
+ return { tag: "DIV", cls: "uiQueryFilter-section uiQueryFilter-aliases", children: [
+ { tag: "SELECT", onChange: this._selectAlias_handler, children: aliases.map(ut.option_template) }
+ ] };
+ },
+ _indexSelector_template: function() {
+ var indices = Object.keys( this.metadata.indices ).sort();
+ return { tag: "DIV", cls: "uiQueryFilter-section uiQueryFilter-indices", children: [
+ { tag: "HEADER", text: i18n.text("QueryFilter-Header-Indices") },
+ { tag: "DIV", onClick: this._selectIndex_handler, children: indices.map( function( name ) {
+ return { tag: "DIV", cls: "uiQueryFilter-booble uiQueryFilter-index", text: name };
+ })}
+ ] };
+ },
+ _typesSelector_template: function() {
+ var types = Object.keys( this.metadata.types ).sort();
+ return { tag: "DIV", cls: "uiQueryFilter-section uiQueryFilter-types", children: [
+ { tag: "HEADER", text: i18n.text("QueryFilter-Header-Types") },
+ { tag: "DIV", onClick: this._selectType_handler, children: types.map( function( name ) {
+ return { tag: "DIV", cls: "uiQueryFilter-booble uiQueryFilter-type", text: name };
+ })}
+ ] };
+ },
+ _filters_template: function() {
+ var _metadataFields = this.metadata.fields;
+ var fields = Object.keys( _metadataFields ).sort()
+ .filter(function(d) { return (_metadataFields[d].core_type !== undefined); });
+ return { tag: "DIV", cls: "uiQueryFilter-section uiQueryFilter-filters", children: [
+ { tag: "HEADER", text: i18n.text("QueryFilter-Header-Fields") },
+ { tag: "DIV", children: fields.map( function(name ) {
+ return new app.ui.SidebarSection({
+ title: name,
+ help: this.helpTypeMap[this.metadata.fields[ name ].type],
+ onShow: this._openFilter_handler
+ });
+ }, this ) }
+ ] };
+ },
+ _textFilter_template: function(spec) {
+ return { tag: "INPUT", data: { spec: spec }, onKeyup: this._textFilterChange_handler };
+ },
+ _dateFilter_template: function(spec) {
+ return { tag: "DIV", children: [
+ { tag: "INPUT", data: { spec: spec }, onKeyup: this._dateFilterChange_handler },
+ { tag: "PRE", cls: "uiQueryFilter-rangeHintFrom", text: i18n.text("QueryFilter.DateRangeHint.from", "")},
+ { tag: "PRE", cls: "uiQueryFilter-rangeHintTo", text: i18n.text("QueryFilter.DateRangeHint.to", "") }
+ ]};
+ },
+ _numericFilter_template: function(spec) {
+ return { tag: "INPUT", data: { spec: spec }, onKeyup: this._numericFilterChange_handler };
+ },
+ _booleanFilter_template: function(spec) {
+ return { tag: "SELECT", data: { spec: spec }, onChange: this._booleanFilterChange_handler,
+ children: [ i18n.text("QueryFilter.AnyValue"), "true", "false" ].map( function( val ) {
+ return { tag: "OPTION", value: val, text: val };
+ })
+ };
+ },
+ _multiFieldFilter_template: function(section, spec) {
+ return {
+ tag : "DIV", cls : "uiQueryFilter-subMultiFields", children : acx.eachMap(spec.fields, function(name, data) {
+ if (name === spec.field_name) {
+ section.config.title = spec.field_name + "." + name;
+ return this._openFilter_handler(section);
+ }
+ return new app.ui.SidebarSection({
+ title : data.field_name, help : this.helpTypeMap[data.type], onShow : this._openFilter_handler
+ });
+ }, this)
+ };
+ }
+ });
+
+})( this.jQuery, this.app, this.i18n );