]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: Update services to use the new 'provideIn' configuration
authorTiago Melo <tspmelo@gmail.com>
Tue, 5 Jun 2018 15:43:55 +0000 (16:43 +0100)
committerTiago Melo <tmelo@suse.com>
Mon, 11 Jun 2018 09:54:39 +0000 (10:54 +0100)
Angular 6 introduced a new way to define where a service should be provided,
which helps during the build of the project.

Signed-off-by: Tiago Melo <tmelo@suse.com>
27 files changed:
src/pybind/mgr/dashboard/frontend/src/app/shared/api/api.module.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/api/auth.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/api/cephfs.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/api/configuration.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/api/dashboard.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/api/host.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/api/logging.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/api/monitor.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/api/osd.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/api/performance-counter.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/api/pool.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/api/rbd-mirroring.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/api/rbd.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/api/rgw-bucket.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/api/rgw-daemon.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/api/rgw-user.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/api/tcmu-iscsi.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/api-interceptor.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/auth-guard.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/auth-storage.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/formatter.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/module-status-guard.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/notification.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/services.module.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/summary.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-manager-message.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/services/task-manager.service.ts

index 8a8fd64da5caa3575ae805682ecfe58fc107abaf..4066a30420b54f2ad60272bd4c5f07a28032d876 100644 (file)
@@ -1,43 +1,7 @@
 import { CommonModule } from '@angular/common';
 import { NgModule } from '@angular/core';
 
-import { AuthService } from './auth.service';
-import { CephfsService } from './cephfs.service';
-import { ConfigurationService } from './configuration.service';
-import { DashboardService } from './dashboard.service';
-import { HostService } from './host.service';
-import { LoggingService } from './logging.service';
-import { MonitorService } from './monitor.service';
-import { OsdService } from './osd.service';
-import { PerformanceCounterService } from './performance-counter.service';
-import { PoolService } from './pool.service';
-import { RbdMirroringService } from './rbd-mirroring.service';
-import { RbdService } from './rbd.service';
-import { RgwBucketService } from './rgw-bucket.service';
-import { RgwDaemonService } from './rgw-daemon.service';
-import { RgwUserService } from './rgw-user.service';
-import { TcmuIscsiService } from './tcmu-iscsi.service';
-
 @NgModule({
-  imports: [CommonModule],
-  declarations: [],
-  providers: [
-    AuthService,
-    CephfsService,
-    ConfigurationService,
-    DashboardService,
-    HostService,
-    MonitorService,
-    OsdService,
-    PoolService,
-    RbdService,
-    RbdMirroringService,
-    RgwBucketService,
-    RgwDaemonService,
-    RgwUserService,
-    PerformanceCounterService,
-    LoggingService,
-    TcmuIscsiService
-  ]
+  imports: [CommonModule]
 })
 export class ApiModule {}
index c915884a03451c8e4ed42c547f03987d8bef704e..74edcedf4ae23160cf6cb26db14c6ac60934cdf4 100644 (file)
@@ -3,23 +3,29 @@ import { Injectable } from '@angular/core';
 
 import { Credentials } from '../models/credentials';
 import { AuthStorageService } from '../services/auth-storage.service';
+import { ApiModule } from './api.module';
 
-@Injectable()
+@Injectable({
+  providedIn: ApiModule
+})
 export class AuthService {
-
-  constructor(private authStorageService: AuthStorageService,
-              private http: HttpClient) {
-  }
+  constructor(private authStorageService: AuthStorageService, private http: HttpClient) {}
 
   login(credentials: Credentials) {
-    return this.http.post('api/auth', credentials).toPromise().then((resp: Credentials) => {
-      this.authStorageService.set(resp.username);
-    });
+    return this.http
+      .post('api/auth', credentials)
+      .toPromise()
+      .then((resp: Credentials) => {
+        this.authStorageService.set(resp.username);
+      });
   }
 
   logout() {
-    return this.http.delete('api/auth').toPromise().then(() => {
-      this.authStorageService.remove();
-    });
+    return this.http
+      .delete('api/auth')
+      .toPromise()
+      .then(() => {
+        this.authStorageService.remove();
+      });
   }
 }
index 81d2521779a85e1ca5a99a354a70af66c55afa45..745f2589243db13c23ce1ce1b96077be18c179d6 100644 (file)
@@ -1,7 +1,11 @@
 import { HttpClient } from '@angular/common/http';
 import { Injectable } from '@angular/core';
 
-@Injectable()
+import { ApiModule } from './api.module';
+
+@Injectable({
+  providedIn: ApiModule
+})
 export class CephfsService {
   baseURL = 'api/cephfs';
 
index 41ac7bb5196ad3c5e08ac960999599e94d052d3b..5dd305cdc865de461a176f6f8b622df5c1e38702 100644 (file)
@@ -1,7 +1,11 @@
 import { HttpClient } from '@angular/common/http';
 import { Injectable } from '@angular/core';
 
-@Injectable()
+import { ApiModule } from './api.module';
+
+@Injectable({
+  providedIn: ApiModule
+})
 export class ConfigurationService {
   constructor(private http: HttpClient) {}
 
index cb51cb4d71b0c10d267cb76e19d668d161c5d4fa..04bdece8cf6a4a5ad99c5f5614162e95efd0ed7a 100644 (file)
@@ -1,7 +1,11 @@
 import { HttpClient } from '@angular/common/http';
 import { Injectable } from '@angular/core';
 
-@Injectable()
+import { ApiModule } from './api.module';
+
+@Injectable({
+  providedIn: ApiModule
+})
 export class DashboardService {
   constructor(private http: HttpClient) {}
 
index 3d28cd78926a3c31162cce8daca56c7a777c837a..f68231bf173b920d62b5b750cd8a0fc72238160c 100644 (file)
@@ -1,7 +1,11 @@
 import { HttpClient } from '@angular/common/http';
 import { Injectable } from '@angular/core';
 
-@Injectable()
+import { ApiModule } from './api.module';
+
+@Injectable({
+  providedIn: ApiModule
+})
 export class HostService {
 
   constructor(private http: HttpClient) {
index 746df5438746bc28a3b721ec62b9a93fd91aa539..097f86edfe82249646190cba0713db51f6a05275 100644 (file)
@@ -1,7 +1,11 @@
 import { HttpClient } from '@angular/common/http';
 import { Injectable } from '@angular/core';
 
-@Injectable()
+import { ApiModule } from './api.module';
+
+@Injectable({
+  providedIn: ApiModule
+})
 export class LoggingService {
 
   constructor(private http: HttpClient) {
index 32057f3b6ea11fce90db950d3f95e853efae3a33..115d1ca37883596131ff2ff331d87ff01da3cb2a 100644 (file)
@@ -1,7 +1,11 @@
 import { HttpClient } from '@angular/common/http';
 import { Injectable } from '@angular/core';
 
-@Injectable()
+import { ApiModule } from './api.module';
+
+@Injectable({
+  providedIn: ApiModule
+})
 export class MonitorService {
   constructor(private http: HttpClient) {}
 
index a59bcbcf34249ea0ddba84ded055ac65d39fdcfa..29ffa721cb72a473bb45cbaae4687102c58f11cb 100644 (file)
@@ -1,7 +1,11 @@
 import { HttpClient } from '@angular/common/http';
 import { Injectable } from '@angular/core';
 
-@Injectable()
+import { ApiModule } from './api.module';
+
+@Injectable({
+  providedIn: ApiModule
+})
 export class OsdService {
   private path = 'api/osd';
 
index 05317bc28a6ee0d16662af3255b0bc5d036a39c7..6cd54dfdad1b2288aa63c0e52ce9787b67a255d8 100644 (file)
@@ -4,7 +4,11 @@ import { Injectable } from '@angular/core';
 import { of as observableOf } from 'rxjs';
 import { mergeMap } from 'rxjs/operators';
 
-@Injectable()
+import { ApiModule } from './api.module';
+
+@Injectable({
+  providedIn: ApiModule
+})
 export class PerformanceCounterService {
   private url = 'api/perf_counters';
 
index 4a6da48a98770aefe5cc5cc077667c465fee5b36..8ecdc669e9f382cbb16f23ae572a96d43ba8a7b6 100644 (file)
@@ -1,7 +1,11 @@
 import { HttpClient } from '@angular/common/http';
 import { Injectable } from '@angular/core';
 
-@Injectable()
+import { ApiModule } from './api.module';
+
+@Injectable({
+  providedIn: ApiModule
+})
 export class PoolService {
 
   constructor(private http: HttpClient) {
index b840b3053a05e79847b1db79e42885985647d49a..1dbe79bfcd4858fa4abc2faa7761a338f2d56e50 100644 (file)
@@ -1,7 +1,11 @@
 import { HttpClient } from '@angular/common/http';
 import { Injectable } from '@angular/core';
 
-@Injectable()
+import { ApiModule } from './api.module';
+
+@Injectable({
+  providedIn: ApiModule
+})
 export class RbdMirroringService {
   constructor(private http: HttpClient) {}
 
index 30099c4a0f1f58343f57b2511264ae152dd9e4cb..134928551d99da98fa92004f48296e333edbc6f0 100644 (file)
@@ -1,7 +1,11 @@
 import { HttpClient } from '@angular/common/http';
 import { Injectable } from '@angular/core';
 
-@Injectable()
+import { ApiModule } from './api.module';
+
+@Injectable({
+  providedIn: ApiModule
+})
 export class RbdService {
 
   constructor(private http: HttpClient) {
index acf03f664192f15014c000c55b595fc871574727..e6b4062a5a19c8777f498115284f9f7b8c0d0686 100644 (file)
@@ -5,7 +5,11 @@ import * as _ from 'lodash';
 import { forkJoin as observableForkJoin, of as observableOf } from 'rxjs';
 import { mergeMap } from 'rxjs/operators';
 
-@Injectable()
+import { ApiModule } from './api.module';
+
+@Injectable({
+  providedIn: ApiModule
+})
 export class RgwBucketService {
   private url = '/api/rgw/proxy/bucket';
 
index 48e24c98ad449979fd64b518cc2a9b5c0cc658b1..59b83dc588f8260facad5abf74f43f1c4d6eac9c 100644 (file)
@@ -1,7 +1,11 @@
 import { HttpClient } from '@angular/common/http';
 import { Injectable } from '@angular/core';
 
-@Injectable()
+import { ApiModule } from './api.module';
+
+@Injectable({
+  providedIn: ApiModule
+})
 export class RgwDaemonService {
   private url = 'api/rgw/daemon';
 
index d031dde446f832fd99d4145d6b68ae66a8f6748c..f1b78f12baf491df396c0f2da0a3ff8b38c61503 100644 (file)
@@ -5,7 +5,11 @@ import * as _ from 'lodash';
 import {forkJoin as observableForkJoin, of as observableOf } from 'rxjs';
 import { mergeMap } from 'rxjs/operators';
 
-@Injectable()
+import { ApiModule } from './api.module';
+
+@Injectable({
+  providedIn: ApiModule
+})
 export class RgwUserService {
   private url = '/api/rgw/proxy/user';
 
index 2f36bb81813b9cd142008d5a1ed77456037514b7..7514b942f46e25e643e6c826a5e1397bba22874e 100644 (file)
@@ -1,7 +1,11 @@
 import { HttpClient } from '@angular/common/http';
 import { Injectable } from '@angular/core';
 
-@Injectable()
+import { ApiModule } from './api.module';
+
+@Injectable({
+  providedIn: ApiModule
+})
 export class TcmuIscsiService {
 
   constructor(private http: HttpClient) {
index b706cd55d4f8fe604587504eeb5613fc166998f5..283978358870e6147296864b464a5f9ad5016c29 100644 (file)
@@ -16,8 +16,11 @@ import { NotificationType } from '../enum/notification-type.enum';
 import { FinishedTask } from '../models/finished-task';
 import { AuthStorageService } from './auth-storage.service';
 import { NotificationService } from './notification.service';
+import { ServicesModule } from './services.module';
 
-@Injectable()
+@Injectable({
+  providedIn: ServicesModule
+})
 export class ApiInterceptorService implements HttpInterceptor {
   constructor(
     private router: Router,
index a3ec803870325b64a5f5fc0ca544269b97e09f3b..b3028c2c0b7ee722a65c4275927a4051e210da07 100644 (file)
@@ -2,8 +2,11 @@ import { Injectable } from '@angular/core';
 import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';
 
 import { AuthStorageService } from './auth-storage.service';
+import { ServicesModule } from './services.module';
 
-@Injectable()
+@Injectable({
+  providedIn: ServicesModule
+})
 export class AuthGuardService implements CanActivate {
 
   constructor(private router: Router, private authStorageService: AuthStorageService) {
index cd6dbbe7a0b220712109a29e5442919ce8f17a78..889220f93ba765503f99369acfab327213477de1 100644 (file)
@@ -1,6 +1,10 @@
 import { Injectable } from '@angular/core';
 
-@Injectable()
+import { ServicesModule } from './services.module';
+
+@Injectable({
+  providedIn: ServicesModule
+})
 export class AuthStorageService {
 
   constructor() {
index 6f1cfe4ec47ab9535eaa43af92f7acc23bbb4889..5d777e886b82e27c7db6136bd5fd11883ffa18c6 100644 (file)
@@ -2,7 +2,11 @@ import { Injectable } from '@angular/core';
 
 import * as _ from 'lodash';
 
-@Injectable()
+import { ServicesModule } from './services.module';
+
+@Injectable({
+  providedIn: ServicesModule
+})
 export class FormatterService {
   constructor() {}
 
index a70e75d6fcde0def8428f880ebdc6de1538c0efc..5f47c2dc20cfc1fe99c99557644464627d945143 100644 (file)
@@ -11,6 +11,8 @@ import {
 import { of as observableOf } from 'rxjs';
 import { catchError, map } from 'rxjs/operators';
 
+import { ServicesModule } from './services.module';
+
 /**
  * This service checks if a route can be activated by executing a
  * REST API call to '/api/<apiPath>/status'. If the returned response
@@ -36,7 +38,9 @@ import { catchError, map } from 'rxjs/operators';
  * },
  * ...
  */
-@Injectable()
+@Injectable({
+  providedIn: ServicesModule
+})
 export class ModuleStatusGuardService implements CanActivate, CanActivateChild {
   constructor(private http: HttpClient, private router: Router) {}
 
index d698ee4a73911b9784614be8de4c2ccb7cd0acbd..13a9f4350a4c97ac2266287b4e3329063a5011f3 100644 (file)
@@ -7,9 +7,12 @@ import { BehaviorSubject } from 'rxjs';
 import { NotificationType } from '../enum/notification-type.enum';
 import { CdNotification } from '../models/cd-notification';
 import { FinishedTask } from '../models/finished-task';
+import { ServicesModule } from './services.module';
 import { TaskManagerMessageService } from './task-manager-message.service';
 
-@Injectable()
+@Injectable({
+  providedIn: ServicesModule
+})
 export class NotificationService {
   // Observable sources
   private dataSource = new BehaviorSubject<CdNotification[]>([]);
index 6bdce286beb9b334dd9829235cb2c39c29ce3b47..0278df0618deeb1ebf44a64aaebb136ecb6688ca 100644 (file)
@@ -1,27 +1,7 @@
 import { CommonModule } from '@angular/common';
 import { NgModule } from '@angular/core';
 
-import { AuthGuardService } from './auth-guard.service';
-import { AuthStorageService } from './auth-storage.service';
-import { FormatterService } from './formatter.service';
-import { ModuleStatusGuardService } from './module-status-guard.service';
-import { NotificationService } from './notification.service';
-import { SummaryService } from './summary.service';
-import { TaskManagerMessageService } from './task-manager-message.service';
-import { TaskManagerService } from './task-manager.service';
-
 @NgModule({
-  imports: [CommonModule],
-  declarations: [],
-  providers: [
-    AuthGuardService,
-    AuthStorageService,
-    FormatterService,
-    SummaryService,
-    ModuleStatusGuardService,
-    NotificationService,
-    TaskManagerService,
-    TaskManagerMessageService
-  ]
+  imports: [CommonModule]
 })
 export class ServicesModule {}
index b597fb96c1adb0ca5208e28cec42c2844c63c875..c2fafa201184a7165275ccfd406d4513b61193ef 100644 (file)
@@ -4,8 +4,11 @@ import { Injectable, NgZone } from '@angular/core';
 import { Subject } from 'rxjs';
 
 import { AuthStorageService } from './auth-storage.service';
+import { ServicesModule } from './services.module';
 
-@Injectable()
+@Injectable({
+  providedIn: ServicesModule
+})
 export class SummaryService {
   // Observable sources
   private summaryDataSource = new Subject();
index f3ce7da23b179ee8d81523051cd12e26de01ecac..e7d034bc904079b45b793a27c663da34d1ff1b2f 100644 (file)
@@ -3,24 +3,28 @@ import { Injectable } from '@angular/core';
 import { Components } from '../enum/components.enum';
 import { FinishedTask } from '../models/finished-task';
 import { Task } from '../models/task';
+import { ServicesModule } from './services.module';
 
 class TaskManagerMessage {
   descr: (metadata) => string;
   success: (metadata) => string;
   error: (metadata) => object;
 
-  constructor(descr: (metadata) => string,
-              success: (metadata) => string,
-              error: (metadata) => object) {
+  constructor(
+    descr: (metadata) => string,
+    success: (metadata) => string,
+    error: (metadata) => object
+  ) {
     this.descr = descr;
     this.success = success;
     this.error = error;
   }
 }
 
-@Injectable()
+@Injectable({
+  providedIn: ServicesModule
+})
 export class TaskManagerMessageService {
-
   messages = {
     'rbd/create': new TaskManagerMessage(
       (metadata) => `Create RBD '${metadata.pool_name}/${metadata.image_name}'`,
@@ -82,16 +86,17 @@ export class TaskManagerMessageService {
       (metadata) => `RBD '${metadata.pool_name}/${metadata.image_name}'
                      has been flattened successfully`,
       () => {
-        return {
-        };
+        return {};
       }
     ),
     'rbd/snap/create': new TaskManagerMessage(
-      (metadata) => `Create snapshot ` +
-                    `'${metadata.pool_name}/${metadata.image_name}@${metadata.snapshot_name}'`,
-      (metadata) => `Snapshot ` +
-                    `'${metadata.pool_name}/${metadata.image_name}@${metadata.snapshot_name}' ` +
-                    `has been created successfully`,
+      (metadata) =>
+        `Create snapshot ` +
+        `'${metadata.pool_name}/${metadata.image_name}@${metadata.snapshot_name}'`,
+      (metadata) =>
+        `Snapshot ` +
+        `'${metadata.pool_name}/${metadata.image_name}@${metadata.snapshot_name}' ` +
+        `has been created successfully`,
       (metadata) => {
         return {
           '17': `Name '${metadata.snapshot_name}' is already in use.`
@@ -99,11 +104,13 @@ export class TaskManagerMessageService {
       }
     ),
     'rbd/snap/edit': new TaskManagerMessage(
-      (metadata) => `Update snapshot ` +
-                    `'${metadata.pool_name}/${metadata.image_name}@${metadata.snapshot_name}'`,
-      (metadata) => `Snapshot ` +
-                    `'${metadata.pool_name}/${metadata.image_name}@${metadata.snapshot_name}' ` +
-                    `has been updated successfully`,
+      (metadata) =>
+        `Update snapshot ` +
+        `'${metadata.pool_name}/${metadata.image_name}@${metadata.snapshot_name}'`,
+      (metadata) =>
+        `Snapshot ` +
+        `'${metadata.pool_name}/${metadata.image_name}@${metadata.snapshot_name}' ` +
+        `has been updated successfully`,
       () => {
         return {
           '16': `Cannot unprotect snapshot because it contains child images.`
@@ -111,11 +118,13 @@ export class TaskManagerMessageService {
       }
     ),
     'rbd/snap/delete': new TaskManagerMessage(
-      (metadata) => `Delete snapshot ` +
-                    `'${metadata.pool_name}/${metadata.image_name}@${metadata.snapshot_name}'`,
-      (metadata) => `Snapshot ` +
-                    `'${metadata.pool_name}/${metadata.image_name}@${metadata.snapshot_name}' ` +
-                    `has been deleted successfully`,
+      (metadata) =>
+        `Delete snapshot ` +
+        `'${metadata.pool_name}/${metadata.image_name}@${metadata.snapshot_name}'`,
+      (metadata) =>
+        `Snapshot ` +
+        `'${metadata.pool_name}/${metadata.image_name}@${metadata.snapshot_name}' ` +
+        `has been deleted successfully`,
       () => {
         return {
           '16': `Snapshot is protected.`
@@ -123,14 +132,15 @@ export class TaskManagerMessageService {
       }
     ),
     'rbd/snap/rollback': new TaskManagerMessage(
-      (metadata) => `Rollback snapshot ` +
-                    `'${metadata.pool_name}/${metadata.image_name}@${metadata.snapshot_name}'`,
-      (metadata) => `Snapshot ` +
-                    `'${metadata.pool_name}/${metadata.image_name}@${metadata.snapshot_name}' ` +
-                    `has been rolled back successfully`,
+      (metadata) =>
+        `Rollback snapshot ` +
+        `'${metadata.pool_name}/${metadata.image_name}@${metadata.snapshot_name}'`,
+      (metadata) =>
+        `Snapshot ` +
+        `'${metadata.pool_name}/${metadata.image_name}@${metadata.snapshot_name}' ` +
+        `has been rolled back successfully`,
       () => {
-        return {
-        };
+        return {};
       }
     )
   };
@@ -141,12 +151,11 @@ export class TaskManagerMessageService {
     },
     (metadata) => 'Task executed successfully',
     () => {
-      return {
-      };
+      return {};
     }
   );
 
-  constructor() { }
+  constructor() {}
 
   getSuccessMessage(finishedTask: FinishedTask) {
     const taskManagerMessage = this.messages[finishedTask.name] || this.defaultMessage;
@@ -155,8 +164,10 @@ export class TaskManagerMessageService {
 
   getErrorMessage(finishedTask: FinishedTask) {
     const taskManagerMessage = this.messages[finishedTask.name] || this.defaultMessage;
-    return taskManagerMessage.error(finishedTask.metadata)[finishedTask.exception.code] ||
-      finishedTask.exception.detail;
+    return (
+      taskManagerMessage.error(finishedTask.metadata)[finishedTask.exception.code] ||
+      finishedTask.exception.detail
+    );
   }
 
   getDescription(task: Task) {
index b7435e50b7c902dc6a30d17a9046f65db7e95438..9eedf43e2ff8dcafb90f53e472cd50f785ffe14b 100644 (file)
@@ -5,6 +5,7 @@ import * as _ from 'lodash';
 import { ExecutingTask } from '../models/executing-task';
 import { FinishedTask } from '../models/finished-task';
 import { Task } from '../models/task';
+import { ServicesModule } from './services.module';
 import { SummaryService } from './summary.service';
 
 class TaskSubscription {
@@ -19,7 +20,9 @@ class TaskSubscription {
   }
 }
 
-@Injectable()
+@Injectable({
+  providedIn: ServicesModule
+})
 export class TaskManagerService {
   subscriptions: Array<TaskSubscription> = [];