blob: d30ee2025a260d980a289522db376ddd7a5da087 [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/lang",
"dojo/json",
"dojo/Deferred",
"dojo/Evented",
"dojo/text!dashboard/QueryWidgetSettings.html",
"qpid/management/query/QueryGrid",
"qpid/common/util",
"dojox/html/entities",
"dojox/widget/Portlet",
"dojox/widget/PortletDialogSettings",
"qpid/common/MessageDialog",
"dojo/query",
"dijit/_WidgetBase",
"dijit/_TemplatedMixin",
"dijit/_WidgetsInTemplateMixin",
"dijit/form/Button",
"dijit/Toolbar",
"dijit/Dialog"],
function (declare,
lang,
json,
Deferred,
Evented,
queryWidgetSettingsTemplate,
QueryGrid,
util,
entities,
Portlet,
PortletDialogSettings,
MessageDialog)
{
var QueryWidgetSettings = declare("qpid.management.dashboard.QueryWidgetSettings",
[dijit._WidgetBase, dijit._TemplatedMixin, dijit._WidgetsInTemplateMixin, Evented],
{
//Strip out the apache comment header from the template html as comments unsupported.
templateString: queryWidgetSettingsTemplate.replace(/<!--[\s\S]*?-->/g, ""),
// template fields
cancelButton: null,
applyButton: null,
refreshPeriod: null,
limit: null,
settingsForm: null,
postCreate: function ()
{
this.inherited(arguments);
this.cancelButton.on("click", lang.hitch(this, function ()
{
this.emit("cancel");
}));
this.settingsForm.on("submit", lang.hitch(this, function ()
{
if (this.settingsForm.validate())
{
var settings = {
limit: this.limit.get("value"),
refreshPeriod: this.refreshPeriod.get("value")
};
this.emit("save", {settings: settings});
}
else
{
alert('Form contains invalid data. Please correct first');
}
return false;
}));
this.refreshPeriod.on("change", lang.hitch(this, this._onChange));
this.limit.on("change", lang.hitch(this, this._onChange));
},
_onChange: function ()
{
this.applyButton.set("disabled", !this.settingsForm.validate());
},
_setLimitAttr: function (value)
{
this.limit.set("value", value)
},
_setRefreshPeriodAttr: function (value)
{
this.refreshPeriod.set("value", value)
}
});
return declare(Evented, {
_timer : null,
portlet : null,
constructor: function (kwargs)
{
this.preference = kwargs.preference;
this.controller = kwargs.controller;
this.management = kwargs.management;
this.parentObject = kwargs.parentObject;
var widgetSettings = kwargs.widgetSettings;
this.limit = 10;
if (widgetSettings
&& widgetSettings.preference
&& widgetSettings.preference.configuration
&& widgetSettings.preference.configuration.limit)
{
this.limit = widgetSettings.preference.configuration.limit;
}
this.refreshPeriod = widgetSettings && widgetSettings.refreshPeriod ? widgetSettings.refreshPeriod : 10;
this.hidden = !!(widgetSettings && widgetSettings.hidden);
},
createPortlet: function ()
{
var preference = this.preference;
var query = {
category: preference.value.category,
select: preference.value.select,
where: "1=2"
};
var deferred = new Deferred();
var queryPreflightRequestPromise = this.management.query(query);
queryPreflightRequestPromise.then(lang.hitch(this, function (preflightResults)
{
var headers = lang.clone(preflightResults.headers);
var columns = [];
for (var i = 0; i < headers.length; i++)
{
columns.push({
field: i,
label: headers[i],
sortable: false
});
}
var queryGrid = new QueryGrid({
detectChanges: true,
rowsPerPage: this.limit,
management: this.management,
parentObject: this.parentObject,
category: preference.value.category,
selectClause: preference.value.select + ",id",
orderBy: preference.value.orderBy,
where: preference.value.where,
pageSizeOptions: [],
previousNextArrows: false,
pagingLinks: 0,
columns: columns,
idProperty: columns.length
});
queryGrid.on('rowBrowsed', lang.hitch(this, function (event)
{
this.controller.showById(event.id);
}));
this._queryGrid = queryGrid;
var portlet = new Portlet({
title: preference.name,
content: queryGrid,
open: !this.hidden,
onClose: lang.hitch(this, function ()
{
MessageDialog.confirm({
title: "Remove widget?",
message: ("Are you sure you want to remove the query widget '"
+ entities.encode(new String(preference.name)) + "'"
+ " from the dashboard?"),
confirmationId: "dashboard.confirmation.widget.delete"
})
.then(lang.hitch(this, function ()
{
this.emit("close");
}));
}),
startup: function ()
{
this.inherited("startup", arguments);
// inherited startup adds the settings icon to the portlet's toolbar but does not expose
// a handle to it.
var settingsIconNodes = dojo.query(".dashboardWidgetSettingsIcon", this.domNode);
if (settingsIconNodes && settingsIconNodes.length == 1)
{
settingsIconNodes[0].title = "Configure the settings of this widget.";
}
}
});
if (portlet.closeIcon)
{
portlet.closeIcon.title = "Remove this query from the dashboard.";
}
if (portlet.arrowNode)
{
portlet.arrowNode.title = "Maximise/minimise this widget.";
}
portlet._preferenceAccessIcon = portlet._createIcon("preferenceAccessIcon",
"preferenceAccessHoverIcon",
lang.hitch(this, function ()
{
var tabData = {
tabType: "query",
modelObject: this.parentObject,
data: preference,
preferenceId: preference.id
};
this.controller.showTab(tabData);
}));
portlet._preferenceAccessIcon.title = "Open this query in a separate tab.";
var settings = new QueryWidgetSettings();
settings.set("limit", this.limit);
settings.set("refreshPeriod", this.refreshPeriod);
// TODO: remove hardcoded sizes
var settingsDialog = new PortletDialogSettings({
content: settings,
dimensions: [540, 130],
portletIconClass: "dashboardWidgetSettingsIcon",
portletIconHoverClass: "dashboardWidgetSettingsHoverIcon",
title: "Widget settings - " + preference.name
});
settings.on("save", lang.hitch(this, function (event)
{
var settings = event.settings;
var emitChange = this.limit !== settings.limit || this.refreshPeriod !== settings.refreshPeriod;
this.limit = settings.limit;
this.refreshPeriod = settings.refreshPeriod;
this.deactivate();
this.activate();
queryGrid.set("rowsPerPage", this.limit);
settingsDialog.toggle();
if (emitChange)
{
this.emit("change");
}
}));
settings.on("cancel", lang.hitch(settingsDialog, settingsDialog.toggle));
portlet.addChild(settingsDialog);
portlet.on("hide", lang.hitch(this, function(){
this.hidden = true;
this.emit("change");
}));
portlet.on("show", lang.hitch(this, function(){
this.hidden = false;
this.emit("change");
}));
this.activate();
this.portlet = portlet;
deferred.resolve(portlet);
}), function (error)
{
deferred.cancel(error);
});
return deferred.promise;
},
destroy : function ()
{
if (this.portlet)
{
this.portlet.destroyRecursive();
}
this.deactivate();
},
getSettings: function ()
{
return {
type: "query",
refreshPeriod: this.refreshPeriod,
hidden: this.hidden,
preference: {
id: this.preference.id,
configuration: {
limit: this.limit
}
}
};
},
activate: function ()
{
var updateQuery = function ()
{
this._queryGrid.updateData();
};
if (this._timer)
{
this.deactivate();
}
this._queryGrid.updateData();
this._timer = setInterval(lang.hitch(this, updateQuery), this.refreshPeriod * 1000);
},
deactivate: function ()
{
if (this._timer)
{
clearInterval(this._timer);
this._timer = null;
}
}
});
});