summaryrefslogtreecommitdiffstats
path: root/src/pybind/mgr/dashboard/frontend/src/app/shared/pipes/relative-date.pipe.ts
blob: f802b6b2add174a0124dad8eb1a20c3bc9b7b24c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import { Pipe, PipeTransform } from '@angular/core';

import _ from 'lodash';
import moment from 'moment';

moment.updateLocale('en', {
  relativeTime: {
    future: $localize`in %s`,
    past: $localize`%s ago`,
    s: $localize`a few seconds`,
    ss: $localize`%d seconds`,
    m: $localize`a minute`,
    mm: $localize`%d minutes`,
    h: $localize`an hour`,
    hh: $localize`%d hours`,
    d: $localize`a day`,
    dd: $localize`%d days`,
    w: $localize`a week`,
    ww: $localize`%d weeks`,
    M: $localize`a month`,
    MM: $localize`%d months`,
    y: $localize`a year`,
    yy: $localize`%d years`
  }
});

@Pipe({
  name: 'relativeDate',
  pure: false
})
export class RelativeDatePipe implements PipeTransform {
  /**
   * Convert a time into a human readable form, e.g. '2 minutes ago'.
   * @param {Date | string | number} value The date to convert, should be
   *   an ISO8601 string, an Unix timestamp (seconds) or Date object.
   * @param {boolean} upperFirst Set to `true` to start the sentence
   *   upper case. Defaults to `true`.
   * @return {string} The time in human readable form or an empty string
   *   on failure (e.g. invalid input).
   */
  transform(value: Date | string | number, upperFirst = true): string {
    let date: moment.Moment;
    if (_.isNumber(value)) {
      date = moment.unix(value);
    } else {
      date = moment(value);
    }
    if (!date.isValid()) {
      return '';
    }
    let relativeDate: string = date.fromNow();
    if (upperFirst) {
      relativeDate = _.upperFirst(relativeDate);
    }
    return relativeDate;
  }
}