blob: e2e71a29509dfe34112de2f463a1ec8289070afb [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.
*/
/**
* Displays the list of activities/tasks the entity performed.
*/
define([
"underscore", "jquery", "backbone", "brooklyn-utils", "view/viewutils",
"view/activity-details",
"text!tpl/apps/activities.html", "text!tpl/apps/activity-table.html",
"text!tpl/apps/activity-row-details.html", "text!tpl/apps/activity-row-details-main.html",
"text!tpl/apps/activity-full-details.html",
"bootstrap", "jquery-datatables", "datatables-extensions", "moment"
], function (_, $, Backbone, Util, ViewUtils, ActivityDetailsView,
ActivitiesHtml, ActivityTableHtml, ActivityRowDetailsHtml, ActivityRowDetailsMainHtml, ActivityFullDetailsHtml) {
var ActivitiesView = Backbone.View.extend({
template:_.template(ActivitiesHtml),
table:null,
refreshActive:true,
selectedId:null,
selectedRow:null,
events:{
"click #activities-root .activity-table tr":"rowClick",
'click #activities-root .refresh':'refreshNow',
'click #activities-root .toggleAutoRefresh':'toggleAutoRefresh',
'click #activities-root .showDrillDown':'showDrillDown',
'click #activities-root .toggleFullDetail':'toggleFullDetail'
},
initialize:function () {
_.bindAll(this)
this.$el.html(this.template({ }));
this.$('#activities-root').html(_.template(ActivityTableHtml))
var that = this,
$table = that.$('#activities-root .activity-table');
that.collection.url = that.model.getLinkByName("activities");
that.table = ViewUtils.myDataTable($table, {
"fnRowCallback": function( nRow, aData, iDisplayIndex, iDisplayIndexFull ) {
$(nRow).attr('id', aData[0])
$(nRow).addClass('activity-row')
},
"aaSorting": [[ 2, "desc" ]],
"aoColumnDefs": [
{
"mRender": function ( data, type, row ) { return Util.escape(data) },
"aTargets": [ 1, 3 ]
},
{
"mRender": function ( data, type, row ) {
if ( type === 'display' ) {
data = moment(data).calendar();
}
return Util.escape(data)
},
"aTargets": [ 2 ]
},
{ "bVisible": false,
"mRender": function ( data, type, row ) { return Util.escape(data) },
"aTargets": [ 0 ]
}
]
});
// TODO domain-specific filters
ViewUtils.addAutoRefreshButton(that.table);
ViewUtils.addRefreshButton(that.table);
ViewUtils.fadeToIndicateInitialLoad($table);
that.collection.on("reset", that.renderOnLoad, that);
ViewUtils.fetchRepeatedlyWithDelay(this, this.collection,
{ fetchOptions: { reset: true }, doitnow: true,
enablement: function() { return that.refreshActive } });
},
refreshNow: function() {
this.collection.fetch({reset: true});
},
render:function () {
this.updateActivitiesNow();
var details = this.options.tabView ? this.options.tabView.options.preselectTabDetails : null;
if (details && details!=this.lastPreselectTabDetails) {
this.lastPreselectTabDetails = details;
// should be a path
this.queuedTasksToOpen = details.split("/");
}
this.tryOpenQueuedTasks();
return this;
},
tryOpenQueuedTasks: function() {
if (!this.queuedTasksToOpen || this.tryingOpenQueuedTasks) return;
this.openingQueuedTasks = true;
var $lastActivityPanel = null;
while (true) {
var task = this.queuedTasksToOpen.shift();
if (task == undefined) {
this.openingQueuedTasks = false;
return;
}
if (task == 'subtask') {
var subtask = this.queuedTasksToOpen.shift();
$lastActivityPanel = this.showDrillDownTask(subtask, $lastActivityPanel);
} else {
log("unknown queued task for activities panel: "+task)
// skip it, just continue
}
}
},
beforeClose:function () {
this.collection.off("reset", this.renderOnLoad);
},
renderOnLoad: function() {
this.loaded = true;
this.render();
ViewUtils.cancelFadeOnceLoaded(this.table);
},
toggleAutoRefresh:function () {
ViewUtils.toggleAutoRefresh(this);
},
enableAutoRefresh: function(isEnabled) {
this.refreshActive = isEnabled
},
refreshNow: function() {
this.collection.fetch();
this.table.fnAdjustColumnSizing();
},
updateActivitiesNow: function() {
var that = this;
if (this.table == null || this.collection.length==0 || this.viewIsClosed) {
// nothing to do
} else {
var topLevelTasks = []
for (taskI in this.collection.models) {
var task = this.collection.models[taskI]
var submitter = task.get("submittedByTask")
if ((submitter==null) ||
(submitter!=null && this.collection.get(submitter.metadata.id)==null)
) {
topLevelTasks.push(task)
}
}
ViewUtils.updateMyDataTable(that.table, topLevelTasks, function(task, index) {
return [ task.get("id"),
task.get("displayName"),
task.get("submitTimeUtc"),
task.get("currentStatus")
];
});
this.showDetailRow(true);
}
return this;
},
rowClick:function(evt) {
var row = $(evt.currentTarget).closest("tr");
var id = row.attr("id");
if (id==null)
// is the details row, ignore click here
return;
this.showDrillDownTask(id);
return;
},
showDrillDown: function(event) {
this.showDrillDownTask($(event.currentTarget).closest("td.row-expansion").attr("id"));
},
showDrillDownTask: function(taskId, optionalParent) {
// log("showing initial drill down "+taskId)
var that = this;
var activityDetailsPanel = new ActivityDetailsView({
taskId: taskId,
tabView: that,
collection: this.collection,
breadcrumbs: ''
})
activityDetailsPanel.addToView(optionalParent || this.$(".activity-table"));
return activityDetailsPanel.$el;
},
showDetailRow: function(updateOnly) {
var id = this.selectedId,
that = this;
if (id==null) return;
var task = this.collection.get(id);
if (task==null) return;
if (!updateOnly) {
var html = _.template(ActivityRowDetailsHtml, {
task: task==null ? null : task.attributes,
link: that.model.getLinkByName("activities")+"/"+id,
updateOnly: updateOnly
})
$('tr#'+_.escape(id)).next().find('td.row-expansion').html(html)
$('tr#'+_.escape(id)).next().find('td.row-expansion').attr('id', id)
} else {
// just update
$('tr#'+_.escape(id)).next().find('.task-description').html(Util.escape(task.attributes.description))
}
var html = _.template(ActivityRowDetailsMainHtml, {
task: task==null ? null : task.attributes,
link: that.model.getLinkByName("activities")+"/"+id,
updateOnly: updateOnly
})
$('tr#'+_.escape(id)).next().find('.expansion-main').html(html)
if (!updateOnly) {
$('tr#'+_.escape(id)).next().find('.row-expansion .opened-row-details').hide()
$('tr#'+_.escape(id)).next().find('.row-expansion .opened-row-details').slideDown(300)
}
},
toggleFullDetail: function(evt) {
var i = $('.toggleFullDetail');
var id = i.closest("td.row-expansion").attr('id')
i.toggleClass('active')
if (i.hasClass('active'))
this.showFullActivity(id)
else
this.hideFullActivity(id)
},
showFullActivity: function(id) {
id = this.selectedId
var $details = $("td.row-expansion#"+_.escape(id)+" .expansion-footer");
var task = this.collection.get(id);
var html = _.template(ActivityFullDetailsHtml, { task: task });
$details.html(html);
$details.slideDown(100);
_.defer(function() { ViewUtils.setHeightAutomatically($('textarea',$details), 30, 200) })
},
hideFullActivity: function(id) {
id = this.selectedId
var $details = $("td.row-expansion#"+_.escape(id)+" .expansion-footer");
$details.slideUp(100);
}
});
return ActivitiesView;
});