Commit 7057a9e1d1b55ee0b89712c54c1c300a9b5b7feb
1 parent
a7010295
Exists in
master
and in
11 other branches
initial commit for the design mode feature
Showing
9 changed files
with
105 additions
and
10 deletions
Show diff stats
... | ... | @@ -0,0 +1,17 @@ |
1 | +import {Component, Injectable, Output, EventEmitter} from 'ng-forward'; | |
2 | +import {BodyStateClassesService} from './../layout/services/body-state-classes.service'; | |
3 | + | |
4 | +@Injectable() | |
5 | +export class DesignModeService { | |
6 | + @Output() onToggle: EventEmitter<boolean> = new EventEmitter<boolean>(); | |
7 | + | |
8 | + private designModeOn: boolean = false; | |
9 | + | |
10 | + constructor() { | |
11 | + } | |
12 | + | |
13 | + toggle() { | |
14 | + this.designModeOn = !this.designModeOn; | |
15 | + this.onToggle.next(this.designModeOn); | |
16 | + } | |
17 | +} | |
0 | 18 | \ No newline at end of file | ... | ... |
... | ... | @@ -0,0 +1,33 @@ |
1 | +import {Component, Inject} from 'ng-forward'; | |
2 | +import {DesignModeService} from './designMode.service'; | |
3 | +@Component({ | |
4 | + selector: 'noosfero-design-toggler', | |
5 | + templateUrl: 'app/admin/designModeToggler.html' | |
6 | +}) | |
7 | +@Inject(DesignModeService, '$scope') | |
8 | +export class DesignModeTogglerComponent { | |
9 | + | |
10 | + inDesignMode: boolean = false; | |
11 | + | |
12 | + constructor(private designModeService: DesignModeService, private $scope: ng.IScope) { | |
13 | + } | |
14 | + | |
15 | + ngOnInit() { | |
16 | + this.designModeService.onToggle.subscribe((editOnOrFalse: boolean) => { | |
17 | + this.inDesignMode = editOnOrFalse; | |
18 | + this.$scope.$apply(); | |
19 | + }); | |
20 | + } | |
21 | + | |
22 | + toggleDesignModeOn() { | |
23 | + if (!this.inDesignMode) { | |
24 | + this.designModeService.toggle(); | |
25 | + } | |
26 | + } | |
27 | + | |
28 | + toggleDesignModeOff() { | |
29 | + if (this.inDesignMode) { | |
30 | + this.designModeService.toggle(); | |
31 | + } | |
32 | + } | |
33 | +} | |
0 | 34 | \ No newline at end of file | ... | ... |
... | ... | @@ -0,0 +1,6 @@ |
1 | + | |
2 | + <span class="design-toggler-label" ng-bind="'designMode.label' | translate"></span> | |
3 | + <div class="btn-group design-toggler"> | |
4 | + <button ng-click="ctrl.toggleDesignModeOff()" ng-class="{active: !ctrl.inDesignMode}" class="btn btn-xs btn-warning" ng-bind="'designMode.toggle.OFF' | translate"></button> | |
5 | + <button ng-click="ctrl.toggleDesignModeOn()" ng-class="{active: ctrl.inDesignMode}" class="btn btn-xs btn-warning" ng-bind="'designMode.toggle.ON' | translate "></button> | |
6 | + </div> | ... | ... |
src/app/layout/navbar/navbar.html
... | ... | @@ -39,9 +39,15 @@ |
39 | 39 | </ul> |
40 | 40 | </li> |
41 | 41 | </ul> |
42 | + | |
42 | 43 | <ul class="nav navbar-nav navbar-right"> |
43 | 44 | <language-selector class="nav navbar-nav navbar-right"></language-selector> |
44 | 45 | </ul> |
46 | + <ul class="nav navbar-nav navbar-right"> | |
47 | + <li class="toggler-container"> | |
48 | + <noosfero-design-toggler></noosfero-design-toggler> | |
49 | + </li> | |
50 | + </ul> | |
45 | 51 | <div ui-view="actions"></div> |
46 | 52 | </div> |
47 | 53 | </div> | ... | ... |
src/app/layout/navbar/navbar.ts
... | ... | @@ -4,11 +4,12 @@ import {SessionService, AuthService, AuthController, AuthEvents} from "./../../l |
4 | 4 | import {EnvironmentService} from "./../../../lib/ng-noosfero-api/http/environment.service"; |
5 | 5 | import {SidebarNotificationService} from "../sidebar/sidebar.notification.service"; |
6 | 6 | import {BodyStateClassesService} from '../services/body-state-classes.service'; |
7 | +import {DesignModeTogglerComponent} from './../../admin/designModeToggler.component'; | |
7 | 8 | |
8 | 9 | @Component({ |
9 | 10 | selector: "acme-navbar", |
10 | 11 | templateUrl: "app/layout/navbar/navbar.html", |
11 | - directives: [LanguageSelectorComponent], | |
12 | + directives: [LanguageSelectorComponent, DesignModeTogglerComponent], | |
12 | 13 | providers: [AuthService, SessionService, SidebarNotificationService, EnvironmentService] |
13 | 14 | }) |
14 | 15 | @Inject("$uibModal", AuthService, "SessionService", "$state", SidebarNotificationService, BodyStateClassesService, EnvironmentService) | ... | ... |
src/app/layout/scss/_layout.scss
... | ... | @@ -35,3 +35,17 @@ |
35 | 35 | padding: 0 20px 20px 20px; |
36 | 36 | } |
37 | 37 | } |
38 | + | |
39 | + | |
40 | +body.noosfero-design-on { | |
41 | + | |
42 | + div.content-wrapper { | |
43 | + opacity: 0.5; | |
44 | + } | |
45 | +} | |
46 | + | |
47 | +ul.nav > li.toggler-container { | |
48 | + position: relative; | |
49 | + padding-top: 12px; | |
50 | + color: white; | |
51 | +} | |
38 | 52 | \ No newline at end of file | ... | ... |
src/app/layout/services/body-state-classes.service.ts
... | ... | @@ -3,6 +3,7 @@ import {AuthEvents} from "../../login/auth-events"; |
3 | 3 | import {AuthService} from "./../../login/auth.service"; |
4 | 4 | import {HtmlUtils} from "../html-utils"; |
5 | 5 | import {INgForwardJQuery} from 'ng-forward/cjs/util/jqlite-extensions'; |
6 | +import {DesignModeService} from './../../admin/designMode.service'; | |
6 | 7 | |
7 | 8 | export interface StartParams { |
8 | 9 | skin?: string; |
... | ... | @@ -22,12 +23,13 @@ export interface StartParams { |
22 | 23 | * - full-content |
23 | 24 | */ |
24 | 25 | @Injectable() |
25 | -@Inject("$rootScope", "$document", "$state", AuthService) | |
26 | +@Inject("$rootScope", "$document", "$state", AuthService, DesignModeService) | |
26 | 27 | export class BodyStateClassesService { |
27 | 28 | |
28 | 29 | private started: boolean = false; |
29 | 30 | private skin: string; |
30 | 31 | |
32 | + public static get DESIGN_MODE_ON_CLASSNAME(): string { return "noosfero-design-on"; } | |
31 | 33 | public static get USER_LOGGED_CLASSNAME(): string { return "noosfero-user-logged"; } |
32 | 34 | public static get ROUTE_STATE_CLASSNAME_PREFIX(): string { return "noosfero-route-"; } |
33 | 35 | public static get CONTENT_WRAPPER_FULL(): string { return "full-content"; } |
... | ... | @@ -38,16 +40,16 @@ export class BodyStateClassesService { |
38 | 40 | private $rootScope: ng.IRootScopeService, |
39 | 41 | private $document: ng.IDocumentService, |
40 | 42 | private $state: ng.ui.IStateService, |
41 | - private authService: AuthService | |
43 | + private authService: AuthService, | |
44 | + private designModeService: DesignModeService | |
42 | 45 | ) { |
43 | - | |
44 | 46 | } |
45 | 47 | |
46 | 48 | start(config?: StartParams) { |
47 | 49 | if (!this.started) { |
48 | 50 | this.setupUserLoggedClassToggle(); |
49 | 51 | this.setupStateClassToggle(); |
50 | - | |
52 | + this.setupDesignModeClassToggle(); | |
51 | 53 | if (config) { |
52 | 54 | this.setThemeSkin(config.skin); |
53 | 55 | } |
... | ... | @@ -87,9 +89,19 @@ export class BodyStateClassesService { |
87 | 89 | } |
88 | 90 | |
89 | 91 | /** |
90 | - * Setup the initial class name on body element indicating the current route | |
91 | - * and adds event handler to swith this class when the current page/state changes | |
92 | + * setup the listeners to the desigModeService to add class on the Body Element | |
93 | + * indicating the user activated the designMode | |
92 | 94 | */ |
95 | + private setupDesignModeClassToggle() { | |
96 | + this.designModeService.onToggle.subscribe((designOn: boolean) => { | |
97 | + if (designOn) { | |
98 | + this.getBodyElement().addClass(BodyStateClassesService.DESIGN_MODE_ON_CLASSNAME); | |
99 | + } else { | |
100 | + this.getBodyElement().removeClass(BodyStateClassesService.DESIGN_MODE_ON_CLASSNAME); | |
101 | + } | |
102 | + }); | |
103 | + } | |
104 | + | |
93 | 105 | private setupStateClassToggle() { |
94 | 106 | let bodyElement = this.getBodyElement(); |
95 | 107 | bodyElement.addClass(BodyStateClassesService.ROUTE_STATE_CLASSNAME_PREFIX + this.$state.current.name); | ... | ... |
src/languages/en.json
... | ... | @@ -74,5 +74,8 @@ |
74 | 74 | "profile.content.success.message": "Profile saved!", |
75 | 75 | "custom_content.title": "Edit content", |
76 | 76 | "profile.custom_header.label": "Header", |
77 | - "profile.custom_footer.label": "Footer" | |
77 | + "profile.custom_footer.label": "Footer", | |
78 | + "designMode.label": "Design Mode", | |
79 | + "designMode.toggle.ON": "ON", | |
80 | + "designMode.toggle.OFF": "OFF" | |
78 | 81 | } | ... | ... |
src/languages/pt.json
... | ... | @@ -58,7 +58,7 @@ |
58 | 58 | "article.remove.success.title": "Bom trabalho!", |
59 | 59 | "article.remove.success.message": "Artigo removido!", |
60 | 60 | "article.remove.confirmation.title": "Tem certeza?", |
61 | - "article.remove.confirmation.message": "Não será possível recuperar este artigo!", | |
61 | + "article.remove.confirmation.message": "Não será possível recuperar este artigo!", | |
62 | 62 | "article.basic_editor.visibility": "Visibilidade", |
63 | 63 | "article.basic_editor.visibility.public": "Público", |
64 | 64 | "article.basic_editor.visibility.private": "Privado", |
... | ... | @@ -74,5 +74,8 @@ |
74 | 74 | "profile.content.success.message": "Perfil salvo!", |
75 | 75 | "custom_content.title": "Editar conteúdo", |
76 | 76 | "profile.custom_header.label": "Cabeçalho", |
77 | - "profile.custom_footer.label": "Rodapé" | |
77 | + "profile.custom_footer.label": "Rodapé", | |
78 | + "designMode.label": "Modo de Edição", | |
79 | + "designMode.toggle.ON": "Ligado", | |
80 | + "designMode.toggle.OFF": "Desligado" | |
78 | 81 | } | ... | ... |