diff --git a/domain/meta/endpoint.go b/domain/meta/endpoint.go index e7c67787..759ad8e5 100644 --- a/domain/meta/endpoint.go +++ b/domain/meta/endpoint.go @@ -63,6 +63,7 @@ func (h *Handler) Meta(w http.ResponseWriter, r *http.Request) { data.ConversionEndpoint = org.ConversionEndpoint data.Storage = h.Runtime.StoreProvider.Type() data.Location = h.Runtime.Flags.Location // reserved + data.Theme = org.Theme // Strip secrets data.AuthConfig = auth.StripAuthSecrets(h.Runtime, org.AuthProvider, org.AuthConfig) @@ -277,3 +278,20 @@ type sitemapItem struct { type searchStatus struct { Entries int `json:"entries"` } + +// Themes returns list of installed UI themes. +func (h *Handler) Themes(w http.ResponseWriter, r *http.Request) { + type theme struct { + Name string `json:"names"` + Primary string `json:"primary"` + } + + th := []theme{} + + th = append(th, theme{Name: "Default", Primary: "#280A42"}) + th = append(th, theme{Name: "Blue", Primary: "#176091"}) + th = append(th, theme{Name: "Deep Orange", Primary: "#BF360C"}) + th = append(th, theme{Name: "Teal", Primary: "#00695C"}) + + response.WriteJSON(w, th) +} diff --git a/gui/app/services/app-meta.js b/gui/app/services/app-meta.js index bb4e880f..a60b47f3 100644 --- a/gui/app/services/app-meta.js +++ b/gui/app/services/app-meta.js @@ -20,6 +20,8 @@ export default Service.extend({ ajax: service(), localStorage: service(), kcAuth: service(), + assetMap: service('asset-map'), + appHost: '', apiHost: `${config.apiHost}`, endpoint: `${config.apiHost}/${config.apiNamespace}`, @@ -41,6 +43,8 @@ export default Service.extend({ location: 'selfhost', // for bugfix releases, only admin is made aware of new release and end users see no What's New messaging updateAvailable: false, + // empty theme uses default theme + theme: '', getBaseUrl(endpoint) { return [this.get('endpoint'), endpoint].join('/'); @@ -75,6 +79,9 @@ export default Service.extend({ this.set('version', 'v' + this.get('version')); this.set('appHost', window.location.host); + // Handle theming + this.setTheme(this.get('theme')); + if (requestedRoute === 'secure') { this.setProperties({ title: htmlSafe("Secure document viewing"), @@ -110,5 +117,13 @@ export default Service.extend({ return response; }); + }, + + setTheme(theme) { + theme = theme.trim(); + if (theme.length === 0) return; + + let file = this.get('assetMap').resolve(`assets/theme-${theme}.css`); + $('head').append(``); } }); diff --git a/gui/app/services/browser.js b/gui/app/services/browser.js index 0c483ecd..d0420d4d 100644 --- a/gui/app/services/browser.js +++ b/gui/app/services/browser.js @@ -39,8 +39,6 @@ export default Service.extend({ if (is.null(description) || is.undefined(description)) { description = this.get('sessionService.appMeta.message'); } - - $('head').append(''); }, scrollTo(id) { diff --git a/gui/app/styles/app.scss b/gui/app/styles/app.scss index 138e564f..2176180c 100644 --- a/gui/app/styles/app.scss +++ b/gui/app/styles/app.scss @@ -8,20 +8,21 @@ // by contacting . // // https://documize.com -@import "color.scss"; -@import "font.scss"; -@import "mixins.scss"; -@import "base.scss"; -@import "bootstrap.scss"; -@import "view/common.scss"; -@import "widget/widget.scss"; -@import "view/toolbar.scss"; -@import "view/views.scss"; -@import "layout/all.scss"; +@import "core/color.scss"; +@import "core/font.scss"; +@import "core/mixins.scss"; +@import "core/base.scss"; +@import "core/bootstrap.scss"; -@import "vendor.scss"; -@import "print.scss"; -@import "news.scss"; -@import "section/all.scss"; -@import "enterprise/all.scss"; +@import "core/view/common.scss"; +@import "core/widget/widget.scss"; +@import "core/view/toolbar.scss"; +@import "core/view/views.scss"; +@import "core/layout/all.scss"; + +@import "core/vendor.scss"; +@import "core/print.scss"; +@import "core/news.scss"; +@import "core/section/all.scss"; +@import "core/enterprise/all.scss"; diff --git a/gui/app/styles/base.scss b/gui/app/styles/core/base.scss similarity index 100% rename from gui/app/styles/base.scss rename to gui/app/styles/core/base.scss diff --git a/gui/app/styles/bootstrap.scss b/gui/app/styles/core/bootstrap.scss similarity index 99% rename from gui/app/styles/bootstrap.scss rename to gui/app/styles/core/bootstrap.scss index ee14bf95..c9221e8f 100644 --- a/gui/app/styles/bootstrap.scss +++ b/gui/app/styles/core/bootstrap.scss @@ -35,7 +35,7 @@ $tooltip-bg: $color-dark; $tooltip-color: $color-white; // modal -$modal-backdrop-opacity: 0.7; +$modal-backdrop-opacity: 0.5; $modal-header-border-color: $color-white; $modal-footer-border-color: $color-white; diff --git a/gui/app/styles/color.scss b/gui/app/styles/core/color.scss similarity index 95% rename from gui/app/styles/color.scss rename to gui/app/styles/core/color.scss index 820f62f8..142bc92f 100644 --- a/gui/app/styles/color.scss +++ b/gui/app/styles/core/color.scss @@ -9,13 +9,7 @@ // // https://documize.com - -// theme blue -$color-primary: #176091; -$color-primary-light: #E6F1F8; -$color-link: #348A37; - -// theme purple +// default theme makes things tick $color-primary: #280A42; $color-primary-light: #F7F2FF; $color-link: #348A37; diff --git a/gui/app/styles/enterprise/all.scss b/gui/app/styles/core/enterprise/all.scss similarity index 100% rename from gui/app/styles/enterprise/all.scss rename to gui/app/styles/core/enterprise/all.scss diff --git a/gui/app/styles/font.scss b/gui/app/styles/core/font.scss similarity index 71% rename from gui/app/styles/font.scss rename to gui/app/styles/core/font.scss index ac041cc3..4ebda61c 100644 --- a/gui/app/styles/font.scss +++ b/gui/app/styles/core/font.scss @@ -1,10 +1,10 @@ -.font-fixed-width { - font-family: 'courier new', courier; -} +// .font-fixed-width { +// font-family: 'courier new', courier; +// } -$font-regular: Helvetica; -$font-semibold: Helvetica; -$font-light: Helvetica; +// $font-regular: Helvetica; +// $font-semibold: Helvetica; +// $font-light: Helvetica; @font-face { font-family: "Material Icons"; diff --git a/gui/app/styles/layout/all.scss b/gui/app/styles/core/layout/all.scss similarity index 100% rename from gui/app/styles/layout/all.scss rename to gui/app/styles/core/layout/all.scss diff --git a/gui/app/styles/layout/layout-content.scss b/gui/app/styles/core/layout/layout-content.scss similarity index 100% rename from gui/app/styles/layout/layout-content.scss rename to gui/app/styles/core/layout/layout-content.scss diff --git a/gui/app/styles/layout/layout-footer.scss b/gui/app/styles/core/layout/layout-footer.scss similarity index 100% rename from gui/app/styles/layout/layout-footer.scss rename to gui/app/styles/core/layout/layout-footer.scss diff --git a/gui/app/styles/layout/layout-master.scss b/gui/app/styles/core/layout/layout-master.scss similarity index 100% rename from gui/app/styles/layout/layout-master.scss rename to gui/app/styles/core/layout/layout-master.scss diff --git a/gui/app/styles/layout/layout-sidebar.scss b/gui/app/styles/core/layout/layout-sidebar.scss similarity index 100% rename from gui/app/styles/layout/layout-sidebar.scss rename to gui/app/styles/core/layout/layout-sidebar.scss diff --git a/gui/app/styles/layout/layout-topbar.scss b/gui/app/styles/core/layout/layout-topbar.scss similarity index 100% rename from gui/app/styles/layout/layout-topbar.scss rename to gui/app/styles/core/layout/layout-topbar.scss diff --git a/gui/app/styles/mixins.scss b/gui/app/styles/core/mixins.scss similarity index 100% rename from gui/app/styles/mixins.scss rename to gui/app/styles/core/mixins.scss diff --git a/gui/app/styles/news.scss b/gui/app/styles/core/news.scss similarity index 100% rename from gui/app/styles/news.scss rename to gui/app/styles/core/news.scss diff --git a/gui/app/styles/print.scss b/gui/app/styles/core/print.scss similarity index 100% rename from gui/app/styles/print.scss rename to gui/app/styles/core/print.scss diff --git a/gui/app/styles/section/all.scss b/gui/app/styles/core/section/all.scss similarity index 100% rename from gui/app/styles/section/all.scss rename to gui/app/styles/core/section/all.scss diff --git a/gui/app/styles/section/code.scss b/gui/app/styles/core/section/code.scss similarity index 100% rename from gui/app/styles/section/code.scss rename to gui/app/styles/core/section/code.scss diff --git a/gui/app/styles/section/flowchart.scss b/gui/app/styles/core/section/flowchart.scss similarity index 100% rename from gui/app/styles/section/flowchart.scss rename to gui/app/styles/core/section/flowchart.scss diff --git a/gui/app/styles/section/gemini.scss b/gui/app/styles/core/section/gemini.scss similarity index 100% rename from gui/app/styles/section/gemini.scss rename to gui/app/styles/core/section/gemini.scss diff --git a/gui/app/styles/section/github.scss b/gui/app/styles/core/section/github.scss similarity index 100% rename from gui/app/styles/section/github.scss rename to gui/app/styles/core/section/github.scss diff --git a/gui/app/styles/section/jira.scss b/gui/app/styles/core/section/jira.scss similarity index 100% rename from gui/app/styles/section/jira.scss rename to gui/app/styles/core/section/jira.scss diff --git a/gui/app/styles/section/markdown.scss b/gui/app/styles/core/section/markdown.scss similarity index 100% rename from gui/app/styles/section/markdown.scss rename to gui/app/styles/core/section/markdown.scss diff --git a/gui/app/styles/section/papertrail.scss b/gui/app/styles/core/section/papertrail.scss similarity index 100% rename from gui/app/styles/section/papertrail.scss rename to gui/app/styles/core/section/papertrail.scss diff --git a/gui/app/styles/section/plantuml.scss b/gui/app/styles/core/section/plantuml.scss similarity index 100% rename from gui/app/styles/section/plantuml.scss rename to gui/app/styles/core/section/plantuml.scss diff --git a/gui/app/styles/section/table.scss b/gui/app/styles/core/section/table.scss similarity index 100% rename from gui/app/styles/section/table.scss rename to gui/app/styles/core/section/table.scss diff --git a/gui/app/styles/section/trello.scss b/gui/app/styles/core/section/trello.scss similarity index 100% rename from gui/app/styles/section/trello.scss rename to gui/app/styles/core/section/trello.scss diff --git a/gui/app/styles/section/wysiwyg.scss b/gui/app/styles/core/section/wysiwyg.scss similarity index 100% rename from gui/app/styles/section/wysiwyg.scss rename to gui/app/styles/core/section/wysiwyg.scss diff --git a/gui/app/styles/vendor.scss b/gui/app/styles/core/vendor.scss similarity index 100% rename from gui/app/styles/vendor.scss rename to gui/app/styles/core/vendor.scss diff --git a/gui/app/styles/view/auth.scss b/gui/app/styles/core/view/auth.scss similarity index 100% rename from gui/app/styles/view/auth.scss rename to gui/app/styles/core/view/auth.scss diff --git a/gui/app/styles/view/common.scss b/gui/app/styles/core/view/common.scss similarity index 100% rename from gui/app/styles/view/common.scss rename to gui/app/styles/core/view/common.scss diff --git a/gui/app/styles/view/customize.scss b/gui/app/styles/core/view/customize.scss similarity index 100% rename from gui/app/styles/view/customize.scss rename to gui/app/styles/core/view/customize.scss diff --git a/gui/app/styles/view/document/add-section.scss b/gui/app/styles/core/view/document/add-section.scss similarity index 100% rename from gui/app/styles/view/document/add-section.scss rename to gui/app/styles/core/view/document/add-section.scss diff --git a/gui/app/styles/view/document/copy-move.scss b/gui/app/styles/core/view/document/copy-move.scss similarity index 100% rename from gui/app/styles/view/document/copy-move.scss rename to gui/app/styles/core/view/document/copy-move.scss diff --git a/gui/app/styles/view/document/doc-meta.scss b/gui/app/styles/core/view/document/doc-meta.scss similarity index 100% rename from gui/app/styles/view/document/doc-meta.scss rename to gui/app/styles/core/view/document/doc-meta.scss diff --git a/gui/app/styles/view/document/doc-structure.scss b/gui/app/styles/core/view/document/doc-structure.scss similarity index 100% rename from gui/app/styles/view/document/doc-structure.scss rename to gui/app/styles/core/view/document/doc-structure.scss diff --git a/gui/app/styles/view/document/doc-toc.scss b/gui/app/styles/core/view/document/doc-toc.scss similarity index 100% rename from gui/app/styles/view/document/doc-toc.scss rename to gui/app/styles/core/view/document/doc-toc.scss diff --git a/gui/app/styles/view/document/document.scss b/gui/app/styles/core/view/document/document.scss similarity index 100% rename from gui/app/styles/view/document/document.scss rename to gui/app/styles/core/view/document/document.scss diff --git a/gui/app/styles/view/document/section-editor.scss b/gui/app/styles/core/view/document/section-editor.scss similarity index 100% rename from gui/app/styles/view/document/section-editor.scss rename to gui/app/styles/core/view/document/section-editor.scss diff --git a/gui/app/styles/view/document/view-activity.scss b/gui/app/styles/core/view/document/view-activity.scss similarity index 100% rename from gui/app/styles/view/document/view-activity.scss rename to gui/app/styles/core/view/document/view-activity.scss diff --git a/gui/app/styles/view/document/view-attachment.scss b/gui/app/styles/core/view/document/view-attachment.scss similarity index 100% rename from gui/app/styles/view/document/view-attachment.scss rename to gui/app/styles/core/view/document/view-attachment.scss diff --git a/gui/app/styles/view/document/view-revision.scss b/gui/app/styles/core/view/document/view-revision.scss similarity index 100% rename from gui/app/styles/view/document/view-revision.scss rename to gui/app/styles/core/view/document/view-revision.scss diff --git a/gui/app/styles/view/document/vote-likes.scss b/gui/app/styles/core/view/document/vote-likes.scss similarity index 100% rename from gui/app/styles/view/document/vote-likes.scss rename to gui/app/styles/core/view/document/vote-likes.scss diff --git a/gui/app/styles/view/document/wysiwyg.scss b/gui/app/styles/core/view/document/wysiwyg.scss similarity index 100% rename from gui/app/styles/view/document/wysiwyg.scss rename to gui/app/styles/core/view/document/wysiwyg.scss diff --git a/gui/app/styles/view/exceptions.scss b/gui/app/styles/core/view/exceptions.scss similarity index 100% rename from gui/app/styles/view/exceptions.scss rename to gui/app/styles/core/view/exceptions.scss diff --git a/gui/app/styles/view/import.scss b/gui/app/styles/core/view/import.scss similarity index 100% rename from gui/app/styles/view/import.scss rename to gui/app/styles/core/view/import.scss diff --git a/gui/app/styles/view/onboard.scss b/gui/app/styles/core/view/onboard.scss similarity index 100% rename from gui/app/styles/view/onboard.scss rename to gui/app/styles/core/view/onboard.scss diff --git a/gui/app/styles/view/search.scss b/gui/app/styles/core/view/search.scss similarity index 100% rename from gui/app/styles/view/search.scss rename to gui/app/styles/core/view/search.scss diff --git a/gui/app/styles/view/space.scss b/gui/app/styles/core/view/space.scss similarity index 100% rename from gui/app/styles/view/space.scss rename to gui/app/styles/core/view/space.scss diff --git a/gui/app/styles/view/spaces.scss b/gui/app/styles/core/view/spaces.scss similarity index 100% rename from gui/app/styles/view/spaces.scss rename to gui/app/styles/core/view/spaces.scss diff --git a/gui/app/styles/view/toolbar.scss b/gui/app/styles/core/view/toolbar.scss similarity index 100% rename from gui/app/styles/view/toolbar.scss rename to gui/app/styles/core/view/toolbar.scss diff --git a/gui/app/styles/view/views.scss b/gui/app/styles/core/view/views.scss similarity index 100% rename from gui/app/styles/view/views.scss rename to gui/app/styles/core/view/views.scss diff --git a/gui/app/styles/widget/widget-avatar.scss b/gui/app/styles/core/widget/widget-avatar.scss similarity index 100% rename from gui/app/styles/widget/widget-avatar.scss rename to gui/app/styles/core/widget/widget-avatar.scss diff --git a/gui/app/styles/widget/widget-button.scss b/gui/app/styles/core/widget/widget-button.scss similarity index 100% rename from gui/app/styles/widget/widget-button.scss rename to gui/app/styles/core/widget/widget-button.scss diff --git a/gui/app/styles/widget/widget-checkbox.scss b/gui/app/styles/core/widget/widget-checkbox.scss similarity index 100% rename from gui/app/styles/widget/widget-checkbox.scss rename to gui/app/styles/core/widget/widget-checkbox.scss diff --git a/gui/app/styles/widget/widget-list-picker.scss b/gui/app/styles/core/widget/widget-list-picker.scss similarity index 100% rename from gui/app/styles/widget/widget-list-picker.scss rename to gui/app/styles/core/widget/widget-list-picker.scss diff --git a/gui/app/styles/widget/widget-notification.scss b/gui/app/styles/core/widget/widget-notification.scss similarity index 100% rename from gui/app/styles/widget/widget-notification.scss rename to gui/app/styles/core/widget/widget-notification.scss diff --git a/gui/app/styles/widget/widget-radio.scss b/gui/app/styles/core/widget/widget-radio.scss similarity index 100% rename from gui/app/styles/widget/widget-radio.scss rename to gui/app/styles/core/widget/widget-radio.scss diff --git a/gui/app/styles/widget/widget-symbol.scss b/gui/app/styles/core/widget/widget-symbol.scss similarity index 100% rename from gui/app/styles/widget/widget-symbol.scss rename to gui/app/styles/core/widget/widget-symbol.scss diff --git a/gui/app/styles/widget/widget-table.scss b/gui/app/styles/core/widget/widget-table.scss similarity index 100% rename from gui/app/styles/widget/widget-table.scss rename to gui/app/styles/core/widget/widget-table.scss diff --git a/gui/app/styles/widget/widget-tabnav.scss b/gui/app/styles/core/widget/widget-tabnav.scss similarity index 100% rename from gui/app/styles/widget/widget-tabnav.scss rename to gui/app/styles/core/widget/widget-tabnav.scss diff --git a/gui/app/styles/widget/widget.scss b/gui/app/styles/core/widget/widget.scss similarity index 100% rename from gui/app/styles/widget/widget.scss rename to gui/app/styles/core/widget/widget.scss diff --git a/gui/app/styles/themes/blue.scss b/gui/app/styles/themes/blue.scss new file mode 100644 index 00000000..830ba50d --- /dev/null +++ b/gui/app/styles/themes/blue.scss @@ -0,0 +1,45 @@ +// Copyright 2016 Documize Inc. . All rights reserved. +// +// This software (Documize Community Edition) is licensed under +// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html +// +// You can operate outside the AGPL restrictions by purchasing +// Documize Enterprise Edition and obtaining a commercial license +// by contacting . +// +// https://documize.com + +@import "../core/color.scss"; +$color-primary: #176091; +$color-primary-light: #E6F1F8; +$color-link: #348A37; + +.color-primary { + color: $color-primary !important; +} +.color-link { + color: $color-link !important; +} +.background-color-theme { + background-color: $color-primary !important; +} +.background-color-theme-light { + background-color: $color-primary-light !important; +} + +@import "../core/font.scss"; +@import "../core/mixins.scss"; +@import "../core/base.scss"; +@import "../core/bootstrap.scss"; + +@import "../core/view/common.scss"; +@import "../core/widget/widget.scss"; +@import "../core/view/toolbar.scss"; +@import "../core/view/views.scss"; +@import "../core/layout/all.scss"; + +@import "../core/vendor.scss"; +@import "../core/print.scss"; +@import "../core/news.scss"; +@import "../core/section/all.scss"; +@import "../core/enterprise/all.scss"; diff --git a/gui/app/styles/themes/deep-orange.scss b/gui/app/styles/themes/deep-orange.scss new file mode 100644 index 00000000..44363bb3 --- /dev/null +++ b/gui/app/styles/themes/deep-orange.scss @@ -0,0 +1,45 @@ +// Copyright 2016 Documize Inc. . All rights reserved. +// +// This software (Documize Community Edition) is licensed under +// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html +// +// You can operate outside the AGPL restrictions by purchasing +// Documize Enterprise Edition and obtaining a commercial license +// by contacting . +// +// https://documize.com + +@import "../core/color.scss"; +$color-primary: #BF360C; +$color-primary-light: #FBE9E7; +$color-link: #FF8A65; + +.color-primary { + color: $color-primary !important; +} +.color-link { + color: $color-link !important; +} +.background-color-theme { + background-color: $color-primary !important; +} +.background-color-theme-light { + background-color: $color-primary-light !important; +} + +@import "../core/font.scss"; +@import "../core/mixins.scss"; +@import "../core/base.scss"; +@import "../core/bootstrap.scss"; + +@import "../core/view/common.scss"; +@import "../core/widget/widget.scss"; +@import "../core/view/toolbar.scss"; +@import "../core/view/views.scss"; +@import "../core/layout/all.scss"; + +@import "../core/vendor.scss"; +@import "../core/print.scss"; +@import "../core/news.scss"; +@import "../core/section/all.scss"; +@import "../core/enterprise/all.scss"; diff --git a/gui/app/styles/themes/teal.scss b/gui/app/styles/themes/teal.scss new file mode 100644 index 00000000..141b58c3 --- /dev/null +++ b/gui/app/styles/themes/teal.scss @@ -0,0 +1,45 @@ +// Copyright 2016 Documize Inc. . All rights reserved. +// +// This software (Documize Community Edition) is licensed under +// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html +// +// You can operate outside the AGPL restrictions by purchasing +// Documize Enterprise Edition and obtaining a commercial license +// by contacting . +// +// https://documize.com + +@import "../core/color.scss"; +$color-primary: #00695C; +$color-primary-light: #E0F2F1; +$color-link: #348A37; + +.color-primary { + color: $color-primary !important; +} +.color-link { + color: $color-link !important; +} +.background-color-theme { + background-color: $color-primary !important; +} +.background-color-theme-light { + background-color: $color-primary-light !important; +} + +@import "../core/font.scss"; +@import "../core/mixins.scss"; +@import "../core/base.scss"; +@import "../core/bootstrap.scss"; + +@import "../core/view/common.scss"; +@import "../core/widget/widget.scss"; +@import "../core/view/toolbar.scss"; +@import "../core/view/views.scss"; +@import "../core/layout/all.scss"; + +@import "../core/vendor.scss"; +@import "../core/print.scss"; +@import "../core/news.scss"; +@import "../core/section/all.scss"; +@import "../core/enterprise/all.scss"; diff --git a/gui/config/environment.js b/gui/config/environment.js index 8fbe66cf..f4824e0d 100644 --- a/gui/config/environment.js +++ b/gui/config/environment.js @@ -23,6 +23,12 @@ module.exports = function (environment) { apiNamespace: '', contentSecurityPolicyHeader: 'Content-Security-Policy-Report-Only', + // ember-cli-ifa + ifa: { + enabled: true, + inline: false, + }, + EmberENV: { FEATURES: {} }, diff --git a/gui/ember-cli-build.js b/gui/ember-cli-build.js index 1cec1415..a2611351 100644 --- a/gui/ember-cli-build.js +++ b/gui/ember-cli-build.js @@ -17,6 +17,9 @@ module.exports = function (defaults) { var app = new EmberApp(defaults, { fingerprint: { enabled: true, + generateAssetMap: true, + fingerprintAssetMap: true, + prepend: '/', extensions: ['js', 'css'], exclude: ['tinymce/**', 'codemirror/**', 'flowchart/**'] }, @@ -38,6 +41,17 @@ module.exports = function (defaults) { sourcemaps: { enabled: isDevelopment, extensions: ['js'] + }, + + outputPaths: { + app: { + css: { + 'app': '/assets/documize.css', + 'themes/blue': '/assets/theme-blue.css', + 'themes/teal': '/assets/theme-teal.css', + 'themes/deep-orange': '/assets/theme-deep-orange.css' + } + } } }); diff --git a/gui/package.json b/gui/package.json index 09bb75aa..3cc2d0a2 100644 --- a/gui/package.json +++ b/gui/package.json @@ -30,6 +30,7 @@ "ember-cli-eslint": "^4.2.1", "ember-cli-htmlbars": "^2.0.1", "ember-cli-htmlbars-inline-precompile": "^1.0.0", + "ember-cli-ifa": "^0.7.0", "ember-cli-inject-live-reload": "^1.4.1", "ember-cli-mirage": "^0.4.1", "ember-cli-qunit": "^4.1.1", diff --git a/gui/yarn.lock b/gui/yarn.lock index 3ba0abc8..def24967 100644 --- a/gui/yarn.lock +++ b/gui/yarn.lock @@ -172,7 +172,7 @@ amd-name-resolver@0.0.7: dependencies: ensure-posix-path "^1.0.1" -amd-name-resolver@^1.2.0: +amd-name-resolver@1.2.0, amd-name-resolver@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-1.2.0.tgz#fc41b3848824b557313897d71f8d5a0184fbe679" integrity sha512-hlSTWGS1t6/xq5YCed7YALg7tKZL3rkl7UwEZ/eCIkn8JxmM6fU6Qs/1hwtjQqfuYxlffuUcgYEm0f5xP4YKaA== @@ -758,6 +758,13 @@ babel-plugin-debug-macros@^0.1.10, babel-plugin-debug-macros@^0.1.11: dependencies: semver "^5.3.0" +babel-plugin-debug-macros@^0.2.0-beta.6: + version "0.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.2.0.tgz#0120ac20ce06ccc57bf493b667cf24b85c28da7a" + integrity sha512-Wpmw4TbhR3Eq2t3W51eBAQSdKlr+uAyF0GI4GtPfMCD12Y4cIdpKC9l0RjNTH/P9isFypSqqewMPm7//fnZlNA== + dependencies: + semver "^5.3.0" + babel-plugin-ember-modules-api-polyfill@^1.4.2: version "1.6.0" resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-1.6.0.tgz#abd1afa4237b3121cb51222f9bf3283cad8990aa" @@ -779,6 +786,13 @@ babel-plugin-ember-modules-api-polyfill@^2.3.0: dependencies: ember-rfc176-data "^0.3.0" +babel-plugin-ember-modules-api-polyfill@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.5.0.tgz#860aab9fecbf38c10d1fe0779c6979a854fff154" + integrity sha512-o1rOgWFHR0IRBjC9Dvqc2V4MKE2UvdMv/fD/c5GUMAkS6DlTjQV54iMH9sdQ3TGfXPukPKBIOpoSoH/hdfGiMg== + dependencies: + ember-rfc176-data "^0.3.5" + babel-plugin-eval@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz#a2faed25ce6be69ade4bfec263f70169195950da" @@ -1101,7 +1115,7 @@ babel-plugin-undefined-to-void@^1.1.6: resolved "https://registry.yarnpkg.com/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz#7f578ef8b78dfae6003385d8417a61eda06e2f81" integrity sha1-f1eO+LeN+uYAM4XYQXph7aBuL4E= -babel-polyfill@^6.16.0: +babel-polyfill@^6.16.0, babel-polyfill@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= @@ -1146,6 +1160,42 @@ babel-preset-env@^1.5.1: invariant "^2.2.2" semver "^5.3.0" +babel-preset-env@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" + integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.23.0" + babel-plugin-transform-es2015-classes "^6.23.0" + babel-plugin-transform-es2015-computed-properties "^6.22.0" + babel-plugin-transform-es2015-destructuring "^6.23.0" + babel-plugin-transform-es2015-duplicate-keys "^6.22.0" + babel-plugin-transform-es2015-for-of "^6.23.0" + babel-plugin-transform-es2015-function-name "^6.22.0" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.22.0" + babel-plugin-transform-es2015-modules-commonjs "^6.23.0" + babel-plugin-transform-es2015-modules-systemjs "^6.23.0" + babel-plugin-transform-es2015-modules-umd "^6.23.0" + babel-plugin-transform-es2015-object-super "^6.22.0" + babel-plugin-transform-es2015-parameters "^6.23.0" + babel-plugin-transform-es2015-shorthand-properties "^6.22.0" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.22.0" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.23.0" + babel-plugin-transform-es2015-unicode-regex "^6.22.0" + babel-plugin-transform-exponentiation-operator "^6.22.0" + babel-plugin-transform-regenerator "^6.22.0" + browserslist "^3.2.6" + invariant "^2.2.2" + semver "^5.3.0" + babel-register@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" @@ -1514,6 +1564,22 @@ broccoli-babel-transpiler@^6.0.0, broccoli-babel-transpiler@^6.1.2: rsvp "^3.5.0" workerpool "^2.2.1" +broccoli-babel-transpiler@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.5.0.tgz#aa501a227b298a99742fdd0309b1eaad7124bba0" + integrity sha512-c5OLGY40Sdmv6rP230Jt8yoK49BHfOw1LXiDMu9EC9k2U6sqlpNRK78SzvByQ8IzKtBYUfeWCxeZHcvW+gH7VQ== + dependencies: + babel-core "^6.26.0" + broccoli-funnel "^2.0.1" + broccoli-merge-trees "^2.0.0" + broccoli-persistent-filter "^1.4.3" + clone "^2.0.0" + hash-for-dep "^1.2.3" + heimdalljs-logger "^0.1.7" + json-stable-stringify "^1.0.0" + rsvp "^4.8.2" + workerpool "^2.3.0" + broccoli-builder@^0.18.8: version "0.18.10" resolved "https://registry.yarnpkg.com/broccoli-builder/-/broccoli-builder-0.18.10.tgz#9767e0061ff5b5e6eb1619d1a972ef2c7fd07631" @@ -1620,6 +1686,18 @@ broccoli-debug@^0.6.2: symlink-or-copy "^1.1.8" tree-sync "^1.2.2" +broccoli-debug@^0.6.4: + version "0.6.5" + resolved "https://registry.yarnpkg.com/broccoli-debug/-/broccoli-debug-0.6.5.tgz#164a5cdafd8936e525e702bf8f91f39d758e2e78" + integrity sha512-RIVjHvNar9EMCLDW/FggxFRXqpjhncM/3qq87bn/y+/zR9tqEkHvTqbyOc4QnB97NO2m6342w4wGkemkaeOuWg== + dependencies: + broccoli-plugin "^1.2.1" + fs-tree-diff "^0.5.2" + heimdalljs "^0.2.1" + heimdalljs-logger "^0.1.7" + symlink-or-copy "^1.1.8" + tree-sync "^1.2.2" + broccoli-file-creator@^1.0.0, broccoli-file-creator@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/broccoli-file-creator/-/broccoli-file-creator-1.1.1.tgz#1b35b67d215abdfadd8d49eeb69493c39e6c3450" @@ -1930,6 +2008,14 @@ browserslist@^2.1.2: caniuse-lite "^1.0.30000718" electron-to-chromium "^1.3.18" +browserslist@^3.2.6: + version "3.2.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" + integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== + dependencies: + caniuse-lite "^1.0.30000844" + electron-to-chromium "^1.3.47" + bser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" @@ -2070,6 +2156,11 @@ caniuse-lite@^1.0.30000718: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000722.tgz#8cbfe07440478e3a16ab0d3b182feef1901eab55" integrity sha1-jL/gdEBHjjoWqw07GC/u8ZAeq1U= +caniuse-lite@^1.0.30000844: + version "1.0.30000910" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000910.tgz#755d5181d4b006e5a2b59b1ffa05d0a0470039f5" + integrity sha512-u/nxtHGAzCGZzIxt3dA/tpSPOcirBZFWKwz1EPz4aaupnBI2XR0Rbr74g0zc6Hzy41OEM4uMoZ38k56TpYAWjQ== + capture-exit@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" @@ -2957,6 +3048,11 @@ electron-to-chromium@^1.3.18: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.20.tgz#2eedd5ccbae7ddc557f68ad1fce9c172e915e4e5" integrity sha1-Lu3VzLrn3cVX9orR/OnBcukV5OU= +electron-to-chromium@^1.3.47: + version "1.3.84" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.84.tgz#2e55df59e818f150a9f61b53471ebf4f0feecc65" + integrity sha512-IYhbzJYOopiTaNWMBp7RjbecUBsbnbDneOP86f3qvS0G0xfzwNSvMJpTrvi5/Y1gU7tg2NAgeg8a8rCYvW9Whw== + ember-ajax@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ember-ajax/-/ember-ajax-3.0.0.tgz#8f21e9da0c1d433cf879aa855fce464d517e9ab5" @@ -3058,6 +3154,25 @@ ember-cli-babel@^6.10.0, ember-cli-babel@^6.6.0: ember-cli-version-checker "^2.1.0" semver "^5.4.1" +ember-cli-babel@^6.11.0: + version "6.17.2" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.17.2.tgz#f0d53d2fb95e70c15d8db84760d045f88f458f69" + integrity sha512-9KcCvF1PcelEFTSiJ/Ld20tfuW9acMkwHC/xINLsmwqJVDbm3oEqWtiFDZ5ebaC278O5I0GqNJWJLYNoWMNZ8g== + dependencies: + amd-name-resolver "1.2.0" + babel-plugin-debug-macros "^0.2.0-beta.6" + babel-plugin-ember-modules-api-polyfill "^2.5.0" + babel-plugin-transform-es2015-modules-amd "^6.24.0" + babel-polyfill "^6.26.0" + babel-preset-env "^1.7.0" + broccoli-babel-transpiler "^6.5.0" + broccoli-debug "^0.6.4" + broccoli-funnel "^2.0.0" + broccoli-source "^1.1.0" + clone "^2.0.0" + ember-cli-version-checker "^2.1.2" + semver "^5.5.0" + ember-cli-babel@^6.8.2: version "6.9.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.9.0.tgz#5147391389bdbb7091d15f81ae1dff1eb49d71aa" @@ -3133,6 +3248,13 @@ ember-cli-htmlbars@^2.0.1: json-stable-stringify "^1.0.0" strip-bom "^3.0.0" +ember-cli-ifa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/ember-cli-ifa/-/ember-cli-ifa-0.7.0.tgz#dbcfef17744d9ee10648dca5025ac55383d528f8" + integrity sha512-+BTJRF9EnZPFqMVlXT1cMupAlLEDfVXads92OKZNQjzv8RbFlkwpyD7cW6NswaDagsysD9NrJ5wLiHNzaqz2yg== + dependencies: + ember-cli-babel "^6.11.0" + ember-cli-inject-live-reload@^1.4.1: version "1.7.0" resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-1.7.0.tgz#af94336e015336127dfb98080ad442bb233e37ed" @@ -3304,7 +3426,7 @@ ember-cli-version-checker@^2.1.0: resolve "^1.3.3" semver "^5.3.0" -ember-cli-version-checker@^2.1.1: +ember-cli-version-checker@^2.1.1, ember-cli-version-checker@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.1.2.tgz#305ce102390c66e4e0f1432dea9dc5c7c19fed98" integrity sha512-sjkHGr4IGXnO3EUcY21380Xo9Qf6bC8HWH4D62bVnrQop/8uha5XgMQRoAflMCeH6suMrezQL287JUoYc2smEw== @@ -3623,6 +3745,11 @@ ember-rfc176-data@^0.3.0, ember-rfc176-data@^0.3.1: resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.1.tgz#6a5a4b8b82ec3af34f3010965fa96b936ca94519" integrity sha512-u+W5rUvYO7xyKJjiPuCM7bIAvFyPwPTJ66fOZz1xuCv3AyReI9Oev5oOADOO6YJZk+vEn0xWiZ9N6zSf8WU7Fg== +ember-rfc176-data@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.5.tgz#f630e550572c81a5e5c7220f864c0f06eee9e977" + integrity sha512-5NfL1iTkIQDYs16/IZ7/jWCEglNsUrigLelBkBMsNcib9T3XzQwmhhVTjoSsk66s57LmWJ1bQu+2c1CAyYCV7A== + ember-router-generator@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/ember-router-generator/-/ember-router-generator-1.2.3.tgz#8ed2ca86ff323363120fc14278191e9e8f1315ee" @@ -5090,7 +5217,7 @@ has@^1.0.1: dependencies: function-bind "^1.0.2" -hash-for-dep@^1.0.2: +hash-for-dep@^1.0.2, hash-for-dep@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.2.3.tgz#5ec69fca32c23523972d52acb5bb65ffc3664cab" integrity sha512-NE//rDaCFpWHViw30YM78OAGBShU+g4dnUGY3UWGyEzPOGYg/ptOjk32nEc+bC1xz+RfK5UIs6lOL6eQdrV4Ow== @@ -8934,6 +9061,11 @@ rsvp@^4.6.1, rsvp@^4.7.0: resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.7.0.tgz#dc1b0b1a536f7dec9d2be45e0a12ad4197c9fd96" integrity sha1-3BsLGlNvfeydK+ReChKtQZfJ/ZY= +rsvp@^4.8.2: + version "4.8.4" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.4.tgz#b50e6b34583f3dd89329a2f23a8a2be072845911" + integrity sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA== + rsvp@~3.0.6: version "3.0.21" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.0.21.tgz#49c588fe18ef293bcd0ab9f4e6756e6ac433359f" @@ -10433,6 +10565,13 @@ workerpool@^2.2.1: dependencies: object-assign "4.1.1" +workerpool@^2.3.0: + version "2.3.3" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-2.3.3.tgz#49a70089bd55e890d68cc836a19419451d7c81d7" + integrity sha512-L1ovlYHp6UObYqElXXpbd214GgbEKDED0d3sj7pRdFXjNkb2+un/AUcCkceHizO0IVI6SOGGncrcjozruCkRgA== + dependencies: + object-assign "4.1.1" + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" diff --git a/model/org/meta.go b/model/org/meta.go index edbf702b..85bad8d4 100644 --- a/model/org/meta.go +++ b/model/org/meta.go @@ -43,4 +43,5 @@ type SiteMeta struct { ConversionEndpoint string `json:"conversionEndpoint"` Storage env.StoreType `json:"storageProvider"` Location string `json:"location"` // reserved for internal use + Theme string `json:"theme"` // default side-wide theme, user overrideble } diff --git a/model/org/org.go b/model/org/org.go index 5cf8bebc..f7710cc9 100644 --- a/model/org/org.go +++ b/model/org/org.go @@ -31,6 +31,7 @@ type Organization struct { Serial string `json:"serial"` Active bool `json:"active"` Subscription string `json:"subscription"` + Theme string `json:"theme"` } // StripSecrets removes sensitive information. diff --git a/server/routing/routes.go b/server/routing/routes.go index 0c83ac62..20ff9705 100644 --- a/server/routing/routes.go +++ b/server/routing/routes.go @@ -75,9 +75,11 @@ func RegisterEndpoints(rt *env.Runtime, s *store.Store) { //************************************************** AddPublic(rt, "meta", []string{"GET", "OPTIONS"}, nil, meta.Meta) - AddPublic(rt, "version", []string{"GET", "OPTIONS"}, nil, func(w http.ResponseWriter, r *http.Request) { - w.Write([]byte(rt.Product.Version)) - }) + AddPublic(rt, "meta/themes", []string{"GET", "OPTIONS"}, nil, meta.Themes) + AddPublic(rt, "version", []string{"GET", "OPTIONS"}, nil, + func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte(rt.Product.Version)) + }) //************************************************** // Non-secure public service routes