Commit 4d167676c121275cf2a5927c873c3283e9956fdb

Authored by Victor Costa
Committed by Michel Felipe
1 parent f3cb9503

Add component to display tasks in menu

src/app/layout/navbar/navbar.html
@@ -45,10 +45,12 @@ @@ -45,10 +45,12 @@
45 </ul> 45 </ul>
46 </li> 46 </li>
47 </ul> 47 </ul>
48 -  
49 <ul class="nav navbar-nav navbar-right"> 48 <ul class="nav navbar-nav navbar-right">
50 <language-selector class="nav navbar-nav navbar-right"></language-selector> 49 <language-selector class="nav navbar-nav navbar-right"></language-selector>
51 </ul> 50 </ul>
  51 + <ul class="nav navbar-nav navbar-right">
  52 + <tasks-menu class="nav navbar-nav navbar-right"></tasks-menu>
  53 + </ul>
52 <div ui-view="actions"></div> 54 <div ui-view="actions"></div>
53 <div class="nav navbar-nav search navbar-right"> 55 <div class="nav navbar-nav search navbar-right">
54 <search-form></search-form> 56 <search-form></search-form>
src/app/main/main.component.ts
@@ -52,6 +52,8 @@ import { SearchFormComponent } from &quot;../search/search-form/search-form.component @@ -52,6 +52,8 @@ import { SearchFormComponent } from &quot;../search/search-form/search-form.component
52 52
53 import { EVENTS_HUB_KNOW_EVENT_NAMES, EventsHubService } from "../shared/services/events-hub.service"; 53 import { EVENTS_HUB_KNOW_EVENT_NAMES, EventsHubService } from "../shared/services/events-hub.service";
54 import { NoosferoKnownEvents } from "../known-events"; 54 import { NoosferoKnownEvents } from "../known-events";
  55 +import { TasksMenuComponent } from "../task/tasks-menu/tasks-menu.component";
  56 +
55 /** 57 /**
56 * @ngdoc controller 58 * @ngdoc controller
57 * @name main.MainContentComponent 59 * @name main.MainContentComponent
@@ -118,16 +120,16 @@ export class EnvironmentContent { @@ -118,16 +120,16 @@ export class EnvironmentContent {
118 MembersBlockComponent, NoosferoTemplate, DateFormat, RawHTMLBlockComponent, StatisticsBlockComponent, 120 MembersBlockComponent, NoosferoTemplate, DateFormat, RawHTMLBlockComponent, StatisticsBlockComponent,
119 LoginBlockComponent, CustomContentComponent, PermissionDirective, SearchFormComponent, SearchComponent, 121 LoginBlockComponent, CustomContentComponent, PermissionDirective, SearchFormComponent, SearchComponent,
120 PersonTagsPluginInterestsBlockComponent, TagsBlockComponent, RecentActivitiesPluginActivitiesBlockComponent, 122 PersonTagsPluginInterestsBlockComponent, TagsBlockComponent, RecentActivitiesPluginActivitiesBlockComponent,
121 - ProfileImagesPluginProfileImagesBlockComponent, BlockComponent, RegisterComponent 123 + ProfileImagesPluginProfileImagesBlockComponent, BlockComponent, RegisterComponent, TasksMenuComponent
122 ].concat(plugins.mainComponents).concat(plugins.hotspots), 124 ].concat(plugins.mainComponents).concat(plugins.hotspots),
123 - providers: [AuthService, SessionService, NotificationService, BodyStateClassesService, RegisterService, 125 + providers: [AuthService, SessionService, NotificationService, BodyStateClassesService,
124 "ngAnimate", "ngCookies", "ngStorage", "ngTouch", 126 "ngAnimate", "ngCookies", "ngStorage", "ngTouch",
125 "ngSanitize", "ngMessages", "ngAria", "restangular", 127 "ngSanitize", "ngMessages", "ngAria", "restangular",
126 "ui.router", "ui.bootstrap", "toastr", "ngCkeditor", 128 "ui.router", "ui.bootstrap", "toastr", "ngCkeditor",
127 "angular-bind-html-compile", "angularMoment", "angular.filter", "akoenig.deckgrid", 129 "angular-bind-html-compile", "angularMoment", "angular.filter", "akoenig.deckgrid",
128 "angular-timeline", "duScroll", "oitozero.ngSweetAlert", 130 "angular-timeline", "duScroll", "oitozero.ngSweetAlert",
129 "pascalprecht.translate", "tmh.dynamicLocale", "angularLoad", 131 "pascalprecht.translate", "tmh.dynamicLocale", "angularLoad",
130 - "angular-click-outside", "ngTagCloud", "noosfero.init", "uiSwitch", "ngPassword"] 132 + "angular-click-outside", "ngTagCloud", "noosfero.init", "uiSwitch"]
131 }) 133 })
132 @StateConfig([ 134 @StateConfig([
133 { 135 {
@@ -148,6 +150,7 @@ export class EnvironmentContent { @@ -148,6 +150,7 @@ export class EnvironmentContent {
148 url: '/', 150 url: '/',
149 component: EnvironmentComponent, 151 component: EnvironmentComponent,
150 name: 'main.environment', 152 name: 'main.environment',
  153 + abstract: true,
151 views: { 154 views: {
152 "content": { 155 "content": {
153 templateUrl: "app/environment/environment.html", 156 templateUrl: "app/environment/environment.html",
src/app/task/tasks-menu/tasks-menu.component.ts 0 → 100644
@@ -0,0 +1,24 @@ @@ -0,0 +1,24 @@
  1 +import { Component, Inject } from "ng-forward";
  2 +import { TaskService } from "../../../lib/ng-noosfero-api/http/task.service";
  3 +
  4 +@Component({
  5 + selector: "tasks-menu",
  6 + templateUrl: "app/task/tasks-menu/tasks-menu.html"
  7 +})
  8 +@Inject(TaskService)
  9 +export class TasksMenuComponent {
  10 +
  11 + tasks: noosfero.Task[];
  12 + total: number;
  13 + perPage: 5;
  14 +
  15 + constructor(private taskService: TaskService) { }
  16 +
  17 + ngOnInit() {
  18 + this.taskService.getAllPending({ per_page: this.perPage }).then((result: noosfero.RestResult) => {
  19 + this.total = result.headers('total');
  20 + this.tasks = result.data;
  21 + });
  22 + }
  23 +
  24 +}
src/app/task/tasks-menu/tasks-menu.html 0 → 100644
@@ -0,0 +1,20 @@ @@ -0,0 +1,20 @@
  1 +<li class="btn-nav tasks-menu" uib-dropdown ng-show="ctrl.total > 0">
  2 + <a href="#" uib-dropdown-toggle>
  3 + <i class="fa fa-bell-o fa-fw fa-2x"></i>
  4 + <span class="badge">{{ctrl.total}}</span>
  5 + </a>
  6 + <ul class="dropdown-menu task-list" uib-dropdown-menu>
  7 + <li ng-repeat="(target, tasks) in ctrl.tasks | groupBy: 'target.name'">
  8 + {{target}}
  9 + <a href="#" ng-repeat="task in tasks | orderBy: 'created_at':true" class="task">
  10 + {{task.type}}
  11 + {{task.requestor.name}}
  12 + {{task.target.name}}
  13 + <span class="time">
  14 + <span class="bullet-separator">•</span> <span am-time-ago="task.created_at | dateFormat"></span>
  15 + </span>
  16 + </a>
  17 + </li>
  18 + <a href="#" class="all-tasks btn btn-default btn-xs">{{"tasks.menu.all" | translate}}</a>
  19 + </ul>
  20 +</li>
src/app/task/tasks-menu/tasks-menu.scss 0 → 100644
@@ -0,0 +1,32 @@ @@ -0,0 +1,32 @@
  1 +.tasks-menu {
  2 + position: relative;
  3 + margin-right: 0;
  4 + .badge {
  5 + position: absolute;
  6 + top: 1px;
  7 + right: 8px;
  8 + border-radius: 6px;
  9 + }
  10 + i {
  11 + color: #FFF;
  12 + }
  13 + .task-list {
  14 + width: 500px;
  15 + padding: 16px 16px 8px 16px;
  16 + .task {
  17 + .time {
  18 + color: #c1c1c1;
  19 + font-size: 12px;
  20 + .bullet-separator {
  21 + font-size: 10px;
  22 + color: #d1d1d1;
  23 + }
  24 + }
  25 + }
  26 + .all-tasks {
  27 + text-align: center;
  28 + width: 100%;
  29 + display: inline-block;
  30 + }
  31 + }
  32 +}
src/languages/en.json
@@ -124,5 +124,6 @@ @@ -124,5 +124,6 @@
124 "messages.invalid.maxlength": "This field is too long", 124 "messages.invalid.maxlength": "This field is too long",
125 "messages.invalid.minlength": "This field is too short", 125 "messages.invalid.minlength": "This field is too short",
126 "messages.invalid.email": "This needs to be a valid email", 126 "messages.invalid.email": "This needs to be a valid email",
127 - "messages.invalid.passwordMatch": "Your passwords did not match" 127 + "messages.invalid.passwordMatch": "Your passwords did not match",
  128 + "tasks.menu.all": "All tasks"
128 } 129 }
src/languages/pt.json
@@ -128,4 +128,5 @@ @@ -128,4 +128,5 @@
128 "messages.invalid.minlength": "O valor é muito curto", 128 "messages.invalid.minlength": "O valor é muito curto",
129 "messages.invalid.email": "Informe um email válido", 129 "messages.invalid.email": "Informe um email válido",
130 "messages.invalid.passwordMatch": "As senhas não coincidem" 130 "messages.invalid.passwordMatch": "As senhas não coincidem"
  131 + "tasks.menu.all": "Todas as tarefas"
131 } 132 }
src/lib/ng-noosfero-api/http/task.service.ts 0 → 100644
@@ -0,0 +1,26 @@ @@ -0,0 +1,26 @@
  1 +import { Injectable, Inject } from "ng-forward";
  2 +import { RestangularService } from "./restangular_service";
  3 +
  4 +@Injectable()
  5 +@Inject("Restangular", "$q", "$log")
  6 +export class TaskService extends RestangularService<noosfero.Task> {
  7 +
  8 + constructor(Restangular: restangular.IService, $q: ng.IQService, $log: ng.ILogService) {
  9 + super(Restangular, $q, $log);
  10 + }
  11 +
  12 + getResourcePath() {
  13 + return "tasks";
  14 + }
  15 +
  16 + getDataKeys() {
  17 + return {
  18 + singular: 'task',
  19 + plural: 'tasks'
  20 + };
  21 + }
  22 +
  23 + getAllPending(params: any) {
  24 + return this.list(null, { all_pending: true });
  25 + }
  26 +}
src/lib/ng-noosfero-api/interfaces/task.ts 0 → 100644
@@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
  1 +namespace noosfero {
  2 + /**
  3 + * @ngdoc interface
  4 + * @name noosfero.Task
  5 + * @description
  6 + * A representation of a Task in Noosfero.
  7 + */
  8 + export interface Task extends RestModel {
  9 + type: string;
  10 + }
  11 +}