diff --git a/README.md b/README.md index 3e961221..01188dcf 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,16 @@ The language has to be referenced in the `languages.properties` file to be picke When adding new translations, add them in en.properties then run `mvn -e groovy:execute -Pi18n`. It will parse the english file and add placeholders in the other translation files. +Themes +--------------------- + +To create a theme, create a new file called _.scss in `src/main/webapp/sass/themes/`. Your styles should be wrapped in a `#theme-` element. + +Don't forget to reference your theme in `src/main/webapp/sass/app.scss` and in `src/main/webapp/js/controllers.js` (look for `$scope.themes`). + +See _test.scss for an example. + + Copyright and license --------------------- diff --git a/src/main/java/com/commafeed/backend/model/UserSettings.java b/src/main/java/com/commafeed/backend/model/UserSettings.java index 2ba434ae..4d4a3d96 100644 --- a/src/main/java/com/commafeed/backend/model/UserSettings.java +++ b/src/main/java/com/commafeed/backend/model/UserSettings.java @@ -50,6 +50,9 @@ public class UserSettings extends AbstractModel { private boolean scrollMarks; private boolean socialButtons; + @Column(length = 32) + private String theme; + @Lob @Column(length = Integer.MAX_VALUE) private String customCss; @@ -126,4 +129,12 @@ public class UserSettings extends AbstractModel { this.language = language; } + public String getTheme() { + return theme; + } + + public void setTheme(String theme) { + this.theme = theme; + } + } diff --git a/src/main/java/com/commafeed/frontend/model/Settings.java b/src/main/java/com/commafeed/frontend/model/Settings.java index 9d009ce5..e428e815 100644 --- a/src/main/java/com/commafeed/frontend/model/Settings.java +++ b/src/main/java/com/commafeed/frontend/model/Settings.java @@ -36,6 +36,9 @@ public class Settings implements Serializable { @ApiProperty(value = "In expanded view, scroll through entries mark them as read", required = true) private boolean scrollMarks; + @ApiProperty(value = "user's selected theme") + private String theme; + @ApiProperty(value = "user's custom css for the website") private String customCss; @@ -103,4 +106,12 @@ public class Settings implements Serializable { this.language = language; } + public String getTheme() { + return theme; + } + + public void setTheme(String theme) { + this.theme = theme; + } + } diff --git a/src/main/java/com/commafeed/frontend/pages/BasePage.java b/src/main/java/com/commafeed/frontend/pages/BasePage.java index e1b30301..6a9a955c 100644 --- a/src/main/java/com/commafeed/frontend/pages/BasePage.java +++ b/src/main/java/com/commafeed/frontend/pages/BasePage.java @@ -62,7 +62,7 @@ public abstract class BasePage extends WebPage { @Inject protected UserRoleDAO userRoleDAO; - + @Inject MailService mailService; @@ -74,17 +74,20 @@ public abstract class BasePage extends WebPage { public BasePage() { String lang = "en"; + String theme = "default"; User user = CommaFeedSession.get().getUser(); if (user != null) { UserSettings settings = userSettingsDAO.findByUser(user); if (settings != null) { lang = settings.getLanguage() == null ? "en" : settings .getLanguage(); + theme = settings.getTheme() == null ? "default" : settings + .getTheme(); } } - add(new TransparentWebMarkupContainer("html") - .add(new AttributeModifier("lang", lang))); + add(new TransparentWebMarkupContainer("html").setMarkupId( + "theme-" + theme).add(new AttributeModifier("lang", lang))); settings = applicationSettingsService.get(); add(new HeaderResponseContainer("footer-container", "footer-container")); @@ -104,7 +107,8 @@ public abstract class BasePage extends WebPage { if (getApplication().getConfigurationType() == RuntimeConfigurationType.DEPLOYMENT) { long startupTime = startupBean.getStartupTime(); String suffix = "?" + startupTime; - response.render(JavaScriptHeaderItem.forUrl("static/all.js" + suffix)); + response.render(JavaScriptHeaderItem.forUrl("static/all.js" + + suffix)); response.render(CssHeaderItem.forUrl("static/all.css" + suffix)); } else { response.render(JavaScriptHeaderItem.forUrl("wro/lib.js")); diff --git a/src/main/java/com/commafeed/frontend/rest/resources/UserREST.java b/src/main/java/com/commafeed/frontend/rest/resources/UserREST.java index c69a5b37..f563dcbe 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/UserREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/UserREST.java @@ -41,6 +41,7 @@ public class UserREST extends AbstractResourceREST { s.setShowRead(settings.isShowRead()); s.setSocialButtons(settings.isSocialButtons()); s.setScrollMarks(settings.isScrollMarks()); + s.setTheme(settings.getTheme()); s.setCustomCss(settings.getCustomCss()); s.setLanguage(settings.getLanguage()); } else { @@ -48,6 +49,7 @@ public class UserREST extends AbstractResourceREST { s.setReadingOrder(ReadingOrder.desc.name()); s.setViewMode(ViewMode.title.name()); s.setShowRead(true); + s.setTheme("default"); s.setSocialButtons(true); s.setScrollMarks(true); s.setLanguage("en"); @@ -75,6 +77,7 @@ public class UserREST extends AbstractResourceREST { s.setShowRead(settings.isShowRead()); s.setViewMode(ViewMode.valueOf(settings.getViewMode())); s.setScrollMarks(settings.isScrollMarks()); + s.setTheme(settings.getTheme()); s.setCustomCss(settings.getCustomCss()); s.setSocialButtons(settings.isSocialButtons()); s.setLanguage(settings.getLanguage()); diff --git a/src/main/webapp/js/controllers.js b/src/main/webapp/js/controllers.js index 163f5bbc..164c7f8c 100644 --- a/src/main/webapp/js/controllers.js +++ b/src/main/webapp/js/controllers.js @@ -987,6 +987,8 @@ function($scope, $location, SettingsService, AnalyticsService, ServerService) { $scope.ServerService = ServerService.get(); + $scope.themes = ['default', 'test']; + $scope.settingsService = SettingsService; $scope.$watch('settingsService.settings', function(value) { $scope.settings = angular.copy(value); diff --git a/src/main/webapp/sass/app.scss b/src/main/webapp/sass/app.scss index 85dacaf9..3f4b8ab5 100644 --- a/src/main/webapp/sass/app.scss +++ b/src/main/webapp/sass/app.scss @@ -1,10 +1,11 @@ @import "generic/misc"; - @import "components/admin-panel"; @import "components/toolbar"; @import "components/entry-list"; @import "components/subscription-list"; @import "components/help"; -@import "mobile/mobile"; \ No newline at end of file +@import "mobile/mobile"; + +@import "themes/test"; \ No newline at end of file diff --git a/src/main/webapp/sass/themes/_test.scss b/src/main/webapp/sass/themes/_test.scss new file mode 100644 index 00000000..b03cdf4f --- /dev/null +++ b/src/main/webapp/sass/themes/_test.scss @@ -0,0 +1,5 @@ +#theme-test { + body { + background-color: black + } +} \ No newline at end of file diff --git a/src/main/webapp/templates/settings.html b/src/main/webapp/templates/settings.html index 1fbf168e..e41f12ab 100644 --- a/src/main/webapp/templates/settings.html +++ b/src/main/webapp/templates/settings.html @@ -55,8 +55,13 @@
- +
+ +
+
+ +