330 lines
8.3 KiB
JavaScript
330 lines
8.3 KiB
JavaScript
function getUrlVars() {
|
|
"use strict";
|
|
var vars = {};
|
|
window.location.href.replace(/[?&#]+([^=&]+)=([^&#]*)/gi, function (m, key, value) {
|
|
vars[key] = decodeURIComponent(value);
|
|
});
|
|
return vars;
|
|
}
|
|
|
|
function make_uri(uri, options) {
|
|
"use strict";
|
|
var ops = {};
|
|
$.extend(ops, getUrlVars());
|
|
if (options !== null) {
|
|
$.extend(ops, options);
|
|
}
|
|
var str = $.map(ops, function (val, index) {
|
|
return index + "=" + encodeURIComponent(val).toLowerCase();
|
|
}).join("&");
|
|
|
|
return (str === "") ? uri : uri + "?" + str;
|
|
}
|
|
|
|
function reload(extra) {
|
|
"use strict";
|
|
window.location.search = make_uri ("", extra);
|
|
}
|
|
|
|
function update_url(extra) {
|
|
var ops = {};
|
|
$.extend(ops, getUrlVars ());
|
|
if (extra !== null) {
|
|
$.extend(ops, extra);
|
|
}
|
|
window.location.hash = $.map(ops, function (val, index) {
|
|
return val ? (index + "=" + encodeURIComponent(val)) : null;
|
|
}).join("&");
|
|
}
|
|
|
|
function initSingleSelector(selector_id, property, dataSet, update_handler) {
|
|
var values = {};
|
|
var result = [];
|
|
var value, key;
|
|
|
|
for (var i = 0; i < dataSet.length; i++) {
|
|
var element = dataSet[i][property];
|
|
if (element instanceof Array) {
|
|
for (key in element)
|
|
if (key) {
|
|
values[element[key]] = element[key];
|
|
}
|
|
} else {
|
|
values[element] = element;
|
|
}
|
|
}
|
|
|
|
for (value in values)
|
|
if (value) {
|
|
result.push({"id": value, "text": value});
|
|
}
|
|
|
|
$("#" + selector_id).
|
|
val (getUrlVars()[property]).
|
|
on("select2-selecting", function (e) {
|
|
var options = {};
|
|
options[property] = e.val;
|
|
update_url (options);
|
|
update_handler ();
|
|
}).
|
|
on("select2-removed", function (e) {
|
|
var options = {};
|
|
options[property] = '';
|
|
update_url (options);
|
|
update_handler ();
|
|
}).
|
|
select2({data: result, allowClear: true});
|
|
}
|
|
|
|
function filterData (tableData, filters) {
|
|
var filteredData = [];
|
|
var key, column;
|
|
|
|
for (var i = 0; i < tableData.length; i++) {
|
|
var row = tableData[i];
|
|
var filtered = true;
|
|
|
|
for (column in filters) {
|
|
if (column in row) {
|
|
if (row[column] instanceof Array) {
|
|
filtered = false;
|
|
for (key in row[column])
|
|
if (filters[column] == row[column][key]) {
|
|
filtered = true;
|
|
}
|
|
} else {
|
|
if (filters[column] != row[column]) {
|
|
filtered = false;
|
|
}
|
|
}
|
|
}
|
|
if (filtered == false) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (filtered) {
|
|
filteredData.push(row);
|
|
}
|
|
}
|
|
|
|
return filteredData;
|
|
}
|
|
|
|
function populate_table (table_id, table_column_names, tableData)
|
|
{
|
|
var tableColumns = [];
|
|
for (var i = 0; i < table_column_names.length; i++) {
|
|
tableColumns.push({"mData": table_column_names[i]});
|
|
for (var j = 0; j < tableData.length; j++) {
|
|
if (!(table_column_names[i] in tableData[j])) {
|
|
tableData[j][table_column_names[i]] = "";
|
|
}
|
|
}
|
|
}
|
|
|
|
if (table_id) {
|
|
$("#" + table_id).dataTable({
|
|
"aLengthMenu": [
|
|
[5, 10, 25, 50, -1],
|
|
[5, 10, 25, 50, "All"]
|
|
],
|
|
"bDestroy": true,
|
|
"iDisplayLength": -1,
|
|
"bAutoWidth": false,
|
|
"bPaginate": true,
|
|
"pagingType": "full_numbers",
|
|
"aaData": tableData,
|
|
"aoColumns": tableColumns
|
|
});
|
|
}
|
|
}
|
|
|
|
function showInfoDialog (tab, info) {
|
|
$("#info-container").empty();
|
|
$("#" + tab + "-info").tmpl(info).appendTo("#info-container");
|
|
$("#info-dialog").dialog("open");
|
|
$("button").focus ();
|
|
}
|
|
|
|
function showInfoPage (tab, info)
|
|
{
|
|
$("#info-content").empty();
|
|
$("#" + tab + "-info").tmpl(info).appendTo("#info-content");
|
|
$( ".content" ).hide ();
|
|
$( "#info-page" ).show ();
|
|
update_url ({ tab : tab, asset : info.name});
|
|
$(".value").replaceWith (function(idx, element) {
|
|
return element.replace (/https?:\/\/[^ \t\n\r]+/gi, '<a target="_blank" href="$&">$&</a>');
|
|
});
|
|
}
|
|
|
|
function setupInfoHandler (tab, element_id, info) {
|
|
info.name_html = "<a id=\"" + tab + "-" + element_id +
|
|
"\" href=\"#\" title=\"Show details\">" + info.name + "</a>";
|
|
|
|
$("#" + tab + "-table").on("click", "#" + tab + "-" + element_id, function (event) {
|
|
event.preventDefault();
|
|
event.stopPropagation();
|
|
|
|
showInfoPage (tab, info);
|
|
});
|
|
}
|
|
|
|
var glance_images = { images: [] };
|
|
|
|
function show_glance_images ()
|
|
{
|
|
populate_table ("glance-images-table",
|
|
["name_html", "description", "disk_format", "license"],
|
|
filterData (glance_images.images, getUrlVars ()));
|
|
}
|
|
|
|
var heat_templates = { templates: [] };
|
|
|
|
function show_heat_templates ()
|
|
{
|
|
populate_table ("heat-templates-table",
|
|
["name_html", "description", "release_html", "format"],
|
|
filterData (heat_templates.templates, getUrlVars ()));
|
|
}
|
|
|
|
var murano_apps = { applications: [] };
|
|
|
|
function show_murano_apps ()
|
|
{
|
|
populate_table ("murano-apps-table",
|
|
["name_html", "description", "release_html", "format"],
|
|
filterData (murano_apps.applications, getUrlVars ()));
|
|
}
|
|
|
|
function initTabs ()
|
|
{
|
|
$( "ul.nav > li > a" ).on("click", function (event) {
|
|
event.preventDefault ();
|
|
});
|
|
$( "ul.nav > li" ).not(":last-child").on("click", function (event) {
|
|
update_url ({ tab : this.children[0].hash.substring (1), asset: "" });
|
|
});
|
|
$( "ul.nav > li:last-child").on("click", function (event) {
|
|
window.open('https://wiki.openstack.org/wiki/App-Catalog#How_to_contribute', '_blank');
|
|
});
|
|
}
|
|
|
|
function show_asset (tab, tableData)
|
|
{
|
|
var options = getUrlVars ();
|
|
if ((tab == options.tab) && ("asset" in options)) {
|
|
for (var i = 0; i < tableData.length; ++i) {
|
|
if (tableData[i].name == options.asset) {
|
|
showInfoPage (tab, tableData[i]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function initMarketPlace ()
|
|
{
|
|
navigate ();
|
|
initTabs ();
|
|
$( ".inner" ).matchHeight ();
|
|
|
|
$("#info-dialog").dialog({
|
|
autoOpen: false,
|
|
width: "70%",
|
|
modal: true,
|
|
buttons: {
|
|
Close: function () {
|
|
$(this).dialog("close");
|
|
}
|
|
},
|
|
close: function () { }
|
|
});
|
|
|
|
$.ajax({ url: "static/glance_images.yaml" }).
|
|
done (function (data) {
|
|
try {
|
|
glance_images = jsyaml.safeLoad (data);
|
|
} catch (e) {
|
|
}
|
|
var tableData = glance_images.images;
|
|
for (var i = 0; i < tableData.length; i++) {
|
|
setupInfoHandler ("glance-images", i, tableData[i]);
|
|
}
|
|
|
|
show_asset ("glance-images", tableData);
|
|
show_glance_images ();
|
|
});
|
|
|
|
$.ajax({ url: "static/heat_templates.yaml" }).
|
|
done (function (data) {
|
|
try {
|
|
heat_templates = jsyaml.safeLoad (data);
|
|
} catch (e) {
|
|
}
|
|
var tableData = heat_templates.templates;
|
|
for (var i = 0; i < tableData.length; i++) {
|
|
tableData[i].release_html = tableData[i].release.join (", ");
|
|
setupInfoHandler ("heat-templates", i, tableData[i]);
|
|
}
|
|
|
|
show_asset ("heat-templates", tableData);
|
|
show_heat_templates ();
|
|
|
|
initSingleSelector ("heat-release", "release", tableData, show_heat_templates);
|
|
});
|
|
|
|
$.ajax({ url: "static/murano_apps.yaml" }).
|
|
done (function (data) {
|
|
try {
|
|
murano_apps = jsyaml.safeLoad (data);
|
|
} catch (e) {
|
|
}
|
|
var tableData = murano_apps.applications;
|
|
for (var i = 0; i < tableData.length; i++) {
|
|
tableData[i].release_html = tableData[i].release.join (", ");
|
|
setupInfoHandler ("murano-apps", i, tableData[i]);
|
|
}
|
|
|
|
show_asset ("murano-apps", tableData);
|
|
show_murano_apps ();
|
|
|
|
initSingleSelector ("murano-release", "release", tableData, show_murano_apps);
|
|
});
|
|
}
|
|
|
|
function navigate ()
|
|
{
|
|
var tabs_list = $("#navbar")[0].children;
|
|
var selected_tab_name = null;
|
|
var options = getUrlVars ();
|
|
|
|
$( "ul.nav > li" ).removeClass ("active");
|
|
if ("tab" in options) {
|
|
for (var i = 0; i < tabs_list.length; ++i) {
|
|
var tab_name = tabs_list[i].children[0].hash.substring (1);
|
|
if (tab_name == options.tab) {
|
|
selected_tab_name = tab_name;
|
|
if (!("asset" in options)) {
|
|
tabs_list[i].className = "active";
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
$( ".content" ).hide ();
|
|
|
|
if (selected_tab_name === null) {
|
|
$( "#landing-page" ).show ();
|
|
} else if ("asset" in options) {
|
|
show_asset ("murano-apps", murano_apps.applications);
|
|
show_asset ("heat-templates", heat_templates.templates);
|
|
show_asset ("glance-images", glance_images.images);
|
|
} else {
|
|
$( "#" + selected_tab_name ).show ();
|
|
}
|
|
}
|
|
|
|
window.onhashchange = navigate;
|