blob: 256238072effb014266850399e0238728cbfe6ed [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.
*/
/**
* Renders details information about an application (sensors, summary, effectors, etc.).
*
* Options preselectTab (e.g. 'activities') and preselectTabDetails ('subtasks/1234') can be set
* before a render to cause the given tab / details to be opened.
*
* @type {*}
*/
define([
"underscore", "jquery", "backbone", "./entity-summary",
"./entity-sensors", "./entity-effectors", "./entity-policies",
"./entity-activities", "./entity-advanced", "model/task-summary", "text!tpl/apps/details.html"
], function (_, $, Backbone, SummaryView, SensorsView, EffectorsView, PoliciesView, ActivitiesView, AdvancedView, TaskSummary, DetailsHtml) {
var EntityDetailsView = Backbone.View.extend({
template:_.template(DetailsHtml),
events:{
'click .entity-tabs a':'tabSelected'
},
initialize:function () {
var self = this;
var tasks = new TaskSummary.Collection;
this.$el.html(this.template({}))
this.sensorsView = new SensorsView({
model:this.model,
tabView:this,
})
this.effectorsView = new EffectorsView({
model:this.model,
tabView:this,
})
this.policiesView = new PoliciesView({
model:this.model,
tabView:this,
})
this.activitiesView = new ActivitiesView({
model:this.model,
tabView:this,
collection:tasks
})
// summary comes after others because it uses the tasks
this.summaryView = new SummaryView({
model:this.model,
tabView:this,
application:this.options.application,
tasks:tasks,
})
this.advancedView = new AdvancedView({
model: this.model,
tabView:this,
application:this.options.application
});
// propagate to app tree view
this.advancedView.on("entity.expunged", function() { self.trigger("entity.expunged"); })
this.$("#summary").html(this.summaryView.render().el);
this.$("#sensors").html(this.sensorsView.render().el);
this.$("#effectors").html(this.effectorsView.render().el);
this.$("#policies").html(this.policiesView.render().el);
this.$("#activities").html(this.activitiesView.render().el);
this.$("#advanced").html(this.advancedView.render().el);
},
beforeClose:function () {
this.summaryView.close();
this.sensorsView.close();
this.effectorsView.close();
this.policiesView.close();
this.activitiesView.close();
this.advancedView.close();
},
getEntityHref: function() {
return $("#app-tree .entity_tree_node_wrapper.active a").attr("href");
},
render: function(optionalParent) {
this.summaryView.render()
this.sensorsView.render()
this.effectorsView.render()
this.policiesView.render()
this.activitiesView.render()
this.advancedView.render()
if (optionalParent) {
optionalParent.html(this.el)
}
var entityHref = this.getEntityHref();
if (entityHref) {
$("a[data-toggle='tab']").each(function(i,a) {
$(a).attr('href',entityHref+"/"+$(a).attr("data-target").slice(1));
});
} else {
// entity not available yet -- should be soon
// log("could not find entity href for tab");
}
if (this.options.preselectTab) {
var tabLink = this.$('a[data-target="#'+_.escape(this.options.preselectTab)+'"]');
var showFn = function() { tabLink.tab('show', { duration: 0 }); };
if (optionalParent) showFn();
else _.defer(showFn);
}
return this;
},
tabSelected: function(event) {
// TODO: the bootstrap JS code still prevents shift-click from working
// have to add the following logic to bootstrap tab click handler also
// if (event.metaKey || event.shiftKey)
// // trying to open in a new tab, do not act on it here!
// return;
event.preventDefault();
var tabName = $(event.currentTarget).attr("data-target").slice(1);
this.options.preselectTab = tabName;
this.options.preselectTabDetails = null;
var route = this.getTab(tabName);
if (route) {
if (route[0]=='#') route = route.substring(1);
Backbone.history.navigate(route);
}
// caller will ensure tab is shown
},
getTab: function(tabName, entityId, entityHref) {
if (!entityHref) {
if (entityId) {
entityHref = this.getEntityHref();
if (!entityHref.endsWith(entityId)) {
lastSlash = entityHref.lastIndexOf('/');
if (lastSlash>=0) {
entityHref = entityHref.substring(0, lastSlash+1) + '/' + entityId;
} else {
log("malformed entityHref when opening tab: "+entityHref)
entityHref = this.getEntityHref();
}
}
} else {
entityHref = this.getEntityHref();
}
}
if (entityHref && tabName)
return entityHref+"/"+tabName;
return null;
},
/** for tabs to redirect to other tabs; entityId and entityHref are optional (can supply either, or null to use current entity);
* tabPath is e.g. 'sensors' or 'activities/subtask/1234' */
openTab: function(tabPath, entityId, entityHref) {
var route = this.getTab(tabPath, entityId, entityHref);
if (!route) return;
if (route[0]=='#') route = route.substring(1);
Backbone.history.navigate(route);
tabPaths = tabPath.split('/');
if (!tabPaths) return;
var tabName = tabPaths.shift();
if (!tabName)
// ignore leading /
tabName = tabPaths.shift();
if (!tabName) return;
this.options.preselectTab = tabName;
if (tabPaths)
this.options.preselectTabDetails = tabPaths.join('/');
this.render();
}
});
return EntityDetailsView;
});