summaryrefslogtreecommitdiff
path: root/gae/frontend/src/app/menu/menu_base.ts
diff options
context:
space:
mode:
Diffstat (limited to 'gae/frontend/src/app/menu/menu_base.ts')
-rw-r--r--gae/frontend/src/app/menu/menu_base.ts79
1 files changed, 79 insertions, 0 deletions
diff --git a/gae/frontend/src/app/menu/menu_base.ts b/gae/frontend/src/app/menu/menu_base.ts
new file mode 100644
index 0000000..4d68f03
--- /dev/null
+++ b/gae/frontend/src/app/menu/menu_base.ts
@@ -0,0 +1,79 @@
+/**
+ * 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.
+ */
+
+/** This class defines and/or implements the common properties and methods
+ * used among menus.
+ */
+import { AppService } from '../appservice';
+import { MatSnackBar } from '@angular/material';
+import moment from 'moment-timezone';
+
+
+export abstract class MenuBaseClass {
+ count = -1;
+
+ loading = false;
+ pageSizeOptions = [20, 50, 100, 200];
+ pageSize = 100;
+ pageIndex = 0;
+
+ protected constructor(private appService: AppService,
+ public snackBar: MatSnackBar) {
+ this.appService.closeSideNav();
+ this.snackBar.dismiss();
+ }
+
+ /** Returns an Observable which handles a response of count API.
+ * @param additionalOperations A list of lambda functions.
+ */
+ getDefaultCountObservable(additionalOperations: any[] = []) {
+ return {
+ next: (response) => {
+ this.count = response.count;
+ for (const operation of additionalOperations) {
+ operation(response);
+ }
+ },
+ error: (error) => this.showSnackbar(`[${error.status}] ${error.name}`)
+ };
+ }
+
+ getRelativeTime(timeString) {
+ return (moment.tz(timeString, 'YYYY-MM-DDThh:mm:ss', 'UTC').isValid() ?
+ moment.tz(timeString, 'YYYY-MM-DDThh:mm:ss', 'UTC').fromNow() : '---');
+ }
+
+ /** Checks whether timeString is expired from current time. */
+ isExpired(timeString, hours=72) {
+ let currentTime = moment.tz(timeString, 'YYYY-MM-DDThh:mm:ss', 'UTC');
+ if (!currentTime.isValid()) { return false; }
+
+ let diff = moment().diff(currentTime);
+ let duration = moment.duration(diff);
+ return duration.asHours() > hours;
+ }
+
+ /** Displays a snackbar notification. */
+ showSnackbar(message = 'Error', duration = 5000) {
+ this.loading = false;
+ this.snackBar.open(message, 'DISMISS', {duration});
+ }
+
+ /** Displays a side nav window and lists all properties of selected entity. */
+ onShowDetailsClicked(entity) {
+ this.appService.showDetails(entity);
+ }
+}