blob: 874474f8bcf01475772bea85e03ea3a4100596d1 [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(['require',
'backbone',
'hbs!tmpl/profile/ProfileColumnLayoutView_tmpl',
'collection/VProfileList',
'utils/Utils',
'utils/Messages',
'utils/Globals',
'moment',
'models/VEntity',
'nvd3'
], function(require, Backbone, ProfileColumnLayoutViewTmpl, VProfileList, Utils, Messages, Globals, moment, VEntity) {
'use strict';
var ProfileColumnLayoutView = Backbone.Marionette.LayoutView.extend(
/** @lends ProfileColumnLayoutView */
{
_viewName: 'ProfileColumnLayoutView',
template: ProfileColumnLayoutViewTmpl,
/** Layout sub regions */
regions: {},
templateHelpers: function() {
return {
profileData: this.profileData.attributes ? this.profileData.attributes : this.profileData,
entityDetail: this.entityDetail,
typeObject: this.typeObject
};
},
/** ui selector cache */
ui: {
"backToYear": '[data-id="backToYear"]'
},
/** ui events hash */
events: function() {
var events = {};
events["click " + this.ui.backToYear] = 'backToYear';
return events;
},
/**
* intialize a new ProfileColumnLayoutView Layout
* @constructs
*/
initialize: function(options) {
_.extend(this, _.pick(options, 'profileData', 'guid', 'entityDetail'));
this.typeObject = Utils.getProfileTabType(this.profileData.attributes);
this.entityModel = new VEntity();
this.formatValue = d3.format("2s")
},
fetchEntity: function(argument) {
var that = this;
this.entityModel.getEntity(this.entityDetail.table.guid, {
skipDefaultError: true,
success: function(data) {
var entity = data.entity,
profileData = entity && entity.attributes && entity.attributes.profileData ? entity.attributes.profileData.attributes : null;
if (profileData && profileData.rowCount) {
that.$('.rowValue').show();
that.$('.rowValue .graphval').html('<b>' + that.formatValue(profileData.rowCount).replace('G', 'B') + '</b>');
}
if (entity.attributes) {
if (entity.guid) {
that.$('.table_name .graphval').html('<b><a href="#!/detailPage/' + entity.guid + "?profile=true" + '">' + Utils.getName(entity) + '</a></b>');
}
that.$('.table_created .graphval').html('<b>' + moment(entity.attributes.createTime).format("LL") + '</b>');
}
}
});
},
bindEvents: function() {},
onRender: function() {
this.renderGraph();
this.fetchEntity();
if (this.typeObject && this.typeObject.type === "date") {
this.$('svg').addClass('dateType');
}
},
renderGraph: function(argument) {
if (!this.typeObject) {
return;
}
var that = this,
profileData = this.profileData.attributes;
this.data = [{
key: this.typeObject.label,
values: this.typeObject.actualObj || []
}];
nv.addGraph(function() {
that.chart = nv.models.multiBarChart()
.x(function(d) {
return d.value || d.year
}) //Specify the data accessors.
.y(function(d) {
return d.count
})
.height(220)
.stacked(false)
.showControls(false)
.reduceXTicks(false)
.staggerLabels(true)
.duration(1000)
.groupSpacing(0.6)
.wrapLabels(true)
.showLegend(false);
if (that.typeObject.type !== "date") {
that.chart.rotateLabels(-45);
}
that.chart.color(["#38BB9B"]);
that.chart.yAxis.tickFormat(function(d) {
return that.formatValue(d).replace('G', 'B');
});
that.chart.xAxis
.axisLabel(that.typeObject.xAxisLabel)
.axisLabelDistance(-185);
that.chart.yAxis
.axisLabel(that.typeObject.yAxisLabel)
.axisLabelDistance(-5);
that.chart.margin({
right: 30,
left: 80,
top: 20,
bottom: 60
});
if (that.typeObject.type === "date") {
that.chart.multibar.dispatch.elementClick = function(e) {
if (!that.monthsData) {
that.createMonthData(e.data.monthlyCounts)
}
}
}
that.svg = d3.select(that.$('svg')[0]).datum(that.data)
that.svg.transition().duration(0).call(that.chart);
nv.utils.windowResize(that.chart.update);
return that.chart;
});
},
backToYear: function() {
this.ui.backToYear.hide();
this.$('.profileGraphDetail').show();
this.monthsData = null;
this.updateGraph(this.data);
},
createMonthData: function(data) {
var monthsKey = {
"1": "Jan",
"2": "Feb",
"3": "Mar",
"4": "Apr",
"5": "May",
"6": "Jun",
"7": "Jul",
"8": "Aug",
"9": "Sep",
"10": "Oct",
"11": "Nov",
"12": "Dec"
},
i = 1;
this.monthsData = [{
key: this.typeObject.label,
values: []
}];
while (i <= 12) {
this.monthsData[0].values.push({
value: monthsKey[i],
count: data[i] || 0
});
i++;
}
this.ui.backToYear.show();
this.$('.profileGraphDetail').hide();
this.updateGraph(this.monthsData);
},
updateGraph: function(data) {
this.svg.datum(data).transition().duration(0).call(this.chart);
},
});
return ProfileColumnLayoutView;
});