/**
* Kendo UI v2016.1.112 (http://www.telerik.com/kendo-ui)
* Copyright 2016 Telerik AD. All rights reserved.
*
* Kendo UI commercial licenses may be obtained at
* http://www.telerik.com/purchase/license-agreement/kendo-ui-complete
* If you do not own a commercial license, this file shall be governed by the trial license terms.
*/
(function (f, define) {
define('kendo.pivot.configurator', ['kendo.dom'], f);
}(function () {
var __meta__ = {
id: 'pivot.configurator',
name: 'PivotConfigurator',
category: 'web',
depends: [
'dropdownlist',
'treeview',
'pivot.fieldmenu'
],
hidden: true
};
(function ($, undefined) {
var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, ns = '.kendoPivotConfigurator', HOVEREVENTS = 'mouseenter' + ns + ' mouseleave' + ns, SETTING_CONTAINER_TEMPLATE = kendo.template('
${name}
' + '');
function addKPI(data) {
var found;
var idx = 0;
var length = data.length;
for (; idx < length; idx++) {
if (data[idx].type == 2) {
found = true;
break;
}
}
if (found) {
data.splice(idx + 1, 0, {
caption: 'KPIs',
defaultHierarchy: '[KPIs]',
name: 'KPIs',
uniqueName: '[KPIs]'
});
}
}
function kpiNode(node) {
return {
name: node.uniqueName,
type: node.type
};
}
function normalizeKPIs(data) {
for (var idx = 0, length = data.length; idx < length; idx++) {
data[idx].uniqueName = data[idx].name;
data[idx].type = 'kpi';
}
return data;
}
function settingTargetFromNode(node) {
var target = $(node).closest('.k-pivot-setting');
if (target.length) {
return target.data('kendoPivotSettingTarget');
}
return null;
}
var PivotConfigurator = Widget.extend({
init: function (element, options) {
Widget.fn.init.call(this, element, options);
this.element.addClass('k-widget k-fieldselector k-alt k-edit-form-container');
this._dataSource();
this._layout();
this.refresh();
kendo.notify(this);
},
events: [],
options: {
name: 'PivotConfigurator',
filterable: false,
sortable: false,
messages: {
measures: 'Drop Data Fields Here',
columns: 'Drop Column Fields Here',
rows: 'Drop Rows Fields Here',
measuresLabel: 'Measures',
columnsLabel: 'Columns',
rowsLabel: 'Rows',
fieldsLabel: 'Fields'
}
},
_dataSource: function () {
var that = this;
if (that.dataSource && that._refreshHandler) {
that.dataSource.unbind('change', that._refreshHandler).unbind('error', that._errorHandler).unbind('progress', that._progressHandler);
} else {
that._errorHandler = $.proxy(that._error, that);
that._refreshHandler = $.proxy(that.refresh, that);
that._progressHandler = $.proxy(that._requestStart, that);
}
that.dataSource = kendo.data.PivotDataSource.create(that.options.dataSource);
that.dataSource.bind('change', that._refreshHandler).bind('error', that._errorHandler).bind('progress', that._progressHandler);
},
setDataSource: function (dataSource) {
this.options.dataSource = dataSource;
this._dataSource();
if (this.measures) {
this.measures.setDataSource(dataSource);
}
if (this.rows) {
this.rows.setDataSource(dataSource);
}
if (this.columns) {
this.columns.setDataSource(dataSource);
}
this.refresh();
},
_treeViewDataSource: function () {
var that = this;
return kendo.data.HierarchicalDataSource.create({
schema: {
model: {
id: 'uniqueName',
hasChildren: function (item) {
return !('hierarchyUniqueName' in item) && !('aggregator' in item);
}
}
},
transport: {
read: function (options) {
var promise;
var node;
var kpi;
if ($.isEmptyObject(options.data)) {
promise = that.dataSource.schemaDimensions();
promise.done(function (data) {
if (!that.dataSource.cubeBuilder) {
addKPI(data);
}
options.success(data);
}).fail(options.error);
} else {
node = that.treeView.dataSource.get(options.data.uniqueName);
if (node.uniqueName === '[KPIs]') {
kpi = true;
promise = that.dataSource.schemaKPIs();
promise.done(function (data) {
options.success(normalizeKPIs(data));
}).fail(options.error);
} else if (node.type == 'kpi') {
kpi = true;
options.success(buildKPImeasures(node));
}
if (!kpi) {
if (node.type == 2) {
promise = that.dataSource.schemaMeasures();
} else if (node.dimensionUniqueName) {
promise = that.dataSource.schemaLevels(options.data.uniqueName);
} else {
promise = that.dataSource.schemaHierarchies(options.data.uniqueName);
}
promise.done(options.success).fail(options.error);
}
}
}
}
});
},
_progress: function (toggle) {
kendo.ui.progress(this.element, toggle);
},
_error: function () {
this._progress(false);
},
_requestStart: function () {
this._progress(true);
},
_layout: function () {
this.form = $('').appendTo(this.element);
this._fields();
this._targets();
},
_fields: function () {
var container = $('' + this.options.messages.fieldsLabel + '
').appendTo(this.form);
var template = '# if (item.type == 2 || item.uniqueName == "[KPIs]") { #' + '' + '# } else if (item.type && item.type !== "kpi") { #' + '' + '# } #' + '#: item.caption || item.name #';
this.treeView = $('').appendTo(container).kendoTreeView({
template: template,
dataTextField: 'caption',
dragAndDrop: true,
autoBind: false,
dataSource: this._treeViewDataSource(),
dragstart: function (e) {
var dataItem = this.dataItem(e.sourceNode);
if (!dataItem.hasChildren && !dataItem.aggregator && !dataItem.measure || dataItem.type == 2 || dataItem.uniqueName === '[KPIs]') {
e.preventDefault();
}
},
drag: function (e) {
var status = 'k-denied';
var setting = settingTargetFromNode(e.dropTarget);
if (setting && setting.validate(this.dataItem(e.sourceNode))) {
status = 'k-add';
}
e.setStatusClass(status);
},
drop: function (e) {
e.preventDefault();
var setting = settingTargetFromNode(e.dropTarget);
var node = this.dataItem(e.sourceNode);
var idx, length, measures;
var name;
if (setting && setting.validate(node)) {
name = node.defaultHierarchy || node.uniqueName;
if (node.type === 'kpi') {
measures = buildKPImeasures(node);
length = measures.length;
name = [];
for (idx = 0; idx < length; idx++) {
name.push(kpiNode(measures[idx]));
}
} else if (node.kpi) {
name = [kpiNode(node)];
}
setting.add(name);
}
}
}).data('kendoTreeView');
},
_createTarget: function (element, options) {
var template = '';
return new kendo.ui.PivotSettingTarget(element, $.extend({
dataSource: this.dataSource,
hint: function (element) {
var wrapper = $('');
wrapper.find('.k-list').append(element.clone());
return wrapper;
},
template: template,
emptyTemplate: '${data}'
}, options));
},
_targets: function () {
var container = $('').appendTo(this.form);
var columnsContainer = $(SETTING_CONTAINER_TEMPLATE({
name: this.options.messages.columnsLabel,
icon: 'k-i-vbars'
})).appendTo(container);
var columns = $('').appendTo(columnsContainer.last());
var rowsContainer = $(SETTING_CONTAINER_TEMPLATE({
name: this.options.messages.rowsLabel,
icon: 'k-i-hbars'
})).appendTo(container);
var rows = $('').appendTo(rowsContainer.last());
var measuresContainer = $(SETTING_CONTAINER_TEMPLATE({
name: this.options.messages.measuresLabel,
icon: 'k-i-sum'
})).appendTo(container);
var measures = $('').appendTo(measuresContainer.last());
var options = this.options;
this.columns = this._createTarget(columns, {
filterable: options.filterable,
sortable: options.sortable,
connectWith: rows,
messages: {
empty: options.messages.columns,
fieldMenu: options.messages.fieldMenu
}
});
this.rows = this._createTarget(rows, {
filterable: options.filterable,
setting: 'rows',
connectWith: columns,
messages: {
empty: this.options.messages.rows,
fieldMenu: this.options.messages.fieldMenu
}
});
this.measures = this._createTarget(measures, {
setting: 'measures',
messages: { empty: options.messages.measures }
});
columns.add(rows).add(measures).on(HOVEREVENTS, '.k-item:not(.k-empty)', this._toggleHover);
},
_toggleHover: function (e) {
$(e.currentTarget).toggleClass('k-state-hover', e.type === 'mouseenter');
},
_resize: function () {
var element = this.element;
var height = this.options.height;
var border, fields;
if (!height) {
return;
}
element.height(height);
if (element.is(':visible')) {
fields = element.children('.k-columns').children('div.k-state-default');
height = element.innerHeight();
border = (element.outerHeight() - height) / 2;
height = height - (fields.outerHeight(true) - fields.height()) - border;
fields.height(height);
}
},
refresh: function () {
var dataSource = this.dataSource;
if (dataSource.cubeBuilder || this._cube !== dataSource.cube() || this._catalog !== dataSource.catalog()) {
this.treeView.dataSource.fetch();
}
this._catalog = this.dataSource.catalog();
this._cube = this.dataSource.cube();
this._resize();
this._progress(false);
},
destroy: function () {
Widget.fn.destroy.call(this);
this.dataSource.unbind('change', this._refreshHandler);
this.form.find('.k-list').off(ns);
this.rows.destroy();
this.columns.destroy();
this.measures.destroy();
this.treeView.destroy();
this.element = null;
this._refreshHandler = null;
}
});
function kpiMeasure(name, measure, type) {
return {
hierarchyUniqueName: name,
uniqueName: measure,
caption: measure,
measure: measure,
name: measure,
type: type,
kpi: true
};
}
function buildKPImeasures(node) {
var name = node.name;
return [
kpiMeasure(name, node.value, 'value'),
kpiMeasure(name, node.goal, 'goal'),
kpiMeasure(name, node.status, 'status'),
kpiMeasure(name, node.trend, 'trend')
];
}
ui.plugin(PivotConfigurator);
}(window.kendo.jQuery));
return window.kendo;
}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {
(a3 || a2)();
}));