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