blob: 66e33d06a2ed741e73e41d4d38f9052dd1e8d13d [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
define(["dojo/_base/declare",
"dojo/_base/array",
"dojo/_base/lang",
"dojo/string",
"dojo/text!query/WhereCriteria.html",
"dojox/html/entities",
"dijit/popup",
"qpid/management/query/CriteriaPane",
"dojo/Evented",
"dijit/_WidgetBase",
"dijit/_TemplatedMixin",
"dijit/_WidgetsInTemplateMixin",
"dijit/layout/ContentPane",
"dijit/form/Button",
"dijit/form/ValidationTextBox",
"dijit/form/TextBox",
"dijit/form/Select",
"dijit/form/Form",
"dijit/_Container",
"dijit/form/SimpleTextarea",
"dijit/InlineEditBox",
"dojo/domReady!"], function (declare, array, lang, string, template, entities, popup, CriteriaPane, Evented)
{
return declare("qpid.management.query.WhereCriteria",
[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, ""),
/**
* template attach points
*/
removeCriteria: null,
doneButton: null,
cancelButton: null,
addButton: null,
criteriaMatchCondition: null,
editDialog: null,
conditionDialogContent: null,
criteriaContainer: null,
newColumnCondition: null,
/**
* constructor arguments
*/
attributeDetails: null,
userPreferences: null,
/**
* inner fields
*/
_deleted: false,
constructor: function (args)
{
this.attributeDetails = args.attributeDetails;
this.inherited(arguments);
},
postCreate: function ()
{
this.inherited(arguments);
this._postCreate();
},
_getDeletedAttr: function ()
{
return this._deleted;
},
_postCreate: function ()
{
this.removeCriteria.on("click", lang.hitch(this, this._destroy));
this.doneButton.on("click", lang.hitch(this, this._criteriaSet));
this.cancelButton.on("click", lang.hitch(this, this._dialogCancelled));
this.addButton.on("click", lang.hitch(this, this._addCriteria));
this.criteriaMatchCondition.on("change", lang.hitch(this, this._criteriaConditionChanged));
var criteriaPane = this._addCriteria({_stored: true});
criteriaPane.submitted();
this._displayExpression();
this._criteriaConditionChanged();
this.editDialog.on("hide", lang.hitch(this, this._dialogHidden));
},
_addCriteria: function ()
{
var criteriaPane = new CriteriaPane({
criteriaName: this.attributeDetails.attributeName,
typeName: this.attributeDetails.type,
typeValidValues: this.attributeDetails.validValues,
userPreferences: this.userPreferences
});
this.criteriaContainer.addChild(criteriaPane);
criteriaPane.on("change", lang.hitch(this, this._criteriaChanged));
this._updateRemovable();
return criteriaPane;
},
_getNumberOfCriteria: function ()
{
var counter = 0;
var criteriaArray = this.criteriaContainer.getChildren();
for (var i = 0; i < criteriaArray.length; i++)
{
if (!criteriaArray[i].get("removed"))
{
counter = counter + 1;
}
}
return counter;
},
_updateRemovable: function ()
{
var counter = this._getNumberOfCriteria();
var singleCriteria = counter == 1;
var criteriaArray = this.criteriaContainer.getChildren();
for (var i = 0; i < criteriaArray.length; i++)
{
if (!criteriaArray[i].get("removed"))
{
criteriaArray[i].set("removable", !singleCriteria);
break;
}
}
this.criteriaMatchCondition.set("disabled", singleCriteria);
},
_getUserFriendlyExpression: function ()
{
var expression = this.getConditionExpression();
if (!expression)
{
expression = this.attributeDetails.attributeName + ": any";
}
return expression;
},
_displayExpression: function ()
{
var expression = this._getUserFriendlyExpression();
this.criteria.set("label", expression);
},
_criteriaConditionChanged: function ()
{
var isValid = this._validateCriteria();
if (isValid)
{
var expression = this._getUserFriendlyExpression();
this.newColumnCondition.set("value", expression);
this._updateRemovable();
}
this.doneButton.set("disabled", !isValid);
},
_criteriaChanged: function (criteria)
{
this._criteriaConditionChanged();
if (criteria && criteria.get("removed"))
{
var prev = this.criteriaMatchCondition;
var criteriaArray = this.criteriaContainer.getChildren();
for (var i = 0; i < criteriaArray.length; i++)
{
if (criteriaArray[i] == criteria)
{
break;
}
if (!criteriaArray[i].get("removed"))
{
prev = criteriaArray[i]
}
}
if (prev)
{
if (prev.focus)
{
prev.focus();
}
else if (prev instanceof qpid.management.query.CriteriaPane)
{
prev.criteriaCondition.focus();
}
criteria.domNode.style.display = "none";
}
}
},
_validateCriteria: function ()
{
var isValid = true;
var criteriaArray = this.criteriaContainer.getChildren();
for (var i = 0; i < criteriaArray.length; i++)
{
if (!criteriaArray[i].get("removed") && !criteriaArray[i].isValidCriteria())
{
isValid = false;
}
}
return isValid;
},
_getAttributeDetailsAttr: function ()
{
return this.attributeDetails;
},
getConditionExpression: function ()
{
if (this._deleted)
{
return undefined;
}
var expression = "";
var criteriaArray = this.criteriaContainer.getChildren();
var criteriaCounter = 0;
for (var i = 0; i < criteriaArray.length; i++)
{
var criteria = criteriaArray[i].getExpression();
if (criteria)
{
if (expression)
{
expression = expression + " " + this.criteriaMatchCondition.value;
}
expression = expression + " " + criteria;
criteriaCounter = criteriaCounter + 1;
}
}
if (criteriaCounter > 0 && this.criteriaMatchCondition.value == "or")
{
expression = "( " + expression + " )"
}
return expression;
},
getConditions: function () {
if (this._deleted)
{
return undefined;
}
var conditions = [];
var criteriaArray = this.criteriaContainer.getChildren();
for (var i = 0; i < criteriaArray.length; i++)
{
var condition = criteriaArray[i].getCondition();
if (condition)
{
conditions.push(condition);
}
}
return {
operator: this.criteriaMatchCondition.value,
conditions: conditions
};
},
_destroy: function ()
{
this._deleted = true;
try
{
// notify listeners which are listening for onChange events
this.emit("change", this);
}
finally
{
this.destroyRecursive(false);
}
},
_criteriaSet: function ()
{
var isValid = this._validateCriteria();
if (isValid)
{
this._displayExpression();
var criteriaArray = this.criteriaContainer.getChildren();
for (var i = 0; i < criteriaArray.length; i++)
{
criteriaArray[i].submitted();
}
popup.close(this.editDialog);
// notify listeners which are listening for onChange events
this.emit("change", this);
}
},
_dialogCancelled: function ()
{
popup.close(this.editDialog);
this._dialogHidden();
},
_dialogHidden: function ()
{
var criteriaArray = this.criteriaContainer.getChildren();
for (var i = 0; i < criteriaArray.length; i++)
{
if (criteriaArray[i].cancelled)
{
criteriaArray[i].cancelled();
}
}
this._updateRemovable();
}
});
});