diff --git a/gateway/assets/index.html b/gateway/assets/index.html index 48937e795..40f7d12ca 100644 --- a/gateway/assets/index.html +++ b/gateway/assets/index.html @@ -54,10 +54,10 @@

- + - + {{ namespace }} @@ -140,7 +140,7 @@

- + diff --git a/gateway/assets/script/bootstrap.js b/gateway/assets/script/bootstrap.js index d31604fbb..68c8c657a 100644 --- a/gateway/assets/script/bootstrap.js +++ b/gateway/assets/script/bootstrap.js @@ -17,13 +17,14 @@ app.controller("home", ['$scope', '$log', '$http', '$location', '$interval', '$f $scope.invocationStatus = ""; $scope.invocationStart = new Date().getTime(); $scope.roundTripDuration = ""; - $scope.selectedNamespace = "openfaas-fn"; - $scope.allNamespaces = ["openfaas-fn"]; + $scope.selectedNamespace = ""; + $scope.allNamespaces = [""]; $scope.invocation = { contentType: "text" }; $scope.baseUrl = $location.absUrl().replace(/\ui\/$/, ''); + try { $scope.canCopyToClipboard = document.queryCommandSupported('copy'); } catch (err) { @@ -65,15 +66,19 @@ app.controller("home", ['$scope', '$log', '$http', '$location', '$interval', '$f var fetchFunctionsDelay = 3500; var queryFunctionDelay = 2500; - var fetchNamespacesInterval = function() { - $http.get("../system/namespaces") - .then(function(response) { - $scope.allNamespaces = response.data; - }) - }; + $http.get("../system/namespaces") + .then(function(response) { + $scope.allNamespaces = response.data; + if ($scope.selectedNamespace === "" && response.data && response.data[0] && response.data[0] !== "") { + $scope.selectedNamespace = response.data[0] + refreshData($scope.selectedNamespace) + } + }) + + var fetchFunctionsInterval = $interval(function() { refreshData($scope.selectedNamespace); }, fetchFunctionsDelay); @@ -86,13 +91,16 @@ app.controller("home", ['$scope', '$log', '$http', '$location', '$interval', '$f $scope.setNamespace = function(namespace) { $scope.selectedNamespace = namespace; - refreshData($scope.selectedNamespace) + $scope.selectedFunction = undefined; + $scope.functions = []; + refreshData($scope.selectedNamespace) } var refreshFunction = function(functionInstance) { - $http.get("../system/function/" + functionInstance.name + "?namespace=" + $scope.selectedNamespace) + const url = "/system/function/" + functionInstance.name; + $http.get(buildNamespaceAwareURL(url, $scope.selectedNamespace)) .then(function(response) { - functionInstance.ready = (response.data && response.data.availableReplicas && response.data.availableReplicas > 0); + $scope.selectedFunction.ready = (response.data && response.data.availableReplicas && response.data.availableReplicas > 0); }) .catch(function(err) { console.error(err); @@ -114,7 +122,7 @@ app.controller("home", ['$scope', '$log', '$http', '$location', '$interval', '$f requestContentType = "binary/octet-stream"; } - var fnNamespace = ($scope.selectedNamespace !== "openfaas-fn") ? "." + $scope.selectedNamespace : ""; + var fnNamespace = ($scope.selectedNamespace && $scope.selectedNamespace.length > 0) ? "." + $scope.selectedNamespace : ""; var options = { url: "../function/" + $scope.selectedFunction.name + fnNamespace, data: $scope.invocation.request, @@ -204,42 +212,16 @@ app.controller("home", ['$scope', '$log', '$http', '$location', '$interval', '$f }; var refreshData = function (selectedNamespace) { - var previous = $scope.functions; - - var cl = function (previousItems) { - $http.get("../system/functions?namespace=" + selectedNamespace).then(function (response) { - if (response && response.data) { - if (previousItems.length != response.data.length) { - $scope.functions = response.data; - - // update the selected function object because the newly fetched object from the API becomes a different object - var filteredSelectedFunction = $filter('filter')($scope.functions, { name: $scope.selectedFunction.name }, true); - if (filteredSelectedFunction && filteredSelectedFunction.length > 0) { - $scope.selectedFunction = filteredSelectedFunction[0]; - } else { - $scope.selectedFunction = undefined; - } - } else { - for (var i = 0; i < $scope.functions.length; i++) { - for (var j = 0; j < response.data.length; j++) { - if ($scope.functions[i].name == response.data[j].name) { - $scope.functions[i].image = response.data[j].image; - $scope.functions[i].replicas = response.data[j].replicas; - $scope.functions[i].invocationCount = response.data[j].invocationCount; - $scope.functions[i].namespace = response.data[j].namespace; - } - } - } - } - } - }); - }; - cl(previous); - } - - var fetch = function() { - $http.get("../system/functions?namespace=" + $scope.selectedNamespace).then(function(response) { - $scope.functions = response.data; + $http.get(buildNamespaceAwareURL("/system/functions", selectedNamespace)).then(function (response) { + const curNamespace = ($scope.functions.length > 0 && $scope.functions[0].namespace && $scope.functions[0].namespace) ? $scope.functions[0].namespace : ""; + const newNamespace = (response.data && response.data[0] && response.data[0].namespace) ? response.data[0].namespace : ""; + + if (response && response.data && (curNamespace !== newNamespace || $scope.functions.length != response.data.length)) { + $scope.functions = response.data; + if (!$scope.functions.indexOf($scope.selectedFunction )) { + $scope.selectedFunction = undefined; + } + } }); }; @@ -267,13 +249,13 @@ app.controller("home", ['$scope', '$log', '$http', '$location', '$interval', '$f templateUrl: "templates/newfunction.html", locals: { item: $scope.functionTemplate, - allNamespaces: $scope.allNamespaces + selectedNamespace: $scope.selectedNamespace }, - controller: DialogController + controller: DialogController, }); }; - var DialogController = function($scope, $mdDialog, item) { + var DialogController = function($scope, $mdDialog, item, selectedNamespace) { var fetchNamespaces = function () { $http.get("../system/namespaces") .then(function(response) { @@ -294,7 +276,7 @@ app.controller("home", ['$scope', '$log', '$http', '$location', '$interval', '$f $scope.annotationFieldsVisible = false; $scope.annotationInputs = [{key: "", value: ""}]; - $scope.namespaceSelect = "openfaas-fn"; + $scope.namespaceSelect = selectedNamespace; fetchNamespaces(); @@ -354,7 +336,7 @@ app.controller("home", ['$scope', '$log', '$http', '$location', '$interval', '$f item.labels = {}; item.annotations = {}; item.secrets = []; - item.namespace = "openfaas-fn"; + item.namespace = ""; $scope.validationError = ""; $scope.closeDialog(); @@ -572,7 +554,8 @@ app.controller("home", ['$scope', '$log', '$http', '$location', '$interval', '$f $mdDialog.show(confirm) .then(function() { var options = { - url: "../system/functions?namespace=" + $scope.selectedNamespace, + + url: buildNamespaceAwareURL("/system/functions", $scope.selectedNamespace), data: { functionName: $scope.selectedFunction.name }, @@ -592,9 +575,6 @@ app.controller("home", ['$scope', '$log', '$http', '$location', '$interval', '$f } }); }; - - fetch(); - fetchNamespacesInterval(); } ]); @@ -603,4 +583,13 @@ function uuidv4() { return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, function(c) { return (c ^ cryptoInstance.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16) }) -} \ No newline at end of file +} + +function buildNamespaceAwareURL(path, namespace) { + let newUrl = path.startsWith("/")? ".." + path: "../" + path; + + if (namespace && namespace.length > 0){ + newUrl += "?namespace=" + namespace + } + return newUrl +} \ No newline at end of file diff --git a/gateway/assets/style/bootstrap.css b/gateway/assets/style/bootstrap.css index d7fb7a4f2..7d2c11773 100644 --- a/gateway/assets/style/bootstrap.css +++ b/gateway/assets/style/bootstrap.css @@ -146,3 +146,6 @@ md-input-container.function-url md-icon { color: red; } +.display-flex { + display: flex; +} \ No newline at end of file diff --git a/gateway/assets/templates/newfunction.html b/gateway/assets/templates/newfunction.html index 891ab185e..2ee5f68f5 100644 --- a/gateway/assets/templates/newfunction.html +++ b/gateway/assets/templates/newfunction.html @@ -63,7 +63,7 @@

Deploy A New Function

Namespace your function runs in i.e. 'openfaas-fn'. Only namespaces OpenFaaS can manage will show here - + {{ namespace }}