cartodb/lib/assets/javascripts/dashboard/components/tabpane/tabpane.js
2020-06-15 10:58:47 +08:00

144 lines
3.1 KiB
JavaScript

const _ = require('underscore');
const CoreView = require('backbone/core-view');
module.exports = CoreView.extend({
initialize: function () {
this.tabs = {};
this.activeTab = null;
this.activePane = null;
},
addTab: function (name, view, options) {
options = options || { active: true };
if (this.tabs[name] !== undefined) {
console.debug(name + 'already added');
} else {
this.tabs[name] = view.cid;
this.addView(view);
if (options.after !== undefined) {
var e = this.$el.children()[options.after];
view.$el.insertAfter(e);
} else if (options.prepend) {
this.$el.prepend(view.el);
} else {
this.$el.append(view.el);
}
this.trigger('tabAdded', name, view);
if (options.active) {
this.active(name);
} else {
view.hide();
}
}
},
getPreviousPane: function () {
var tabs = _.toArray(this.tabs);
var panes = _.toArray(this._subviews);
var i = _.indexOf(tabs, this.activePane.cid) - 1;
if (i < 0) i = panes.length - 1;
return panes[i];
},
getNextPane: function () {
var tabs = _.toArray(this.tabs);
var panes = _.toArray(this._subviews);
var i = 1 + _.indexOf(tabs, this.activePane.cid);
if (i > panes.length - 1) i = 0;
return panes[i];
},
getPane: function (name) {
var vid = this.tabs[name];
return this._subviews[vid];
},
getActivePane: function () {
return this.activePane;
},
size: function () {
return _.size(this.tabs);
},
clean: function () {
this.removeTabs();
CoreView.prototype.clean.call(this);
},
removeTab: function (name) {
if (this.tabs[name] !== undefined) {
var vid = this.tabs[name];
this._subviews[vid].clean();
delete this.tabs[name];
if (this.activeTab == name) { // eslint-disable-line eqeqeq
this.activeTab = null;
}
if (_.size(this.tabs)) {
this.active(_.keys(this.tabs)[0]);
}
}
},
removeTabs: function () {
for (var name in this.tabs) {
var vid = this.tabs[name];
this._subviews[vid].clean();
delete this.tabs[name];
}
this.activeTab = null;
},
active: function (name) {
const vid = this.tabs[name];
if (vid !== undefined) {
if (this.activeTab !== name) {
var v = this._subviews[vid];
if (this.activeTab) {
var vid_old = this._subviews[this.tabs[this.activeTab]];
vid_old.hide();
this.trigger('tabDisabled', this.activeTab, vid_old);
this.trigger('tabDisabled:' + this.activeTab, vid_old);
if (vid_old.deactivated) {
vid_old.deactivated();
}
}
v.show();
if (v.activated) {
v.activated();
}
this.activeTab = name;
this.activePane = v;
this.trigger('tabEnabled', name, v);
this.trigger('tabEnabled:' + name, v);
}
return this.activePane;
}
},
render: function () {
return this;
},
each: function (fn) {
_.each(this.tabs, (cid, tab) => {
fn(tab, this.getPane(tab));
});
}
});