mirror of https://github.com/rancher/api-ui.git
182 lines
3.5 KiB
JavaScript
182 lines
3.5 KiB
JavaScript
function Explorer(htmlapi)
|
|
{
|
|
this._api = htmlapi;
|
|
this._columns = [];
|
|
this._lastColumnId = 0;
|
|
}
|
|
|
|
Explorer.prototype.show = function(cb)
|
|
{
|
|
var tpl = {
|
|
};
|
|
|
|
document.body.innerHTML = Handlebars.templates['explorer'](tpl);
|
|
$('#explorer').css('top', $('#header')[0].offsetHeight + 'px');
|
|
|
|
this.rootColumn();
|
|
|
|
if ( cb )
|
|
return async.nextTick(cb);
|
|
}
|
|
|
|
Explorer.prototype.rootColumn = function()
|
|
{
|
|
var data = [];
|
|
var schemas = this._api._schemas;
|
|
var keys = Object.keys(schemas);
|
|
var k, schema;
|
|
for ( var i = 0 ; i < keys.length ; i++ )
|
|
{
|
|
k = keys[i];
|
|
schema = schemas[k];
|
|
if ( schema.links && schema.links.collection )
|
|
{
|
|
data.push({
|
|
id: schema.id,
|
|
displayName: schema.displayName || schema.name || schema.id,
|
|
links: {
|
|
'self': schema.links.collection
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
var col = this.addPlaceholder();
|
|
this.populateColumn(col, {
|
|
type: 'collection',
|
|
data: data
|
|
});
|
|
}
|
|
|
|
Explorer.prototype.removeColumns = function(numOrElem, inclusive)
|
|
{
|
|
var stopAt;
|
|
|
|
if ( inclusive !== true )
|
|
inclusive = false;
|
|
|
|
if ( typeof numOrElem === 'object' )
|
|
stopAt = numOrElem.data('num');
|
|
else
|
|
stopAt = numOrElem;
|
|
|
|
if ( inclusive )
|
|
stopAt--;
|
|
|
|
var col;
|
|
while ( this._columns.length > stopAt )
|
|
{
|
|
col = this._columns.pop();
|
|
col.remove();
|
|
}
|
|
}
|
|
|
|
Explorer.prototype.addPlaceholder = function()
|
|
{
|
|
var id = ++this._lastColumnId;
|
|
var tpl = {
|
|
id: id,
|
|
num: this._columns.length + 1
|
|
};
|
|
|
|
var html = Handlebars.templates['column'](tpl);
|
|
$('#explorer').append(html);
|
|
|
|
var elem = $('#column_'+ id);
|
|
|
|
this._columns.push(elem);
|
|
return elem;
|
|
}
|
|
|
|
Explorer.prototype._findColumnById = function(id)
|
|
{
|
|
var col;
|
|
for ( var i = 0, len = this._columns.length ; i < len ; i++ )
|
|
{
|
|
col = this._columns[id];
|
|
if ( col.data('id') == id )
|
|
{
|
|
return col;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
Explorer.prototype._findColumnByChild = function(child)
|
|
{
|
|
return $(child).parents('.column');
|
|
}
|
|
|
|
Explorer.prototype.populateColumn = function(idOrElem, obj)
|
|
{
|
|
var col;
|
|
if ( typeof idOrElem === 'object' )
|
|
col = idOrElem;
|
|
else
|
|
col = this._findColumnById(id);
|
|
|
|
if ( !col )
|
|
return;
|
|
|
|
var links = obj.links || {};
|
|
delete obj.links;
|
|
delete links.self;
|
|
delete links.schemas;
|
|
|
|
if ( obj.type && obj.type == 'collection' )
|
|
{
|
|
var tpl = {
|
|
id: col.data('id'),
|
|
num: col.data('num'),
|
|
pagination: obj.pagination,
|
|
data: obj.data,
|
|
links: links,
|
|
};
|
|
|
|
var html = Handlebars.templates['column-collection'](tpl);
|
|
col.html(html);
|
|
|
|
col.on('click', $.proxy(this.followLink, this));
|
|
}
|
|
else
|
|
{
|
|
var actions = obj.actions || {};
|
|
delete obj.actions;
|
|
|
|
var tpl = {
|
|
id: col.data('id'),
|
|
num: col.data('num'),
|
|
actions: actions,
|
|
data: obj,
|
|
links: links,
|
|
};
|
|
|
|
var html = Handlebars.templates['column-resource'](tpl);
|
|
col.html(html);
|
|
|
|
$('.column-links',col).on('click', $.proxy(this.followLink, this));
|
|
}
|
|
}
|
|
|
|
Explorer.prototype.followLink = function(event)
|
|
{
|
|
var self = this;
|
|
var $tgt = $(event.target);
|
|
var $col = this._findColumnByChild($tgt);
|
|
var link = $tgt.data('self');
|
|
|
|
this.removeColumns($col);
|
|
var $newColumn = this.addPlaceholder();
|
|
this._api.ajax('GET', link, function(err,res) {
|
|
if ( err )
|
|
{
|
|
self.removeColumns($newColumn,true);
|
|
alert(err);
|
|
return;
|
|
}
|
|
|
|
self.populateColumn($newColumn, res);
|
|
});
|
|
}
|