diff options
Diffstat (limited to 'gae/frontend/src/app/menu/build/build.component.ts')
-rw-r--r-- | gae/frontend/src/app/menu/build/build.component.ts | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/gae/frontend/src/app/menu/build/build.component.ts b/gae/frontend/src/app/menu/build/build.component.ts new file mode 100644 index 0000000..e4c7325 --- /dev/null +++ b/gae/frontend/src/app/menu/build/build.component.ts @@ -0,0 +1,127 @@ +/** + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { MatSnackBar, MatTableDataSource, PageEvent } from '@angular/material'; + +import { AppService } from '../../appservice'; +import { Build } from '../../model/build'; +import { BuildService } from './build.service'; +import { FilterComponent } from '../../shared/filter/filter.component'; +import { FilterItem } from '../../model/filter_item'; +import { MenuBaseClass } from '../menu_base'; + + +/** Component that handles build menu. */ +@Component({ + selector: 'app-build', + templateUrl: './build.component.html', + providers: [ BuildService ], + styleUrls: ['./build.component.scss'], +}) +export class BuildComponent extends MenuBaseClass implements OnInit { + columnTitles = [ + '_index', + 'artifact_type', + 'manifest_branch', + 'build_id', + 'build_target', + 'build_type', + 'signed']; + dataSource = new MatTableDataSource<Build>(); + pageEvent: PageEvent; + appliedFilters: FilterItem[]; + + @ViewChild(FilterComponent) filterComponent: FilterComponent; + + constructor(private buildService: BuildService, + appService: AppService, + snackBar: MatSnackBar) { + super(appService, snackBar); + } + + ngOnInit(): void { + this.filterComponent.setSelectorList(Build); + this.getCount(); + this.getBuilds(this.pageSize, this.pageSize * this.pageIndex); + } + + /** Gets a total count of builds. */ + getCount(observer = this.getDefaultCountObservable()) { + const filterJSON = (this.appliedFilters) ? JSON.stringify(this.appliedFilters) : ''; + this.buildService.getCount(filterJSON).subscribe(observer); + } + + /** Gets builds. + * @param size A number, at most this many results will be returned. + * @param offset A Number of results to skip. + */ + getBuilds(size = 0, offset = 0) { + this.loading = true; + const filterJSON = (this.appliedFilters) ? JSON.stringify(this.appliedFilters) : ''; + this.buildService.getBuilds(size, offset, filterJSON, '', '') + .subscribe( + (response) => { + this.loading = false; + if (this.count >= 0) { + let length = 0; + if (response.builds) { + length = response.builds.length; + } + const total = length + offset; + if (response.has_next) { + if (length !== this.pageSize) { + this.showSnackbar('Received unexpected number of entities.'); + } else if (this.count <= total) { + this.getCount(); + } + } else { + if (this.count !== total) { + if (length !== this.count) { + this.getCount(); + } else if (this.count > total) { + const countObservable = this.getDefaultCountObservable([ + () => { + this.pageIndex = Math.floor(this.count / this.pageSize); + this.getBuilds(this.pageSize, this.pageSize * this.pageIndex); + } + ]); + this.getCount(countObservable); + } + } + } + } + this.dataSource.data = response.builds; + }, + (error) => this.showSnackbar(`[${error.status}] ${error.name}`) + ); + } + + /** Hooks a page event and handles properly. */ + onPageEvent(event: PageEvent) { + this.pageSize = event.pageSize; + this.pageIndex = event.pageIndex; + this.getBuilds(this.pageSize, this.pageSize * this.pageIndex); + return event; + } + + /** Applies a filter and get entities with it. */ + applyFilters(filters) { + this.pageIndex = 0; + this.appliedFilters = filters; + this.getCount(); + this.getBuilds(this.pageSize, this.pageSize * this.pageIndex); + } +} |