diff --git a/.eslintrc b/.eslintrc index ad34b11..f6306b7 100644 --- a/.eslintrc +++ b/.eslintrc @@ -4,3 +4,10 @@ extends: openstack env: # browser global variables. browser: true + +rules: + # Require camel case names + # http://eslint.org/docs/rules/camelcase + camelcase: + - 1 # report camelcase properties as warnings + - properties: "never" diff --git a/openstack_catalog/web/static/css/theme.css b/openstack_catalog/web/static/css/theme.css index 6101d5d..29fd211 100644 --- a/openstack_catalog/web/static/css/theme.css +++ b/openstack_catalog/web/static/css/theme.css @@ -25,7 +25,7 @@ a { .navbar { margin: 0; border-radius: 0; - border: none: + border: none; } .navbar-brand { width: 136px; @@ -214,4 +214,4 @@ h1 { } input[type=text] { width: 250px; -} \ No newline at end of file +} diff --git a/openstack_catalog/web/static/js/apps-catalog.js b/openstack_catalog/web/static/js/apps-catalog.js index 965f133..c19ff9a 100644 --- a/openstack_catalog/web/static/js/apps-catalog.js +++ b/openstack_catalog/web/static/js/apps-catalog.js @@ -1,316 +1,329 @@ function getUrlVars() { - var vars = {}; - var parts = window.location.href.replace(/[?&#]+([^=&]+)=([^&#]*)/gi, function (m, key, value) { - vars[key] = decodeURIComponent(value); - }); - return vars; + "use strict"; + var vars = {}; + window.location.href.replace(/[?&#]+([^=&]+)=([^&#]*)/gi, function (m, key, value) { + vars[key] = decodeURIComponent(value); + }); + return vars; } function make_uri(uri, options) { - var ops = {}; - $.extend(ops, getUrlVars()); - if (options != null) { - $.extend(ops, options); - } - var str = $.map(ops, function (val, index) { - return index + "=" + encodeURIComponent(val).toLowerCase(); - }).join("&"); + "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; + return (str === "") ? uri : uri + "?" + str; } function reload(extra) { - window.location.search = make_uri ("", 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("&") + 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 values = {}; + var result = []; + var value, key; - for (var i = 0; i < dataSet.length; i++) { - var element = dataSet[i][property]; - if (element instanceof Array) { - for (var key in element) - values[element[key]] = element[key]; - } else - values[element] = element; + 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}); } - var result = []; - for (var 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}); + $("#" + 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 filteredData = []; + var key, column; - for (var i = 0; i < tableData.length; i++) { - var row = tableData[i]; - var filtered = true; + for (var i = 0; i < tableData.length; i++) { + var row = tableData[i]; + var filtered = true; - for (var column in filters) { - if (column in row) { - if (row[column] instanceof Array) { - filtered = false; - for (var 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); + 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; + } } - return filteredData; + 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]] = ""; - } + 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 - }); - } + 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 (); + $("#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, '$&'); - }); + $("#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, '$&'); + }); } function setupInfoHandler (tab, element_id, info) { - info.name_html = "" + info.name + ""; + info.name_html = "" + info.name + ""; - $("#" + tab + "-table").on("click", "#" + tab + "-" + element_id, function (event) { - event.preventDefault(); - event.stopPropagation(); + $("#" + tab + "-table").on("click", "#" + tab + "-" + element_id, function (event) { + event.preventDefault(); + event.stopPropagation(); - showInfoPage (tab, info); - }); + 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 ())); + 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 ())); + 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 ())); + 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'); - }); + $( "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]); - } + 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 () { } + 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/glance_images.yaml" }). - done (function (data) { - try { - glance_images = jsyaml.safeLoad (data); - } catch (e) { - console.log ("Failed to load YAML\n" + data); - } - 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]); + } - $.ajax({ url: "static/heat_templates.yaml" }). - done (function (data) { - try { - heat_templates = jsyaml.safeLoad (data); - } catch (e) { - console.log ("Failed to load YAML\n" + data); - } - 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 (); + show_asset ("heat-templates", tableData); + show_heat_templates (); - initSingleSelector ("heat-release", "release", 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) { - console.log ("Failed to load YAML\n" + 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 (); + $.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]); + } - initSingleSelector ("murano-release", "release", tableData, show_murano_apps); - }); + 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 (); - } -} + var tabs_list = $("#navbar")[0].children; + var selected_tab_name = null; + var options = getUrlVars (); -window.onhashchange = navigate + $( "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;