diff --git a/brewman/__version__.py b/brewman/__version__.py index 7ffab095..73d4c8be 100644 --- a/brewman/__version__.py +++ b/brewman/__version__.py @@ -1 +1 @@ -__version__ = "7.6.0" +__version__ = "8.0.0" diff --git a/overlord/.eslintrc.js b/overlord/.eslintrc.js index 7e7569e4..bee21e28 100644 --- a/overlord/.eslintrc.js +++ b/overlord/.eslintrc.js @@ -6,42 +6,39 @@ https://github.com/typescript-eslint/tslint-to-eslint-config/blob/master/docs/FA Happy linting! 💖 */ module.exports = { - "extends": [ - "plugin:@angular-eslint/recommended", - // AirBnB Styleguide rules - "airbnb-typescript/base", - // Settings for Prettier - "prettier/@typescript-eslint", - "plugin:prettier/recommended", - ], - "env": { - "browser": true, - "node": true - }, - "parser": "@typescript-eslint/parser", - "parserOptions": { - "project": "tsconfig.json", - "sourceType": "module" - }, - "plugins": [ - "eslint-plugin-import", - "eslint-plugin-jsdoc", - "@angular-eslint/eslint-plugin", - "@typescript-eslint", - "@typescript-eslint/tslint" - ], - "overrides": [ - { - files: ['*.ts'], - extends: [ - // AirBnB Styleguide rules - 'airbnb-typescript/base', - ], - parser: '@typescript-eslint/parser', - parserOptions: { - ecmaVersion: 2020, - sourceType: 'module', - }, - }, - ] + "extends": [ + "plugin:@angular-eslint/recommended", + // AirBnB Styleguide rules + "airbnb-typescript/base", + // Settings for Prettier + "prettier", + "prettier/@typescript-eslint", + "prettier/react", + ], + "env": { + "browser": true, + "node": true + }, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "project": "tsconfig.json", + "ecmaVersion": 2020, + "sourceType": "module" + }, + "plugins": [ + "eslint-plugin-import", + "eslint-plugin-jsdoc", + "@angular-eslint/eslint-plugin", + "@typescript-eslint", + "@typescript-eslint/tslint" + ], + "ignorePatterns": ["/src/**/*.spec.ts", "src/test.ts", "src/polyfills.ts"], + "rules": { + "import/prefer-default-export": "off", + "no-param-reassign": ["error", { "props": false }], + "@typescript-eslint/lines-between-class-members": ["error", "always", { "exceptAfterSingleLine": true }], + "class-methods-use-this": ["error", {"exceptMethods": ["disconnect", "displayFn", "transform"]}], + "import/order": ["error", {"alphabetize": {"order": "asc", "caseInsensitive": true}, "newlines-between": "always"}], + "@typescript-eslint/no-explicit-any": "off", // Disabled for now, but needed to transition to strict compiling + } }; diff --git a/overlord/angular.json b/overlord/angular.json index bd81a5b9..0946382c 100644 --- a/overlord/angular.json +++ b/overlord/angular.json @@ -4,21 +4,25 @@ "newProjectRoot": "projects", "projects": { "overlord": { + "projectType": "application", + "schematics": { + "@schematics/angular:application": { + "strict": true + } + }, "root": "", "sourceRoot": "src", - "projectType": "application", "prefix": "app", - "schematics": {}, "architect": { "build": { "builder": "@angular-devkit/build-angular:browser", "options": { - "aot": true, "outputPath": "../frontend", "index": "src/index.html", "main": "src/main.ts", "polyfills": "src/polyfills.ts", - "tsConfig": "src/tsconfig.app.json", + "tsConfig": "tsconfig.app.json", + "aot": true, "assets": [ "src/favicon.ico", "src/assets" @@ -42,19 +46,19 @@ "sourceMap": false, "extractCss": true, "namedChunks": false, - "aot": true, "extractLicenses": true, "vendorChunk": false, "buildOptimizer": true, "budgets": [ { "type": "initial", - "maximumWarning": "2mb", - "maximumError": "5mb" + "maximumWarning": "500kb", + "maximumError": "1mb" }, { "type": "anyComponentStyle", - "maximumWarning": "6kb" + "maximumWarning": "2kb", + "maximumError": "4kb" } ] } @@ -83,8 +87,8 @@ "options": { "main": "src/test.ts", "polyfills": "src/polyfills.ts", - "tsConfig": "src/tsconfig.spec.json", - "karmaConfig": "src/karma.conf.js", + "tsConfig": "tsconfig.spec.json", + "karmaConfig": "karma.conf.js", "styles": [ "./node_modules/@angular/material/prebuilt-themes/indigo-pink.css", "src/styles.css" @@ -101,21 +105,15 @@ "options": { "eslintConfig": ".eslintrc.js", "tsConfig": [ - "src/tsconfig.app.json", - "src/tsconfig.spec.json" + "tsconfig.app.json", + "tsconfig.spec.json", + "e2e/tsconfig.json" ], "exclude": [ "**/node_modules/**" ] } - } - } - }, - "overlord-e2e": { - "root": "e2e/", - "projectType": "application", - "prefix": "", - "architect": { + }, "e2e": { "builder": "@angular-devkit/build-angular:protractor", "options": { @@ -127,15 +125,6 @@ "devServerTarget": "overlord:serve:production" } } - }, - "lint": { - "builder": "@angular-devkit/build-angular:tslint", - "options": { - "tsConfig": "e2e/tsconfig.e2e.json", - "exclude": [ - "**/node_modules/**" - ] - } } } } diff --git a/overlord/e2e/protractor.conf.js b/overlord/e2e/protractor.conf.js index 86776a39..b95b8f5e 100644 --- a/overlord/e2e/protractor.conf.js +++ b/overlord/e2e/protractor.conf.js @@ -21,8 +21,8 @@ exports.config = { }, onPrepare() { require('ts-node').register({ - project: require('path').join(__dirname, './tsconfig.e2e.json') + project: require('path').join(__dirname, './tsconfig.json') }); jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); } -}; \ No newline at end of file +}; diff --git a/overlord/e2e/tsconfig.e2e.json b/overlord/e2e/tsconfig.json similarity index 100% rename from overlord/e2e/tsconfig.e2e.json rename to overlord/e2e/tsconfig.json diff --git a/overlord/src/karma.conf.js b/overlord/karma.conf.js similarity index 82% rename from overlord/src/karma.conf.js rename to overlord/karma.conf.js index b6e00421..e0147997 100644 --- a/overlord/src/karma.conf.js +++ b/overlord/karma.conf.js @@ -16,8 +16,8 @@ module.exports = function (config) { clearContext: false // leave Jasmine Spec Runner output visible in browser }, coverageIstanbulReporter: { - dir: require('path').join(__dirname, '../coverage'), - reports: ['html', 'lcovonly'], + dir: require('path').join(__dirname, './coverage/overlord'), + reports: ['html', 'lcovonly', 'text-summary'], fixWebpackSourcePaths: true }, reporters: ['progress', 'kjhtml'], @@ -26,6 +26,7 @@ module.exports = function (config) { logLevel: config.LOG_INFO, autoWatch: true, browsers: ['Chrome'], - singleRun: false + singleRun: false, + restartOnFileChange: true }); -}; \ No newline at end of file +}; diff --git a/overlord/package.json b/overlord/package.json index 80c62fd5..675e6221 100644 --- a/overlord/package.json +++ b/overlord/package.json @@ -1,6 +1,6 @@ { "name": "overlord", - "version": "7.6.0", + "version": "8.0.0", "scripts": { "ng": "ng", "prettier": "prettier", @@ -61,7 +61,6 @@ "eslint-config-prettier": "^6.12.0", "eslint-plugin-import": "^2.22.1", "eslint-plugin-jsdoc": "^30.6.3", - "eslint-plugin-prettier": "^3.1.4", "husky": "^4.3.0", "jasmine-core": "^3.6.0", "jasmine-spec-reporter": "^6.0.0", diff --git a/overlord/src/app/account/account-detail/account-detail.component.ts b/overlord/src/app/account/account-detail/account-detail.component.ts index 5bb11378..8129e1df 100644 --- a/overlord/src/app/account/account-detail/account-detail.component.ts +++ b/overlord/src/app/account/account-detail/account-detail.component.ts @@ -1,13 +1,14 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { ToasterService } from '../../core/toaster.service'; +import { FormBuilder, FormGroup } from '@angular/forms'; +import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router } from '@angular/router'; -import { AccountService } from '../../core/account.service'; + import { Account } from '../../core/account'; import { AccountType } from '../../core/account-type'; +import { AccountService } from '../../core/account.service'; import { CostCentre } from '../../core/cost-centre'; +import { ToasterService } from '../../core/toaster.service'; import { ConfirmDialogComponent } from '../../shared/confirm-dialog/confirm-dialog.component'; -import { MatDialog } from '@angular/material/dialog'; -import { FormBuilder, FormGroup } from '@angular/forms'; @Component({ selector: 'app-account-detail', @@ -73,7 +74,7 @@ export class AccountDetailComponent implements OnInit, AfterViewInit { save() { this.ser.saveOrUpdate(this.getItem()).subscribe( - (result) => { + () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/accounts'); }, @@ -85,7 +86,7 @@ export class AccountDetailComponent implements OnInit, AfterViewInit { delete() { this.ser.delete(this.item.id).subscribe( - (result) => { + () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/accounts'); }, diff --git a/overlord/src/app/account/account-list-resolver.service.ts b/overlord/src/app/account/account-list-resolver.service.ts index 6a968561..ae94ef33 100644 --- a/overlord/src/app/account/account-list-resolver.service.ts +++ b/overlord/src/app/account/account-list-resolver.service.ts @@ -1,7 +1,8 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; -import { Account } from '../core/account'; +import { Resolve } from '@angular/router'; import { Observable } from 'rxjs/internal/Observable'; + +import { Account } from '../core/account'; import { AccountService } from '../core/account.service'; @Injectable({ @@ -10,7 +11,7 @@ import { AccountService } from '../core/account.service'; export class AccountListResolver implements Resolve { constructor(private ser: AccountService) {} - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + resolve(): Observable { return this.ser.list(); } } diff --git a/overlord/src/app/account/account-list/account-list-datasource.ts b/overlord/src/app/account/account-list/account-list-datasource.ts index 13df38cb..c92668c4 100644 --- a/overlord/src/app/account/account-list/account-list-datasource.ts +++ b/overlord/src/app/account/account-list/account-list-datasource.ts @@ -1,10 +1,16 @@ import { DataSource } from '@angular/cdk/collections'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; -import { map, tap } from 'rxjs/operators'; import { merge, Observable, of as observableOf } from 'rxjs'; +import { map, tap } from 'rxjs/operators'; + import { Account } from '../../core/account'; +/** Simple sort comparator for example ID/Name columns (for client-side sorting). */ +function compare(a, b, isAsc) { + return (a < b ? -1 : 1) * (isAsc ? 1 : -1); +} + export class AccountListDataSource extends DataSource { private filterValue: string; @@ -15,7 +21,11 @@ export class AccountListDataSource extends DataSource { public data: Account[], ) { super(); - this.filter = filter.pipe(tap((x) => (this.filterValue = x))); + this.filter = filter.pipe( + tap((x) => { + this.filterValue = x; + }), + ); } connect(): Observable { @@ -28,35 +38,28 @@ export class AccountListDataSource extends DataSource { return merge(...dataMutations) .pipe( - map((x: any) => { - return this.getFilteredData([...this.data]); + map(() => this.getFilteredData([...this.data])), + tap((x: Account[]) => { + this.paginator.length = x.length; }), - tap((x: Account[]) => (this.paginator.length = x.length)), ) - .pipe( - map((x: any) => { - return this.getPagedData(this.getSortedData(x)); - }), - ); + .pipe(map((x: any) => this.getPagedData(this.getSortedData(x)))); } disconnect() {} private getFilteredData(data: Account[]): Account[] { const filter = this.filterValue === undefined ? '' : this.filterValue; - return filter.split(' ').reduce((p: Account[], c: string) => { - return p.filter((x) => { - const accountString = ( - x.name + - ' ' + - x.type + - ' ' + - x.costCentre + - (x.isActive ? ' active' : ' inactive') - ).toLowerCase(); - return accountString.indexOf(c) !== -1; - }); - }, Object.assign([], data)); + return filter.split(' ').reduce( + (p: Account[], c: string) => + p.filter((x) => { + const accountString = `${x.name} ${x.type} ${x.costCentre}${ + x.isActive ? ' active' : ' inactive' + }`.toLowerCase(); + return accountString.indexOf(c) !== -1; + }), + Object.assign([], data), + ); } private getPagedData(data: Account[]) { @@ -90,8 +93,3 @@ export class AccountListDataSource extends DataSource { }); } } - -/** Simple sort comparator for example ID/Name columns (for client-side sorting). */ -function compare(a, b, isAsc) { - return (a < b ? -1 : 1) * (isAsc ? 1 : -1); -} diff --git a/overlord/src/app/account/account-list/account-list.component.ts b/overlord/src/app/account/account-list/account-list.component.ts index e0f81c05..1b6b97e7 100644 --- a/overlord/src/app/account/account-list/account-list.component.ts +++ b/overlord/src/app/account/account-list/account-list.component.ts @@ -1,13 +1,15 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; +import { FormBuilder, FormGroup } from '@angular/forms'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; -import { AccountListDataSource } from './account-list-datasource'; -import { Account } from '../../core/account'; import { ActivatedRoute } from '@angular/router'; import { Observable } from 'rxjs'; -import { FormBuilder, FormGroup } from '@angular/forms'; import { debounceTime, distinctUntilChanged, startWith } from 'rxjs/operators'; +import { Account } from '../../core/account'; + +import { AccountListDataSource } from './account-list-datasource'; + @Component({ selector: 'app-account-list', templateUrl: './account-list.component.html', diff --git a/overlord/src/app/account/account-resolver.service.ts b/overlord/src/app/account/account-resolver.service.ts index 71d14fdd..086b20c3 100644 --- a/overlord/src/app/account/account-resolver.service.ts +++ b/overlord/src/app/account/account-resolver.service.ts @@ -1,16 +1,17 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, Router, RouterStateSnapshot } from '@angular/router'; -import { AccountService } from '../core/account.service'; -import { Account } from '../core/account'; +import { ActivatedRouteSnapshot, Resolve } from '@angular/router'; import { Observable } from 'rxjs/internal/Observable'; +import { Account } from '../core/account'; +import { AccountService } from '../core/account.service'; + @Injectable({ providedIn: 'root', }) export class AccountResolver implements Resolve { - constructor(private ser: AccountService, private router: Router) {} + constructor(private ser: AccountService) {} - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + resolve(route: ActivatedRouteSnapshot): Observable { const id = route.paramMap.get('id'); return this.ser.get(id); } diff --git a/overlord/src/app/account/account-routing.module.ts b/overlord/src/app/account/account-routing.module.ts index ea5c3ea6..43badf2c 100644 --- a/overlord/src/app/account/account-routing.module.ts +++ b/overlord/src/app/account/account-routing.module.ts @@ -1,16 +1,16 @@ -import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { AccountListResolver } from './account-list-resolver.service'; -import { AccountResolver } from './account-resolver.service'; -import { AccountTypeResolver } from './account-type-resolver.service'; -import { AccountDetailComponent } from './account-detail/account-detail.component'; -import { AccountListComponent } from './account-list/account-list.component'; - import { AuthGuard } from '../auth/auth-guard.service'; import { CostCentreListResolver } from '../cost-centre/cost-centre-list-resolver.service'; +import { AccountDetailComponent } from './account-detail/account-detail.component'; +import { AccountListResolver } from './account-list-resolver.service'; +import { AccountListComponent } from './account-list/account-list.component'; +import { AccountResolver } from './account-resolver.service'; +import { AccountTypeResolver } from './account-type-resolver.service'; + const accountRoutes: Routes = [ { path: '', diff --git a/overlord/src/app/account/account-type-resolver.service.ts b/overlord/src/app/account/account-type-resolver.service.ts index 3f43aec9..8e5ec27a 100644 --- a/overlord/src/app/account/account-type-resolver.service.ts +++ b/overlord/src/app/account/account-type-resolver.service.ts @@ -1,7 +1,9 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; -import { AccountType } from '../core/account-type'; +import { Resolve } from '@angular/router'; import { Observable } from 'rxjs/internal/Observable'; + +import { AccountType } from '../core/account-type'; + import { AccountTypeService } from './account-type.service'; @Injectable({ @@ -10,7 +12,7 @@ import { AccountTypeService } from './account-type.service'; export class AccountTypeResolver implements Resolve { constructor(private ser: AccountTypeService) {} - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + resolve(): Observable { return this.ser.list(); } } diff --git a/overlord/src/app/account/account-type.service.ts b/overlord/src/app/account/account-type.service.ts index fca8afc0..30f53abc 100644 --- a/overlord/src/app/account/account-type.service.ts +++ b/overlord/src/app/account/account-type.service.ts @@ -1,8 +1,9 @@ +import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Observable } from 'rxjs/internal/Observable'; -import { AccountType } from '../core/account-type'; import { catchError } from 'rxjs/operators'; -import { HttpClient } from '@angular/common/http'; + +import { AccountType } from '../core/account-type'; import { ErrorLoggerService } from '../core/error-logger.service'; const url = '/api/account-types'; diff --git a/overlord/src/app/account/account.module.ts b/overlord/src/app/account/account.module.ts index 69dfa0e2..6ada7e95 100644 --- a/overlord/src/app/account/account.module.ts +++ b/overlord/src/app/account/account.module.ts @@ -1,9 +1,8 @@ -import { NgModule } from '@angular/core'; +import { CdkTableModule } from '@angular/cdk/table'; import { CommonModule } from '@angular/common'; - -import { AccountListComponent } from './account-list/account-list.component'; -import { AccountDetailComponent } from './account-detail/account-detail.component'; -import { AccountRoutingModule } from './account-routing.module'; +import { NgModule } from '@angular/core'; +import { FlexLayoutModule } from '@angular/flex-layout'; +import { ReactiveFormsModule } from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; import { MatCardModule } from '@angular/material/card'; import { MatCheckboxModule } from '@angular/material/checkbox'; @@ -15,9 +14,10 @@ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatSelectModule } from '@angular/material/select'; import { MatSortModule } from '@angular/material/sort'; import { MatTableModule } from '@angular/material/table'; -import { CdkTableModule } from '@angular/cdk/table'; -import { ReactiveFormsModule } from '@angular/forms'; -import { FlexLayoutModule } from '@angular/flex-layout'; + +import { AccountDetailComponent } from './account-detail/account-detail.component'; +import { AccountListComponent } from './account-list/account-list.component'; +import { AccountRoutingModule } from './account-routing.module'; @NgModule({ imports: [ diff --git a/overlord/src/app/app-routing.module.ts b/overlord/src/app/app-routing.module.ts index dc98fe82..f39b78b0 100644 --- a/overlord/src/app/app-routing.module.ts +++ b/overlord/src/app/app-routing.module.ts @@ -1,7 +1,8 @@ -import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { LoginComponent } from './auth/login/login.component'; +import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; + +import { LoginComponent } from './auth/login/login.component'; import { LogoutComponent } from './auth/logout/logout.component'; import { HomeComponent } from './home/home.component'; diff --git a/overlord/src/app/app.component.css b/overlord/src/app/app.component.css index 22274544..e340780b 100644 --- a/overlord/src/app/app.component.css +++ b/overlord/src/app/app.component.css @@ -1,5 +1,3 @@ -@import '~@angular/material/prebuilt-themes/deeppurple-amber.css'; - .basic-container { padding: 30px; } diff --git a/overlord/src/app/app.module.ts b/overlord/src/app/app.module.ts index 409cd770..94503a38 100644 --- a/overlord/src/app/app.module.ts +++ b/overlord/src/app/app.module.ts @@ -1,10 +1,10 @@ -import { BrowserModule } from '@angular/platform-browser'; -import { LOCALE_ID, NgModule } from '@angular/core'; -import enIN from '@angular/common/locales/en-IN'; - -import { AppComponent } from './app.component'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { LayoutModule } from '@angular/cdk/layout'; +import { registerLocaleData } from '@angular/common'; +import { HttpClientModule } from '@angular/common/http'; +import enIN from '@angular/common/locales/en-IN'; +import { LOCALE_ID, NgModule } from '@angular/core'; +import { FlexLayoutModule } from '@angular/flex-layout'; +import { ReactiveFormsModule } from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; import { MatCardModule } from '@angular/material/card'; import { MatDividerModule } from '@angular/material/divider'; @@ -19,18 +19,18 @@ import { MatSnackBarModule } from '@angular/material/snack-bar'; import { MatSortModule } from '@angular/material/sort'; import { MatTableModule } from '@angular/material/table'; import { MatToolbarModule } from '@angular/material/toolbar'; -import { LoginComponent } from './auth/login/login.component'; +import { BrowserModule } from '@angular/platform-browser'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { HotkeyModule } from 'angular2-hotkeys'; + import { AppRoutingModule } from './app-routing.module'; -import { ReactiveFormsModule } from '@angular/forms'; -import { HttpClientModule } from '@angular/common/http'; +import { AppComponent } from './app.component'; import { AuthService } from './auth/auth.service'; +import { LoginComponent } from './auth/login/login.component'; import { LogoutComponent } from './auth/logout/logout.component'; import { CoreModule } from './core/core.module'; -import { SharedModule } from './shared/shared.module'; import { HomeComponent } from './home/home.component'; -import { registerLocaleData } from '@angular/common'; -import { FlexLayoutModule } from '@angular/flex-layout'; -import { HotkeyModule } from 'angular2-hotkeys'; +import { SharedModule } from './shared/shared.module'; registerLocaleData(enIN); diff --git a/overlord/src/app/attendance/attendance-datasource.ts b/overlord/src/app/attendance/attendance-datasource.ts index 3befe655..2c60ea4a 100644 --- a/overlord/src/app/attendance/attendance-datasource.ts +++ b/overlord/src/app/attendance/attendance-datasource.ts @@ -1,6 +1,7 @@ import { DataSource } from '@angular/cdk/collections'; import { Observable } from 'rxjs'; -import { AttendanceItem } from './attendance'; + +import { AttendanceItem } from './attendance-item'; export class AttendanceDataSource extends DataSource { constructor(private data: Observable) { diff --git a/overlord/src/app/attendance/attendance-item.ts b/overlord/src/app/attendance/attendance-item.ts new file mode 100644 index 00000000..ba174a51 --- /dev/null +++ b/overlord/src/app/attendance/attendance-item.ts @@ -0,0 +1,17 @@ +import { AttendanceType } from './attendance-type'; + +export class AttendanceItem { + id: string; + code: number; + name: string; + designation: string; + department: string; + attendanceType: AttendanceType; + prints: string; + hoursWorked: string; + fullDay?: boolean; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} diff --git a/overlord/src/app/attendance/attendance-resolver.service.ts b/overlord/src/app/attendance/attendance-resolver.service.ts index 8609c9f7..c7490923 100644 --- a/overlord/src/app/attendance/attendance-resolver.service.ts +++ b/overlord/src/app/attendance/attendance-resolver.service.ts @@ -1,8 +1,9 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { ActivatedRouteSnapshot, Resolve } from '@angular/router'; import { Observable } from 'rxjs/internal/Observable'; -import { AttendanceService } from './attendance.service'; + import { Attendance } from './attendance'; +import { AttendanceService } from './attendance.service'; @Injectable({ providedIn: 'root', @@ -10,7 +11,7 @@ import { Attendance } from './attendance'; export class AttendanceResolver implements Resolve { constructor(private ser: AttendanceService) {} - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + resolve(route: ActivatedRouteSnapshot): Observable { const date = route.paramMap.get('date'); return this.ser.get(date); } diff --git a/overlord/src/app/attendance/attendance-routing.module.ts b/overlord/src/app/attendance/attendance-routing.module.ts index ed7b6edc..d72ff202 100644 --- a/overlord/src/app/attendance/attendance-routing.module.ts +++ b/overlord/src/app/attendance/attendance-routing.module.ts @@ -1,10 +1,12 @@ -import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { AttendanceResolver } from './attendance-resolver.service'; + import { AuthGuard } from '../auth/auth-guard.service'; -import { AttendanceComponent } from './attendance.component'; + +import { AttendanceResolver } from './attendance-resolver.service'; import { AttendanceTypeResolver } from './attendance-type-resolver.service'; +import { AttendanceComponent } from './attendance.component'; const attendanceRoutes: Routes = [ { diff --git a/overlord/src/app/attendance/attendance-type-resolver.service.ts b/overlord/src/app/attendance/attendance-type-resolver.service.ts index 79126a7e..1acadce2 100644 --- a/overlord/src/app/attendance/attendance-type-resolver.service.ts +++ b/overlord/src/app/attendance/attendance-type-resolver.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { Resolve } from '@angular/router'; import { Observable } from 'rxjs/internal/Observable'; + import { AttendanceType } from './attendance-type'; import { AttendanceTypeService } from './attendance-type.service'; @@ -10,7 +11,7 @@ import { AttendanceTypeService } from './attendance-type.service'; export class AttendanceTypeResolver implements Resolve { constructor(private ser: AttendanceTypeService) {} - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + resolve(): Observable { return this.ser.list(); } } diff --git a/overlord/src/app/attendance/attendance-type.service.ts b/overlord/src/app/attendance/attendance-type.service.ts index 5d1e221d..e94811e8 100644 --- a/overlord/src/app/attendance/attendance-type.service.ts +++ b/overlord/src/app/attendance/attendance-type.service.ts @@ -1,8 +1,10 @@ +import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Observable } from 'rxjs/internal/Observable'; import { catchError } from 'rxjs/operators'; -import { HttpClient } from '@angular/common/http'; + import { ErrorLoggerService } from '../core/error-logger.service'; + import { AttendanceType } from './attendance-type'; const url = '/api/attendance-types'; diff --git a/overlord/src/app/attendance/attendance.component.html b/overlord/src/app/attendance/attendance.component.html index 9a81d6e2..b07fb1cb 100644 --- a/overlord/src/app/attendance/attendance.component.html +++ b/overlord/src/app/attendance/attendance.component.html @@ -61,7 +61,7 @@ Prints {{ row.prints }} - new_releases diff --git a/overlord/src/app/attendance/attendance.component.ts b/overlord/src/app/attendance/attendance.component.ts index f99cf487..d4e8f6b6 100644 --- a/overlord/src/app/attendance/attendance.component.ts +++ b/overlord/src/app/attendance/attendance.component.ts @@ -2,14 +2,17 @@ import { Component, OnInit } from '@angular/core'; import { FormArray, FormBuilder, FormGroup } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router } from '@angular/router'; -import { BehaviorSubject } from 'rxjs'; -import { AttendanceDataSource } from './attendance-datasource'; import * as moment from 'moment'; +import { BehaviorSubject } from 'rxjs'; + import { AuthService } from '../auth/auth.service'; import { ToasterService } from '../core/toaster.service'; -import { AttendanceService } from './attendance.service'; + +import { Attendance } from './attendance'; +import { AttendanceDataSource } from './attendance-datasource'; +import { AttendanceItem } from './attendance-item'; import { AttendanceType } from './attendance-type'; -import { Attendance, AttendanceItem } from './attendance'; +import { AttendanceService } from './attendance.service'; @Component({ selector: 'app-attendance', @@ -68,7 +71,7 @@ export class AttendanceComponent implements OnInit { getClass(index: number) { const array = this.form.get('attendances') as FormArray; const id = array.controls[index].value.attendanceType; - const name: string = this.attendanceTypes.filter((x) => x.id === id)[0].name; + const { name } = this.attendanceTypes.filter((x) => x.id === id)[0]; return name.toLowerCase().replace(/(\s+\+\s+)|(\s+)/g, '-'); } @@ -79,7 +82,7 @@ export class AttendanceComponent implements OnInit { save() { this.ser.save(this.getAttendance()).subscribe( - (result) => { + () => { this.toaster.show('Success', ''); }, (error) => { diff --git a/overlord/src/app/attendance/attendance.module.ts b/overlord/src/app/attendance/attendance.module.ts index 8bfed0f5..28d9c875 100644 --- a/overlord/src/app/attendance/attendance.module.ts +++ b/overlord/src/app/attendance/attendance.module.ts @@ -1,5 +1,10 @@ -import { NgModule } from '@angular/core'; +import { A11yModule } from '@angular/cdk/a11y'; +import { CdkTableModule } from '@angular/cdk/table'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FlexLayoutModule } from '@angular/flex-layout'; +import { ReactiveFormsModule } from '@angular/forms'; +import { MomentDateAdapter } from '@angular/material-moment-adapter'; import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatButtonModule } from '@angular/material/button'; import { MatCardModule } from '@angular/material/card'; @@ -21,14 +26,11 @@ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatSelectModule } from '@angular/material/select'; import { MatSortModule } from '@angular/material/sort'; import { MatTableModule } from '@angular/material/table'; + import { SharedModule } from '../shared/shared.module'; -import { ReactiveFormsModule } from '@angular/forms'; -import { CdkTableModule } from '@angular/cdk/table'; + import { AttendanceRoutingModule } from './attendance-routing.module'; import { AttendanceComponent } from './attendance.component'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; -import { A11yModule } from '@angular/cdk/a11y'; -import { FlexLayoutModule } from '@angular/flex-layout'; export const MY_FORMATS = { parse: { diff --git a/overlord/src/app/attendance/attendance.service.ts b/overlord/src/app/attendance/attendance.service.ts index cdb5c9e5..a49586e2 100644 --- a/overlord/src/app/attendance/attendance.service.ts +++ b/overlord/src/app/attendance/attendance.service.ts @@ -1,10 +1,12 @@ +import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Observable } from 'rxjs/internal/Observable'; import { catchError } from 'rxjs/operators'; -import { HttpClient, HttpHeaders } from '@angular/common/http'; -import { Attendance } from './attendance'; + import { ErrorLoggerService } from '../core/error-logger.service'; +import { Attendance } from './attendance'; + const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }), }; diff --git a/overlord/src/app/attendance/attendance.ts b/overlord/src/app/attendance/attendance.ts index ae8b5c67..f659146b 100644 --- a/overlord/src/app/attendance/attendance.ts +++ b/overlord/src/app/attendance/attendance.ts @@ -1,4 +1,4 @@ -import { AttendanceType } from './attendance-type'; +import { AttendanceItem } from './attendance-item'; export class Attendance { date: string; @@ -8,19 +8,3 @@ export class Attendance { Object.assign(this, init); } } - -export class AttendanceItem { - id: string; - code: number; - name: string; - designation: string; - department: string; - attendanceType: AttendanceType; - prints: string; - hoursWorked: string; - fullDay?: boolean; - - public constructor(init?: Partial) { - Object.assign(this, init); - } -} diff --git a/overlord/src/app/auth/auth-guard.service.ts b/overlord/src/app/auth/auth-guard.service.ts index 59d87dbe..7df8c607 100644 --- a/overlord/src/app/auth/auth-guard.service.ts +++ b/overlord/src/app/auth/auth-guard.service.ts @@ -1,9 +1,10 @@ import { Injectable } from '@angular/core'; import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; -import { AuthService } from './auth.service'; import { ToasterService } from '../core/toaster.service'; +import { AuthService } from './auth.service'; + @Injectable({ providedIn: 'root' }) export class AuthGuard implements CanActivate { constructor( @@ -13,11 +14,11 @@ export class AuthGuard implements CanActivate { ) {} canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { - const user = this.authService.user; + const { user } = this.authService; const permission = - route.data['permission'] === undefined - ? route.data['permission'] - : route.data['permission'].replace(/ /g, '-').toLowerCase(); + route.data.permission === undefined + ? route.data.permission + : route.data.permission.replace(/ /g, '-').toLowerCase(); if (!user) { // not logged in so redirect to login page with the return url this.router.navigate(['/login'], { queryParams: { returnUrl: state.url } }); diff --git a/overlord/src/app/auth/auth.service.ts b/overlord/src/app/auth/auth.service.ts index 2ecf646a..dbf95ac8 100644 --- a/overlord/src/app/auth/auth.service.ts +++ b/overlord/src/app/auth/auth.service.ts @@ -1,10 +1,10 @@ -import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; import { BehaviorSubject, Observable } from 'rxjs'; import { map } from 'rxjs/operators'; -import { User } from '../core/user'; import { environment } from '../../environments/environment'; +import { User } from '../core/user'; const loginUrl = '/token'; const refreshUrl = '/refresh'; @@ -20,16 +20,37 @@ export class AuthService { this.currentUser = this.currentUserSubject.asObservable(); } + static parseJwt(token): User { + const base64Url = token.split('.')[1]; + const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/'); + const jsonPayload = decodeURIComponent( + atob(base64) + .split('') + .map((c) => `%${`00${c.charCodeAt(0).toString(16)}`.slice(-2)}`) + .join(''), + ); + + const decoded = JSON.parse(jsonPayload); + return new User({ + id: decoded.userId, + name: decoded.sub, + lockedOut: decoded.lockedOut, + perms: decoded.scopes, + access_token: token, + exp: decoded.exp, + ver: decoded.ver, + }); + } + checkStorage(): User { const existingToken: User = JSON.parse(localStorage.getItem(JWT_USER)); if (existingToken === null || Date.now() > existingToken.exp * 1000) { localStorage.removeItem(JWT_USER); this.currentUserSubject = new BehaviorSubject(null); return null; - } else { - this.currentUserSubject = new BehaviorSubject(existingToken); - return existingToken; } + this.currentUserSubject = new BehaviorSubject(existingToken); + return existingToken; } public get user(): User { @@ -60,10 +81,11 @@ export class AuthService { return this.http .post(loginUrl, formData) .pipe(map((u) => u.access_token)) - .pipe(map((u) => this.parseJwt(u))) + .pipe(map((u) => AuthService.parseJwt(u))) .pipe( map((user) => { - // store user details and jwt token in local storage to keep user logged in between page refreshes + // Store user details and jwt token in local storage + // to keep user logged in between page refreshes localStorage.setItem(JWT_USER, JSON.stringify(user)); this.currentUserSubject.next(user); return user; @@ -71,30 +93,6 @@ export class AuthService { ); } - parseJwt(token): User { - const base64Url = token.split('.')[1]; - const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/'); - const jsonPayload = decodeURIComponent( - atob(base64) - .split('') - .map(function (c) { - return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); - }) - .join(''), - ); - - const decoded = JSON.parse(jsonPayload); - return new User({ - id: decoded.userId, - name: decoded.sub, - lockedOut: decoded.lockedOut, - perms: decoded.scopes, - access_token: token, - exp: decoded.exp, - ver: decoded.ver - }); - } - needsRefreshing(): boolean { return Date.now() > (this.user.exp - environment.ACCESS_TOKEN_REFRESH_MINUTES * 60) * 1000; } @@ -109,10 +107,11 @@ export class AuthService { return this.http .post(refreshUrl, {}) .pipe(map((u) => u.access_token)) - .pipe(map((u) => this.parseJwt(u))) + .pipe(map((u) => AuthService.parseJwt(u))) .pipe( map((user) => { - // store user details and jwt token in local storage to keep user logged in between page refreshes + // Store user details and jwt token in local storage + // to keep user logged in between page refreshes localStorage.setItem(JWT_USER, JSON.stringify(user)); this.currentUserSubject.next(user); return user; diff --git a/overlord/src/app/auth/login/login.component.ts b/overlord/src/app/auth/login/login.component.ts index e2cd0563..06ed34c1 100644 --- a/overlord/src/app/auth/login/login.component.ts +++ b/overlord/src/app/auth/login/login.component.ts @@ -1,9 +1,10 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { AuthService } from '../auth.service'; -import { ActivatedRoute, Router } from '@angular/router'; -import { ToasterService } from '../../core/toaster.service'; import { FormBuilder, FormGroup } from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; + +import { ToasterService } from '../../core/toaster.service'; import { CookieService } from '../../shared/cookie.service'; +import { AuthService } from '../auth.service'; @Component({ selector: 'app-login', @@ -40,7 +41,7 @@ export class LoginComponent implements OnInit, AfterViewInit { } ngOnInit() { - this.returnUrl = this.route.snapshot.queryParams['returnUrl'] || '/'; + this.returnUrl = this.route.snapshot.queryParams.returnUrl || '/'; } ngAfterViewInit() { @@ -51,18 +52,18 @@ export class LoginComponent implements OnInit, AfterViewInit { login(): void { const formModel = this.form.value; - const username = formModel.username; - const password = formModel.password; - const otp = formModel.otp; + const { username } = formModel; + const { password } = formModel; + const { otp } = formModel; this.auth .login(username, password, otp) // .pipe(first()) .subscribe( - (data) => { + () => { this.router.navigate([this.returnUrl]); }, (error) => { - if (error.status === 401 && 'Client is not registered' === error.error.detail) { + if (error.status === 401 && error.error.detail === 'Client is not registered') { this.showOtp = true; this.clientId = this.cs.getCookie('client_id'); } diff --git a/overlord/src/app/auth/logout/logout.component.ts b/overlord/src/app/auth/logout/logout.component.ts index d99322db..1db6997f 100644 --- a/overlord/src/app/auth/logout/logout.component.ts +++ b/overlord/src/app/auth/logout/logout.component.ts @@ -1,7 +1,8 @@ import { Component, OnInit } from '@angular/core'; import { Router } from '@angular/router'; -import { AuthService } from '../auth.service'; + import { ToasterService } from '../../core/toaster.service'; +import { AuthService } from '../auth.service'; @Component({ selector: 'app-logout', diff --git a/overlord/src/app/balance-sheet/balance-sheet-datasource.ts b/overlord/src/app/balance-sheet/balance-sheet-datasource.ts index 7a32f122..c194402f 100644 --- a/overlord/src/app/balance-sheet/balance-sheet-datasource.ts +++ b/overlord/src/app/balance-sheet/balance-sheet-datasource.ts @@ -1,8 +1,13 @@ import { DataSource } from '@angular/cdk/collections'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; -import { map } from 'rxjs/operators'; import { merge, Observable, of as observableOf } from 'rxjs'; +import { map } from 'rxjs/operators'; + +/** Simple sort comparator for example ID/Name columns (for client-side sorting). */ +function compare(a, b, isAsc) { + return (a < b ? -1 : 1) * (isAsc ? 1 : -1); +} export class BalanceSheetDataSource extends DataSource { constructor(private paginator: MatPaginator, private sort: MatSort, public data: any[]) { @@ -16,9 +21,7 @@ export class BalanceSheetDataSource extends DataSource { this.paginator.length = this.data.length; return merge(...dataMutations).pipe( - map(() => { - return this.getPagedData(this.getSortedData([...this.data])); - }), + map(() => this.getPagedData(this.getSortedData([...this.data]))), ); } @@ -47,8 +50,3 @@ export class BalanceSheetDataSource extends DataSource { }); } } - -/** Simple sort comparator for example ID/Name columns (for client-side sorting). */ -function compare(a, b, isAsc) { - return (a < b ? -1 : 1) * (isAsc ? 1 : -1); -} diff --git a/overlord/src/app/balance-sheet/balance-sheet-item.ts b/overlord/src/app/balance-sheet/balance-sheet-item.ts new file mode 100644 index 00000000..7b426880 --- /dev/null +++ b/overlord/src/app/balance-sheet/balance-sheet-item.ts @@ -0,0 +1,7 @@ +export class BalanceSheetItem { + name?: string; + group?: string; + amount?: number; + subAmount?: number; + order: number; +} diff --git a/overlord/src/app/balance-sheet/balance-sheet-resolver.service.ts b/overlord/src/app/balance-sheet/balance-sheet-resolver.service.ts index eec04f1e..c3b6facb 100644 --- a/overlord/src/app/balance-sheet/balance-sheet-resolver.service.ts +++ b/overlord/src/app/balance-sheet/balance-sheet-resolver.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { ActivatedRouteSnapshot, Resolve } from '@angular/router'; import { Observable } from 'rxjs/internal/Observable'; + import { BalanceSheet } from './balance-sheet'; import { BalanceSheetService } from './balance-sheet.service'; @@ -10,7 +11,7 @@ import { BalanceSheetService } from './balance-sheet.service'; export class BalanceSheetResolver implements Resolve { constructor(private ser: BalanceSheetService) {} - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + resolve(route: ActivatedRouteSnapshot): Observable { const date = route.paramMap.get('date'); return this.ser.list(date); } diff --git a/overlord/src/app/balance-sheet/balance-sheet-routing.module.ts b/overlord/src/app/balance-sheet/balance-sheet-routing.module.ts index 91d6c8f6..904cfa2d 100644 --- a/overlord/src/app/balance-sheet/balance-sheet-routing.module.ts +++ b/overlord/src/app/balance-sheet/balance-sheet-routing.module.ts @@ -1,8 +1,10 @@ -import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { BalanceSheetResolver } from './balance-sheet-resolver.service'; + import { AuthGuard } from '../auth/auth-guard.service'; + +import { BalanceSheetResolver } from './balance-sheet-resolver.service'; import { BalanceSheetComponent } from './balance-sheet.component'; const balanceSheetRoutes: Routes = [ diff --git a/overlord/src/app/balance-sheet/balance-sheet.component.ts b/overlord/src/app/balance-sheet/balance-sheet.component.ts index ad78995d..bb3b05a7 100644 --- a/overlord/src/app/balance-sheet/balance-sheet.component.ts +++ b/overlord/src/app/balance-sheet/balance-sheet.component.ts @@ -1,11 +1,12 @@ import { Component, OnInit, ViewChild } from '@angular/core'; +import { FormBuilder, FormGroup } from '@angular/forms'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; -import { BalanceSheetDataSource } from './balance-sheet-datasource'; -import { BalanceSheet } from './balance-sheet'; import { ActivatedRoute, Router } from '@angular/router'; import * as moment from 'moment'; -import { FormBuilder, FormGroup } from '@angular/forms'; + +import { BalanceSheet } from './balance-sheet'; +import { BalanceSheetDataSource } from './balance-sheet-datasource'; @Component({ selector: 'app-balance-sheet', diff --git a/overlord/src/app/balance-sheet/balance-sheet.module.ts b/overlord/src/app/balance-sheet/balance-sheet.module.ts index bce0a32f..0137f49a 100644 --- a/overlord/src/app/balance-sheet/balance-sheet.module.ts +++ b/overlord/src/app/balance-sheet/balance-sheet.module.ts @@ -1,5 +1,9 @@ -import { NgModule } from '@angular/core'; +import { CdkTableModule } from '@angular/cdk/table'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FlexLayoutModule } from '@angular/flex-layout'; +import { ReactiveFormsModule } from '@angular/forms'; +import { MomentDateAdapter } from '@angular/material-moment-adapter'; import { MatButtonModule } from '@angular/material/button'; import { MatCardModule } from '@angular/material/card'; import { MatCheckboxModule } from '@angular/material/checkbox'; @@ -16,13 +20,11 @@ import { MatPaginatorModule } from '@angular/material/paginator'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatSortModule } from '@angular/material/sort'; import { MatTableModule } from '@angular/material/table'; + import { SharedModule } from '../shared/shared.module'; -import { CdkTableModule } from '@angular/cdk/table'; + import { BalanceSheetRoutingModule } from './balance-sheet-routing.module'; import { BalanceSheetComponent } from './balance-sheet.component'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; -import { FlexLayoutModule } from '@angular/flex-layout'; -import { ReactiveFormsModule } from '@angular/forms'; export const MY_FORMATS = { parse: { diff --git a/overlord/src/app/balance-sheet/balance-sheet.service.ts b/overlord/src/app/balance-sheet/balance-sheet.service.ts index da28c04e..34b75ec7 100644 --- a/overlord/src/app/balance-sheet/balance-sheet.service.ts +++ b/overlord/src/app/balance-sheet/balance-sheet.service.ts @@ -1,13 +1,11 @@ +import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { catchError } from 'rxjs/operators'; import { Observable } from 'rxjs/internal/Observable'; -import { HttpClient, HttpHeaders } from '@angular/common/http'; -import { BalanceSheet } from './balance-sheet'; +import { catchError } from 'rxjs/operators'; + import { ErrorLoggerService } from '../core/error-logger.service'; -const httpOptions = { - headers: new HttpHeaders({ 'Content-Type': 'application/json' }), -}; +import { BalanceSheet } from './balance-sheet'; const url = '/api/balance-sheet'; const serviceName = 'BalanceSheetService'; diff --git a/overlord/src/app/balance-sheet/balance-sheet.ts b/overlord/src/app/balance-sheet/balance-sheet.ts index 043c6ee0..5b2effab 100644 --- a/overlord/src/app/balance-sheet/balance-sheet.ts +++ b/overlord/src/app/balance-sheet/balance-sheet.ts @@ -1,10 +1,5 @@ -export class BalanceSheetItem { - name?: string; - group?: string; - amount?: number; - subAmount?: number; - order: number; -} +import { BalanceSheetItem } from './balance-sheet-item'; + export class BalanceSheet { date: string; body: BalanceSheetItem[]; diff --git a/overlord/src/app/cash-flow/cash-flow-datasource.ts b/overlord/src/app/cash-flow/cash-flow-datasource.ts index 7aa1478c..22fdaff6 100644 --- a/overlord/src/app/cash-flow/cash-flow-datasource.ts +++ b/overlord/src/app/cash-flow/cash-flow-datasource.ts @@ -1,6 +1,7 @@ import { DataSource } from '@angular/cdk/collections'; import { Observable, of as observableOf } from 'rxjs'; -import { CashFlowItem } from './cash-flow'; + +import { CashFlowItem } from './cash-flow-item'; export class CashFlowDataSource extends DataSource { constructor(private data: CashFlowItem[]) { diff --git a/overlord/src/app/cash-flow/cash-flow-item.ts b/overlord/src/app/cash-flow/cash-flow-item.ts new file mode 100644 index 00000000..bbb342a4 --- /dev/null +++ b/overlord/src/app/cash-flow/cash-flow-item.ts @@ -0,0 +1,9 @@ +export class CashFlowItem { + name: string; + url: []; + amount: number; + + constructor(name: string) { + this.name = name; + } +} diff --git a/overlord/src/app/cash-flow/cash-flow-resolver.service.ts b/overlord/src/app/cash-flow/cash-flow-resolver.service.ts index 976213fe..a284f60c 100644 --- a/overlord/src/app/cash-flow/cash-flow-resolver.service.ts +++ b/overlord/src/app/cash-flow/cash-flow-resolver.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { ActivatedRouteSnapshot, Resolve } from '@angular/router'; import { Observable } from 'rxjs/internal/Observable'; + import { CashFlow } from './cash-flow'; import { CashFlowService } from './cash-flow.service'; @@ -10,7 +11,7 @@ import { CashFlowService } from './cash-flow.service'; export class CashFlowResolver implements Resolve { constructor(private ser: CashFlowService) {} - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + resolve(route: ActivatedRouteSnapshot): Observable { const id = route.paramMap.get('id'); const startDate = route.queryParamMap.get('startDate') || null; const finishDate = route.queryParamMap.get('finishDate') || null; diff --git a/overlord/src/app/cash-flow/cash-flow-routing.module.ts b/overlord/src/app/cash-flow/cash-flow-routing.module.ts index 4025dcdb..865066b3 100644 --- a/overlord/src/app/cash-flow/cash-flow-routing.module.ts +++ b/overlord/src/app/cash-flow/cash-flow-routing.module.ts @@ -1,8 +1,10 @@ -import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { CashFlowResolver } from './cash-flow-resolver.service'; + import { AuthGuard } from '../auth/auth-guard.service'; + +import { CashFlowResolver } from './cash-flow-resolver.service'; import { CashFlowComponent } from './cash-flow.component'; const cashFlowRoutes: Routes = [ diff --git a/overlord/src/app/cash-flow/cash-flow.component.ts b/overlord/src/app/cash-flow/cash-flow.component.ts index 47edd203..1b9f3dda 100644 --- a/overlord/src/app/cash-flow/cash-flow.component.ts +++ b/overlord/src/app/cash-flow/cash-flow.component.ts @@ -1,9 +1,10 @@ import { Component, OnInit } from '@angular/core'; -import { CashFlowDataSource } from './cash-flow-datasource'; -import { CashFlow } from './cash-flow'; +import { FormBuilder, FormGroup } from '@angular/forms'; import { ActivatedRoute, Router } from '@angular/router'; import * as moment from 'moment'; -import { FormBuilder, FormGroup } from '@angular/forms'; + +import { CashFlow } from './cash-flow'; +import { CashFlowDataSource } from './cash-flow-datasource'; @Component({ selector: 'app-cash-flow', diff --git a/overlord/src/app/cash-flow/cash-flow.module.ts b/overlord/src/app/cash-flow/cash-flow.module.ts index d8bd8923..e72e6f26 100644 --- a/overlord/src/app/cash-flow/cash-flow.module.ts +++ b/overlord/src/app/cash-flow/cash-flow.module.ts @@ -1,5 +1,9 @@ -import { NgModule } from '@angular/core'; +import { CdkTableModule } from '@angular/cdk/table'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FlexLayoutModule } from '@angular/flex-layout'; +import { ReactiveFormsModule } from '@angular/forms'; +import { MomentDateAdapter } from '@angular/material-moment-adapter'; import { MatButtonModule } from '@angular/material/button'; import { MatCardModule } from '@angular/material/card'; import { MatCheckboxModule } from '@angular/material/checkbox'; @@ -16,13 +20,11 @@ import { MatPaginatorModule } from '@angular/material/paginator'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatSortModule } from '@angular/material/sort'; import { MatTableModule } from '@angular/material/table'; + import { SharedModule } from '../shared/shared.module'; -import { CdkTableModule } from '@angular/cdk/table'; + import { CashFlowRoutingModule } from './cash-flow-routing.module'; import { CashFlowComponent } from './cash-flow.component'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; -import { FlexLayoutModule } from '@angular/flex-layout'; -import { ReactiveFormsModule } from '@angular/forms'; export const MY_FORMATS = { parse: { diff --git a/overlord/src/app/cash-flow/cash-flow.service.ts b/overlord/src/app/cash-flow/cash-flow.service.ts index d5225b7d..9c0bab08 100644 --- a/overlord/src/app/cash-flow/cash-flow.service.ts +++ b/overlord/src/app/cash-flow/cash-flow.service.ts @@ -1,13 +1,11 @@ +import { HttpClient, HttpParams } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { catchError } from 'rxjs/operators'; import { Observable } from 'rxjs/internal/Observable'; -import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; -import { CashFlow } from './cash-flow'; +import { catchError } from 'rxjs/operators'; + import { ErrorLoggerService } from '../core/error-logger.service'; -const httpOptions = { - headers: new HttpHeaders({ 'Content-Type': 'application/json' }), -}; +import { CashFlow } from './cash-flow'; const url = '/api/cash-flow'; const serviceName = 'CashFlowService'; @@ -26,7 +24,14 @@ export class CashFlowService { if (finishDate !== null) { options.params = options.params.set('f', finishDate); } - const listUrl = id === null ? (startDate || finishDate ? `${url}/data` : url) : `${url}/${id}`; + let listUrl = ''; + if (id !== null) { + listUrl = `${url}/${id}`; + } else if (startDate || finishDate) { + listUrl = `${url}/data`; + } else { + listUrl = url; + } return >( this.http .get(listUrl, options) diff --git a/overlord/src/app/cash-flow/cash-flow.ts b/overlord/src/app/cash-flow/cash-flow.ts index 5cd64881..8fee5489 100644 --- a/overlord/src/app/cash-flow/cash-flow.ts +++ b/overlord/src/app/cash-flow/cash-flow.ts @@ -1,12 +1,4 @@ -export class CashFlowItem { - name: string; - url: []; - amount: number; - - constructor(name: string) { - this.name = name; - } -} +import { CashFlowItem } from './cash-flow-item'; export class CashFlow { startDate: string; @@ -17,6 +9,7 @@ export class CashFlow { financing: CashFlowItem[]; details: CashFlowItem[]; }; + footer?: CashFlowItem[]; static Data(value): CashFlowItem[] { diff --git a/overlord/src/app/client/client-detail/client-detail.component.ts b/overlord/src/app/client/client-detail/client-detail.component.ts index 44f4da87..aff58830 100644 --- a/overlord/src/app/client/client-detail/client-detail.component.ts +++ b/overlord/src/app/client/client-detail/client-detail.component.ts @@ -1,12 +1,12 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; - -import { ClientService } from '../client.service'; -import { Client } from '../client'; +import { FormBuilder, FormGroup } from '@angular/forms'; +import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router } from '@angular/router'; + import { ToasterService } from '../../core/toaster.service'; import { ConfirmDialogComponent } from '../../shared/confirm-dialog/confirm-dialog.component'; -import { MatDialog } from '@angular/material/dialog'; -import { FormBuilder, FormGroup } from '@angular/forms'; +import { Client } from '../client'; +import { ClientService } from '../client.service'; @Component({ selector: 'app-client-detail', @@ -62,7 +62,7 @@ export class ClientDetailComponent implements OnInit, AfterViewInit { save() { this.ser.update(this.getItem()).subscribe( - (result) => { + () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/clients'); }, @@ -74,7 +74,7 @@ export class ClientDetailComponent implements OnInit, AfterViewInit { delete() { this.ser.delete(this.item.id).subscribe( - (result) => { + () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/clients'); }, diff --git a/overlord/src/app/client/client-list-resolver.service.ts b/overlord/src/app/client/client-list-resolver.service.ts index a5bfa772..0685046c 100644 --- a/overlord/src/app/client/client-list-resolver.service.ts +++ b/overlord/src/app/client/client-list-resolver.service.ts @@ -1,16 +1,17 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, Router, RouterStateSnapshot } from '@angular/router'; -import { Client } from './client'; +import { Resolve } from '@angular/router'; import { Observable } from 'rxjs/internal/Observable'; + +import { Client } from './client'; import { ClientService } from './client.service'; @Injectable({ providedIn: 'root', }) export class ClientListResolver implements Resolve { - constructor(private ser: ClientService, private router: Router) {} + constructor(private ser: ClientService) {} - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + resolve(): Observable { return this.ser.list(); } } diff --git a/overlord/src/app/client/client-list/client-list-datasource.ts b/overlord/src/app/client/client-list/client-list-datasource.ts index 5e78c37e..88cbb2af 100644 --- a/overlord/src/app/client/client-list/client-list-datasource.ts +++ b/overlord/src/app/client/client-list/client-list-datasource.ts @@ -1,10 +1,16 @@ import { DataSource } from '@angular/cdk/collections'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; -import { map } from 'rxjs/operators'; import { merge, Observable, of as observableOf } from 'rxjs'; +import { map } from 'rxjs/operators'; + import { Client } from '../client'; +/** Simple sort comparator for example ID/Name columns (for client-side sorting). */ +function compare(a, b, isAsc) { + return (a < b ? -1 : 1) * (isAsc ? 1 : -1); +} + export class ClientListDataSource extends DataSource { constructor(private paginator: MatPaginator, private sort: MatSort, public data: Client[]) { super(); @@ -17,9 +23,7 @@ export class ClientListDataSource extends DataSource { this.paginator.length = this.data.length; return merge(...dataMutations).pipe( - map(() => { - return this.getPagedData(this.getSortedData([...this.data])); - }), + map(() => this.getPagedData(this.getSortedData([...this.data]))), ); } @@ -48,8 +52,3 @@ export class ClientListDataSource extends DataSource { }); } } - -/** Simple sort comparator for example ID/Name columns (for client-side sorting). */ -function compare(a, b, isAsc) { - return (a < b ? -1 : 1) * (isAsc ? 1 : -1); -} diff --git a/overlord/src/app/client/client-list/client-list.component.ts b/overlord/src/app/client/client-list/client-list.component.ts index 587141b2..fea2a923 100644 --- a/overlord/src/app/client/client-list/client-list.component.ts +++ b/overlord/src/app/client/client-list/client-list.component.ts @@ -1,10 +1,12 @@ import { Component, OnInit, ViewChild } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; -import { ClientListDataSource } from './client-list-datasource'; -import { Client } from '../client'; import { ActivatedRoute } from '@angular/router'; +import { Client } from '../client'; + +import { ClientListDataSource } from './client-list-datasource'; + @Component({ selector: 'app-client-list', templateUrl: './client-list.component.html', diff --git a/overlord/src/app/client/client-resolver.service.ts b/overlord/src/app/client/client-resolver.service.ts index af4636fc..062729ab 100644 --- a/overlord/src/app/client/client-resolver.service.ts +++ b/overlord/src/app/client/client-resolver.service.ts @@ -1,16 +1,17 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, Router, RouterStateSnapshot } from '@angular/router'; -import { ClientService } from './client.service'; -import { Client } from './client'; +import { ActivatedRouteSnapshot, Resolve } from '@angular/router'; import { Observable } from 'rxjs/internal/Observable'; +import { Client } from './client'; +import { ClientService } from './client.service'; + @Injectable({ providedIn: 'root', }) export class ClientResolver implements Resolve { - constructor(private ser: ClientService, private router: Router) {} + constructor(private ser: ClientService) {} - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + resolve(route: ActivatedRouteSnapshot): Observable { const id = route.paramMap.get('id'); return this.ser.get(id); } diff --git a/overlord/src/app/client/client-routing.module.ts b/overlord/src/app/client/client-routing.module.ts index 6a7e0b1a..a48a36ff 100644 --- a/overlord/src/app/client/client-routing.module.ts +++ b/overlord/src/app/client/client-routing.module.ts @@ -1,12 +1,14 @@ -import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { ClientListResolver } from './client-list-resolver.service'; -import { ClientResolver } from './client-resolver.service'; -import { ClientListComponent } from './client-list/client-list.component'; -import { ClientDetailComponent } from './client-detail/client-detail.component'; + import { AuthGuard } from '../auth/auth-guard.service'; +import { ClientDetailComponent } from './client-detail/client-detail.component'; +import { ClientListResolver } from './client-list-resolver.service'; +import { ClientListComponent } from './client-list/client-list.component'; +import { ClientResolver } from './client-resolver.service'; + const clientRoutes: Routes = [ { path: '', diff --git a/overlord/src/app/client/client.module.ts b/overlord/src/app/client/client.module.ts index bfaa947d..4e6d56a8 100644 --- a/overlord/src/app/client/client.module.ts +++ b/overlord/src/app/client/client.module.ts @@ -1,9 +1,8 @@ -import { NgModule } from '@angular/core'; +import { CdkTableModule } from '@angular/cdk/table'; import { CommonModule } from '@angular/common'; - -import { ClientListComponent } from './client-list/client-list.component'; -import { ClientDetailComponent } from './client-detail/client-detail.component'; -import { ClientRoutingModule } from './client-routing.module'; +import { NgModule } from '@angular/core'; +import { FlexLayoutModule } from '@angular/flex-layout'; +import { ReactiveFormsModule } from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; import { MatCardModule } from '@angular/material/card'; import { MatCheckboxModule } from '@angular/material/checkbox'; @@ -13,10 +12,12 @@ import { MatPaginatorModule } from '@angular/material/paginator'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatSortModule } from '@angular/material/sort'; import { MatTableModule } from '@angular/material/table'; -import { CdkTableModule } from '@angular/cdk/table'; + import { SharedModule } from '../shared/shared.module'; -import { FlexLayoutModule } from '@angular/flex-layout'; -import { ReactiveFormsModule } from '@angular/forms'; + +import { ClientDetailComponent } from './client-detail/client-detail.component'; +import { ClientListComponent } from './client-list/client-list.component'; +import { ClientRoutingModule } from './client-routing.module'; @NgModule({ imports: [ diff --git a/overlord/src/app/client/client.service.ts b/overlord/src/app/client/client.service.ts index 0ee2d558..0274b98b 100644 --- a/overlord/src/app/client/client.service.ts +++ b/overlord/src/app/client/client.service.ts @@ -1,8 +1,10 @@ +import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; -import { ErrorLoggerService } from '../core/error-logger.service'; -import { catchError } from 'rxjs/operators'; import { Observable } from 'rxjs/internal/Observable'; +import { catchError } from 'rxjs/operators'; + +import { ErrorLoggerService } from '../core/error-logger.service'; + import { Client } from './client'; const httpOptions = { diff --git a/overlord/src/app/closing-stock/closing-stock-datasource.ts b/overlord/src/app/closing-stock/closing-stock-datasource.ts index fdebe8d0..e82b6a65 100644 --- a/overlord/src/app/closing-stock/closing-stock-datasource.ts +++ b/overlord/src/app/closing-stock/closing-stock-datasource.ts @@ -1,9 +1,15 @@ import { DataSource } from '@angular/cdk/collections'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; -import { map } from 'rxjs/operators'; import { merge, Observable, of as observableOf } from 'rxjs'; -import { ClosingStockItem } from './closing-stock'; +import { map } from 'rxjs/operators'; + +import { ClosingStockItem } from './closing-stock-item'; + +/** Simple sort comparator for example ID/Name columns (for client-side sorting). */ +function compare(a, b, isAsc) { + return (a < b ? -1 : 1) * (isAsc ? 1 : -1); +} export class ClosingStockDataSource extends DataSource { constructor( @@ -21,9 +27,7 @@ export class ClosingStockDataSource extends DataSource { this.paginator.length = this.data.length; return merge(...dataMutations).pipe( - map(() => { - return this.getPagedData(this.getSortedData([...this.data])); - }), + map(() => this.getPagedData(this.getSortedData([...this.data]))), ); } @@ -56,8 +60,3 @@ export class ClosingStockDataSource extends DataSource { }); } } - -/** Simple sort comparator for example ID/Name columns (for client-side sorting). */ -function compare(a, b, isAsc) { - return (a < b ? -1 : 1) * (isAsc ? 1 : -1); -} diff --git a/overlord/src/app/closing-stock/closing-stock-item.ts b/overlord/src/app/closing-stock/closing-stock-item.ts new file mode 100644 index 00000000..251fe541 --- /dev/null +++ b/overlord/src/app/closing-stock/closing-stock-item.ts @@ -0,0 +1,6 @@ +export class ClosingStockItem { + product: string; + group: string; + quantity: number; + amount: number; +} diff --git a/overlord/src/app/closing-stock/closing-stock-resolver.service.ts b/overlord/src/app/closing-stock/closing-stock-resolver.service.ts index 3cc452e6..1301e2d2 100644 --- a/overlord/src/app/closing-stock/closing-stock-resolver.service.ts +++ b/overlord/src/app/closing-stock/closing-stock-resolver.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { ActivatedRouteSnapshot, Resolve } from '@angular/router'; import { Observable } from 'rxjs/internal/Observable'; + import { ClosingStock } from './closing-stock'; import { ClosingStockService } from './closing-stock.service'; @@ -10,7 +11,7 @@ import { ClosingStockService } from './closing-stock.service'; export class ClosingStockResolver implements Resolve { constructor(private ser: ClosingStockService) {} - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + resolve(route: ActivatedRouteSnapshot): Observable { const date = route.paramMap.get('date'); return this.ser.list(date); } diff --git a/overlord/src/app/closing-stock/closing-stock-routing.module.ts b/overlord/src/app/closing-stock/closing-stock-routing.module.ts index ce139ac1..88490196 100644 --- a/overlord/src/app/closing-stock/closing-stock-routing.module.ts +++ b/overlord/src/app/closing-stock/closing-stock-routing.module.ts @@ -1,8 +1,10 @@ -import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { ClosingStockResolver } from './closing-stock-resolver.service'; + import { AuthGuard } from '../auth/auth-guard.service'; + +import { ClosingStockResolver } from './closing-stock-resolver.service'; import { ClosingStockComponent } from './closing-stock.component'; const closingStockRoutes: Routes = [ diff --git a/overlord/src/app/closing-stock/closing-stock.component.ts b/overlord/src/app/closing-stock/closing-stock.component.ts index 3d05ba8c..c1677e12 100644 --- a/overlord/src/app/closing-stock/closing-stock.component.ts +++ b/overlord/src/app/closing-stock/closing-stock.component.ts @@ -1,13 +1,15 @@ import { Component, OnInit, ViewChild } from '@angular/core'; +import { FormBuilder, FormGroup } from '@angular/forms'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; -import { ClosingStockDataSource } from './closing-stock-datasource'; -import { ClosingStock } from './closing-stock'; import { ActivatedRoute, Router } from '@angular/router'; import * as moment from 'moment'; -import { FormBuilder, FormGroup } from '@angular/forms'; + import { ToCsvService } from '../shared/to-csv.service'; +import { ClosingStock } from './closing-stock'; +import { ClosingStockDataSource } from './closing-stock-datasource'; + @Component({ selector: 'app-closing-stock', templateUrl: './closing-stock.component.html', diff --git a/overlord/src/app/closing-stock/closing-stock.module.ts b/overlord/src/app/closing-stock/closing-stock.module.ts index 7484652a..838b8a03 100644 --- a/overlord/src/app/closing-stock/closing-stock.module.ts +++ b/overlord/src/app/closing-stock/closing-stock.module.ts @@ -1,5 +1,10 @@ -import { NgModule } from '@angular/core'; +import { A11yModule } from '@angular/cdk/a11y'; +import { CdkTableModule } from '@angular/cdk/table'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FlexLayoutModule } from '@angular/flex-layout'; +import { ReactiveFormsModule } from '@angular/forms'; +import { MomentDateAdapter } from '@angular/material-moment-adapter'; import { MatButtonModule } from '@angular/material/button'; import { MatCardModule } from '@angular/material/card'; import { MatCheckboxModule } from '@angular/material/checkbox'; @@ -16,14 +21,11 @@ import { MatPaginatorModule } from '@angular/material/paginator'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatSortModule } from '@angular/material/sort'; import { MatTableModule } from '@angular/material/table'; + import { SharedModule } from '../shared/shared.module'; -import { CdkTableModule } from '@angular/cdk/table'; + import { ClosingStockRoutingModule } from './closing-stock-routing.module'; import { ClosingStockComponent } from './closing-stock.component'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; -import { A11yModule } from '@angular/cdk/a11y'; -import { FlexLayoutModule } from '@angular/flex-layout'; -import { ReactiveFormsModule } from '@angular/forms'; export const MY_FORMATS = { parse: { diff --git a/overlord/src/app/closing-stock/closing-stock.service.ts b/overlord/src/app/closing-stock/closing-stock.service.ts index 3ad72de7..934e37b9 100644 --- a/overlord/src/app/closing-stock/closing-stock.service.ts +++ b/overlord/src/app/closing-stock/closing-stock.service.ts @@ -1,13 +1,11 @@ +import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { catchError } from 'rxjs/operators'; import { Observable } from 'rxjs/internal/Observable'; -import { HttpClient, HttpHeaders } from '@angular/common/http'; -import { ClosingStock } from './closing-stock'; +import { catchError } from 'rxjs/operators'; + import { ErrorLoggerService } from '../core/error-logger.service'; -const httpOptions = { - headers: new HttpHeaders({ 'Content-Type': 'application/json' }), -}; +import { ClosingStock } from './closing-stock'; const url = '/api/closing-stock'; const serviceName = 'ClosingStockService'; diff --git a/overlord/src/app/closing-stock/closing-stock.ts b/overlord/src/app/closing-stock/closing-stock.ts index 73ffbac5..88f51401 100644 --- a/overlord/src/app/closing-stock/closing-stock.ts +++ b/overlord/src/app/closing-stock/closing-stock.ts @@ -1,9 +1,4 @@ -export class ClosingStockItem { - product: string; - group: string; - quantity: number; - amount: number; -} +import { ClosingStockItem } from './closing-stock-item'; export class ClosingStock { date: string; diff --git a/overlord/src/app/core/account.service.ts b/overlord/src/app/core/account.service.ts index 5ff19e85..c45b3a82 100644 --- a/overlord/src/app/core/account.service.ts +++ b/overlord/src/app/core/account.service.ts @@ -1,7 +1,8 @@ +import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Observable } from 'rxjs/internal/Observable'; import { catchError } from 'rxjs/operators'; -import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; + import { Account } from './account'; import { ErrorLoggerService } from './error-logger.service'; @@ -70,9 +71,8 @@ export class AccountService { saveOrUpdate(account: Account): Observable { if (!account.id) { return this.save(account); - } else { - return this.update(account); } + return this.update(account); } delete(id: string): Observable { diff --git a/overlord/src/app/core/batch.service.ts b/overlord/src/app/core/batch.service.ts index 2de9bd52..614c19f1 100644 --- a/overlord/src/app/core/batch.service.ts +++ b/overlord/src/app/core/batch.service.ts @@ -1,8 +1,9 @@ +import { HttpClient, HttpParams } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Observable } from 'rxjs/internal/Observable'; import { catchError } from 'rxjs/operators'; -import { HttpClient, HttpParams } from '@angular/common/http'; -import { Batch } from './voucher'; + +import { Batch } from './batch'; import { ErrorLoggerService } from './error-logger.service'; const url = '/api/batch'; diff --git a/overlord/src/app/core/batch.ts b/overlord/src/app/core/batch.ts new file mode 100644 index 00000000..03cfe7b4 --- /dev/null +++ b/overlord/src/app/core/batch.ts @@ -0,0 +1,11 @@ +import { Product } from './product'; + +export class Batch { + id: string; + name: string; + quantityRemaining: number; + tax: number; + discount: number; + rate: number; + product: Product; +} diff --git a/overlord/src/app/core/core.module.ts b/overlord/src/app/core/core.module.ts index 69151c8a..1096be22 100644 --- a/overlord/src/app/core/core.module.ts +++ b/overlord/src/app/core/core.module.ts @@ -1,16 +1,17 @@ -import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { NavBarComponent } from './nav-bar/nav-bar.component'; +import { HTTP_INTERCEPTORS } from '@angular/common/http'; +import { NgModule } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatMenuModule } from '@angular/material/menu'; import { MatToolbarModule } from '@angular/material/toolbar'; import { RouterModule } from '@angular/router'; -import { HTTP_INTERCEPTORS } from '@angular/common/http'; import { LoadingBarHttpClientModule } from '@ngx-loading-bar/http-client'; import { LoadingBarRouterModule } from '@ngx-loading-bar/router'; -import { JwtInterceptor } from './jwt.interceptor'; + import { ErrorInterceptor } from './http-auth-interceptor'; +import { JwtInterceptor } from './jwt.interceptor'; +import { NavBarComponent } from './nav-bar/nav-bar.component'; @NgModule({ imports: [ diff --git a/overlord/src/app/core/db-file.ts b/overlord/src/app/core/db-file.ts new file mode 100644 index 00000000..2643c4c5 --- /dev/null +++ b/overlord/src/app/core/db-file.ts @@ -0,0 +1,5 @@ +export class DbFile { + id: string; + resized: string; + thumbnail: string; +} diff --git a/overlord/src/app/core/employee-benefit.ts b/overlord/src/app/core/employee-benefit.ts new file mode 100644 index 00000000..3ba7ca7f --- /dev/null +++ b/overlord/src/app/core/employee-benefit.ts @@ -0,0 +1,11 @@ +import { Employee } from '../employee/employee'; + +export class EmployeeBenefit { + grossSalary: number; + daysWorked: number; + esiEmployee: number; + pfEmployee: number; + esiEmployer: number; + pfEmployer: number; + employee: Employee; +} diff --git a/overlord/src/app/core/error-logger.service.ts b/overlord/src/app/core/error-logger.service.ts index 6f13ab76..5cf63a68 100644 --- a/overlord/src/app/core/error-logger.service.ts +++ b/overlord/src/app/core/error-logger.service.ts @@ -1,12 +1,15 @@ import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs/internal/Observable'; import { throwError } from 'rxjs'; +import { Observable } from 'rxjs/internal/Observable'; @Injectable({ providedIn: 'root', }) export class ErrorLoggerService { - constructor() {} + public static log(serviceName = 'error-logger', message: string) { + // eslint-disable-next-line no-console + console.log(`${serviceName}Service: ${message}`); + } /** * Handle Http operation that failed. @@ -14,21 +17,11 @@ export class ErrorLoggerService { * @param operation - name of the operation that failed * @param result - optional value to return as the observable result */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars, class-methods-use-this public handleError(serviceName = 'error-logger', operation = 'operation', result?: T) { return (error: any): Observable => { - // TODO: send the error to remote logging infrastructure - console.error(error); // log to console instead - - // TODO: better job of transforming error for user consumption - this.log(serviceName, `${operation} failed: ${error}`); - - // // Let the app keep running by returning an empty result. - // return of(result as T); + ErrorLoggerService.log(serviceName, `${operation} failed: ${error}`); return throwError(error); }; } - - public log(serviceName = 'error-logger', message: string) { - console.log(serviceName + 'Service: ' + message); - } } diff --git a/overlord/src/app/core/http-auth-interceptor.ts b/overlord/src/app/core/http-auth-interceptor.ts index a8952254..1d1001c5 100644 --- a/overlord/src/app/core/http-auth-interceptor.ts +++ b/overlord/src/app/core/http-auth-interceptor.ts @@ -1,13 +1,15 @@ +import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { Router } from '@angular/router'; import { Observable, throwError } from 'rxjs'; import { catchError } from 'rxjs/operators'; -import { Injectable } from '@angular/core'; -import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http'; -import { Router } from '@angular/router'; -import { MatDialog } from '@angular/material/dialog'; + import { AuthService } from '../auth/auth.service'; -import { ToasterService } from './toaster.service'; import { ConfirmDialogComponent } from '../shared/confirm-dialog/confirm-dialog.component'; +import { ToasterService } from './toaster.service'; + @Injectable() export class ErrorInterceptor implements HttpInterceptor { constructor( @@ -52,6 +54,7 @@ export class ErrorInterceptor implements HttpInterceptor { this.router.navigate(['login']); } }); + return throwError(err); }), ); } diff --git a/overlord/src/app/core/incentive.ts b/overlord/src/app/core/incentive.ts new file mode 100644 index 00000000..ecc76793 --- /dev/null +++ b/overlord/src/app/core/incentive.ts @@ -0,0 +1,8 @@ +export class Incentive { + id: string; + name: string; + designation: string; + department: string; + daysWorked: number; + points: number; +} diff --git a/overlord/src/app/core/inventory.ts b/overlord/src/app/core/inventory.ts new file mode 100644 index 00000000..b3c7727a --- /dev/null +++ b/overlord/src/app/core/inventory.ts @@ -0,0 +1,13 @@ +import { Batch } from './batch'; +import { Product } from './product'; + +export class Inventory { + id: string; + quantity: number; + rate: number; + tax: number; + discount: number; + amount: number; + product: Product; + batch: Batch; +} diff --git a/overlord/src/app/core/journal.ts b/overlord/src/app/core/journal.ts new file mode 100644 index 00000000..99dae0d1 --- /dev/null +++ b/overlord/src/app/core/journal.ts @@ -0,0 +1,14 @@ +import { Account } from './account'; +import { CostCentre } from './cost-centre'; + +export class Journal { + id: string; + debit: number; + amount: number; + account: Account; + costCentre: CostCentre; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} diff --git a/overlord/src/app/core/jwt.interceptor.ts b/overlord/src/app/core/jwt.interceptor.ts index 2623ebe0..4076b8d8 100644 --- a/overlord/src/app/core/jwt.interceptor.ts +++ b/overlord/src/app/core/jwt.interceptor.ts @@ -1,5 +1,5 @@ -import { Injectable } from '@angular/core'; import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http'; +import { Injectable } from '@angular/core'; import { Observable } from 'rxjs'; import { AuthService } from '../auth/auth.service'; @@ -14,13 +14,15 @@ export class JwtInterceptor implements HttpInterceptor { // add authorization header with jwt token if available // We use this line to debug token refreshing - // console.log("intercepting:\nisRefreshing: ", this.isRefreshing, "\n user: ", this.authService.user,"\n needsRefreshing: ", this.authService.needsRefreshing()); if (!this.isRefreshing && this.authService.user && this.authService.needsRefreshing()) { this.isRefreshing = true; - this.authService.refreshToken().subscribe((x) => (this.isRefreshing = false)); + this.authService.refreshToken().subscribe(() => { + this.isRefreshing = false; + }); } const currentUser = this.authService.user; if (currentUser?.access_token) { + // eslint-disable-next-line no-param-reassign request = request.clone({ setHeaders: { Authorization: `Bearer ${currentUser.access_token}`, diff --git a/overlord/src/app/core/nav-bar/nav-bar.component.ts b/overlord/src/app/core/nav-bar/nav-bar.component.ts index 8116b2b0..dbfa5d07 100644 --- a/overlord/src/app/core/nav-bar/nav-bar.component.ts +++ b/overlord/src/app/core/nav-bar/nav-bar.component.ts @@ -1,7 +1,8 @@ import { Component } from '@angular/core'; -import { AuthService } from '../../auth/auth.service'; import { Router } from '@angular/router'; +import { AuthService } from '../../auth/auth.service'; + @Component({ selector: 'app-nav-bar', templateUrl: './nav-bar.component.html', diff --git a/overlord/src/app/core/user-group.ts b/overlord/src/app/core/user-group.ts new file mode 100644 index 00000000..ce7f90a5 --- /dev/null +++ b/overlord/src/app/core/user-group.ts @@ -0,0 +1,5 @@ +export class UserGroup { + id: string; + name: string; + enabled: boolean; +} diff --git a/overlord/src/app/core/user.ts b/overlord/src/app/core/user.ts index 5708b6cc..e1112047 100644 --- a/overlord/src/app/core/user.ts +++ b/overlord/src/app/core/user.ts @@ -1,3 +1,5 @@ +import { UserGroup } from './user-group'; + export class User { id: string; name: string; @@ -14,9 +16,3 @@ export class User { Object.assign(this, init); } } - -export class UserGroup { - id: string; - name: string; - enabled: boolean; -} diff --git a/overlord/src/app/core/voucher.service.ts b/overlord/src/app/core/voucher.service.ts index 925843ab..af7f65f3 100644 --- a/overlord/src/app/core/voucher.service.ts +++ b/overlord/src/app/core/voucher.service.ts @@ -1,7 +1,8 @@ -import { Injectable } from '@angular/core'; -import { catchError } from 'rxjs/operators'; -import { Observable } from 'rxjs/internal/Observable'; import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs/internal/Observable'; +import { catchError } from 'rxjs/operators'; + import { ErrorLoggerService } from './error-logger.service'; import { Voucher } from './voucher'; @@ -18,6 +19,21 @@ const serviceName = 'VoucherService'; export class VoucherService { constructor(private http: HttpClient, private log: ErrorLoggerService) {} + static dataURLtoBlob(dataURL) { + const re = /^data:([\w/\-.]+);\w+,(.*)$/; + const m = dataURL.match(re); + const mimeString = m[1]; + const byteString = atob(m[2]); + const ab = new ArrayBuffer(byteString.length); + const dw = new DataView(ab); + let i; + + for (i = 0; i < byteString.length; i += 1) { + dw.setUint8(i, byteString.charCodeAt(i)); + } + return new Blob([ab], { type: mimeString }); + } + get(id: string, type: string): Observable { const endpoint = type.replace(/ /g, '-').toLowerCase(); return >( @@ -31,6 +47,7 @@ export class VoucherService { const endpoint = type.replace(/ /g, '-').toLowerCase(); const options = {}; if (account !== undefined && account !== null) { + // eslint-disable-next-line @typescript-eslint/dot-notation options['params'] = new HttpParams().set('a', account); } return >( @@ -69,9 +86,8 @@ export class VoucherService { const endpoint = voucher.type.replace(/ /g, '-').toLowerCase(); if (!voucher.id) { return this.save(voucher, endpoint); - } else { - return this.update(voucher, endpoint); } + return this.update(voucher, endpoint); } save(voucher: Voucher, endpoint: string): Observable { @@ -79,8 +95,8 @@ export class VoucherService { voucher.files .filter((x) => !x.id) .forEach((file) => { - fd.append('i', this.dataURLtoBlob(file.resized)); - fd.append('t', this.dataURLtoBlob(file.thumbnail)); + fd.append('i', VoucherService.dataURLtoBlob(file.resized)); + fd.append('t', VoucherService.dataURLtoBlob(file.thumbnail)); }); voucher.files = voucher.files.filter((x) => x.id); fd.append('data', JSON.stringify(voucher)); @@ -96,8 +112,8 @@ export class VoucherService { voucher.files .filter((x) => !x.id) .forEach((file) => { - fd.append('i', this.dataURLtoBlob(file.resized)); - fd.append('t', this.dataURLtoBlob(file.thumbnail)); + fd.append('i', VoucherService.dataURLtoBlob(file.resized)); + fd.append('t', VoucherService.dataURLtoBlob(file.thumbnail)); }); voucher.files = voucher.files.filter((x) => x.id); fd.append('data', JSON.stringify(voucher)); @@ -107,19 +123,4 @@ export class VoucherService { .pipe(catchError(this.log.handleError(serviceName, 'Update Voucher'))) ); } - - dataURLtoBlob(dataURL) { - const re = /^data:([\w/\-\.]+);\w+,(.*)$/; - const m = dataURL.match(re); - const mimeString = m[1]; - const byteString = atob(m[2]); - const ab = new ArrayBuffer(byteString.length); - const dw = new DataView(ab); - let i; - - for (i = 0; i < byteString.length; i++) { - dw.setUint8(i, byteString.charCodeAt(i)); - } - return new Blob([ab], { type: mimeString }); - } } diff --git a/overlord/src/app/core/voucher.ts b/overlord/src/app/core/voucher.ts index 4bd3eecd..88b82e0a 100644 --- a/overlord/src/app/core/voucher.ts +++ b/overlord/src/app/core/voucher.ts @@ -1,8 +1,11 @@ import { Account } from './account'; -import { User } from './user'; import { CostCentre } from './cost-centre'; -import { Product } from './product'; -import { Employee } from '../employee/employee'; +import { DbFile } from './db-file'; +import { EmployeeBenefit } from './employee-benefit'; +import { Incentive } from './incentive'; +import { Inventory } from './inventory'; +import { Journal } from './journal'; +import { User } from './user'; export class Voucher { id: string; @@ -26,61 +29,3 @@ export class Voucher { poster: string; reconcileDate: string; } - -export class Journal { - id: string; - debit: number; - amount: number; - account: Account; - costCentre: CostCentre; - - public constructor(init?: Partial) { - Object.assign(this, init); - } -} - -export class EmployeeBenefit { - grossSalary: number; - daysWorked: number; - esiEmployee: number; - pfEmployee: number; - esiEmployer: number; - pfEmployer: number; - employee: Employee; -} - -export class Incentive { - id: string; - name: string; - designation: string; - department: string; - daysWorked: number; - points: number; -} - -export class Inventory { - id: string; - quantity: number; - rate: number; - tax: number; - discount: number; - amount: number; - product: Product; - batch: Batch; -} - -export class Batch { - id: string; - name: string; - quantityRemaining: number; - tax: number; - discount: number; - rate: number; - product: Product; -} - -export class DbFile { - id: string; - resized: string; - thumbnail: string; -} diff --git a/overlord/src/app/cost-centre/cost-centre-detail/cost-centre-detail.component.ts b/overlord/src/app/cost-centre/cost-centre-detail/cost-centre-detail.component.ts index 33e34f51..c8896e2f 100644 --- a/overlord/src/app/cost-centre/cost-centre-detail/cost-centre-detail.component.ts +++ b/overlord/src/app/cost-centre/cost-centre-detail/cost-centre-detail.component.ts @@ -1,10 +1,10 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; - -import { CostCentreService } from '../cost-centre.service'; -import { CostCentre } from '../../core/cost-centre'; -import { ActivatedRoute, Router } from '@angular/router'; -import { ToasterService } from '../../core/toaster.service'; import { FormBuilder, FormGroup } from '@angular/forms'; +import { ActivatedRoute, Router } from '@angular/router'; + +import { CostCentre } from '../../core/cost-centre'; +import { ToasterService } from '../../core/toaster.service'; +import { CostCentreService } from '../cost-centre.service'; @Component({ selector: 'app-cost-centre-detail', @@ -53,7 +53,7 @@ export class CostCentreDetailComponent implements OnInit, AfterViewInit { save() { this.ser.saveOrUpdate(this.getItem()).subscribe( - (result) => { + () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/cost-centres'); }, diff --git a/overlord/src/app/cost-centre/cost-centre-list-resolver.service.ts b/overlord/src/app/cost-centre/cost-centre-list-resolver.service.ts index 28240d14..b65ec7e7 100644 --- a/overlord/src/app/cost-centre/cost-centre-list-resolver.service.ts +++ b/overlord/src/app/cost-centre/cost-centre-list-resolver.service.ts @@ -1,16 +1,18 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, Router, RouterStateSnapshot } from '@angular/router'; -import { CostCentre } from '../core/cost-centre'; +import { Resolve } from '@angular/router'; import { Observable } from 'rxjs/internal/Observable'; + +import { CostCentre } from '../core/cost-centre'; + import { CostCentreService } from './cost-centre.service'; @Injectable({ providedIn: 'root', }) export class CostCentreListResolver implements Resolve { - constructor(private ser: CostCentreService, private router: Router) {} + constructor(private ser: CostCentreService) {} - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + resolve(): Observable { return this.ser.list(); } } diff --git a/overlord/src/app/cost-centre/cost-centre-list/cost-centre-list-datasource.ts b/overlord/src/app/cost-centre/cost-centre-list/cost-centre-list-datasource.ts index 0900e5cf..2a5ec816 100644 --- a/overlord/src/app/cost-centre/cost-centre-list/cost-centre-list-datasource.ts +++ b/overlord/src/app/cost-centre/cost-centre-list/cost-centre-list-datasource.ts @@ -1,10 +1,16 @@ import { DataSource } from '@angular/cdk/collections'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; -import { map } from 'rxjs/operators'; import { merge, Observable, of as observableOf } from 'rxjs'; +import { map } from 'rxjs/operators'; + import { CostCentre } from '../../core/cost-centre'; +/** Simple sort comparator for example ID/Name columns (for client-side sorting). */ +function compare(a, b, isAsc) { + return (a < b ? -1 : 1) * (isAsc ? 1 : -1); +} + export class CostCentreListDataSource extends DataSource { constructor(private paginator: MatPaginator, private sort: MatSort, public data: CostCentre[]) { super(); @@ -17,9 +23,7 @@ export class CostCentreListDataSource extends DataSource { this.paginator.length = this.data.length; return merge(...dataMutations).pipe( - map(() => { - return this.getPagedData(this.getSortedData([...this.data])); - }), + map(() => this.getPagedData(this.getSortedData([...this.data]))), ); } @@ -48,8 +52,3 @@ export class CostCentreListDataSource extends DataSource { }); } } - -/** Simple sort comparator for example ID/Name columns (for client-side sorting). */ -function compare(a, b, isAsc) { - return (a < b ? -1 : 1) * (isAsc ? 1 : -1); -} diff --git a/overlord/src/app/cost-centre/cost-centre-list/cost-centre-list.component.ts b/overlord/src/app/cost-centre/cost-centre-list/cost-centre-list.component.ts index 11957d63..391ab2e9 100644 --- a/overlord/src/app/cost-centre/cost-centre-list/cost-centre-list.component.ts +++ b/overlord/src/app/cost-centre/cost-centre-list/cost-centre-list.component.ts @@ -1,10 +1,12 @@ import { Component, OnInit, ViewChild } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; -import { CostCentreListDataSource } from './cost-centre-list-datasource'; -import { CostCentre } from '../../core/cost-centre'; import { ActivatedRoute } from '@angular/router'; +import { CostCentre } from '../../core/cost-centre'; + +import { CostCentreListDataSource } from './cost-centre-list-datasource'; + @Component({ selector: 'app-cost-centre-list', templateUrl: './cost-centre-list.component.html', diff --git a/overlord/src/app/cost-centre/cost-centre-resolver.service.ts b/overlord/src/app/cost-centre/cost-centre-resolver.service.ts index 9285ba1e..4c20c935 100644 --- a/overlord/src/app/cost-centre/cost-centre-resolver.service.ts +++ b/overlord/src/app/cost-centre/cost-centre-resolver.service.ts @@ -1,16 +1,18 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, Router, RouterStateSnapshot } from '@angular/router'; -import { CostCentreService } from './cost-centre.service'; -import { CostCentre } from '../core/cost-centre'; +import { ActivatedRouteSnapshot, Resolve } from '@angular/router'; import { Observable } from 'rxjs/internal/Observable'; +import { CostCentre } from '../core/cost-centre'; + +import { CostCentreService } from './cost-centre.service'; + @Injectable({ providedIn: 'root', }) export class CostCentreResolver implements Resolve { - constructor(private ser: CostCentreService, private router: Router) {} + constructor(private ser: CostCentreService) {} - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + resolve(route: ActivatedRouteSnapshot): Observable { const id = route.paramMap.get('id'); return this.ser.get(id); } diff --git a/overlord/src/app/cost-centre/cost-centre-routing.module.ts b/overlord/src/app/cost-centre/cost-centre-routing.module.ts index 959f8da4..8a583638 100644 --- a/overlord/src/app/cost-centre/cost-centre-routing.module.ts +++ b/overlord/src/app/cost-centre/cost-centre-routing.module.ts @@ -1,12 +1,14 @@ -import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { CostCentreListResolver } from './cost-centre-list-resolver.service'; -import { CostCentreResolver } from './cost-centre-resolver.service'; -import { CostCentreListComponent } from './cost-centre-list/cost-centre-list.component'; -import { CostCentreDetailComponent } from './cost-centre-detail/cost-centre-detail.component'; + import { AuthGuard } from '../auth/auth-guard.service'; +import { CostCentreDetailComponent } from './cost-centre-detail/cost-centre-detail.component'; +import { CostCentreListResolver } from './cost-centre-list-resolver.service'; +import { CostCentreListComponent } from './cost-centre-list/cost-centre-list.component'; +import { CostCentreResolver } from './cost-centre-resolver.service'; + const costCentreRoutes: Routes = [ { path: '', diff --git a/overlord/src/app/cost-centre/cost-centre.module.ts b/overlord/src/app/cost-centre/cost-centre.module.ts index 03eafb81..2031254b 100644 --- a/overlord/src/app/cost-centre/cost-centre.module.ts +++ b/overlord/src/app/cost-centre/cost-centre.module.ts @@ -1,9 +1,8 @@ -import { NgModule } from '@angular/core'; +import { CdkTableModule } from '@angular/cdk/table'; import { CommonModule } from '@angular/common'; - -import { CostCentreListComponent } from './cost-centre-list/cost-centre-list.component'; -import { CostCentreDetailComponent } from './cost-centre-detail/cost-centre-detail.component'; -import { CostCentreRoutingModule } from './cost-centre-routing.module'; +import { NgModule } from '@angular/core'; +import { FlexLayoutModule } from '@angular/flex-layout'; +import { ReactiveFormsModule } from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; import { MatCardModule } from '@angular/material/card'; import { MatIconModule } from '@angular/material/icon'; @@ -12,9 +11,10 @@ import { MatPaginatorModule } from '@angular/material/paginator'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatSortModule } from '@angular/material/sort'; import { MatTableModule } from '@angular/material/table'; -import { CdkTableModule } from '@angular/cdk/table'; -import { ReactiveFormsModule } from '@angular/forms'; -import { FlexLayoutModule } from '@angular/flex-layout'; + +import { CostCentreDetailComponent } from './cost-centre-detail/cost-centre-detail.component'; +import { CostCentreListComponent } from './cost-centre-list/cost-centre-list.component'; +import { CostCentreRoutingModule } from './cost-centre-routing.module'; @NgModule({ imports: [ diff --git a/overlord/src/app/cost-centre/cost-centre.service.ts b/overlord/src/app/cost-centre/cost-centre.service.ts index 7fb4b259..4abf056a 100644 --- a/overlord/src/app/cost-centre/cost-centre.service.ts +++ b/overlord/src/app/cost-centre/cost-centre.service.ts @@ -1,9 +1,10 @@ +import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; -import { ErrorLoggerService } from '../core/error-logger.service'; -import { catchError } from 'rxjs/operators'; import { Observable } from 'rxjs/internal/Observable'; +import { catchError } from 'rxjs/operators'; + import { CostCentre } from '../core/cost-centre'; +import { ErrorLoggerService } from '../core/error-logger.service'; const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }), @@ -53,9 +54,8 @@ export class CostCentreService { saveOrUpdate(costCentre: CostCentre): Observable { if (!costCentre.id) { return this.save(costCentre); - } else { - return this.update(costCentre); } + return this.update(costCentre); } delete(id: string): Observable { diff --git a/overlord/src/app/daybook/daybook-datasource.ts b/overlord/src/app/daybook/daybook-datasource.ts index afd02060..8defab79 100644 --- a/overlord/src/app/daybook/daybook-datasource.ts +++ b/overlord/src/app/daybook/daybook-datasource.ts @@ -1,9 +1,15 @@ import { DataSource } from '@angular/cdk/collections'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; -import { map } from 'rxjs/operators'; import { merge, Observable, of as observableOf } from 'rxjs'; -import { DaybookItem } from './daybook'; +import { map } from 'rxjs/operators'; + +import { DaybookItem } from './daybook-item'; + +/** Simple sort comparator for example ID/Name columns (for client-side sorting). */ +function compare(a, b, isAsc) { + return (a < b ? -1 : 1) * (isAsc ? 1 : -1); +} export class DaybookDataSource extends DataSource { constructor(private paginator: MatPaginator, private sort: MatSort, public data: DaybookItem[]) { @@ -17,9 +23,7 @@ export class DaybookDataSource extends DataSource { this.paginator.length = this.data.length; return merge(...dataMutations).pipe( - map(() => { - return this.getPagedData(this.getSortedData([...this.data])); - }), + map(() => this.getPagedData(this.getSortedData([...this.data]))), ); } @@ -50,8 +54,3 @@ export class DaybookDataSource extends DataSource { }); } } - -/** Simple sort comparator for example ID/Name columns (for client-side sorting). */ -function compare(a, b, isAsc) { - return (a < b ? -1 : 1) * (isAsc ? 1 : -1); -} diff --git a/overlord/src/app/daybook/daybook-item.ts b/overlord/src/app/daybook/daybook-item.ts new file mode 100644 index 00000000..58f45821 --- /dev/null +++ b/overlord/src/app/daybook/daybook-item.ts @@ -0,0 +1,12 @@ +export class DaybookItem { + id: string; + date: string; + type: string; + narration: string; + debitText: string; + debitAmount: number; + creditText: string; + creditAmount: number; + posted: boolean; + url: string[]; +} diff --git a/overlord/src/app/daybook/daybook-resolver.service.ts b/overlord/src/app/daybook/daybook-resolver.service.ts index de68473d..58efa7b6 100644 --- a/overlord/src/app/daybook/daybook-resolver.service.ts +++ b/overlord/src/app/daybook/daybook-resolver.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { ActivatedRouteSnapshot, Resolve } from '@angular/router'; import { Observable } from 'rxjs/internal/Observable'; + import { Daybook } from './daybook'; import { DaybookService } from './daybook.service'; @@ -10,7 +11,7 @@ import { DaybookService } from './daybook.service'; export class DaybookResolver implements Resolve { constructor(private ser: DaybookService) {} - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + resolve(route: ActivatedRouteSnapshot): Observable { const startDate = route.queryParamMap.get('startDate') || null; const finishDate = route.queryParamMap.get('finishDate') || null; return this.ser.list(startDate, finishDate); diff --git a/overlord/src/app/daybook/daybook-routing.module.ts b/overlord/src/app/daybook/daybook-routing.module.ts index 05f62fc7..9e1694e2 100644 --- a/overlord/src/app/daybook/daybook-routing.module.ts +++ b/overlord/src/app/daybook/daybook-routing.module.ts @@ -1,8 +1,10 @@ -import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { DaybookResolver } from './daybook-resolver.service'; + import { AuthGuard } from '../auth/auth-guard.service'; + +import { DaybookResolver } from './daybook-resolver.service'; import { DaybookComponent } from './daybook.component'; const daybookRoutes: Routes = [ diff --git a/overlord/src/app/daybook/daybook.component.ts b/overlord/src/app/daybook/daybook.component.ts index 71e5e436..9aaad4e0 100644 --- a/overlord/src/app/daybook/daybook.component.ts +++ b/overlord/src/app/daybook/daybook.component.ts @@ -4,10 +4,10 @@ import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; import { ActivatedRoute, Router } from '@angular/router'; import * as moment from 'moment'; -import { DaybookDataSource } from './daybook-datasource'; + import { Daybook } from './daybook'; +import { DaybookDataSource } from './daybook-datasource'; import { DaybookService } from './daybook.service'; -import { map } from 'rxjs/operators'; @Component({ selector: 'app-daybook', diff --git a/overlord/src/app/daybook/daybook.module.ts b/overlord/src/app/daybook/daybook.module.ts index 1a69a843..63941928 100644 --- a/overlord/src/app/daybook/daybook.module.ts +++ b/overlord/src/app/daybook/daybook.module.ts @@ -1,5 +1,10 @@ -import { NgModule } from '@angular/core'; +import { A11yModule } from '@angular/cdk/a11y'; +import { CdkTableModule } from '@angular/cdk/table'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FlexLayoutModule } from '@angular/flex-layout'; +import { ReactiveFormsModule } from '@angular/forms'; +import { MomentDateAdapter } from '@angular/material-moment-adapter'; import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatButtonModule } from '@angular/material/button'; import { MatCardModule } from '@angular/material/card'; @@ -18,14 +23,11 @@ import { MatPaginatorModule } from '@angular/material/paginator'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatSortModule } from '@angular/material/sort'; import { MatTableModule } from '@angular/material/table'; + import { SharedModule } from '../shared/shared.module'; -import { ReactiveFormsModule } from '@angular/forms'; -import { CdkTableModule } from '@angular/cdk/table'; + import { DaybookRoutingModule } from './daybook-routing.module'; import { DaybookComponent } from './daybook.component'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; -import { A11yModule } from '@angular/cdk/a11y'; -import { FlexLayoutModule } from '@angular/flex-layout'; export const MY_FORMATS = { parse: { diff --git a/overlord/src/app/daybook/daybook.service.ts b/overlord/src/app/daybook/daybook.service.ts index 991ca33d..f961163f 100644 --- a/overlord/src/app/daybook/daybook.service.ts +++ b/overlord/src/app/daybook/daybook.service.ts @@ -1,13 +1,11 @@ +import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { catchError } from 'rxjs/operators'; import { Observable } from 'rxjs/internal/Observable'; -import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; -import { Daybook } from './daybook'; +import { catchError } from 'rxjs/operators'; + import { ErrorLoggerService } from '../core/error-logger.service'; -const httpOptions = { - headers: new HttpHeaders({ 'Content-Type': 'application/json' }), -}; +import { Daybook } from './daybook'; const url = '/api/daybook'; const serviceName = 'DaybookService'; @@ -19,11 +17,11 @@ export class DaybookService { constructor(private http: HttpClient, private log: ErrorLoggerService) {} list(startDate: string, finishDate): Observable { - startDate = startDate ? `/${startDate}` : ''; - finishDate = finishDate ? `/${finishDate}` : ''; + const startDateWithSlash = startDate ? `/${startDate}` : ''; + const finishDateWithSlash = finishDate ? `/${finishDate}` : ''; return >( this.http - .get(`${url}${startDate}${finishDate}`) + .get(`${url}${startDateWithSlash}${finishDateWithSlash}`) .pipe(catchError(this.log.handleError(serviceName, 'list'))) ); } diff --git a/overlord/src/app/daybook/daybook.ts b/overlord/src/app/daybook/daybook.ts index eb3b90c3..f77f1752 100644 --- a/overlord/src/app/daybook/daybook.ts +++ b/overlord/src/app/daybook/daybook.ts @@ -1,15 +1,4 @@ -export class DaybookItem { - id: string; - date: string; - type: string; - narration: string; - debitText: string; - debitAmount: number; - creditText: string; - creditAmount: number; - posted: boolean; - url: string[]; -} +import { DaybookItem } from './daybook-item'; export class Daybook { startDate: string; diff --git a/overlord/src/app/employee-attendance/employee-attendance-datasource.ts b/overlord/src/app/employee-attendance/employee-attendance-datasource.ts index d48d078a..0b0dd82d 100644 --- a/overlord/src/app/employee-attendance/employee-attendance-datasource.ts +++ b/overlord/src/app/employee-attendance/employee-attendance-datasource.ts @@ -1,6 +1,7 @@ import { DataSource } from '@angular/cdk/collections'; import { Observable } from 'rxjs'; -import { EmployeeAttendanceItem } from './employee-attendance'; + +import { EmployeeAttendanceItem } from './employee-attendance-item'; export class EmployeeAttendanceDataSource extends DataSource { constructor(private data: Observable) { diff --git a/overlord/src/app/employee-attendance/employee-attendance-item.ts b/overlord/src/app/employee-attendance/employee-attendance-item.ts new file mode 100644 index 00000000..99b4c235 --- /dev/null +++ b/overlord/src/app/employee-attendance/employee-attendance-item.ts @@ -0,0 +1,13 @@ +import { AttendanceType } from '../attendance/attendance-type'; + +export class EmployeeAttendanceItem { + date: string; + attendanceType: AttendanceType; + prints: string; + hoursWorked: string; + fullDay?: boolean; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} diff --git a/overlord/src/app/employee-attendance/employee-attendance-resolver.service.ts b/overlord/src/app/employee-attendance/employee-attendance-resolver.service.ts index e3287dcd..38156703 100644 --- a/overlord/src/app/employee-attendance/employee-attendance-resolver.service.ts +++ b/overlord/src/app/employee-attendance/employee-attendance-resolver.service.ts @@ -1,8 +1,9 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { ActivatedRouteSnapshot, Resolve } from '@angular/router'; import { Observable } from 'rxjs/internal/Observable'; -import { EmployeeAttendanceService } from './employee-attendance.service'; + import { EmployeeAttendance } from './employee-attendance'; +import { EmployeeAttendanceService } from './employee-attendance.service'; @Injectable({ providedIn: 'root', @@ -10,10 +11,7 @@ import { EmployeeAttendance } from './employee-attendance'; export class EmployeeAttendanceResolver implements Resolve { constructor(private ser: EmployeeAttendanceService) {} - resolve( - route: ActivatedRouteSnapshot, - state: RouterStateSnapshot, - ): Observable { + resolve(route: ActivatedRouteSnapshot): Observable { const id = route.paramMap.get('id'); const startDate = route.queryParamMap.get('startDate') || null; const finishDate = route.queryParamMap.get('finishDate') || null; diff --git a/overlord/src/app/employee-attendance/employee-attendance-routing.module.ts b/overlord/src/app/employee-attendance/employee-attendance-routing.module.ts index d6bae385..ff1d2d39 100644 --- a/overlord/src/app/employee-attendance/employee-attendance-routing.module.ts +++ b/overlord/src/app/employee-attendance/employee-attendance-routing.module.ts @@ -1,10 +1,12 @@ -import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { EmployeeAttendanceResolver } from './employee-attendance-resolver.service'; -import { AuthGuard } from '../auth/auth-guard.service'; -import { EmployeeAttendanceComponent } from './employee-attendance.component'; + import { AttendanceTypeResolver } from '../attendance/attendance-type-resolver.service'; +import { AuthGuard } from '../auth/auth-guard.service'; + +import { EmployeeAttendanceResolver } from './employee-attendance-resolver.service'; +import { EmployeeAttendanceComponent } from './employee-attendance.component'; const employeeEmployeeAttendanceRoutes: Routes = [ { diff --git a/overlord/src/app/employee-attendance/employee-attendance.component.html b/overlord/src/app/employee-attendance/employee-attendance.component.html index bdb025c9..f6512336 100644 --- a/overlord/src/app/employee-attendance/employee-attendance.component.html +++ b/overlord/src/app/employee-attendance/employee-attendance.component.html @@ -90,7 +90,7 @@ Prints {{ row.prints }} - new_releases diff --git a/overlord/src/app/employee-attendance/employee-attendance.component.ts b/overlord/src/app/employee-attendance/employee-attendance.component.ts index 3cf8a7df..c66ceb4c 100644 --- a/overlord/src/app/employee-attendance/employee-attendance.component.ts +++ b/overlord/src/app/employee-attendance/employee-attendance.component.ts @@ -3,17 +3,20 @@ import { FormArray, FormBuilder, FormGroup } from '@angular/forms'; import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router } from '@angular/router'; -import { BehaviorSubject, Observable, of as observableOf } from 'rxjs'; -import { EmployeeAttendanceDataSource } from './employee-attendance-datasource'; import * as moment from 'moment'; +import { BehaviorSubject, Observable, of as observableOf } from 'rxjs'; +import { debounceTime, distinctUntilChanged, map, startWith, switchMap } from 'rxjs/operators'; + +import { AttendanceType } from '../attendance/attendance-type'; import { AuthService } from '../auth/auth.service'; import { ToasterService } from '../core/toaster.service'; -import { EmployeeAttendanceService } from './employee-attendance.service'; -import { EmployeeAttendance, EmployeeAttendanceItem } from './employee-attendance'; -import { EmployeeService } from '../employee/employee.service'; import { Employee } from '../employee/employee'; -import { debounceTime, distinctUntilChanged, map, startWith, switchMap } from 'rxjs/operators'; -import { AttendanceType } from '../attendance/attendance-type'; +import { EmployeeService } from '../employee/employee.service'; + +import { EmployeeAttendance } from './employee-attendance'; +import { EmployeeAttendanceDataSource } from './employee-attendance-datasource'; +import { EmployeeAttendanceItem } from './employee-attendance-item'; +import { EmployeeAttendanceService } from './employee-attendance.service'; @Component({ selector: 'app-employee-attendance', @@ -107,7 +110,7 @@ export class EmployeeAttendanceComponent implements OnInit, AfterViewInit { getClass(index: number) { const array = this.form.get('attendances') as FormArray; const id = array.controls[index].value.attendanceType; - const name: string = this.attendanceTypes.filter((x) => x.id === id)[0].name; + const { name } = this.attendanceTypes.filter((x) => x.id === id)[0]; return name.toLowerCase().replace(/(\s+\+\s+)|(\s+)/g, '-'); } @@ -125,7 +128,7 @@ export class EmployeeAttendanceComponent implements OnInit, AfterViewInit { save() { this.ser.save(this.getEmployeeAttendance()).subscribe( - (result) => { + () => { this.toaster.show('Success', ''); }, (error) => { diff --git a/overlord/src/app/employee-attendance/employee-attendance.module.ts b/overlord/src/app/employee-attendance/employee-attendance.module.ts index df4f365c..e491fca2 100644 --- a/overlord/src/app/employee-attendance/employee-attendance.module.ts +++ b/overlord/src/app/employee-attendance/employee-attendance.module.ts @@ -1,5 +1,10 @@ -import { NgModule } from '@angular/core'; +import { A11yModule } from '@angular/cdk/a11y'; +import { CdkTableModule } from '@angular/cdk/table'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FlexLayoutModule } from '@angular/flex-layout'; +import { ReactiveFormsModule } from '@angular/forms'; +import { MomentDateAdapter } from '@angular/material-moment-adapter'; import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatButtonModule } from '@angular/material/button'; import { MatCardModule } from '@angular/material/card'; @@ -21,14 +26,11 @@ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatSelectModule } from '@angular/material/select'; import { MatSortModule } from '@angular/material/sort'; import { MatTableModule } from '@angular/material/table'; + import { SharedModule } from '../shared/shared.module'; -import { ReactiveFormsModule } from '@angular/forms'; -import { CdkTableModule } from '@angular/cdk/table'; + import { EmployeeAttendanceRoutingModule } from './employee-attendance-routing.module'; import { EmployeeAttendanceComponent } from './employee-attendance.component'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; -import { A11yModule } from '@angular/cdk/a11y'; -import { FlexLayoutModule } from '@angular/flex-layout'; export const MY_FORMATS = { parse: { diff --git a/overlord/src/app/employee-attendance/employee-attendance.service.ts b/overlord/src/app/employee-attendance/employee-attendance.service.ts index c98365a2..73aa4acd 100644 --- a/overlord/src/app/employee-attendance/employee-attendance.service.ts +++ b/overlord/src/app/employee-attendance/employee-attendance.service.ts @@ -1,10 +1,12 @@ +import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Observable } from 'rxjs/internal/Observable'; import { catchError } from 'rxjs/operators'; -import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; -import { EmployeeAttendance } from './employee-attendance'; + import { ErrorLoggerService } from '../core/error-logger.service'; +import { EmployeeAttendance } from './employee-attendance'; + const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }), }; @@ -33,7 +35,7 @@ export class EmployeeAttendanceService { } save(employeeAttendance: EmployeeAttendance): Observable { - const id = employeeAttendance.employee.id; + const { id } = employeeAttendance.employee; return >( this.http .post(`${url}/${id}`, employeeAttendance, httpOptions) diff --git a/overlord/src/app/employee-attendance/employee-attendance.ts b/overlord/src/app/employee-attendance/employee-attendance.ts index bbb963a4..ac1ad9fd 100644 --- a/overlord/src/app/employee-attendance/employee-attendance.ts +++ b/overlord/src/app/employee-attendance/employee-attendance.ts @@ -1,5 +1,6 @@ import { Employee } from '../employee/employee'; -import { AttendanceType } from '../attendance/attendance-type'; + +import { EmployeeAttendanceItem } from './employee-attendance-item'; export class EmployeeAttendance { startDate: string; @@ -11,15 +12,3 @@ export class EmployeeAttendance { Object.assign(this, init); } } - -export class EmployeeAttendanceItem { - date: string; - attendanceType: AttendanceType; - prints: string; - hoursWorked: string; - fullDay?: boolean; - - public constructor(init?: Partial) { - Object.assign(this, init); - } -} diff --git a/overlord/src/app/employee-benefits/employee-benefits-datasource.ts b/overlord/src/app/employee-benefits/employee-benefits-datasource.ts index 26360b52..b04402ec 100644 --- a/overlord/src/app/employee-benefits/employee-benefits-datasource.ts +++ b/overlord/src/app/employee-benefits/employee-benefits-datasource.ts @@ -1,6 +1,7 @@ import { DataSource } from '@angular/cdk/collections'; import { Observable } from 'rxjs'; -import { EmployeeBenefit } from '../core/voucher'; + +import { EmployeeBenefit } from '../core/employee-benefit'; export class EmployeeBenefitsDataSource extends DataSource { constructor(private data: Observable) { diff --git a/overlord/src/app/employee-benefits/employee-benefits-resolver.service.ts b/overlord/src/app/employee-benefits/employee-benefits-resolver.service.ts index 7d23bef3..8288c77b 100644 --- a/overlord/src/app/employee-benefits/employee-benefits-resolver.service.ts +++ b/overlord/src/app/employee-benefits/employee-benefits-resolver.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { ActivatedRouteSnapshot, Resolve } from '@angular/router'; import { Observable } from 'rxjs/internal/Observable'; + import { Voucher } from '../core/voucher'; import { VoucherService } from '../core/voucher.service'; @@ -10,12 +11,11 @@ import { VoucherService } from '../core/voucher.service'; export class EmployeeBenefitsResolver implements Resolve { constructor(private ser: VoucherService) {} - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + resolve(route: ActivatedRouteSnapshot): Observable { const id = route.paramMap.get('id'); if (id === null) { return this.ser.getOfType('Employee Benefit'); - } else { - return this.ser.get(id, 'Employee Benefit'); } + return this.ser.get(id, 'Employee Benefit'); } } diff --git a/overlord/src/app/employee-benefits/employee-benefits-routing.module.ts b/overlord/src/app/employee-benefits/employee-benefits-routing.module.ts index 70109ecf..86e55bc6 100644 --- a/overlord/src/app/employee-benefits/employee-benefits-routing.module.ts +++ b/overlord/src/app/employee-benefits/employee-benefits-routing.module.ts @@ -1,8 +1,10 @@ -import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { EmployeeBenefitsResolver } from './employee-benefits-resolver.service'; + import { AuthGuard } from '../auth/auth-guard.service'; + +import { EmployeeBenefitsResolver } from './employee-benefits-resolver.service'; import { EmployeeBenefitsComponent } from './employee-benefits.component'; const employeeBenefitsRoutes: Routes = [ diff --git a/overlord/src/app/employee-benefits/employee-benefits.component.html b/overlord/src/app/employee-benefits/employee-benefits.component.html index b11fcd63..60eb9ed3 100644 --- a/overlord/src/app/employee-benefits/employee-benefits.component.html +++ b/overlord/src/app/employee-benefits/employee-benefits.component.html @@ -38,7 +38,7 @@ {{ diff --git a/overlord/src/app/employee-benefits/employee-benefits.component.ts b/overlord/src/app/employee-benefits/employee-benefits.component.ts index e1912be4..5e7f4423 100644 --- a/overlord/src/app/employee-benefits/employee-benefits.component.ts +++ b/overlord/src/app/employee-benefits/employee-benefits.component.ts @@ -3,17 +3,20 @@ import { FormBuilder, FormGroup } from '@angular/forms'; import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router } from '@angular/router'; -import { BehaviorSubject, Observable, of as observableOf } from 'rxjs'; -import { EmployeeBenefitsDataSource } from './employee-benefits-datasource'; -import { VoucherService } from '../core/voucher.service'; -import { EmployeeBenefit, Voucher } from '../core/voucher'; import * as moment from 'moment'; -import { AuthService } from '../auth/auth.service'; -import { ConfirmDialogComponent } from '../shared/confirm-dialog/confirm-dialog.component'; -import { ToasterService } from '../core/toaster.service'; +import { BehaviorSubject, Observable, of as observableOf } from 'rxjs'; import { debounceTime, distinctUntilChanged, map, startWith, switchMap } from 'rxjs/operators'; + +import { AuthService } from '../auth/auth.service'; +import { EmployeeBenefit } from '../core/employee-benefit'; +import { ToasterService } from '../core/toaster.service'; +import { Voucher } from '../core/voucher'; +import { VoucherService } from '../core/voucher.service'; import { Employee } from '../employee/employee'; import { EmployeeService } from '../employee/employee.service'; +import { ConfirmDialogComponent } from '../shared/confirm-dialog/confirm-dialog.component'; + +import { EmployeeBenefitsDataSource } from './employee-benefits-datasource'; @Component({ selector: 'app-employee-benefits', @@ -49,7 +52,7 @@ export class EmployeeBenefitsComponent implements OnInit, AfterViewInit { private fb: FormBuilder, private dialog: MatDialog, private toaster: ToasterService, - private auth: AuthService, + public auth: AuthService, private ser: VoucherService, private employeeSer: EmployeeService, ) { @@ -57,6 +60,28 @@ export class EmployeeBenefitsComponent implements OnInit, AfterViewInit { this.setupEmployeeAutocomplete(); } + static getPf(grossSalary, daysWorked, daysInMonth) { + const limit = 15000; + const employeeRate = 0.12; + const employerRate = 0.12 + 0.011 + 0.005 + 0.0001; + const employee = + grossSalary > limit ? 0 : Math.ceil((employeeRate * grossSalary * daysWorked) / daysInMonth); + const employer = + grossSalary > limit ? 0 : Math.ceil((employerRate * grossSalary * daysWorked) / daysInMonth); + return { ee: employee, er: employer, both: employee + employer }; + } + + static getEsi(grossSalary, daysWorked, daysInMonth) { + const limit = 21000; + const employeeRate = 0.0175; + const employerRate = 0.0475; + const employee = + grossSalary > limit ? 0 : Math.ceil((employeeRate * grossSalary * daysWorked) / daysInMonth); + const employer = + grossSalary > limit ? 0 : Math.ceil((employerRate * grossSalary * daysWorked) / daysInMonth); + return { ee: employee, er: employer, both: employee + employer }; + } + ngOnInit() { this.route.data.subscribe((data: { voucher: Voucher }) => { this.loadVoucher(data.voucher); @@ -105,7 +130,7 @@ export class EmployeeBenefitsComponent implements OnInit, AfterViewInit { ); } - displayEmployeeName(employee?: Employee): string | undefined { + displayFn(employee?: Employee): string | undefined { return employee ? employee.name : undefined; } @@ -127,13 +152,13 @@ export class EmployeeBenefitsComponent implements OnInit, AfterViewInit { const daysWorked = +formValue.daysWorked; const date = this.form.get('date').value; const daysInMonth = moment(date).daysInMonth(); - const esi = this.getEsi(grossSalary, daysWorked, daysInMonth); - const pf = this.getPf(grossSalary, daysWorked, daysInMonth); + const esi = EmployeeBenefitsComponent.getEsi(grossSalary, daysWorked, daysInMonth); + const pf = EmployeeBenefitsComponent.getPf(grossSalary, daysWorked, daysInMonth); this.voucher.employeeBenefits.push({ employee: this.employee, - grossSalary: grossSalary, - daysWorked: daysWorked, + grossSalary, + daysWorked, esiEmployee: esi.ee, pfEmployee: pf.ee, esiEmployer: esi.er, @@ -160,47 +185,17 @@ export class EmployeeBenefitsComponent implements OnInit, AfterViewInit { this.benefitsObservable.next(this.voucher.employeeBenefits); } - getEsi(grossSalary, daysWorked, daysInMonth) { - const limit = 21000, - employeeRate = 0.0175, - employerRate = 0.0475, - employee = - grossSalary > limit - ? 0 - : Math.ceil((employeeRate * grossSalary * daysWorked) / daysInMonth), - employer = - grossSalary > limit - ? 0 - : Math.ceil((employerRate * grossSalary * daysWorked) / daysInMonth); - return { ee: employee, er: employer, both: employee + employer }; - } - - getPf(grossSalary, daysWorked, daysInMonth) { - const limit = 15000, - employeeRate = 0.12, - employerRate = 0.12 + 0.011 + 0.005 + 0.0001, - employee = - grossSalary > limit - ? 0 - : Math.ceil((employeeRate * grossSalary * daysWorked) / daysInMonth), - employer = - grossSalary > limit - ? 0 - : Math.ceil((employerRate * grossSalary * daysWorked) / daysInMonth); - return { ee: employee, er: employer, both: employee + employer }; - } - canSave() { if (!this.voucher.id) { return true; - } else if (this.voucher.posted && this.auth.user.perms.indexOf('edit-posted-vouchers') !== -1) { - return true; - } else { - return ( - this.voucher.user.id === this.auth.user.id || - this.auth.user.perms.indexOf("edit-other-user's-vouchers") !== -1 - ); } + if (this.voucher.posted && this.auth.user.perms.indexOf('edit-posted-vouchers') !== -1) { + return true; + } + return ( + this.voucher.user.id === this.auth.user.id || + this.auth.user.perms.indexOf("edit-other-user's-vouchers") !== -1 + ); } post() { @@ -240,7 +235,7 @@ export class EmployeeBenefitsComponent implements OnInit, AfterViewInit { delete() { this.ser.delete(this.voucher.id).subscribe( - (result) => { + () => { this.toaster.show('Success', ''); this.router.navigate(['/employee-benefits'], { replaceUrl: true }); }, diff --git a/overlord/src/app/employee-benefits/employee-benefits.module.ts b/overlord/src/app/employee-benefits/employee-benefits.module.ts index 8cb4fcdd..9465bd99 100644 --- a/overlord/src/app/employee-benefits/employee-benefits.module.ts +++ b/overlord/src/app/employee-benefits/employee-benefits.module.ts @@ -1,5 +1,10 @@ -import { NgModule } from '@angular/core'; +import { A11yModule } from '@angular/cdk/a11y'; +import { CdkTableModule } from '@angular/cdk/table'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FlexLayoutModule } from '@angular/flex-layout'; +import { ReactiveFormsModule } from '@angular/forms'; +import { MomentDateAdapter } from '@angular/material-moment-adapter'; import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatButtonModule } from '@angular/material/button'; import { MatCardModule } from '@angular/material/card'; @@ -20,14 +25,11 @@ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatSelectModule } from '@angular/material/select'; import { MatSortModule } from '@angular/material/sort'; import { MatTableModule } from '@angular/material/table'; -import { ReactiveFormsModule } from '@angular/forms'; -import { CdkTableModule } from '@angular/cdk/table'; -import { A11yModule } from '@angular/cdk/a11y'; -import { FlexLayoutModule } from '@angular/flex-layout'; + import { SharedModule } from '../shared/shared.module'; + import { EmployeeBenefitsRoutingModule } from './employee-benefits-routing.module'; import { EmployeeBenefitsComponent } from './employee-benefits.component'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; export const MY_FORMATS = { parse: { diff --git a/overlord/src/app/employee-functions/employee-functions-routing.module.ts b/overlord/src/app/employee-functions/employee-functions-routing.module.ts index 7d91f5f0..e6308452 100644 --- a/overlord/src/app/employee-functions/employee-functions-routing.module.ts +++ b/overlord/src/app/employee-functions/employee-functions-routing.module.ts @@ -1,7 +1,9 @@ -import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; + import { AuthGuard } from '../auth/auth-guard.service'; + import { EmployeeFunctionsComponent } from './employee-functions.component'; const employeeFunctionsRoutes: Routes = [ diff --git a/overlord/src/app/employee-functions/employee-functions.component.ts b/overlord/src/app/employee-functions/employee-functions.component.ts index 458559ca..fafe8b79 100644 --- a/overlord/src/app/employee-functions/employee-functions.component.ts +++ b/overlord/src/app/employee-functions/employee-functions.component.ts @@ -1,13 +1,14 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; import { FormBuilder, FormGroup } from '@angular/forms'; import { MatDatepicker } from '@angular/material/datepicker'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router } from '@angular/router'; import * as moment from 'moment'; import { Moment } from 'moment'; + import { AuthService } from '../auth/auth.service'; import { ToasterService } from '../core/toaster.service'; -import { EmployeeService } from '../employee/employee.service'; + import { EmployeeFunctionsService } from './employee-functions.service'; @Component({ @@ -15,7 +16,7 @@ import { EmployeeFunctionsService } from './employee-functions.service'; templateUrl: './employee-functions.component.html', styleUrls: ['./employee-functions.component.css'], }) -export class EmployeeFunctionsComponent implements OnInit { +export class EmployeeFunctionsComponent { creditSalaryForm: FormGroup; attendanceRecordForm: FormGroup; fingerprintForm: FormGroup; @@ -29,13 +30,10 @@ export class EmployeeFunctionsComponent implements OnInit { private toaster: ToasterService, private auth: AuthService, private ser: EmployeeFunctionsService, - private employeeSer: EmployeeService, ) { this.createForm(); } - ngOnInit() {} - createForm() { const startDate = moment().date(1); const finishDate = moment().date(startDate.daysInMonth()); @@ -43,8 +41,8 @@ export class EmployeeFunctionsComponent implements OnInit { date: finishDate, }); this.attendanceRecordForm = this.fb.group({ - startDate: startDate, - finishDate: finishDate, + startDate, + finishDate, }); this.fingerprintForm = this.fb.group({}); } @@ -73,11 +71,10 @@ export class EmployeeFunctionsComponent implements OnInit { return; } this.ser.creditSalary(date).subscribe( - (result) => { + () => { this.toaster.show('Success', 'Salaries Credited'); }, (error) => { - console.log('Error:', error); this.toaster.show('Danger', error); }, ); @@ -92,13 +89,13 @@ export class EmployeeFunctionsComponent implements OnInit { ); if (!startDate || !finishDate) { // this.toaster.show('Danger', 'Please choose a start and finish date.'); - return; + return ''; } - return '/attendance-report?s=' + startDate + '&f=' + finishDate; + return `/attendance-report?s=${startDate}&f=${finishDate}`; } detectFiles(event) { - this.fingerprintFile = event.target.files[0]; + [this.fingerprintFile] = event.target.files; } uploadFingerprints() { @@ -107,7 +104,7 @@ export class EmployeeFunctionsComponent implements OnInit { return; } this.ser.uploadFingerprints(this.fingerprintFile).subscribe( - (result) => { + () => { this.toaster.show('Success', 'Fingerprints uploaded'); }, (error) => { diff --git a/overlord/src/app/employee-functions/employee-functions.module.ts b/overlord/src/app/employee-functions/employee-functions.module.ts index d7118bbb..5bc4751d 100644 --- a/overlord/src/app/employee-functions/employee-functions.module.ts +++ b/overlord/src/app/employee-functions/employee-functions.module.ts @@ -1,5 +1,10 @@ -import { NgModule } from '@angular/core'; +import { A11yModule } from '@angular/cdk/a11y'; +import { CdkTableModule } from '@angular/cdk/table'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FlexLayoutModule } from '@angular/flex-layout'; +import { ReactiveFormsModule } from '@angular/forms'; +import { MomentDateAdapter } from '@angular/material-moment-adapter'; import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatButtonModule } from '@angular/material/button'; import { MatCardModule } from '@angular/material/card'; @@ -21,14 +26,11 @@ import { MatSelectModule } from '@angular/material/select'; import { MatSortModule } from '@angular/material/sort'; import { MatTableModule } from '@angular/material/table'; import { MatTabsModule } from '@angular/material/tabs'; -import { ReactiveFormsModule } from '@angular/forms'; -import { CdkTableModule } from '@angular/cdk/table'; -import { A11yModule } from '@angular/cdk/a11y'; -import { FlexLayoutModule } from '@angular/flex-layout'; + import { SharedModule } from '../shared/shared.module'; -import { EmployeeFunctionsComponent } from './employee-functions.component'; + import { EmployeeFunctionsRoutingModule } from './employee-functions-routing.module'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; +import { EmployeeFunctionsComponent } from './employee-functions.component'; export const MY_FORMATS = { parse: { diff --git a/overlord/src/app/employee-functions/employee-functions.service.ts b/overlord/src/app/employee-functions/employee-functions.service.ts index e8a6bba5..eeaa76de 100644 --- a/overlord/src/app/employee-functions/employee-functions.service.ts +++ b/overlord/src/app/employee-functions/employee-functions.service.ts @@ -1,12 +1,9 @@ +import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Observable } from 'rxjs/internal/Observable'; import { catchError } from 'rxjs/operators'; -import { HttpClient, HttpHeaders } from '@angular/common/http'; -import { ErrorLoggerService } from '../core/error-logger.service'; -const httpOptions = { - headers: new HttpHeaders({ 'Content-Type': 'application/json' }), -}; +import { ErrorLoggerService } from '../core/error-logger.service'; const serviceName = 'EmployeeFunctionsService'; @@ -17,8 +14,8 @@ export class EmployeeFunctionsService { creditSalary(month: string): Observable { const url = '/api/credit-salary'; return >this.http - .post(url, { month: month }) - .pipe(catchError(this.log.handleError(serviceName, `creditSalary`))); + .post(url, { month }) + .pipe(catchError(this.log.handleError(serviceName, 'creditSalary'))); } uploadFingerprints(fingerprintFile: File): Observable { @@ -28,7 +25,7 @@ export class EmployeeFunctionsService { return >( this.http .post(url, fd) - .pipe(catchError(this.log.handleError(serviceName, `uploadFingerprints`))) + .pipe(catchError(this.log.handleError(serviceName, 'uploadFingerprints'))) ); } } diff --git a/overlord/src/app/employee/employee-detail/employee-detail.component.ts b/overlord/src/app/employee/employee-detail/employee-detail.component.ts index 1ba2b970..6afb0505 100644 --- a/overlord/src/app/employee/employee-detail/employee-detail.component.ts +++ b/overlord/src/app/employee/employee-detail/employee-detail.component.ts @@ -2,14 +2,13 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angula import { FormBuilder, FormGroup } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router } from '@angular/router'; - import * as moment from 'moment'; -import { ToasterService } from '../../core/toaster.service'; -import { EmployeeService } from '../employee.service'; -import { Employee } from '../employee'; import { CostCentre } from '../../core/cost-centre'; +import { ToasterService } from '../../core/toaster.service'; import { ConfirmDialogComponent } from '../../shared/confirm-dialog/confirm-dialog.component'; +import { Employee } from '../employee'; +import { EmployeeService } from '../employee.service'; @Component({ selector: 'app-employee-detail', @@ -81,12 +80,14 @@ export class EmployeeDetailComponent implements OnInit, AfterViewInit { } listenToIsActiveChanges(): void { - this.form.get('isActive').valueChanges.subscribe((x) => (this.item.isActive = x)); + this.form.get('isActive').valueChanges.subscribe((x) => { + this.item.isActive = x; + }); } save() { this.ser.saveOrUpdate(this.getItem()).subscribe( - (result) => { + () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/employees'); }, @@ -98,7 +99,7 @@ export class EmployeeDetailComponent implements OnInit, AfterViewInit { delete() { this.ser.delete(this.item.id).subscribe( - (result) => { + () => { this.toaster.show('Success', ''); this.router.navigateByUrl('/employees'); }, diff --git a/overlord/src/app/employee/employee-list-resolver.service.ts b/overlord/src/app/employee/employee-list-resolver.service.ts index 77f07640..304a1142 100644 --- a/overlord/src/app/employee/employee-list-resolver.service.ts +++ b/overlord/src/app/employee/employee-list-resolver.service.ts @@ -1,7 +1,8 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; -import { Employee } from './employee'; +import { Resolve } from '@angular/router'; import { Observable } from 'rxjs/internal/Observable'; + +import { Employee } from './employee'; import { EmployeeService } from './employee.service'; @Injectable({ @@ -10,7 +11,7 @@ import { EmployeeService } from './employee.service'; export class EmployeeListResolver implements Resolve { constructor(private ser: EmployeeService) {} - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + resolve(): Observable { return this.ser.list(); } } diff --git a/overlord/src/app/employee/employee-list/employee-list-datasource.ts b/overlord/src/app/employee/employee-list/employee-list-datasource.ts index 4715b975..19ddb56d 100644 --- a/overlord/src/app/employee/employee-list/employee-list-datasource.ts +++ b/overlord/src/app/employee/employee-list/employee-list-datasource.ts @@ -1,10 +1,16 @@ import { DataSource } from '@angular/cdk/collections'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; -import { map, tap } from 'rxjs/operators'; import { merge, Observable, of as observableOf } from 'rxjs'; +import { map, tap } from 'rxjs/operators'; + import { Employee } from '../employee'; +/** Simple sort comparator for example ID/Name columns (for client-side sorting). */ +function compare(a, b, isAsc) { + return (a < b ? -1 : 1) * (isAsc ? 1 : -1); +} + export class EmployeeListDataSource extends DataSource { private filterValue: string; @@ -15,7 +21,11 @@ export class EmployeeListDataSource extends DataSource { public data: Employee[], ) { super(); - this.filter = filter.pipe(tap((x) => (this.filterValue = x))); + this.filter = filter.pipe( + tap((x) => { + this.filterValue = x; + }), + ); } connect(): Observable { @@ -28,37 +38,28 @@ export class EmployeeListDataSource extends DataSource { return merge(...dataMutations) .pipe( - map((x: any) => { - return this.getFilteredData([...this.data]); + map(() => this.getFilteredData([...this.data])), + tap((x: Employee[]) => { + this.paginator.length = x.length; }), - tap((x: Employee[]) => (this.paginator.length = x.length)), ) - .pipe( - map((x: any) => { - return this.getPagedData(this.getSortedData(x)); - }), - ); + .pipe(map((x: any) => this.getPagedData(this.getSortedData(x)))); } disconnect() {} private getFilteredData(data: Employee[]): Employee[] { const filter = this.filterValue === undefined ? '' : this.filterValue; - return filter.split(' ').reduce((p: Employee[], c: string) => { - return p.filter((x) => { - const employeeString = ( - x.code + - ' ' + - x.name + - ' ' + - x.designation + - ' ' + - x.costCentre + - (x.isActive ? ' active' : ' inactive') - ).toLowerCase(); - return employeeString.indexOf(c) !== -1; - }); - }, Object.assign([], data)); + return filter.split(' ').reduce( + (p: Employee[], c: string) => + p.filter((x) => { + const employeeString = `${x.code} ${x.name} ${x.designation} ${x.costCentre}${ + x.isActive ? ' active' : ' inactive' + }`.toLowerCase(); + return employeeString.indexOf(c) !== -1; + }), + Object.assign([], data), + ); } private getPagedData(data: Employee[]) { @@ -96,8 +97,3 @@ export class EmployeeListDataSource extends DataSource { }); } } - -/** Simple sort comparator for example ID/Name columns (for client-side sorting). */ -function compare(a, b, isAsc) { - return (a < b ? -1 : 1) * (isAsc ? 1 : -1); -} diff --git a/overlord/src/app/employee/employee-list/employee-list.component.ts b/overlord/src/app/employee/employee-list/employee-list.component.ts index d18bfb64..715933b4 100644 --- a/overlord/src/app/employee/employee-list/employee-list.component.ts +++ b/overlord/src/app/employee/employee-list/employee-list.component.ts @@ -1,13 +1,15 @@ import { AfterViewInit, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; +import { FormBuilder, FormGroup } from '@angular/forms'; import { MatPaginator } from '@angular/material/paginator'; import { MatSort } from '@angular/material/sort'; -import { EmployeeListDataSource } from './employee-list-datasource'; -import { Employee } from '../employee'; import { ActivatedRoute } from '@angular/router'; -import { FormBuilder, FormGroup } from '@angular/forms'; import { Observable } from 'rxjs'; import { debounceTime, distinctUntilChanged, startWith } from 'rxjs/operators'; + import { ToCsvService } from '../../shared/to-csv.service'; +import { Employee } from '../employee'; + +import { EmployeeListDataSource } from './employee-list-datasource'; @Component({ selector: 'app-employee-list', diff --git a/overlord/src/app/employee/employee-resolver.service.ts b/overlord/src/app/employee/employee-resolver.service.ts index a7971617..605fbb45 100644 --- a/overlord/src/app/employee/employee-resolver.service.ts +++ b/overlord/src/app/employee/employee-resolver.service.ts @@ -1,16 +1,17 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, Router, RouterStateSnapshot } from '@angular/router'; -import { EmployeeService } from './employee.service'; -import { Employee } from './employee'; +import { ActivatedRouteSnapshot, Resolve, Router } from '@angular/router'; import { Observable } from 'rxjs/internal/Observable'; +import { Employee } from './employee'; +import { EmployeeService } from './employee.service'; + @Injectable({ providedIn: 'root', }) export class EmployeeResolver implements Resolve { constructor(private ser: EmployeeService, private router: Router) {} - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + resolve(route: ActivatedRouteSnapshot): Observable { const id = route.paramMap.get('id'); return this.ser.get(id); } diff --git a/overlord/src/app/employee/employee-routing.module.ts b/overlord/src/app/employee/employee-routing.module.ts index 56fdf26e..29e6ee12 100644 --- a/overlord/src/app/employee/employee-routing.module.ts +++ b/overlord/src/app/employee/employee-routing.module.ts @@ -1,15 +1,15 @@ -import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { EmployeeListResolver } from './employee-list-resolver.service'; -import { EmployeeResolver } from './employee-resolver.service'; -import { EmployeeDetailComponent } from './employee-detail/employee-detail.component'; -import { EmployeeListComponent } from './employee-list/employee-list.component'; - import { AuthGuard } from '../auth/auth-guard.service'; import { CostCentreListResolver } from '../cost-centre/cost-centre-list-resolver.service'; +import { EmployeeDetailComponent } from './employee-detail/employee-detail.component'; +import { EmployeeListResolver } from './employee-list-resolver.service'; +import { EmployeeListComponent } from './employee-list/employee-list.component'; +import { EmployeeResolver } from './employee-resolver.service'; + const employeeRoutes: Routes = [ { path: '', diff --git a/overlord/src/app/employee/employee.module.ts b/overlord/src/app/employee/employee.module.ts index 0ad745b7..312be259 100644 --- a/overlord/src/app/employee/employee.module.ts +++ b/overlord/src/app/employee/employee.module.ts @@ -1,9 +1,9 @@ -import { NgModule } from '@angular/core'; +import { CdkTableModule } from '@angular/cdk/table'; import { CommonModule } from '@angular/common'; - -import { EmployeeListComponent } from './employee-list/employee-list.component'; -import { EmployeeDetailComponent } from './employee-detail/employee-detail.component'; -import { EmployeeRoutingModule } from './employee-routing.module'; +import { NgModule } from '@angular/core'; +import { FlexLayoutModule } from '@angular/flex-layout'; +import { ReactiveFormsModule } from '@angular/forms'; +import { MomentDateAdapter } from '@angular/material-moment-adapter'; import { MatButtonModule } from '@angular/material/button'; import { MatCardModule } from '@angular/material/card'; import { MatCheckboxModule } from '@angular/material/checkbox'; @@ -22,10 +22,10 @@ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatSelectModule } from '@angular/material/select'; import { MatSortModule } from '@angular/material/sort'; import { MatTableModule } from '@angular/material/table'; -import { CdkTableModule } from '@angular/cdk/table'; -import { ReactiveFormsModule } from '@angular/forms'; -import { FlexLayoutModule } from '@angular/flex-layout'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; + +import { EmployeeDetailComponent } from './employee-detail/employee-detail.component'; +import { EmployeeListComponent } from './employee-list/employee-list.component'; +import { EmployeeRoutingModule } from './employee-routing.module'; export const MY_FORMATS = { parse: { diff --git a/overlord/src/app/employee/employee.service.ts b/overlord/src/app/employee/employee.service.ts index 67115678..4fc99a33 100644 --- a/overlord/src/app/employee/employee.service.ts +++ b/overlord/src/app/employee/employee.service.ts @@ -1,10 +1,12 @@ +import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Observable } from 'rxjs/internal/Observable'; import { catchError } from 'rxjs/operators'; -import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; -import { Employee } from './employee'; + import { ErrorLoggerService } from '../core/error-logger.service'; +import { Employee } from './employee'; + const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }), }; @@ -52,9 +54,8 @@ export class EmployeeService { saveOrUpdate(employee: Employee): Observable { if (!employee.id) { return this.save(employee); - } else { - return this.update(employee); } + return this.update(employee); } delete(id: string): Observable { diff --git a/overlord/src/app/home/home.component.ts b/overlord/src/app/home/home.component.ts index 07516fd2..9ffc897c 100644 --- a/overlord/src/app/home/home.component.ts +++ b/overlord/src/app/home/home.component.ts @@ -1,12 +1,8 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; @Component({ selector: 'app-home', templateUrl: './home.component.html', styleUrls: ['./home.component.css'], }) -export class HomeComponent implements OnInit { - constructor() {} - - ngOnInit() {} -} +export class HomeComponent {} diff --git a/overlord/src/app/incentive/incentive-datasource.ts b/overlord/src/app/incentive/incentive-datasource.ts index f9def426..b00bc4b3 100644 --- a/overlord/src/app/incentive/incentive-datasource.ts +++ b/overlord/src/app/incentive/incentive-datasource.ts @@ -1,6 +1,7 @@ import { DataSource } from '@angular/cdk/collections'; import { Observable } from 'rxjs'; -import { Incentive } from '../core/voucher'; + +import { Incentive } from '../core/incentive'; export class IncentiveDataSource extends DataSource { constructor(private data: Observable) { diff --git a/overlord/src/app/incentive/incentive-resolver.service.ts b/overlord/src/app/incentive/incentive-resolver.service.ts index 43df2f2e..65162ef3 100644 --- a/overlord/src/app/incentive/incentive-resolver.service.ts +++ b/overlord/src/app/incentive/incentive-resolver.service.ts @@ -1,9 +1,9 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { ActivatedRouteSnapshot, Resolve } from '@angular/router'; import { Observable } from 'rxjs/internal/Observable'; + import { Voucher } from '../core/voucher'; import { VoucherService } from '../core/voucher.service'; -import { tap } from 'rxjs/operators'; @Injectable({ providedIn: 'root', @@ -11,12 +11,11 @@ import { tap } from 'rxjs/operators'; export class IncentiveResolver implements Resolve { constructor(private ser: VoucherService) {} - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + resolve(route: ActivatedRouteSnapshot): Observable { const id = route.paramMap.get('id'); if (id === null) { return this.ser.getOfType('Incentive'); - } else { - return this.ser.get(id, 'Incentive'); } + return this.ser.get(id, 'Incentive'); } } diff --git a/overlord/src/app/incentive/incentive-routing.module.ts b/overlord/src/app/incentive/incentive-routing.module.ts index f67cec3c..ce106a17 100644 --- a/overlord/src/app/incentive/incentive-routing.module.ts +++ b/overlord/src/app/incentive/incentive-routing.module.ts @@ -1,8 +1,10 @@ -import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { IncentiveResolver } from './incentive-resolver.service'; + import { AuthGuard } from '../auth/auth-guard.service'; + +import { IncentiveResolver } from './incentive-resolver.service'; import { IncentiveComponent } from './incentive.component'; const incentiveRoutes: Routes = [ diff --git a/overlord/src/app/incentive/incentive.component.ts b/overlord/src/app/incentive/incentive.component.ts index a2015921..231cb90e 100644 --- a/overlord/src/app/incentive/incentive.component.ts +++ b/overlord/src/app/incentive/incentive.component.ts @@ -2,17 +2,20 @@ import { Component, OnInit } from '@angular/core'; import { FormArray, FormBuilder, FormGroup } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router } from '@angular/router'; -import { BehaviorSubject, Observable } from 'rxjs'; -import { IncentiveDataSource } from './incentive-datasource'; -import { Account } from '../core/account'; -import { VoucherService } from '../core/voucher.service'; -import { Incentive, Voucher } from '../core/voucher'; import * as moment from 'moment'; -import { AuthService } from '../auth/auth.service'; -import { ConfirmDialogComponent } from '../shared/confirm-dialog/confirm-dialog.component'; -import { ToasterService } from '../core/toaster.service'; +import { BehaviorSubject, Observable } from 'rxjs'; import { map } from 'rxjs/operators'; +import { AuthService } from '../auth/auth.service'; +import { Account } from '../core/account'; +import { Incentive } from '../core/incentive'; +import { ToasterService } from '../core/toaster.service'; +import { Voucher } from '../core/voucher'; +import { VoucherService } from '../core/voucher.service'; +import { ConfirmDialogComponent } from '../shared/confirm-dialog/confirm-dialog.component'; + +import { IncentiveDataSource } from './incentive-datasource'; + @Component({ selector: 'app-incentive', templateUrl: './incentive.component.html', @@ -36,7 +39,7 @@ export class IncentiveComponent implements OnInit { private fb: FormBuilder, private dialog: MatDialog, private toaster: ToasterService, - private auth: AuthService, + public auth: AuthService, private ser: VoucherService, ) { this.createForm(); @@ -83,17 +86,14 @@ export class IncentiveComponent implements OnInit { this.loadVoucher(voucher); }); } + return ''; }); } totalPoints() { return this.voucher.incentives - .map((item) => { - return item.daysWorked * item.points; - }) - .reduce((sum, item) => { - return sum + item; - }); + .map((item) => item.daysWorked * item.points) + .reduce((sum, item) => sum + item); } pointValue() { @@ -105,28 +105,25 @@ export class IncentiveComponent implements OnInit { row.points -= 1; this.form .get('incentives') - .get('' + i) - .setValue({ points: '' + row.points }); + .get(`${i}`) + .setValue({ points: `${row.points}` }); } } change(row: Incentive, i: number) { - row.points = +this.form - .get('incentives') - .get('' + i) - .get('points').value; + row.points = +this.form.get('incentives').get(`${i}`).get('points').value; this.form .get('incentives') - .get('' + i) - .setValue({ points: '' + row.points }); + .get(`${i}`) + .setValue({ points: `${row.points}` }); } more(row: Incentive, i: number) { row.points += 1; this.form .get('incentives') - .get('' + i) - .setValue({ points: '' + row.points }); + .get(`${i}`) + .setValue({ points: `${row.points}` }); } amount(row) { @@ -136,14 +133,14 @@ export class IncentiveComponent implements OnInit { canSave() { if (!this.voucher.id) { return true; - } else if (this.voucher.posted && this.auth.user.perms.indexOf('edit-posted-vouchers') !== -1) { - return true; - } else { - return ( - this.voucher.user.id === this.auth.user.id || - this.auth.user.perms.indexOf("edit-other-user's-vouchers") !== -1 - ); } + if (this.voucher.posted && this.auth.user.perms.indexOf('edit-posted-vouchers') !== -1) { + return true; + } + return ( + this.voucher.user.id === this.auth.user.id || + this.auth.user.perms.indexOf("edit-other-user's-vouchers") !== -1 + ); } post() { @@ -186,7 +183,7 @@ export class IncentiveComponent implements OnInit { delete() { this.ser.delete(this.voucher.id).subscribe( - (result) => { + () => { this.toaster.show('Success', ''); this.router.navigate(['/incentive'], { replaceUrl: true }); }, diff --git a/overlord/src/app/incentive/incentive.module.ts b/overlord/src/app/incentive/incentive.module.ts index 970ccd6c..f5b32d18 100644 --- a/overlord/src/app/incentive/incentive.module.ts +++ b/overlord/src/app/incentive/incentive.module.ts @@ -1,5 +1,10 @@ -import { NgModule } from '@angular/core'; +import { A11yModule } from '@angular/cdk/a11y'; +import { CdkTableModule } from '@angular/cdk/table'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { FlexLayoutModule } from '@angular/flex-layout'; +import { ReactiveFormsModule } from '@angular/forms'; +import { MomentDateAdapter } from '@angular/material-moment-adapter'; import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatButtonModule } from '@angular/material/button'; import { MatCardModule } from '@angular/material/card'; @@ -20,14 +25,11 @@ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatSelectModule } from '@angular/material/select'; import { MatSortModule } from '@angular/material/sort'; import { MatTableModule } from '@angular/material/table'; + import { SharedModule } from '../shared/shared.module'; -import { ReactiveFormsModule } from '@angular/forms'; -import { CdkTableModule } from '@angular/cdk/table'; + import { IncentiveRoutingModule } from './incentive-routing.module'; import { IncentiveComponent } from './incentive.component'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; -import { A11yModule } from '@angular/cdk/a11y'; -import { FlexLayoutModule } from '@angular/flex-layout'; export const MY_FORMATS = { parse: { diff --git a/overlord/src/app/issue/issue-datasource.ts b/overlord/src/app/issue/issue-datasource.ts index 7d7fe6a1..e1e1386a 100644 --- a/overlord/src/app/issue/issue-datasource.ts +++ b/overlord/src/app/issue/issue-datasource.ts @@ -1,6 +1,7 @@ import { DataSource } from '@angular/cdk/collections'; import { Observable } from 'rxjs'; -import { Inventory, Journal } from '../core/voucher'; + +import { Inventory } from '../core/inventory'; export class IssueDataSource extends DataSource { constructor(private data: Observable) { diff --git a/overlord/src/app/issue/issue-dialog.component.html b/overlord/src/app/issue/issue-dialog.component.html index bc1b2a20..13020e9a 100644 --- a/overlord/src/app/issue/issue-dialog.component.html +++ b/overlord/src/app/issue/issue-dialog.component.html @@ -21,7 +21,7 @@ {{ diff --git a/overlord/src/app/issue/issue-dialog.component.ts b/overlord/src/app/issue/issue-dialog.component.ts index dabaa6cb..f16c5094 100644 --- a/overlord/src/app/issue/issue-dialog.component.ts +++ b/overlord/src/app/issue/issue-dialog.component.ts @@ -1,12 +1,13 @@ import { Component, Inject, OnInit } from '@angular/core'; +import { FormBuilder, FormGroup } from '@angular/forms'; import { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { FormBuilder, FormGroup } from '@angular/forms'; -import { debounceTime, distinctUntilChanged, map, startWith, switchMap } from 'rxjs/operators'; -import { Observable, of as observableOf } from 'rxjs'; -import { MathService } from '../shared/math.service'; -import { Batch } from '../core/voucher'; +import { Observable } from 'rxjs'; +import { debounceTime, distinctUntilChanged, startWith, switchMap } from 'rxjs/operators'; + +import { Batch } from '../core/batch'; import { BatchService } from '../core/batch.service'; +import { MathService } from '../shared/math.service'; @Component({ selector: 'app-issue-dialog', @@ -47,17 +48,14 @@ export class IssueDialogComponent implements OnInit { listenToBatchAutocompleteChange(): void { const control = this.form.get('batch'); this.batches = control.valueChanges.pipe( - startWith(null), - map((x) => (x !== null && x.length >= 1 ? x : null)), + startWith(''), debounceTime(150), distinctUntilChanged(), - switchMap((x) => - x === null ? observableOf([]) : this.batchSer.autocomplete(this.data.date, x), - ), + switchMap((x) => this.batchSer.autocomplete(this.data.date, x)), ); } - displayBatchName(batch?: Batch): string | undefined { + displayFn(batch?: Batch): string | undefined { return batch ? batch.name : undefined; } diff --git a/overlord/src/app/issue/issue-grid.service.ts b/overlord/src/app/issue/issue-grid.service.ts index a7eb7217..48652827 100644 --- a/overlord/src/app/issue/issue-grid.service.ts +++ b/overlord/src/app/issue/issue-grid.service.ts @@ -1,8 +1,9 @@ -import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; -import { ErrorLoggerService } from '../core/error-logger.service'; -import { catchError } from 'rxjs/operators'; +import { Injectable } from '@angular/core'; import { Observable } from 'rxjs/internal/Observable'; +import { catchError } from 'rxjs/operators'; + +import { ErrorLoggerService } from '../core/error-logger.service'; const url = '/api/issue-grid'; const serviceName = 'IssueGridService'; diff --git a/overlord/src/app/issue/issue-resolver.service.ts b/overlord/src/app/issue/issue-resolver.service.ts index b8dd28a4..73edc5e4 100644 --- a/overlord/src/app/issue/issue-resolver.service.ts +++ b/overlord/src/app/issue/issue-resolver.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { ActivatedRouteSnapshot, Resolve } from '@angular/router'; import { Observable } from 'rxjs/internal/Observable'; + import { Voucher } from '../core/voucher'; import { VoucherService } from '../core/voucher.service'; @@ -10,12 +11,11 @@ import { VoucherService } from '../core/voucher.service'; export class IssueResolver implements Resolve { constructor(private ser: VoucherService) {} - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + resolve(route: ActivatedRouteSnapshot): Observable { const id = route.paramMap.get('id'); if (id === null) { return this.ser.getOfType('Issue'); - } else { - return this.ser.get(id, 'Issue'); } + return this.ser.get(id, 'Issue'); } } diff --git a/overlord/src/app/issue/issue-routing.module.ts b/overlord/src/app/issue/issue-routing.module.ts index 881264ca..837a1f8d 100644 --- a/overlord/src/app/issue/issue-routing.module.ts +++ b/overlord/src/app/issue/issue-routing.module.ts @@ -1,11 +1,13 @@ -import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { IssueResolver } from './issue-resolver.service'; + import { AuthGuard } from '../auth/auth-guard.service'; -import { IssueComponent } from './issue.component'; import { CostCentreListResolver } from '../cost-centre/cost-centre-list-resolver.service'; +import { IssueResolver } from './issue-resolver.service'; +import { IssueComponent } from './issue.component'; + const issueRoutes: Routes = [ { path: '', diff --git a/overlord/src/app/issue/issue.component.html b/overlord/src/app/issue/issue.component.html index 2b75659d..a6997743 100644 --- a/overlord/src/app/issue/issue.component.html +++ b/overlord/src/app/issue/issue.component.html @@ -66,7 +66,7 @@ {{ @@ -142,7 +142,6 @@ Narration