diff --git a/brewman/views/auth/user.py b/brewman/views/auth/user.py index 2c3921d4..37a62cd6 100644 --- a/brewman/views/auth/user.py +++ b/brewman/views/auth/user.py @@ -104,7 +104,7 @@ class UserView(object): def user_info(self, id): if id is None: - account = {'name': '', 'lockedOut': False, 'groups': []} + account = {'name': '', 'lockedOut': False, 'lockedOut': False, 'groups': []} for item in self.request.dbsession.query(Group).order_by(Group.name).all(): account['groups'].append({'id': item.id, 'name': item.name, 'enabled': False}) return account diff --git a/overlord/package.json b/overlord/package.json index 7fd4098d..3f4a0b02 100644 --- a/overlord/package.json +++ b/overlord/package.json @@ -11,47 +11,47 @@ }, "private": true, "dependencies": { - "@angular/animations": "^6.0.3", - "@angular/cdk": "^6.1.0", - "@angular/common": "^6.0.3", - "@angular/compiler": "^6.0.3", - "@angular/core": "^6.0.3", - "@angular/flex-layout": "^6.0.0-beta.15", - "@angular/forms": "^6.0.3", - "@angular/http": "^6.0.3", - "@angular/material": "^6.1.0", - "@angular/material-moment-adapter": "^6.1.0", - "@angular/platform-browser": "^6.0.3", - "@angular/platform-browser-dynamic": "^6.0.3", - "@angular/router": "^6.0.3", - "@ngx-loading-bar/http-client": "^2.1.0", - "@ngx-loading-bar/router": "^2.1.0", - "core-js": "^2.5.4", - "mathjs": "^5.0.0", - "moment": "^2.22.1", - "rxjs": "^6.2.0", + "@angular/animations": "^6.1.0", + "@angular/cdk": "^6.4.1", + "@angular/common": "^6.1.0", + "@angular/compiler": "^6.1.0", + "@angular/core": "^6.1.0", + "@angular/flex-layout": "^6.0.0-beta.17", + "@angular/forms": "^6.1.0", + "@angular/http": "^6.1.0", + "@angular/material": "^6.4.1", + "@angular/material-moment-adapter": "^6.4.1", + "@angular/platform-browser": "^6.1.0", + "@angular/platform-browser-dynamic": "^6.1.0", + "@angular/router": "^6.1.0", + "@ngx-loading-bar/http-client": "^2.1.2", + "@ngx-loading-bar/router": "^2.1.2", + "core-js": "^2.5.7", + "mathjs": "^5.0.4", + "moment": "^2.22.2", + "rxjs": "^6.2.2", "zone.js": "^0.8.26" }, "devDependencies": { - "@angular-devkit/build-angular": "~0.6.0", - "@angular/cli": "~6.0.0", - "@angular/compiler-cli": "^6.0.3", - "@angular/language-service": "^6.0.3", - "@types/jasmine": "~2.8.6", - "@types/jasminewd2": "~2.0.3", - "@types/node": "~8.9.4", - "codelyzer": "~4.2.1", - "jasmine-core": "~2.99.1", - "jasmine-spec-reporter": "~4.2.1", - "karma": "~1.7.1", - "karma-chrome-launcher": "~2.2.0", - "karma-coverage-istanbul-reporter": "~1.4.2", - "karma-jasmine": "~1.1.1", - "karma-jasmine-html-reporter": "^0.2.2", - "protractor": "~5.3.0", + "@angular-devkit/build-angular": "^0.7.1", + "@angular/cli": "^6.1.1", + "@angular/compiler-cli": "^6.1.0", + "@angular/language-service": "^6.1.0", + "@types/jasmine": "^2.8.8", + "@types/jasminewd2": "^2.0.3", + "@types/node": "^10.5.4", + "codelyzer": "^4.4.2", + "jasmine-core": "^3.1.0", + "jasmine-spec-reporter": "^4.2.1", + "karma": "^2.0.5", + "karma-chrome-launcher": "^2.2.0", + "karma-coverage-istanbul-reporter": "^2.0.1", + "karma-jasmine": "^1.1.2", + "karma-jasmine-html-reporter": "^1.2.0", + "protractor": "^5.4.0", "standard-version": "^4.4.0", - "ts-node": "~5.0.1", - "tslint": "~5.9.1", - "typescript": "~2.7.2" + "ts-node": "^7.0.0", + "tslint": "^5.11.0", + "typescript": "^2.9.2" } } diff --git a/overlord/src/app/product/product-list/product-list.component.html b/overlord/src/app/product/product-list/product-list.component.html index 3a3b3fa9..81e8e090 100644 --- a/overlord/src/app/product/product-list/product-list.component.html +++ b/overlord/src/app/product/product-list/product-list.component.html @@ -1,6 +1,9 @@ Products + add_box Add @@ -77,7 +80,7 @@ [length]="dataSource.data.length" [pageIndex]="0" [pageSize]="50" - [pageSizeOptions]="[25, 50, 100, 250]"> + [pageSizeOptions]="[25, 50, 100, 250, 5000]"> diff --git a/overlord/src/app/product/product-list/product-list.component.ts b/overlord/src/app/product/product-list/product-list.component.ts index f2931aa6..dd0eb7e8 100644 --- a/overlord/src/app/product/product-list/product-list.component.ts +++ b/overlord/src/app/product/product-list/product-list.component.ts @@ -6,6 +6,7 @@ import {ActivatedRoute} from '@angular/router'; import {debounceTime, distinctUntilChanged, startWith} from 'rxjs/operators'; import {FormBuilder, FormGroup} from '@angular/forms'; import {Observable} from 'rxjs'; +import {ToCsvService} from "../../shared/to-csv.service"; @Component({ selector: 'app-product-list', @@ -23,7 +24,7 @@ export class ProductListComponent implements OnInit, AfterViewInit { /** Columns displayed in the table. Columns IDs can be added, removed, or reordered. */ displayedColumns: string[]; - constructor(private route: ActivatedRoute, private fb: FormBuilder) { + constructor(private route: ActivatedRoute, private fb: FormBuilder, private toCsv: ToCsvService) { this.showExtended = false; this.createForm(); this.filter = this.listenToFilterChange(); @@ -73,4 +74,24 @@ export class ProductListComponent implements OnInit, AfterViewInit { } } + exportCsv() { + const headers = { + Code: 'code', + Name: 'name', + Units: 'units', + Fraction: 'fraction', + FractionUnits: 'fractionUnits', + CostPrice: 'costPrice', + Yield: 'yield', + ProductGroup: 'productGroup' + }; + + const csvData = new Blob([this.toCsv.toCsv(headers, this.dataSource.data)], {type: 'text/csv;charset=utf-8;'}); + const link = document.createElement('a'); + link.href = window.URL.createObjectURL(csvData); + link.setAttribute('download', 'products.csv'); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } } diff --git a/overlord/src/app/shared/local-time.pipe.ts b/overlord/src/app/shared/local-time.pipe.ts index 597c068b..acd61a20 100644 --- a/overlord/src/app/shared/local-time.pipe.ts +++ b/overlord/src/app/shared/local-time.pipe.ts @@ -10,7 +10,7 @@ export class LocalTimePipe implements PipeTransform { if (value === undefined) { return ''; } - return moment(value, 'DD-MMM-YYYY HH:mm').subtract(new Date().getTimezoneOffset(), 'seconds').format('DD-MMM-YYYY HH:mm'); + return moment(value, 'DD-MMM-YYYY HH:mm').subtract(new Date().getTimezoneOffset(), 'minutes').format('DD-MMM-YYYY HH:mm'); } } diff --git a/overlord/src/app/user/user-detail/user-detail.component.ts b/overlord/src/app/user/user-detail/user-detail.component.ts index ce262b70..8d729917 100644 --- a/overlord/src/app/user/user-detail/user-detail.component.ts +++ b/overlord/src/app/user/user-detail/user-detail.component.ts @@ -7,6 +7,7 @@ import {ToasterService} from '../../core/toaster.service'; import {ConfirmDialogComponent} from '../../shared/confirm-dialog/confirm-dialog.component'; import {MatDialog} from '@angular/material'; import {FormArray, FormBuilder, FormGroup} from '@angular/forms'; +import {Account} from "../../account/account"; @Component({ selector: 'app-user-detail', @@ -43,18 +44,25 @@ export class UserDetailComponent implements OnInit, AfterViewInit { ngOnInit() { this.route.data .subscribe((data: { item: User }) => { - this.item = data.item; - this.form.get('name').setValue(this.item.name); - this.form.setControl('groups', this.fb.array( - this.item.groups.map( - x => this.fb.group({ - group: x.enabled - }) - ) - )); + this.showItem(data.item); }); } + showItem(item: User) { + this.item = item; + this.form.get('name').setValue(item.name); + this.form.get('password').setValue(''); + this.form.get('lockedOut').setValue(item.lockedOut); + this.form.setControl('groups', this.fb.array( + item.groups.map( + x => this.fb.group({ + group: x.enabled + }) + ) + )); + } + + ngAfterViewInit() { setTimeout(() => { this.nameElement.nativeElement.focus(); @@ -103,7 +111,7 @@ export class UserDetailComponent implements OnInit, AfterViewInit { getItem(): User { const formModel = this.form.value; this.item.name = formModel.name; - this.item.password = formModel.password``; + this.item.password = formModel.password; this.item.lockedOut = formModel.lockedOut; const array = this.form.get('groups') as FormArray; this.item.groups.forEach((item, index) => { diff --git a/overlord/src/app/user/user-list/user-list.component.html b/overlord/src/app/user/user-list/user-list.component.html index af3bab9b..5657bc42 100644 --- a/overlord/src/app/user/user-list/user-list.component.html +++ b/overlord/src/app/user/user-list/user-list.component.html @@ -1,6 +1,10 @@ Users + + add_box + Add + diff --git a/requirements.txt b/requirements.txt index 75404471..7ef9947b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,5 +3,5 @@ waitress transaction zope.sqlalchemy SQLAlchemy -psycopg2 +psycopg2-binary