I am looking for a javascript solution to generate an HTML table ( or bootstrap grid layout ) from a data structure.
[
{"x":0,"y":0,"width":2,"height":1,"title":"Lorem ipsum dolor sit amet"},
{"x":2,"y":0,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
{"x":0,"y":2,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
{"x":1,"y":2,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
{"x":0,"y":3,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
{"x":1,"y":3,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
{"x":0,"y":4,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
{"x":0,"y":5,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
{"x":1,"y":5,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
{"x":0,"y":6,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
{"x":1,"y":6,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
{"x":0,"y":8,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
{"x":0,"y":9,"width":3,"height":1,"title":"Lorem ipsum dolor sit amet"},
{"x":0,"y":10,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
{"x":1,"y":10,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
{"x":2,"y":10,"width":1,"height":5,"title":"Lorem ipsum dolor sit amet"},
{"x":0,"y":11,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
{"x":1,"y":11,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
{"x":0,"y":12,"width":2,"height":2,"title":"Lorem ipsum dolor sit amet"},
{"x":0,"y":14,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
{"x":1,"y":14,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
{"x":2,"y":15,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
{"x":0,"y":16,"width":3,"height":1,"title":"Lorem ipsum dolor sit amet"},
{"x":0,"y":17,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
{"x":1,"y":17,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"},
{"x":2,"y":17,"width":1,"height":1,"title":"Lorem ipsum dolor sit amet"}
]
Please note that "height" and "width" represent the rowspan and colspan respectively.
Thank you
Edited
My solution so far was to implement the bootstrap grid. Unfortunately it does not take into account the rowspan so it creates a lot of white space.
here is the code
var cell_height = 80;
var $grid = $('<div class="grid"></div>');
var grid_width = 12;
var items = []; //items
var _getBootstrapGridWidth: function(width){
return Math.round(12/grid_width*width);
};
var _createRow = function(){
var $row = $('<div class="row grid-row"></div>');
$row.css('min-height',cell_height);
return $row;
};
var _fillInEmptyRows = function(current_y,next_y){
var count = next_y-current_y;
(count) && (count--); //needs to subtract 1 to adjust
while (count--){
$grid.append(_createRow());
}
};
//lets create the layout
_.each(items,function(item){
// If y suggests we're on a new row (including the first item), create a new row
if (item.y!==current.y){
$row = _createRow();
_fillInEmptyRows(current.y,item.y);
$grid.append($row);
current.y = item.y;
current.x = 0;
}
var $column = $('<div class="grid-item-wrapper"></div>');
//lets add the data attr
$column.attr('data-x',item.x).attr('data-y',item.y).attr('data-width',item.width).attr('data-height',item.height);
//add width class
$column.addClass('col-sm-'+_getBootstrapGridWidth(item.width));
//if x is not the same as our current x position, add offset class
if (item_data.x!==current.x)
$column.addClass('col-sm-offset-'+_getBootstrapGridWidth(item_data.x-current.x));
//set height of new div
$column.css('min-height',cell_height);
//increment current.x to new starting position
current.x += (item.x-current.x)+item.width;
//add the div to the current row
$column.append($item);
$row.append($column);
});