 6cdfa90941
			
		
	
	6cdfa90941
	
	
	
		
			
			* stable-2.16: Downport "Replace deprecated `require-jsdoc`, `valid-jsdoc` with jsdoc plugin for eslint" Downport "Add a shared pre-commit to run eslintfix for frontend code changes" Downport "Remove `|| exit 0` as eslint already supported correct exit code" Downport "Update eslint version and eslint rules" Downport "Simplify installing / running polylint" Downport "Make `npm start` run run-server.sh" Downport "Simplify installing / running template tests" Downport "Simplify installing and running eslint" Downport "Simplify running frontend tests via package.json" Change-Id: I53c03ca44eeec110c8a015cae7f6e095a869e89f
		
			
				
	
	
		
			185 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			185 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * @license
 | |
|  * Copyright (C) 2016 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.
 | |
|  */
 | |
| (function() {
 | |
|   'use strict';
 | |
| 
 | |
|   const Duration = {
 | |
|     HOUR: 1000 * 60 * 60,
 | |
|     DAY: 1000 * 60 * 60 * 24,
 | |
|   };
 | |
| 
 | |
|   const TimeFormats = {
 | |
|     TIME_12: 'h:mm A', // 2:14 PM
 | |
|     TIME_12_WITH_SEC: 'h:mm:ss A', // 2:14:00 PM
 | |
|     TIME_24: 'HH:mm', // 14:14
 | |
|     TIME_24_WITH_SEC: 'HH:mm:ss', // 14:14:00
 | |
|     MONTH_DAY: 'MMM DD', // Aug 29
 | |
|     MONTH_DAY_YEAR: 'MMM DD, YYYY', // Aug 29, 1997
 | |
|   };
 | |
| 
 | |
|   Polymer({
 | |
|     is: 'gr-date-formatter',
 | |
|     _legacyUndefinedCheck: true,
 | |
| 
 | |
|     properties: {
 | |
|       dateStr: {
 | |
|         type: String,
 | |
|         value: null,
 | |
|         notify: true,
 | |
|       },
 | |
|       showDateAndTime: {
 | |
|         type: Boolean,
 | |
|         value: false,
 | |
|       },
 | |
| 
 | |
|       /**
 | |
|        * When true, the detailed date appears in a GR-TOOLTIP rather than in the
 | |
|        * native browser tooltip.
 | |
|        */
 | |
|       hasTooltip: Boolean,
 | |
| 
 | |
|       /**
 | |
|        * The title to be used as the native tooltip or by the tooltip behavior.
 | |
|        */
 | |
|       title: {
 | |
|         type: String,
 | |
|         reflectToAttribute: true,
 | |
|         computed: '_computeFullDateStr(dateStr, _timeFormat)',
 | |
|       },
 | |
| 
 | |
|       _timeFormat: String, // No default value to prevent flickering.
 | |
|       _relative: Boolean, // No default value to prevent flickering.
 | |
|     },
 | |
| 
 | |
|     behaviors: [
 | |
|       Gerrit.TooltipBehavior,
 | |
|     ],
 | |
| 
 | |
|     attached() {
 | |
|       this._loadPreferences();
 | |
|     },
 | |
| 
 | |
|     _getUtcOffsetString() {
 | |
|       return ' UTC' + moment().format('Z');
 | |
|     },
 | |
| 
 | |
|     _loadPreferences() {
 | |
|       return this._getLoggedIn().then(loggedIn => {
 | |
|         if (!loggedIn) {
 | |
|           this._timeFormat = TimeFormats.TIME_24;
 | |
|           this._relative = false;
 | |
|           return;
 | |
|         }
 | |
|         return Promise.all([
 | |
|           this._loadTimeFormat(),
 | |
|           this._loadRelative(),
 | |
|         ]);
 | |
|       });
 | |
|     },
 | |
| 
 | |
|     _loadTimeFormat() {
 | |
|       return this._getPreferences().then(preferences => {
 | |
|         const timeFormat = preferences && preferences.time_format;
 | |
|         switch (timeFormat) {
 | |
|           case 'HHMM_12':
 | |
|             this._timeFormat = TimeFormats.TIME_12;
 | |
|             break;
 | |
|           case 'HHMM_24':
 | |
|             this._timeFormat = TimeFormats.TIME_24;
 | |
|             break;
 | |
|           default:
 | |
|             throw Error('Invalid time format: ' + timeFormat);
 | |
|         }
 | |
|       });
 | |
|     },
 | |
| 
 | |
|     _loadRelative() {
 | |
|       return this._getPreferences().then(prefs => {
 | |
|         // prefs.relative_date_in_change_table is not set when false.
 | |
|         this._relative = !!(prefs && prefs.relative_date_in_change_table);
 | |
|       });
 | |
|     },
 | |
| 
 | |
|     _getLoggedIn() {
 | |
|       return this.$.restAPI.getLoggedIn();
 | |
|     },
 | |
| 
 | |
|     _getPreferences() {
 | |
|       return this.$.restAPI.getPreferences();
 | |
|     },
 | |
| 
 | |
|     /**
 | |
|      * Return true if date is within 24 hours and on the same day.
 | |
|      */
 | |
|     _isWithinDay(now, date) {
 | |
|       const diff = -date.diff(now);
 | |
|       return diff < Duration.DAY && date.day() === now.getDay();
 | |
|     },
 | |
| 
 | |
|     /**
 | |
|      * Returns true if date is from one to six months.
 | |
|      */
 | |
|     _isWithinHalfYear(now, date) {
 | |
|       const diff = -date.diff(now);
 | |
|       return (date.day() !== now.getDay() || diff >= Duration.DAY) &&
 | |
|           diff < 180 * Duration.DAY;
 | |
|     },
 | |
| 
 | |
|     _computeDateStr(dateStr, timeFormat, relative, showDateAndTime) {
 | |
|       if (!dateStr) { return ''; }
 | |
|       const date = moment(util.parseDate(dateStr));
 | |
|       if (!date.isValid()) { return ''; }
 | |
|       if (relative) {
 | |
|         const dateFromNow = date.fromNow();
 | |
|         if (dateFromNow === 'a few seconds ago') {
 | |
|           return 'just now';
 | |
|         } else {
 | |
|           return dateFromNow;
 | |
|         }
 | |
|       }
 | |
|       const now = new Date();
 | |
|       let format = TimeFormats.MONTH_DAY_YEAR;
 | |
|       if (this._isWithinDay(now, date)) {
 | |
|         format = timeFormat;
 | |
|       } else {
 | |
|         if (this._isWithinHalfYear(now, date)) {
 | |
|           format = TimeFormats.MONTH_DAY;
 | |
|         }
 | |
|         if (this.showDateAndTime) {
 | |
|           format = `${format} ${timeFormat}`;
 | |
|         }
 | |
|       }
 | |
|       return date.format(format);
 | |
|     },
 | |
| 
 | |
|     _timeToSecondsFormat(timeFormat) {
 | |
|       return timeFormat === TimeFormats.TIME_12 ?
 | |
|         TimeFormats.TIME_12_WITH_SEC :
 | |
|         TimeFormats.TIME_24_WITH_SEC;
 | |
|     },
 | |
| 
 | |
|     _computeFullDateStr(dateStr, timeFormat) {
 | |
|       if (!dateStr) { return ''; }
 | |
|       const date = moment(util.parseDate(dateStr));
 | |
|       if (!date.isValid()) { return ''; }
 | |
|       let format = TimeFormats.MONTH_DAY_YEAR + ', ';
 | |
|       format += this._timeToSecondsFormat(timeFormat);
 | |
|       return date.format(format) + this._getUtcOffsetString();
 | |
|     },
 | |
|   });
 | |
| })();
 |