You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by lq...@apache.org on 2016/04/29 13:04:44 UTC

svn commit: r1741609 [24/31] - in /qpid/java/trunk: bdbstore/src/main/java/resources/js/qpid/management/virtualhost/bdb/ bdbstore/src/main/java/resources/js/qpid/management/virtualhost/bdb_ha/ bdbstore/src/main/java/resources/js/qpid/management/virtual...

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/CriteriaPane.js
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/CriteriaPane.js?rev=1741609&r1=1741608&r2=1741609&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/CriteriaPane.js (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/query/CriteriaPane.js Fri Apr 29 11:04:40 2016
@@ -19,648 +19,684 @@
  *
  */
 
-define([
-  "dojo/_base/declare",
-  "dojo/_base/array",
-  "dojo/_base/lang",
-  "dojo/string",
-  "dojo/dom-construct",
-  "dojo/dom-style",
-  "dojo/sniff",
-  "dojo/text!query/CriteriaPane.html",
-  "dojox/html/entities",
-  "dojo/Evented",
-  "dojo/number",
-  "dijit/_WidgetBase",
-  "dijit/_TemplatedMixin",
-  "dijit/_WidgetsInTemplateMixin",
-  "dijit/layout/ContentPane",
-  "dijit/TitlePane",
-  "dijit/form/Button",
-  "dijit/form/ValidationTextBox",
-  "dijit/form/TextBox",
-  "dijit/form/NumberTextBox",
-  "dijit/form/MultiSelect",
-  "dijit/form/TimeTextBox",
-  "dijit/form/DateTextBox",
-  "dijit/form/NumberSpinner",
-  "dojo/domReady!"
-],
-function(declare, array, lang, string, domConstruct, domStyle, has, template, entities, Evented, number)
-{
-    var ANY = "any";
-    var IS_NULL = "is null";
-    var IS_NOT_NULL = "is not null";
-    var CONTAINS = "contains";
-    var NOT_CONTAINS = "not contains";
-    var STARTS_WITH = "starts with";
-    var ENDS_WIDTH = "ends with";
-    var NOT_STARTS_WITH = "not starts with";
-    var NOT_ENDS_WIDTH = "not ends with";
-    var NOT = "not";
-    var EQUAL = "=";
-    var NOT_EQUAL = "<>";
-    var LESS_THAN = "<";
-    var LESS_EQUAL_THAN = "<=";
-    var GREATER_THAN = ">";
-    var GREATER_EQUAL_THAN = ">=";
-    var IN = "in"
-    var NOT_IN = "not in"
-
-    var CONDITIONS_NOT_NEEDING_WIDGET = [ANY,IS_NULL,IS_NOT_NULL];
-    var BOOLEAN_CONDITIONS = [ANY,IS_NULL,IS_NOT_NULL,EQUAL,NOT_EQUAL];
-    var STRING_CONDITIONS = [ANY,IS_NULL,IS_NOT_NULL,EQUAL,NOT_EQUAL,CONTAINS,NOT_CONTAINS,STARTS_WITH,ENDS_WIDTH,
-                             NOT_STARTS_WITH,NOT_ENDS_WIDTH];
-    var NUMERIC_CONDITIONS = [ANY,IS_NULL,IS_NOT_NULL,EQUAL,NOT_EQUAL,LESS_THAN,LESS_EQUAL_THAN,GREATER_THAN,
-                              GREATER_EQUAL_THAN];
-    var ENUM_CONDITIONS = [ANY,IS_NULL,IS_NOT_NULL,IN,NOT_IN];
-    var DATE_CONDITIONS = [ANY,IS_NULL,IS_NOT_NULL,EQUAL,NOT_EQUAL,LESS_THAN,LESS_EQUAL_THAN,GREATER_THAN,GREATER_EQUAL_THAN];
-    var UNSUPPORTED_TYPES_CONDITIONS = [ANY,IS_NULL,IS_NOT_NULL];
-    var UNSUPPORTED_TYPES = ["Map","Collection","Set","List"];
-
-    var sqlEscape =                    function(value)
-                                       {
-                                         return value.replace(/'/g, "'''");
-                                       }
-
-    var sqlLikeEscape =                function(value)
-                                       {
-                                         return sqlEscape(value).replace(/%/g, "\\%").replace(/_/g, "\\_");
-                                       }
-
-    var sqlValue =                     function(value, type)
-                                       {
-                                         return (isNumericType(type) || type === "Boolean" || type === "Date") ? value : "'" + sqlEscape(value) + "'"
-                                       }
-
-    var isNumericType =                function(type)
-                                       {
-                                         return (type === "Long"
-                                                 || type == "Integer"
-                                                 || type == "Double"
-                                                 || type == "Float"
-                                                 || type == "Short"
-                                                 || type == "Number"
-                                                 );
-                                       }
-
-    var buildExpression =              function(name, condition, value, type)
-                                       {
-                                          if (condition === ANY)
-                                          {
-                                            return undefined;
-                                          }
-                                          else if (condition ===  IS_NULL)
-                                          {
-                                            return name + " " + IS_NULL;
-                                          }
-                                          else  if (condition === IS_NOT_NULL)
-                                          {
-                                            return name + " " + IS_NOT_NULL;
-                                          }
-                                          else if (condition === CONTAINS || condition === NOT_CONTAINS)
-                                          {
-                                            var exp = (condition === NOT_CONTAINS ? " " + NOT : "");
-                                            return  name + exp + " like '%" + sqlLikeEscape(value) + "%' escape '\\'";
-                                          }
-                                          else if (condition === STARTS_WITH || condition === NOT_STARTS_WITH)
-                                          {
-                                            var exp = (condition === NOT_STARTS_WITH ? " " + NOT : "");
-                                            return name + exp  + " like '" + sqlLikeEscape(value) + "%' escape '\\'";
-                                          }
-                                          else if (condition === ENDS_WIDTH  || condition === NOT_ENDS_WIDTH)
-                                          {
-                                            var exp = (condition === NOT_ENDS_WIDTH ? " " + NOT : "");
-                                            return name + exp  + " like '%" + sqlLikeEscape(value) + "' escape '\\'";
-                                          }
-                                          else if (condition === IN  || condition === NOT_IN)
-                                          {
-                                            if (!value)
-                                            {
-                                              return undefined;
-                                            }
-
-                                            var exp = condition + " (";
-                                            if (lang.isArray(value))
-                                            {
-                                              if (!value.length)
-                                              {
-                                                return undefined;
-                                              }
-                                              for(var i=0;i<value.length;i++)
-                                              {
-                                                 if (i>0)
-                                                 {
-                                                   exp = exp + ",";
-                                                 }
-                                                 exp = exp + sqlValue(value[i], type);
-                                              }
-                                            }
-                                            else
-                                            {
-                                              exp = exp + sqlValue(value, type);
-                                            }
-                                            exp = exp + " )";
-                                            return name + " " + exp;
-                                          }
-                                          else
-                                          {
-                                            return name + " " + condition + " " + sqlValue(value, type);
-                                          }
-                                       }
-
-    var getTypeConditions  =           function(type, validValues)
-                                       {
-                                         if (type === "Boolean")
-                                         {
-                                            return BOOLEAN_CONDITIONS;
-                                         }
-                                         if (type === "Date")
-                                         {
-                                             return DATE_CONDITIONS;
-                                         }
-                                         else if (isNumericType(type))
-                                         {
-                                            return NUMERIC_CONDITIONS;
-                                         }
-                                         else
-                                         {
-                                            if (UNSUPPORTED_TYPES.indexOf(type) != -1)
-                                            {
-                                                return UNSUPPORTED_TYPES_CONDITIONS;
-                                            }
-
-                                            if (validValues && validValues.length)
-                                            {
-                                                return ENUM_CONDITIONS;
-                                            }
-                                            else
-                                            {
-                                                return STRING_CONDITIONS;
-                                            }
-                                         }
-                                       }
-
-    var arrayToOptions =               function(conditions, defaultValue)
-                                       {
-                                         var options = [];
-                                         for (var i=0;i<conditions.length;i++)
-                                         {
-                                           var selected = conditions[i] == defaultValue;
-                                           options.push({label: conditions[i], value:  conditions[i], selected: selected});
-                                         }
-                                         return options;
-                                       }
-    var conditionHasWidget =           function(condition)
-                                       {
-                                         return array.indexOf(CONDITIONS_NOT_NEEDING_WIDGET,condition) == -1;
-                                       }
-    var isInt =                        function isInt(value)
-                                       {
-                                         return !isNaN(value) &&
-                                                parseInt(Number(value)) == value &&
-                                                !isNaN(parseInt(value, 10));
-                                       }
-
-    // dojo TimeTextBox has a bug in Firefox
-    // https://bugzilla.mozilla.org/show_bug.cgi?id=487897
-    // Custom TimePicker is implemented for Firefox
-    var TimePicker =                   declare("qpid.management.TimePicker",
-                                         [dijit._WidgetBase, Evented],
-                                         {
-                                           disabled: false,
-                                           intermediateChanges: false,
-                                           value: undefined,
-                                           buildRendering: function()
-                                                     {
-                                                       var domNode = this.domNode = domConstruct.create("div", {className: "dijitReset dijitInline"});
-                                                       domConstruct.create("span",{innerHTML:"T"}, domNode);
-                                                       var timeNode = domConstruct.create("div",{}, domNode);
-                                                       this.hoursEditor = new dijit.form.NumberSpinner({name: "hours",
-                                                                                                        constraints:{ max:23, min:0 },
-                                                                                                        style: {width: "4em"},
-                                                                                                        intermediateChanges: this.intermediateChanges,
-                                                                                                        title: "Hours in range 0-23"},
-                                                                                                       timeNode);
-                                                       this.hoursEditor.on("change", lang.hitch(this, this._setValue));
-                                                       domConstruct.create("span",{innerHTML:":"}, domNode);
-                                                       var minutesNode = domConstruct.create("div",{}, domNode);
-                                                       this.minutesEditor = new dijit.form.NumberSpinner({name: "minutes",
-                                                                                                          constraints:{ max:59, min:0 },
-                                                                                                          style: {width: "4em"},
-                                                                                                          intermediateChanges: this.intermediateChanges,
-                                                                                                          title: "Minutes in range 0-59"},
-                                                                                                          minutesNode);
-                                                       this.minutesEditor.on("change", lang.hitch(this, this._setValue));
-                                                       domConstruct.create("span",{innerHTML:":"}, domNode);
-                                                       var secondsNode = domConstruct.create("div",{}, domNode);
-                                                       this.secondsEditor = new dijit.form.NumberSpinner({name: "seconds",
-                                                                                                           constraints:{ max:59, min:0 },
-                                                                                                           style: {width: "4em"},
-                                                                                                           intermediateChanges: this.intermediateChanges,
-                                                                                                           title: "Seconds in range 0-59"},
-                                                                                                           secondsNode);
-                                                       this.secondsEditor.on("change", lang.hitch(this, this._setValue));
-                                                       domConstruct.create("span",{innerHTML:"."}, domNode);
-                                                       var millisecondsNode = domConstruct.create("div",{}, domNode);
-                                                       this.millisecondsEditor = new dijit.form.NumberSpinner({name: "milliseconds",
-                                                                                                            constraints:{ max:999, min:0 },
-                                                                                                            style: {width: "5em"},
-                                                                                                            intermediateChanges: this.intermediateChanges,
-                                                                                                            title: "Milliseconds in range 0-999"},
-                                                                                                            millisecondsNode);
-                                                       this.millisecondsEditor.on("change", lang.hitch(this, this._setValue));
-                                                     },
-                                           startup:  function()
-                                                     {
-                                                       this.inherited(arguments);
-                                                       this.hoursEditor.startup();
-                                                       this.minutesEditor.startup();
-                                                       this.secondsEditor.startup();
-                                                       this.millisecondsEditor.startup();
-                                                     },
-                                           _setValue:function()
-                                                     {
-                                                       var time = 0
-                                                       if (isInt(this.hoursEditor.value) )
-                                                       {
-                                                         time = time + this.hoursEditor.value * 60 * 60 * 1000;
-                                                       }
-                                                       if (isInt(this.minutesEditor.value))
-                                                       {
-                                                         time = time + this.minutesEditor.value * 60 * 1000;
-                                                       }
-                                                       if (isInt(this.secondsEditor.value))
-                                                       {
-                                                         time = time + this.secondsEditor.value * 1000;
-                                                       }
-                                                       if (isInt(this.millisecondsEditor.value))
-                                                       {
-                                                         time = time + this.millisecondsEditor.value;
-                                                       }
-                                                       this.value = new Date(time - new Date().getTimezoneOffset() * 60 * 1000);
-                                                       this.emit("change", this.value);
-                                                     },
-                                           _setDisabledAttr:function(value)
-                                                     {
-                                                       this.inherited(arguments);
-                                                       this.disabled = value;
-                                                       this.hoursEditor.set("disabled", value);
-                                                       this.minutesEditor.set("disabled", value);
-                                                       this.secondsEditor.set("disabled", value);
-                                                       this.millisecondsEditor.set("disabled", value);
-                                                     },
-                                           _setValueAttr:  function(value)
-                                                     {
-                                                       if (value)
-                                                       {
-                                                         var date = value instanceof Date ? value :new Date(value);
-                                                         this.hoursEditor.set("value", date.getHours());
-                                                         this.minutesEditor.set("value", date.getMinutes());
-                                                         this.secondsEditor.set("value", date.getSeconds());
-                                                         this.millisecondsEditor.set("value", date.getMilliseconds());
-                                                       }
-                                                       this.value = date;
-                                                       this.inherited(arguments);
-                                                     },
-                                           _getValueAttr:  function()
-                                                     {
-                                                       return this.value;
-                                                     }
-                                         });
-
-    var DateTimePicker =               declare("qpid.management.DateTimePicker",
-                                         [dijit._WidgetBase, Evented],
-                                         {
-                                           disabled: false,
-                                           value: undefined,
-                                           buildRendering: function()
-                                                     {
-                                                       var domNode = this.domNode = domConstruct.create("div",
-                                                                                                        {className:"dijitReset dijitInline"});
-                                                       var dateNode = domConstruct.create("div",
-                                                                                          {},
-                                                                                          domNode);
-                                                       this.dateEditor = new dijit.form.DateTextBox({name: "date",
-                                                                                                     intermediateChanges: true,
-                                                                                                     constraints: {datePattern: "yyyy-MM-dd"}},
-                                                                                                    dateNode);
-                                                       this.dateEditor.on("change", lang.hitch(this, this._setValue));
-                                                       var timeNode = domConstruct.create("div",{}, domNode);
-                                                       if (has("ff"))
-                                                       {
-                                                         this.timeEditor = new TimePicker({name: "time",
-                                                                                           value: this.value,
-                                                                                           intermediateChanges: true,
-                                                                                           disabled: this.disabled},
-                                                                                          timeNode);
-                                                       }
-                                                       else
-                                                       {
-                                                         this.timeEditor = new dijit.form.TimeTextBox({name: "time",
-                                                                                                       intermediateChanges: true,
-                                                                                                       value: this.value,
-                                                                                                       constraints: {
-                                                                                                         timePattern: 'HH:mm:ss.SSS',
-                                                                                                         clickableIncrement: 'T00:15:00',
-                                                                                                         visibleIncrement: 'T00:15:00',
-                                                                                                         visibleRange: 'T00:00:00'
-                                                                                                         }
-                                                                                                       },
-                                                                                                       timeNode);
-                                                       }
-                                                       this.timeEditor.on("change", lang.hitch(this, this._setValue));
-                                                     },
-                                           startup:  function()
-                                                     {
-                                                       this.inherited(arguments);
-                                                       this.dateEditor.startup();
-                                                       this.timeEditor.startup();
-                                                     },
-                                           _setValue:function()
-                                                     {
-                                                       var date = this.dateEditor.get("value");
-                                                       if (date)
-                                                       {
-                                                         var time = this.timeEditor.value;
-                                                         var value = date.getTime() + (time ? time.getTime() + time.getTimezoneOffset() * 60 * 1000 : 0);
-                                                         this.value = value;
-                                                         this._buildExpression(value);
-                                                         this.emit("change", this.value);
-                                                       }
-                                                     },
-                                           _buildExpression: function(value)
-                                                     {
-                                                        var formattedDate = this.userPreferences.formatDateTime(value,
-                                                                                          {selector: "date",
-                                                                                           datePattern: "yyyy-MM-dd"});
-                                                        var formattedTime = this.userPreferences.formatDateTime(value,
-                                                                                          {selector: "time",
-                                                                                          datePattern: "HH:mm:ss.SSS"});
-                                                        var timeZoneOffset = "";
-                                                        var timeZone = this.userPreferences.getTimeZoneInfo();
-                                                        if (timeZone)
-                                                        {
-                                                          var timeZoneOffsetInMinutes = timeZone.offset;
-                                                          if (!timeZoneOffsetInMinutes)
-                                                          {
-                                                            timeZoneOffset = "Z";
-                                                          }
-                                                          else
-                                                          {
-                                                            if (timeZoneOffsetInMinutes>0)
-                                                            {
-                                                              timeZoneOffset = "+";
-                                                            }
-                                                            timeZoneOffset = timeZoneOffset
-                                                                             + number.format(timeZoneOffsetInMinutes/60,
-                                                                                             {pattern: "00"})
-                                                                             + ":"
-                                                                             + number.format(timeZoneOffsetInMinutes%60,
-                                                                                             {pattern: "00"});
-                                                          }
-                                                        }
-                                                        this.expression = "to_date('"
-                                                                          + formattedDate + "T"
-                                                                          + formattedTime + timeZoneOffset +"')";
-                                                     },
-                                           _getExpressionAttr:function()
-                                                     {
-                                                       return this.expression;
-                                                     },
-                                           _setDisabledAttr: function(value)
-                                                     {
-                                                       this.inherited(arguments);
-                                                       this.disabled = value;
-                                                       this.dateEditor.set("disabled", value);
-                                                       this.timeEditor.set("disabled", value);
-                                                     },
-                                           _setValueAttr: function(value)
-                                                     {
-                                                       var date;
-                                                       if (value instanceof Date )
-                                                       {
-                                                         date = value;
-                                                       }
-                                                       else if (isInt(value))
-                                                       {
-                                                         date =  new Date(value);
-                                                       }
-                                                       if (date)
-                                                       {
-                                                         this.dateEditor.set("value", date);
-                                                         this.timeEditor.set("value", date);
-                                                         this.value = date;
-                                                       }
-                                                       this.inherited(arguments);
-                                                     },
-                                           _getValueAttr: function()
-                                                     {
-                                                       return this.value;
-                                                     },
-                                           isValid: function()
-                                                     {
-                                                        return !!this.value;
-                                                     }
-                                         });
-
-    return declare( "qpid.management.query.CriteriaPane",
-                    [dijit._WidgetBase, dijit._TemplatedMixin, dijit._WidgetsInTemplateMixin, Evented],
-                    {
-                        //Strip out the apache comment header from the template html as comments unsupported.
-                        templateString:    template.replace(/<!--[\s\S]*?-->/g, ""),
-
-                        /**
-                         * fields from template
-                         */
-                        conditionExpression: null,
-                        criteriaCondition: null,
-                        criteriaValueInputContainer: null,
-                        removeButton: null,
-                        contentPane: null,
-                        titleNode: null,
-
-                        /**
-                         * mandatory constructor arguments
-                         */
-                        criteriaName: null,
-                        typeName: null,
-                        typeValidValues: null,
-                        userPreferences: null,
-
-                        /**
-                         * auxiliary fields
-                         */
-                         _removed: false,
-                         _stored: false,
-                         _lastCondition: undefined,
-                         _savedValue: undefined,
-                         _savedCondition: undefined,
-
-                        postCreate:     function()
-                                        {
-                                            this.inherited(arguments);
-                                            this._postCreate();
-                                        },
-                        _postCreate:    function()
-                                        {
-                                            var conditions = getTypeConditions(this.typeName, this.typeValidValues);
-                                            this.criteriaCondition.set("options", arrayToOptions(conditions, ANY));
-                                            this.criteriaCondition.on("change", lang.hitch(this, this._conditionChanged));
-
-
-                                            if (this.typeName === "Boolean")
-                                            {
-                                                this.typeValidValues = ['true', 'false'];
-                                            }
-
-                                            var domNode = domConstruct.create("div", {}, this.criteriaValueInputContainer);
-                                            if (this.typeValidValues && this.typeValidValues.length)
-                                            {
-                                                for (var i=0;i<this.typeValidValues.length;i++)
-                                                {
-                                                  var val = this.typeValidValues[i];
-                                                  domConstruct.create("option", {innerHTML: entities.encode(String(val)), value: val}, domNode);
-                                                }
-                                                this.valueEditor = new dijit.form.MultiSelect({intermediateChanges: true,
-                                                                                               multiple: true}, domNode);
-                                            }
-                                            else if (this.typeName === "Date")
-                                            {
-                                                this.valueEditor = new DateTimePicker({intermediateChanges: true,
-                                                                                       userPreferences: this.userPreferences}, domNode);
-                                            }
-                                            else
-                                            {
-                                                this.valueEditor = isNumericType(this.typeName)
-                                                                ? new dijit.form.NumberTextBox({
-                                                                                                value: 0,
-                                                                                                required:true,
-                                                                                                intermediateChanges: true,
-                                                                                                invalidMessage:'Please enter a numeric value.'},
-                                                                                               domNode)
-                                                                : new dijit.form.ValidationTextBox({value: '',
-                                                                                                    required:true,
-                                                                                                    intermediateChanges: true},
-                                                                                                    domNode);
-                                            }
-                                            this.valueEditor.startup();
-                                            this.valueEditor.on("change", lang.hitch(this, this._conditionValueChanged));
-                                            this.removeCriteria.on("click", lang.hitch(this, this._removalRequested));
-                                            this._conditionChanged(ANY);
-                                            this._saveState()
-                                        },
-                        _saveState:     function()
-                                        {
-                                            this._savedValue = this.valueEditor.value;
-                                            this._savedCondition = this.criteriaCondition.value;
-                                        },
-                        _conditionChanged: function(newValue)
-                                        {
-                                            if (this.criteriaCondition.value != this._lastCondition)
-                                            {
-                                              var editable = conditionHasWidget(newValue);
-                                              this.valueEditor.set("disabled", !editable);
-                                              this._lastCondition = newValue;
-                                              this._conditionValueChanged();
-                                            }
-                                        },
-                        _conditionValueChanged: function(newValue)
-                                        {
-                                            var expression;
-                                            var val = this._getConditionValue();
-                                            if (val)
-                                            {
-                                              expression = buildExpression(this.criteriaName,
-                                                                             this.criteriaCondition.value,
-                                                                             val,
-                                                                             this.typeName);
-                                            }
-                                            if (!expression)
-                                            {
-                                              expression = this.criteriaName + ":" + ANY;
-                                            }
-                                            this.conditionExpression.innerHTML = entities.encode(String(expression));
-
-                                            // notify listeners that criteria is changed
-                                            this.emit("change", this);
-                                        },
-                        getExpression : function()
-                                        {
-                                            if (this._removed)
-                                            {
-                                               return undefined;
-                                            }
-                                            return buildExpression(this.criteriaName,
+define(["dojo/_base/declare",
+        "dojo/_base/array",
+        "dojo/_base/lang",
+        "dojo/string",
+        "dojo/dom-construct",
+        "dojo/dom-style",
+        "dojo/sniff",
+        "dojo/text!query/CriteriaPane.html",
+        "dojox/html/entities",
+        "dojo/Evented",
+        "dojo/number",
+        "dijit/_WidgetBase",
+        "dijit/_TemplatedMixin",
+        "dijit/_WidgetsInTemplateMixin",
+        "dijit/layout/ContentPane",
+        "dijit/TitlePane",
+        "dijit/form/Button",
+        "dijit/form/ValidationTextBox",
+        "dijit/form/TextBox",
+        "dijit/form/NumberTextBox",
+        "dijit/form/MultiSelect",
+        "dijit/form/TimeTextBox",
+        "dijit/form/DateTextBox",
+        "dijit/form/NumberSpinner",
+        "dojo/domReady!"],
+       function (declare, array, lang, string, domConstruct, domStyle, has, template, entities, Evented, number)
+       {
+           var ANY = "any";
+           var IS_NULL = "is null";
+           var IS_NOT_NULL = "is not null";
+           var CONTAINS = "contains";
+           var NOT_CONTAINS = "not contains";
+           var STARTS_WITH = "starts with";
+           var ENDS_WIDTH = "ends with";
+           var NOT_STARTS_WITH = "not starts with";
+           var NOT_ENDS_WIDTH = "not ends with";
+           var NOT = "not";
+           var EQUAL = "=";
+           var NOT_EQUAL = "<>";
+           var LESS_THAN = "<";
+           var LESS_EQUAL_THAN = "<=";
+           var GREATER_THAN = ">";
+           var GREATER_EQUAL_THAN = ">=";
+           var IN = "in"
+           var NOT_IN = "not in"
+
+           var CONDITIONS_NOT_NEEDING_WIDGET = [ANY, IS_NULL, IS_NOT_NULL];
+           var BOOLEAN_CONDITIONS = [ANY, IS_NULL, IS_NOT_NULL, EQUAL, NOT_EQUAL];
+           var STRING_CONDITIONS = [ANY,
+                                    IS_NULL,
+                                    IS_NOT_NULL,
+                                    EQUAL,
+                                    NOT_EQUAL,
+                                    CONTAINS,
+                                    NOT_CONTAINS,
+                                    STARTS_WITH,
+                                    ENDS_WIDTH,
+                                    NOT_STARTS_WITH,
+                                    NOT_ENDS_WIDTH];
+           var NUMERIC_CONDITIONS = [ANY,
+                                     IS_NULL,
+                                     IS_NOT_NULL,
+                                     EQUAL,
+                                     NOT_EQUAL,
+                                     LESS_THAN,
+                                     LESS_EQUAL_THAN,
+                                     GREATER_THAN,
+                                     GREATER_EQUAL_THAN];
+           var ENUM_CONDITIONS = [ANY, IS_NULL, IS_NOT_NULL, IN, NOT_IN];
+           var DATE_CONDITIONS = [ANY,
+                                  IS_NULL,
+                                  IS_NOT_NULL,
+                                  EQUAL,
+                                  NOT_EQUAL,
+                                  LESS_THAN,
+                                  LESS_EQUAL_THAN,
+                                  GREATER_THAN,
+                                  GREATER_EQUAL_THAN];
+           var UNSUPPORTED_TYPES_CONDITIONS = [ANY, IS_NULL, IS_NOT_NULL];
+           var UNSUPPORTED_TYPES = ["Map", "Collection", "Set", "List"];
+
+           var sqlEscape = function (value)
+           {
+               return value.replace(/'/g, "'''");
+           }
+
+           var sqlLikeEscape = function (value)
+           {
+               return sqlEscape(value).replace(/%/g, "\\%").replace(/_/g, "\\_");
+           }
+
+           var sqlValue = function (value, type)
+           {
+               return (isNumericType(type) || type === "Boolean" || type === "Date") ? value : "'" + sqlEscape(value)
+                                                                                               + "'"
+           }
+
+           var isNumericType = function (type)
+           {
+               return (type === "Long" || type == "Integer" || type == "Double" || type == "Float" || type == "Short"
+                       || type == "Number"
+               );
+           }
+
+           var buildExpression = function (name, condition, value, type)
+           {
+               if (condition === ANY)
+               {
+                   return undefined;
+               }
+               else if (condition === IS_NULL)
+               {
+                   return name + " " + IS_NULL;
+               }
+               else if (condition === IS_NOT_NULL)
+               {
+                   return name + " " + IS_NOT_NULL;
+               }
+               else if (condition === CONTAINS || condition === NOT_CONTAINS)
+               {
+                   var exp = (condition === NOT_CONTAINS ? " " + NOT : "");
+                   return name + exp + " like '%" + sqlLikeEscape(value) + "%' escape '\\'";
+               }
+               else if (condition === STARTS_WITH || condition === NOT_STARTS_WITH)
+               {
+                   var exp = (condition === NOT_STARTS_WITH ? " " + NOT : "");
+                   return name + exp + " like '" + sqlLikeEscape(value) + "%' escape '\\'";
+               }
+               else if (condition === ENDS_WIDTH || condition === NOT_ENDS_WIDTH)
+               {
+                   var exp = (condition === NOT_ENDS_WIDTH ? " " + NOT : "");
+                   return name + exp + " like '%" + sqlLikeEscape(value) + "' escape '\\'";
+               }
+               else if (condition === IN || condition === NOT_IN)
+               {
+                   if (!value)
+                   {
+                       return undefined;
+                   }
+
+                   var exp = condition + " (";
+                   if (lang.isArray(value))
+                   {
+                       if (!value.length)
+                       {
+                           return undefined;
+                       }
+                       for (var i = 0; i < value.length; i++)
+                       {
+                           if (i > 0)
+                           {
+                               exp = exp + ",";
+                           }
+                           exp = exp + sqlValue(value[i], type);
+                       }
+                   }
+                   else
+                   {
+                       exp = exp + sqlValue(value, type);
+                   }
+                   exp = exp + " )";
+                   return name + " " + exp;
+               }
+               else
+               {
+                   return name + " " + condition + " " + sqlValue(value, type);
+               }
+           }
+
+           var getTypeConditions = function (type, validValues)
+           {
+               if (type === "Boolean")
+               {
+                   return BOOLEAN_CONDITIONS;
+               }
+               if (type === "Date")
+               {
+                   return DATE_CONDITIONS;
+               }
+               else if (isNumericType(type))
+               {
+                   return NUMERIC_CONDITIONS;
+               }
+               else
+               {
+                   if (UNSUPPORTED_TYPES.indexOf(type) != -1)
+                   {
+                       return UNSUPPORTED_TYPES_CONDITIONS;
+                   }
+
+                   if (validValues && validValues.length)
+                   {
+                       return ENUM_CONDITIONS;
+                   }
+                   else
+                   {
+                       return STRING_CONDITIONS;
+                   }
+               }
+           }
+
+           var arrayToOptions = function (conditions, defaultValue)
+           {
+               var options = [];
+               for (var i = 0; i < conditions.length; i++)
+               {
+                   var selected = conditions[i] == defaultValue;
+                   options.push({
+                                    label: conditions[i],
+                                    value: conditions[i],
+                                    selected: selected
+                                });
+               }
+               return options;
+           }
+           var conditionHasWidget = function (condition)
+           {
+               return array.indexOf(CONDITIONS_NOT_NEEDING_WIDGET, condition) == -1;
+           }
+           var isInt = function isInt(value)
+           {
+               return !isNaN(value) && parseInt(Number(value)) == value && !isNaN(parseInt(value, 10));
+           }
+
+           // dojo TimeTextBox has a bug in Firefox
+           // https://bugzilla.mozilla.org/show_bug.cgi?id=487897
+           // Custom TimePicker is implemented for Firefox
+           var TimePicker = declare("qpid.management.TimePicker", [dijit._WidgetBase, Evented], {
+               disabled: false,
+               intermediateChanges: false,
+               value: undefined,
+               buildRendering: function ()
+               {
+                   var domNode = this.domNode = domConstruct.create("div", {className: "dijitReset dijitInline"});
+                   domConstruct.create("span", {innerHTML: "T"}, domNode);
+                   var timeNode = domConstruct.create("div", {}, domNode);
+                   this.hoursEditor = new dijit.form.NumberSpinner({
+                       name: "hours",
+                       constraints: {
+                           max: 23,
+                           min: 0
+                       },
+                       style: {width: "4em"},
+                       intermediateChanges: this.intermediateChanges,
+                       title: "Hours in range 0-23"
+                   }, timeNode);
+                   this.hoursEditor.on("change", lang.hitch(this, this._setValue));
+                   domConstruct.create("span", {innerHTML: ":"}, domNode);
+                   var minutesNode = domConstruct.create("div", {}, domNode);
+                   this.minutesEditor = new dijit.form.NumberSpinner({
+                       name: "minutes",
+                       constraints: {
+                           max: 59,
+                           min: 0
+                       },
+                       style: {width: "4em"},
+                       intermediateChanges: this.intermediateChanges,
+                       title: "Minutes in range 0-59"
+                   }, minutesNode);
+                   this.minutesEditor.on("change", lang.hitch(this, this._setValue));
+                   domConstruct.create("span", {innerHTML: ":"}, domNode);
+                   var secondsNode = domConstruct.create("div", {}, domNode);
+                   this.secondsEditor = new dijit.form.NumberSpinner({
+                       name: "seconds",
+                       constraints: {
+                           max: 59,
+                           min: 0
+                       },
+                       style: {width: "4em"},
+                       intermediateChanges: this.intermediateChanges,
+                       title: "Seconds in range 0-59"
+                   }, secondsNode);
+                   this.secondsEditor.on("change", lang.hitch(this, this._setValue));
+                   domConstruct.create("span", {innerHTML: "."}, domNode);
+                   var millisecondsNode = domConstruct.create("div", {}, domNode);
+                   this.millisecondsEditor = new dijit.form.NumberSpinner({
+                       name: "milliseconds",
+                       constraints: {
+                           max: 999,
+                           min: 0
+                       },
+                       style: {width: "5em"},
+                       intermediateChanges: this.intermediateChanges,
+                       title: "Milliseconds in range 0-999"
+                   }, millisecondsNode);
+                   this.millisecondsEditor.on("change", lang.hitch(this, this._setValue));
+               },
+               startup: function ()
+               {
+                   this.inherited(arguments);
+                   this.hoursEditor.startup();
+                   this.minutesEditor.startup();
+                   this.secondsEditor.startup();
+                   this.millisecondsEditor.startup();
+               },
+               _setValue: function ()
+               {
+                   var time = 0
+                   if (isInt(this.hoursEditor.value))
+                   {
+                       time = time + this.hoursEditor.value * 60 * 60 * 1000;
+                   }
+                   if (isInt(this.minutesEditor.value))
+                   {
+                       time = time + this.minutesEditor.value * 60 * 1000;
+                   }
+                   if (isInt(this.secondsEditor.value))
+                   {
+                       time = time + this.secondsEditor.value * 1000;
+                   }
+                   if (isInt(this.millisecondsEditor.value))
+                   {
+                       time = time + this.millisecondsEditor.value;
+                   }
+                   this.value = new Date(time - new Date().getTimezoneOffset() * 60 * 1000);
+                   this.emit("change", this.value);
+               },
+               _setDisabledAttr: function (value)
+               {
+                   this.inherited(arguments);
+                   this.disabled = value;
+                   this.hoursEditor.set("disabled", value);
+                   this.minutesEditor.set("disabled", value);
+                   this.secondsEditor.set("disabled", value);
+                   this.millisecondsEditor.set("disabled", value);
+               },
+               _setValueAttr: function (value)
+               {
+                   if (value)
+                   {
+                       var date = value instanceof Date ? value : new Date(value);
+                       this.hoursEditor.set("value", date.getHours());
+                       this.minutesEditor.set("value", date.getMinutes());
+                       this.secondsEditor.set("value", date.getSeconds());
+                       this.millisecondsEditor.set("value", date.getMilliseconds());
+                   }
+                   this.value = date;
+                   this.inherited(arguments);
+               },
+               _getValueAttr: function ()
+               {
+                   return this.value;
+               }
+           });
+
+           var DateTimePicker = declare("qpid.management.DateTimePicker", [dijit._WidgetBase, Evented], {
+               disabled: false,
+               value: undefined,
+               buildRendering: function ()
+               {
+                   var domNode = this.domNode = domConstruct.create("div", {className: "dijitReset dijitInline"});
+                   var dateNode = domConstruct.create("div", {}, domNode);
+                   this.dateEditor = new dijit.form.DateTextBox({
+                       name: "date",
+                       intermediateChanges: true,
+                       constraints: {datePattern: "yyyy-MM-dd"}
+                   }, dateNode);
+                   this.dateEditor.on("change", lang.hitch(this, this._setValue));
+                   var timeNode = domConstruct.create("div", {}, domNode);
+                   if (has("ff"))
+                   {
+                       this.timeEditor = new TimePicker({
+                           name: "time",
+                           value: this.value,
+                           intermediateChanges: true,
+                           disabled: this.disabled
+                       }, timeNode);
+                   }
+                   else
+                   {
+                       this.timeEditor = new dijit.form.TimeTextBox({
+                           name: "time",
+                           intermediateChanges: true,
+                           value: this.value,
+                           constraints: {
+                               timePattern: 'HH:mm:ss.SSS',
+                               clickableIncrement: 'T00:15:00',
+                               visibleIncrement: 'T00:15:00',
+                               visibleRange: 'T00:00:00'
+                           }
+                       }, timeNode);
+                   }
+                   this.timeEditor.on("change", lang.hitch(this, this._setValue));
+               },
+               startup: function ()
+               {
+                   this.inherited(arguments);
+                   this.dateEditor.startup();
+                   this.timeEditor.startup();
+               },
+               _setValue: function ()
+               {
+                   var date = this.dateEditor.get("value");
+                   if (date)
+                   {
+                       var time = this.timeEditor.value;
+                       var value = date.getTime() + (time ? time.getTime() + time.getTimezoneOffset() * 60 * 1000 : 0);
+                       this.value = value;
+                       this._buildExpression(value);
+                       this.emit("change", this.value);
+                   }
+               },
+               _buildExpression: function (value)
+               {
+                   var formattedDate = this.userPreferences.formatDateTime(value, {
+                       selector: "date",
+                       datePattern: "yyyy-MM-dd"
+                   });
+                   var formattedTime = this.userPreferences.formatDateTime(value, {
+                       selector: "time",
+                       datePattern: "HH:mm:ss.SSS"
+                   });
+                   var timeZoneOffset = "";
+                   var timeZone = this.userPreferences.getTimeZoneInfo();
+                   if (timeZone)
+                   {
+                       var timeZoneOffsetInMinutes = timeZone.offset;
+                       if (!timeZoneOffsetInMinutes)
+                       {
+                           timeZoneOffset = "Z";
+                       }
+                       else
+                       {
+                           if (timeZoneOffsetInMinutes > 0)
+                           {
+                               timeZoneOffset = "+";
+                           }
+                           timeZoneOffset =
+                               timeZoneOffset + number.format(timeZoneOffsetInMinutes / 60, {pattern: "00"}) + ":"
+                               + number.format(timeZoneOffsetInMinutes % 60, {pattern: "00"});
+                       }
+                   }
+                   this.expression = "to_date('" + formattedDate + "T" + formattedTime + timeZoneOffset + "')";
+               },
+               _getExpressionAttr: function ()
+               {
+                   return this.expression;
+               },
+               _setDisabledAttr: function (value)
+               {
+                   this.inherited(arguments);
+                   this.disabled = value;
+                   this.dateEditor.set("disabled", value);
+                   this.timeEditor.set("disabled", value);
+               },
+               _setValueAttr: function (value)
+               {
+                   var date;
+                   if (value instanceof Date)
+                   {
+                       date = value;
+                   }
+                   else if (isInt(value))
+                   {
+                       date = new Date(value);
+                   }
+                   if (date)
+                   {
+                       this.dateEditor.set("value", date);
+                       this.timeEditor.set("value", date);
+                       this.value = date;
+                   }
+                   this.inherited(arguments);
+               },
+               _getValueAttr: function ()
+               {
+                   return this.value;
+               },
+               isValid: function ()
+               {
+                   return !!this.value;
+               }
+           });
+
+           return declare("qpid.management.query.CriteriaPane",
+                          [dijit._WidgetBase, dijit._TemplatedMixin, dijit._WidgetsInTemplateMixin, Evented],
+                          {
+                              //Strip out the apache comment header from the template html as comments unsupported.
+                              templateString: template.replace(/<!--[\s\S]*?-->/g, ""),
+
+                              /**
+                               * fields from template
+                               */
+                              conditionExpression: null,
+                              criteriaCondition: null,
+                              criteriaValueInputContainer: null,
+                              removeButton: null,
+                              contentPane: null,
+                              titleNode: null,
+
+                              /**
+                               * mandatory constructor arguments
+                               */
+                              criteriaName: null,
+                              typeName: null,
+                              typeValidValues: null,
+                              userPreferences: null,
+
+                              /**
+                               * auxiliary fields
+                               */
+                              _removed: false,
+                              _stored: false,
+                              _lastCondition: undefined,
+                              _savedValue: undefined,
+                              _savedCondition: undefined,
+
+                              postCreate: function ()
+                              {
+                                  this.inherited(arguments);
+                                  this._postCreate();
+                              },
+                              _postCreate: function ()
+                              {
+                                  var conditions = getTypeConditions(this.typeName, this.typeValidValues);
+                                  this.criteriaCondition.set("options", arrayToOptions(conditions, ANY));
+                                  this.criteriaCondition.on("change", lang.hitch(this, this._conditionChanged));
+
+                                  if (this.typeName === "Boolean")
+                                  {
+                                      this.typeValidValues = ['true', 'false'];
+                                  }
+
+                                  var domNode = domConstruct.create("div", {}, this.criteriaValueInputContainer);
+                                  if (this.typeValidValues && this.typeValidValues.length)
+                                  {
+                                      for (var i = 0; i < this.typeValidValues.length; i++)
+                                      {
+                                          var val = this.typeValidValues[i];
+                                          domConstruct.create("option",
+                                                              {
+                                                                  innerHTML: entities.encode(String(val)),
+                                                                  value: val
+                                                              },
+                                                              domNode);
+                                      }
+                                      this.valueEditor = new dijit.form.MultiSelect({
+                                          intermediateChanges: true,
+                                          multiple: true
+                                      }, domNode);
+                                  }
+                                  else if (this.typeName === "Date")
+                                  {
+                                      this.valueEditor = new DateTimePicker({
+                                          intermediateChanges: true,
+                                          userPreferences: this.userPreferences
+                                      }, domNode);
+                                  }
+                                  else
+                                  {
+                                      this.valueEditor = isNumericType(this.typeName) ? new dijit.form.NumberTextBox({
+                                          value: 0,
+                                          required: true,
+                                          intermediateChanges: true,
+                                          invalidMessage: 'Please enter a numeric value.'
+                                      }, domNode) : new dijit.form.ValidationTextBox({
+                                          value: '',
+                                          required: true,
+                                          intermediateChanges: true
+                                      }, domNode);
+                                  }
+                                  this.valueEditor.startup();
+                                  this.valueEditor.on("change", lang.hitch(this, this._conditionValueChanged));
+                                  this.removeCriteria.on("click", lang.hitch(this, this._removalRequested));
+                                  this._conditionChanged(ANY);
+                                  this._saveState()
+                              },
+                              _saveState: function ()
+                              {
+                                  this._savedValue = this.valueEditor.value;
+                                  this._savedCondition = this.criteriaCondition.value;
+                              },
+                              _conditionChanged: function (newValue)
+                              {
+                                  if (this.criteriaCondition.value != this._lastCondition)
+                                  {
+                                      var editable = conditionHasWidget(newValue);
+                                      this.valueEditor.set("disabled", !editable);
+                                      this._lastCondition = newValue;
+                                      this._conditionValueChanged();
+                                  }
+                              },
+                              _conditionValueChanged: function (newValue)
+                              {
+                                  var expression;
+                                  var val = this._getConditionValue();
+                                  if (val)
+                                  {
+                                      expression = buildExpression(this.criteriaName,
                                                                    this.criteriaCondition.value,
-                                                                   this._getConditionValue(),
+                                                                   val,
                                                                    this.typeName);
-                                        },
-                        _getConditionValue: function()
-                                        {
-                                            return this.valueEditor.expression || this.valueEditor.value;
-                                        },
-                        _removalRequested: function()
-                                        {
-                                            this._removed = true;
-                                            this.emit("change", this);
-                                        },
-                        _getRemovedAttr:function()
-                                        {
-                                          return this._removed;
-                                        },
-                        cancelled:      function()
-                                        {
-                                            if (!this._stored)
-                                            {
-                                              this.destroyRecursive(false);
-                                            }
-                                            else
-                                            {
-                                              if (this._removed)
-                                              {
-                                                domStyle.set(this.domNode, "display", "");
-                                                this._removed = false;
-                                              }
-                                              this.valueEditor.set("value", this._savedValue);
-                                              this.criteriaCondition.set("value", this._savedCondition);
-                                            }
-                                        },
-                        submitted:      function()
-                                        {
-                                            if (this._removed)
-                                            {
-                                              this.destroyRecursive(false);
-                                            }
-                                            else
-                                            {
-                                              this._saveState();
-                                              this._stored = true;
-                                            }
-                                        },
-                        _setRemovableAttr:function(removable)
-                                        {
-                                          this._removable = removable
-                                          this.removeCriteria.set("disabled", !removable);
-                                        },
-                        isValidCriteria:function()
-                                        {
-                                          if (!this.valueEditor.get("disabled"))
-                                          {
-                                            if (this.valueEditor.isValid)
-                                            {
-                                              return this.valueEditor.isValid();
-                                            }
-
-                                            if (this.valueEditor instanceof dijit.form.MultiSelect)
-                                            {
-                                              var value = this.valueEditor.value;
-                                              return value && value.length;
-                                            }
-                                          }
-                                          return true;
-                                        }
+                                  }
+                                  if (!expression)
+                                  {
+                                      expression = this.criteriaName + ":" + ANY;
+                                  }
+                                  this.conditionExpression.innerHTML = entities.encode(String(expression));
+
+                                  // notify listeners that criteria is changed
+                                  this.emit("change", this);
+                              },
+                              getExpression: function ()
+                              {
+                                  if (this._removed)
+                                  {
+                                      return undefined;
+                                  }
+                                  return buildExpression(this.criteriaName,
+                                                         this.criteriaCondition.value,
+                                                         this._getConditionValue(),
+                                                         this.typeName);
+                              },
+                              _getConditionValue: function ()
+                              {
+                                  return this.valueEditor.expression || this.valueEditor.value;
+                              },
+                              _removalRequested: function ()
+                              {
+                                  this._removed = true;
+                                  this.emit("change", this);
+                              },
+                              _getRemovedAttr: function ()
+                              {
+                                  return this._removed;
+                              },
+                              cancelled: function ()
+                              {
+                                  if (!this._stored)
+                                  {
+                                      this.destroyRecursive(false);
+                                  }
+                                  else
+                                  {
+                                      if (this._removed)
+                                      {
+                                          domStyle.set(this.domNode, "display", "");
+                                          this._removed = false;
+                                      }
+                                      this.valueEditor.set("value", this._savedValue);
+                                      this.criteriaCondition.set("value", this._savedCondition);
+                                  }
+                              },
+                              submitted: function ()
+                              {
+                                  if (this._removed)
+                                  {
+                                      this.destroyRecursive(false);
+                                  }
+                                  else
+                                  {
+                                      this._saveState();
+                                      this._stored = true;
+                                  }
+                              },
+                              _setRemovableAttr: function (removable)
+                              {
+                                  this._removable = removable
+                                  this.removeCriteria.set("disabled", !removable);
+                              },
+                              isValidCriteria: function ()
+                              {
+                                  if (!this.valueEditor.get("disabled"))
+                                  {
+                                      if (this.valueEditor.isValid)
+                                      {
+                                          return this.valueEditor.isValid();
+                                      }
+
+                                      if (this.valueEditor instanceof dijit.form.MultiSelect)
+                                      {
+                                          var value = this.valueEditor.value;
+                                          return value && value.length;
+                                      }
+                                  }
+                                  return true;
+                              }
 
-                });
+                          });
 
-});
\ No newline at end of file
+       });
\ No newline at end of file



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org