From d244e81068042b9c75761b944aff34deed8b3b8f Mon Sep 17 00:00:00 2001 From: Gowtam Lal Date: Fri, 2 Feb 2018 18:14:13 -0500 Subject: [PATCH 1/2] Add support for configurable navbar title links. --- .../singularity/config/UIConfiguration.java | 12 ++++++++++ .../hubspot/singularity/views/IndexView.java | 12 ++++++++++ SingularityUI/app/assets/index.mustache | 3 ++- .../app/components/common/Navigation.jsx | 22 ++++++++++++++++++- SingularityUI/gulpfile.js | 3 ++- 5 files changed, 49 insertions(+), 3 deletions(-) diff --git a/SingularityService/src/main/java/com/hubspot/singularity/config/UIConfiguration.java b/SingularityService/src/main/java/com/hubspot/singularity/config/UIConfiguration.java index 135c708ab6..cbb79e7692 100644 --- a/SingularityService/src/main/java/com/hubspot/singularity/config/UIConfiguration.java +++ b/SingularityService/src/main/java/com/hubspot/singularity/config/UIConfiguration.java @@ -111,6 +111,10 @@ public static RootUrlMode parse(String value) { @JsonProperty private Map>> quickLinks = Collections.emptyMap(); + // e.g. {"QA": "https://singularity-qa.my-paas.net", "Production": "https://singularity-prod.my-paas.net"} + @JsonProperty + private Map navTitleLinks = Collections.emptyMap(); + public boolean isHideNewDeployButton() { return hideNewDeployButton; } @@ -294,4 +298,12 @@ public Map>> getQuickLinks() public void setQuickLinks(Map>> quickLinks) { this.quickLinks = quickLinks; } + + public Map getNavTitleLinks() { + return navTitleLinks; + } + + public void setNavTitleLinks(Map navTitleLinks) { + this.navTitleLinks = navTitleLinks; + } } diff --git a/SingularityService/src/main/java/com/hubspot/singularity/views/IndexView.java b/SingularityService/src/main/java/com/hubspot/singularity/views/IndexView.java index 828da0cd53..cc7d983c74 100644 --- a/SingularityService/src/main/java/com/hubspot/singularity/views/IndexView.java +++ b/SingularityService/src/main/java/com/hubspot/singularity/views/IndexView.java @@ -66,6 +66,7 @@ public class IndexView extends View { private final String authCookieName; private final String authTokenKey; private final String quickLinks; + private final String navTitleLinks; public IndexView(String singularityUriBase, String appRoot, IndexViewConfiguration configuration, ObjectMapper mapper) { super("index.mustache"); @@ -139,6 +140,12 @@ public IndexView(String singularityUriBase, String appRoot, IndexViewConfigurati } catch (JsonProcessingException e) { throw Throwables.propagate(e); } + + try { + this.navTitleLinks = ow.writeValueAsString(uiConfiguration.getNavTitleLinks()); + } catch (JsonProcessingException e) { + throw Throwables.propagate(e); + } } public String getAppRoot() { @@ -281,6 +288,10 @@ public String getQuickLinks() { return quickLinks; } + public String getNavTitleLinks() { + return navTitleLinks; + } + @Override public String toString() { return "IndexView{" + @@ -319,6 +330,7 @@ public String toString() { ", authCookieName='" + authCookieName + '\'' + ", authTokenKey='" + authTokenKey + '\'' + ", quickLinks='" + quickLinks + '\'' + + ", navTitleLinks='" + navTitleLinks + '\'' + "} " + super.toString(); } } diff --git a/SingularityUI/app/assets/index.mustache b/SingularityUI/app/assets/index.mustache index 35bd8b66a9..06571880b9 100644 --- a/SingularityUI/app/assets/index.mustache +++ b/SingularityUI/app/assets/index.mustache @@ -52,7 +52,8 @@ generateAuthHeader: {{{generateAuthHeader}}}, authCookieName: "{{{ authCookieName }}}", authTokenKey: "{{{ authTokenKey }}}", - quickLinks: {{{quickLinks}}} + quickLinks: {{{quickLinks}}}, + navTitleLinks: {{{navTitleLinks}}} }; diff --git a/SingularityUI/app/components/common/Navigation.jsx b/SingularityUI/app/components/common/Navigation.jsx index 7f54f99cd7..0e30a09bf9 100644 --- a/SingularityUI/app/components/common/Navigation.jsx +++ b/SingularityUI/app/components/common/Navigation.jsx @@ -35,6 +35,26 @@ function isActive(navbarPath, fragment) { // put into page wrapper, render children const Navigation = (props) => { const fragment = props.location.pathname.split('/')[1]; + let renderedNavTitle; + + if (Object.keys(config.navTitleLinks).length > 0) { + const renderedNavTitleLinks = Object.keys(config.navTitleLinks).map(linkTitle => { + return
  • {linkTitle}
  • ; + }); + + renderedNavTitle = +
    + +
      + {renderedNavTitleLinks} +
    +
    + + } else { + renderedNavTitle = {config.title}; + } return (