avvir 0.4.17 → 0.4.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1745,50 +1745,26 @@ var Config = {
1745
1745
  "use strict";
1746
1746
  __webpack_require__.r(__webpack_exports__);
1747
1747
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1748
- /* harmony export */ "DateFormatter": () => (/* binding */ DateFormatter),
1749
1748
  /* harmony export */ "DateConverter": () => (/* binding */ DateConverter),
1750
1749
  /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1751
1750
  /* harmony export */ });
1752
1751
  /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2245);
1753
1752
  /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_0__);
1753
+ /* harmony import */ var _date_formatter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2228);
1754
1754
 
1755
- var DateFormatter = /** @class */ (function () {
1756
- function DateFormatter(format) {
1757
- this.formatString = format;
1758
- }
1759
- DateFormatter.prototype.format = function (date) {
1760
- if (date) {
1761
- return moment__WEBPACK_IMPORTED_MODULE_0___default()(date).format(this.formatString);
1762
- }
1763
- else {
1764
- return "";
1765
- }
1766
- };
1767
- return DateFormatter;
1768
- }());
1769
1755
 
1770
1756
  var DateConverter = /** @class */ (function () {
1771
1757
  function DateConverter() {
1772
1758
  }
1773
- DateConverter.getDateFormatter = function (format) {
1774
- return new DateFormatter(format);
1759
+ DateConverter.getLocalizedDateFormatter = function () {
1760
+ return new _date_formatter__WEBPACK_IMPORTED_MODULE_1__["default"]("l");
1761
+ };
1762
+ DateConverter.getDateFormatter = function (format, secondaryFormat) {
1763
+ return new _date_formatter__WEBPACK_IMPORTED_MODULE_1__["default"](format, secondaryFormat);
1775
1764
  };
1776
1765
  DateConverter.dateToText = function (date, format) {
1777
1766
  if (date instanceof Date) {
1778
- if (format) {
1779
- return moment__WEBPACK_IMPORTED_MODULE_0___default()(date).format(format);
1780
- }
1781
- else {
1782
- return "last scanned: " + moment__WEBPACK_IMPORTED_MODULE_0___default()(date).format("MMM D, YYYY");
1783
- }
1784
- }
1785
- else if (moment__WEBPACK_IMPORTED_MODULE_0___default().isMoment(date)) {
1786
- if (format) {
1787
- return date.format(format);
1788
- }
1789
- else {
1790
- return "last scanned: " + date.format("MMM D, YYYY");
1791
- }
1767
+ return moment__WEBPACK_IMPORTED_MODULE_0___default()(date).format(format);
1792
1768
  }
1793
1769
  else {
1794
1770
  return "";
@@ -1797,37 +1773,40 @@ var DateConverter = /** @class */ (function () {
1797
1773
  DateConverter.instantToDate = function (instant) {
1798
1774
  if (typeof instant === "number") {
1799
1775
  var epochMillis = instant * 1000;
1800
- return moment__WEBPACK_IMPORTED_MODULE_0___default()(epochMillis).toDate();
1776
+ return new Date(epochMillis);
1801
1777
  }
1802
1778
  else {
1803
1779
  return null;
1804
1780
  }
1805
1781
  };
1806
- DateConverter.dateToISO = function (date) {
1807
- if (date == null) {
1808
- return "";
1782
+ DateConverter.dateToInstant = function (date) {
1783
+ if (date instanceof Date) {
1784
+ return date.getTime() / 1000;
1809
1785
  }
1810
- else if (date instanceof Date || moment__WEBPACK_IMPORTED_MODULE_0___default().isMoment(date)) {
1811
- return date.toISOString();
1786
+ else {
1787
+ return null;
1812
1788
  }
1813
- return date + "";
1814
1789
  };
1815
- DateConverter.dateToInstant = function (date) {
1790
+ DateConverter.localDateToMoment = function (localDate) {
1791
+ if (this.isValidDateString(localDate)) {
1792
+ return moment__WEBPACK_IMPORTED_MODULE_0___default()(localDate);
1793
+ }
1794
+ return null;
1795
+ };
1796
+ DateConverter.dateToLocalDate = function (date) {
1816
1797
  if (date instanceof Date) {
1817
- var epochMillis = moment__WEBPACK_IMPORTED_MODULE_0___default()(date).utc(false).toDate().valueOf();
1818
- return epochMillis / 1000;
1798
+ return date.toISOString().substring(0, 10);
1819
1799
  }
1820
- else if (moment__WEBPACK_IMPORTED_MODULE_0___default().isMoment(date) && date.isValid()) {
1821
- var epochMillis = date.utc(false).toDate().valueOf();
1822
- return epochMillis / 1000;
1800
+ else if (moment__WEBPACK_IMPORTED_MODULE_0___default().isMoment(date)) {
1801
+ return moment__WEBPACK_IMPORTED_MODULE_0___default()(date).format("YYYY-MM-DD");
1823
1802
  }
1824
1803
  else {
1825
1804
  return null;
1826
1805
  }
1827
1806
  };
1828
1807
  DateConverter.millisecondsToDate = function (epochMillis) {
1829
- if (epochMillis || epochMillis === 0) {
1830
- return moment__WEBPACK_IMPORTED_MODULE_0___default()(epochMillis).toDate();
1808
+ if (typeof epochMillis === "number") {
1809
+ return new Date(epochMillis);
1831
1810
  }
1832
1811
  else {
1833
1812
  return null;
@@ -1836,20 +1815,134 @@ var DateConverter = /** @class */ (function () {
1836
1815
  DateConverter.isValidDate = function (value) {
1837
1816
  return (value instanceof Date && !isNaN(value.valueOf())) || value === null;
1838
1817
  };
1818
+ DateConverter.isValidDateString = function (value) {
1819
+ return (typeof value === "string")
1820
+ && !!value.match(/^\d{4}-\d{2}-\d{2}$/);
1821
+ };
1839
1822
  DateConverter.tsvStringToDate = function (dateString) {
1840
- if (dateString) {
1823
+ if (typeof dateString === "string") {
1841
1824
  return moment__WEBPACK_IMPORTED_MODULE_0___default()(dateString, "MM/DD/YYYY").toDate();
1842
1825
  }
1843
1826
  else {
1844
1827
  return null;
1845
1828
  }
1846
1829
  };
1830
+ /**
1831
+ * truncate 2 dates to days and compare
1832
+ * @param date1
1833
+ * @param date2
1834
+ * @returns true when date2 is on or after the day of date1;
1835
+ * false if either date1 or date2 is null
1836
+ */
1837
+ DateConverter.isOnOrAfterDay = function (date1, date2) {
1838
+ if (date1 == null || date2 == null) {
1839
+ return false;
1840
+ }
1841
+ return this.dateToString(date1) <= this.dateToString(date2);
1842
+ };
1843
+ /**
1844
+ * truncate 2 dates to days and compare
1845
+ * @param date1
1846
+ * @param date2
1847
+ * @returns true when date2 is on the same day as date1
1848
+ */
1849
+ DateConverter.isOnDay = function (date1, date2) {
1850
+ if (date1 == null || date2 == null) {
1851
+ return false;
1852
+ }
1853
+ return this.dateToString(date1) === this.dateToString(date2);
1854
+ };
1855
+ DateConverter.dateToString = function (date) {
1856
+ if (date instanceof Date) {
1857
+ return this.pad(date.getUTCFullYear()) + "-" + this.pad(date.getUTCMonth() + 1) + "-" + this.pad(date.getUTCDate());
1858
+ }
1859
+ if (this.isValidDateString(date)) {
1860
+ return date;
1861
+ }
1862
+ throw new TypeError("Expected date to be a Date or string");
1863
+ };
1864
+ DateConverter.dateToISO = function (date) {
1865
+ if (date == null) {
1866
+ return "";
1867
+ }
1868
+ else if (date instanceof Date || moment__WEBPACK_IMPORTED_MODULE_0___default().isMoment(date)) {
1869
+ return date.toISOString();
1870
+ }
1871
+ return date + "";
1872
+ };
1873
+ DateConverter.pad = function (i) {
1874
+ return i.toString().padStart(2, "0");
1875
+ };
1847
1876
  return DateConverter;
1848
1877
  }());
1849
1878
 
1850
1879
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (DateConverter);
1851
1880
 
1852
1881
 
1882
+ /***/ }),
1883
+
1884
+ /***/ 2228:
1885
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1886
+
1887
+ "use strict";
1888
+ __webpack_require__.r(__webpack_exports__);
1889
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1890
+ /* harmony export */ "DateFormatter": () => (/* binding */ DateFormatter),
1891
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1892
+ /* harmony export */ });
1893
+ /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2245);
1894
+ /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_0__);
1895
+
1896
+ var DateFormatter = /** @class */ (function () {
1897
+ function DateFormatter(format, secondaryFormat) {
1898
+ this.formatString = format;
1899
+ this.secondaryFormat = secondaryFormat;
1900
+ }
1901
+ /** Use formatLocal when displaying times relative to the user i.e. when
1902
+ * somebody else replied to their comment, or when a file was uploaded. */
1903
+ DateFormatter.prototype.formatLocal = function (date) {
1904
+ if (date) {
1905
+ return moment__WEBPACK_IMPORTED_MODULE_0___default()(date).format(this.formatString);
1906
+ }
1907
+ else {
1908
+ return "";
1909
+ }
1910
+ };
1911
+ /** Use formatUTC when all users should see the same information, regardless
1912
+ * of their geographical location. i.e. dates pertaining to what happened on
1913
+ * the job site */
1914
+ DateFormatter.prototype.formatUTC = function (date) {
1915
+ if (date) {
1916
+ return moment__WEBPACK_IMPORTED_MODULE_0___default()(date).utc().format(this.formatString);
1917
+ }
1918
+ else {
1919
+ return "";
1920
+ }
1921
+ };
1922
+ DateFormatter.prototype.formatRangeLocal = function (startDate, endDate) {
1923
+ var formatted = this.formatLocal(startDate);
1924
+ if (endDate != null) {
1925
+ formatted += " - ";
1926
+ var endMoment = moment__WEBPACK_IMPORTED_MODULE_0___default()(endDate);
1927
+ if (this.secondaryFormat
1928
+ && moment__WEBPACK_IMPORTED_MODULE_0___default()(startDate).isSame(endMoment, "day")) {
1929
+ formatted += endMoment.format(this.secondaryFormat);
1930
+ }
1931
+ else {
1932
+ formatted += this.formatLocal(endDate);
1933
+ }
1934
+ }
1935
+ return formatted;
1936
+ };
1937
+ DateFormatter.prototype.parseUTC = function (date) {
1938
+ return moment__WEBPACK_IMPORTED_MODULE_0___default().utc(date, this.formatString).toDate();
1939
+ };
1940
+ return DateFormatter;
1941
+ }());
1942
+
1943
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (DateFormatter);
1944
+
1945
+
1853
1946
  /***/ }),
1854
1947
 
1855
1948
  /***/ 6781:
@@ -1859,17 +1952,19 @@ var DateConverter = /** @class */ (function () {
1859
1952
  __webpack_require__.r(__webpack_exports__);
1860
1953
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1861
1954
  /* harmony export */ "DateConverter": () => (/* reexport safe */ _date_converter__WEBPACK_IMPORTED_MODULE_0__.DateConverter),
1862
- /* harmony export */ "DateFormatter": () => (/* reexport safe */ _date_converter__WEBPACK_IMPORTED_MODULE_0__.DateFormatter),
1863
- /* harmony export */ "kebabCase": () => (/* reexport safe */ _kebab_case__WEBPACK_IMPORTED_MODULE_1__.kebabCase),
1864
- /* harmony export */ "Matrix3Converter": () => (/* reexport safe */ _matrix_3_converter__WEBPACK_IMPORTED_MODULE_2__.Matrix3Converter),
1865
- /* harmony export */ "Matrix4Converter": () => (/* reexport safe */ _matrix_4_converter__WEBPACK_IMPORTED_MODULE_3__.Matrix4Converter),
1866
- /* harmony export */ "PurposeTypeConverter": () => (/* reexport safe */ _purpose_type_converter__WEBPACK_IMPORTED_MODULE_4__.PurposeTypeConverter)
1955
+ /* harmony export */ "DateFormatter": () => (/* reexport safe */ _date_formatter__WEBPACK_IMPORTED_MODULE_1__.DateFormatter),
1956
+ /* harmony export */ "kebabCase": () => (/* reexport safe */ _kebab_case__WEBPACK_IMPORTED_MODULE_2__.kebabCase),
1957
+ /* harmony export */ "Matrix3Converter": () => (/* reexport safe */ _matrix_3_converter__WEBPACK_IMPORTED_MODULE_3__.Matrix3Converter),
1958
+ /* harmony export */ "Matrix4Converter": () => (/* reexport safe */ _matrix_4_converter__WEBPACK_IMPORTED_MODULE_4__.Matrix4Converter),
1959
+ /* harmony export */ "PurposeTypeConverter": () => (/* reexport safe */ _purpose_type_converter__WEBPACK_IMPORTED_MODULE_5__.PurposeTypeConverter)
1867
1960
  /* harmony export */ });
1868
1961
  /* harmony import */ var _date_converter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2024);
1869
- /* harmony import */ var _kebab_case__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5519);
1870
- /* harmony import */ var _matrix_3_converter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(28);
1871
- /* harmony import */ var _matrix_4_converter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(2908);
1872
- /* harmony import */ var _purpose_type_converter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(6154);
1962
+ /* harmony import */ var _date_formatter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2228);
1963
+ /* harmony import */ var _kebab_case__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(5519);
1964
+ /* harmony import */ var _matrix_3_converter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(28);
1965
+ /* harmony import */ var _matrix_4_converter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(2908);
1966
+ /* harmony import */ var _purpose_type_converter__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(6154);
1967
+
1873
1968
 
1874
1969
 
1875
1970
 
@@ -2382,11 +2477,20 @@ function addInstantGetterAndSetterToApiModel(modelInstance, propertyName, initia
2382
2477
  },
2383
2478
  set: function (val) {
2384
2479
  if (typeof val === "string") {
2385
- dateVal = _converters_date_converter__WEBPACK_IMPORTED_MODULE_1__["default"].dateToInstant(moment__WEBPACK_IMPORTED_MODULE_0___default()(val, "MMM D, YYYY").utc(true));
2480
+ var date = moment__WEBPACK_IMPORTED_MODULE_0___default()(val, "MMM D, YYYY").utc(true).toDate();
2481
+ if (_converters_date_converter__WEBPACK_IMPORTED_MODULE_1__["default"].isValidDate(date)) {
2482
+ dateVal = _converters_date_converter__WEBPACK_IMPORTED_MODULE_1__["default"].dateToInstant(date);
2483
+ }
2484
+ else {
2485
+ dateVal = null;
2486
+ }
2386
2487
  }
2387
- else if (val instanceof Date || moment__WEBPACK_IMPORTED_MODULE_0___default().isMoment(val)) {
2488
+ else if (val instanceof Date) {
2388
2489
  dateVal = _converters_date_converter__WEBPACK_IMPORTED_MODULE_1__["default"].dateToInstant(val);
2389
2490
  }
2491
+ else if (moment__WEBPACK_IMPORTED_MODULE_0___default().isMoment(val)) {
2492
+ dateVal = _converters_date_converter__WEBPACK_IMPORTED_MODULE_1__["default"].dateToInstant(val.toDate());
2493
+ }
2390
2494
  else {
2391
2495
  dateVal = val;
2392
2496
  }
@@ -6345,6 +6449,7 @@ var map = {
6345
6449
  "./avvir_api.ts": 5489,
6346
6450
  "./config.ts": 5508,
6347
6451
  "./converters/date_converter.ts": 2024,
6452
+ "./converters/date_formatter.ts": 2228,
6348
6453
  "./converters/index.ts": 6781,
6349
6454
  "./converters/kebab_case.ts": 5519,
6350
6455
  "./converters/matrix_3_converter.ts": 28,
@@ -1,18 +1,35 @@
1
1
  import { Moment } from "moment";
2
+ import DateFormatter from "./date_formatter";
2
3
  import { DateLike } from "../models";
3
- export declare class DateFormatter {
4
- constructor(format: string);
5
- format(date?: Date): string;
6
- private readonly formatString;
7
- }
8
4
  export declare class DateConverter {
9
- static getDateFormatter(format: string): DateFormatter;
10
- static dateToText(date: Date | Moment, format?: string): string;
5
+ static getLocalizedDateFormatter(): DateFormatter;
6
+ static getDateFormatter(format: string, secondaryFormat?: string): DateFormatter;
7
+ static dateToText(date: Date, format: string): string;
11
8
  static instantToDate(instant: number): Date | null;
12
- static dateToISO(date: DateLike): string;
13
- static dateToInstant(date: Date | Moment): number | null;
9
+ static dateToInstant(date: Date): number | null;
10
+ static localDateToMoment(localDate: string): Moment | null;
11
+ static dateToLocalDate(date: DateLike): string;
14
12
  static millisecondsToDate(epochMillis: number): Date | null;
15
13
  static isValidDate(value: any): boolean;
16
- static tsvStringToDate(dateString: any): Date;
14
+ static isValidDateString(value: string): boolean;
15
+ static tsvStringToDate(dateString: string): Date;
16
+ /**
17
+ * truncate 2 dates to days and compare
18
+ * @param date1
19
+ * @param date2
20
+ * @returns true when date2 is on or after the day of date1;
21
+ * false if either date1 or date2 is null
22
+ */
23
+ static isOnOrAfterDay(date1: Date | string, date2: Date | string): boolean;
24
+ /**
25
+ * truncate 2 dates to days and compare
26
+ * @param date1
27
+ * @param date2
28
+ * @returns true when date2 is on the same day as date1
29
+ */
30
+ static isOnDay(date1: Date | string, date2: Date | string): boolean;
31
+ private static dateToString;
32
+ static dateToISO(date: DateLike): string;
33
+ private static pad;
17
34
  }
18
35
  export default DateConverter;
@@ -1,37 +1,15 @@
1
1
  import moment from "moment";
2
- export class DateFormatter {
3
- constructor(format) {
4
- this.formatString = format;
5
- }
6
- format(date) {
7
- if (date) {
8
- return moment(date).format(this.formatString);
9
- }
10
- else {
11
- return "";
12
- }
13
- }
14
- }
2
+ import DateFormatter from "./date_formatter";
15
3
  export class DateConverter {
16
- static getDateFormatter(format) {
17
- return new DateFormatter(format);
4
+ static getLocalizedDateFormatter() {
5
+ return new DateFormatter("l");
6
+ }
7
+ static getDateFormatter(format, secondaryFormat) {
8
+ return new DateFormatter(format, secondaryFormat);
18
9
  }
19
10
  static dateToText(date, format) {
20
11
  if (date instanceof Date) {
21
- if (format) {
22
- return moment(date).format(format);
23
- }
24
- else {
25
- return `last scanned: ${moment(date).format("MMM D, YYYY")}`;
26
- }
27
- }
28
- else if (moment.isMoment(date)) {
29
- if (format) {
30
- return date.format(format);
31
- }
32
- else {
33
- return `last scanned: ${date.format("MMM D, YYYY")}`;
34
- }
12
+ return moment(date).format(format);
35
13
  }
36
14
  else {
37
15
  return "";
@@ -40,37 +18,40 @@ export class DateConverter {
40
18
  static instantToDate(instant) {
41
19
  if (typeof instant === "number") {
42
20
  const epochMillis = instant * 1000;
43
- return moment(epochMillis).toDate();
21
+ return new Date(epochMillis);
44
22
  }
45
23
  else {
46
24
  return null;
47
25
  }
48
26
  }
49
- static dateToISO(date) {
50
- if (date == null) {
51
- return "";
27
+ static dateToInstant(date) {
28
+ if (date instanceof Date) {
29
+ return date.getTime() / 1000;
52
30
  }
53
- else if (date instanceof Date || moment.isMoment(date)) {
54
- return date.toISOString();
31
+ else {
32
+ return null;
55
33
  }
56
- return date + "";
57
34
  }
58
- static dateToInstant(date) {
35
+ static localDateToMoment(localDate) {
36
+ if (this.isValidDateString(localDate)) {
37
+ return moment(localDate);
38
+ }
39
+ return null;
40
+ }
41
+ static dateToLocalDate(date) {
59
42
  if (date instanceof Date) {
60
- const epochMillis = moment(date).utc(false).toDate().valueOf();
61
- return epochMillis / 1000;
43
+ return date.toISOString().substring(0, 10);
62
44
  }
63
- else if (moment.isMoment(date) && date.isValid()) {
64
- const epochMillis = date.utc(false).toDate().valueOf();
65
- return epochMillis / 1000;
45
+ else if (moment.isMoment(date)) {
46
+ return moment(date).format("YYYY-MM-DD");
66
47
  }
67
48
  else {
68
49
  return null;
69
50
  }
70
51
  }
71
52
  static millisecondsToDate(epochMillis) {
72
- if (epochMillis || epochMillis === 0) {
73
- return moment(epochMillis).toDate();
53
+ if (typeof epochMillis === "number") {
54
+ return new Date(epochMillis);
74
55
  }
75
56
  else {
76
57
  return null;
@@ -79,14 +60,64 @@ export class DateConverter {
79
60
  static isValidDate(value) {
80
61
  return (value instanceof Date && !isNaN(value.valueOf())) || value === null;
81
62
  }
63
+ static isValidDateString(value) {
64
+ return (typeof value === "string")
65
+ && !!value.match(/^\d{4}-\d{2}-\d{2}$/);
66
+ }
82
67
  static tsvStringToDate(dateString) {
83
- if (dateString) {
68
+ if (typeof dateString === "string") {
84
69
  return moment(dateString, "MM/DD/YYYY").toDate();
85
70
  }
86
71
  else {
87
72
  return null;
88
73
  }
89
74
  }
75
+ /**
76
+ * truncate 2 dates to days and compare
77
+ * @param date1
78
+ * @param date2
79
+ * @returns true when date2 is on or after the day of date1;
80
+ * false if either date1 or date2 is null
81
+ */
82
+ static isOnOrAfterDay(date1, date2) {
83
+ if (date1 == null || date2 == null) {
84
+ return false;
85
+ }
86
+ return this.dateToString(date1) <= this.dateToString(date2);
87
+ }
88
+ /**
89
+ * truncate 2 dates to days and compare
90
+ * @param date1
91
+ * @param date2
92
+ * @returns true when date2 is on the same day as date1
93
+ */
94
+ static isOnDay(date1, date2) {
95
+ if (date1 == null || date2 == null) {
96
+ return false;
97
+ }
98
+ return this.dateToString(date1) === this.dateToString(date2);
99
+ }
100
+ static dateToString(date) {
101
+ if (date instanceof Date) {
102
+ return `${this.pad(date.getUTCFullYear())}-${this.pad(date.getUTCMonth() + 1)}-${this.pad(date.getUTCDate())}`;
103
+ }
104
+ if (this.isValidDateString(date)) {
105
+ return date;
106
+ }
107
+ throw new TypeError("Expected date to be a Date or string");
108
+ }
109
+ static dateToISO(date) {
110
+ if (date == null) {
111
+ return "";
112
+ }
113
+ else if (date instanceof Date || moment.isMoment(date)) {
114
+ return date.toISOString();
115
+ }
116
+ return date + "";
117
+ }
118
+ static pad(i) {
119
+ return i.toString().padStart(2, "0");
120
+ }
90
121
  }
91
122
  export default DateConverter;
92
123
  //# sourceMappingURL=date_converter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"date_converter.js","sourceRoot":"","sources":["../../../source/converters/date_converter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"date_converter.js","sourceRoot":"","sources":["../../../source/converters/date_converter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import moment from "moment";
2
+ export declare class DateFormatter {
3
+ constructor(format: string, secondaryFormat?: string);
4
+ /** Use formatLocal when displaying times relative to the user i.e. when
5
+ * somebody else replied to their comment, or when a file was uploaded. */
6
+ formatLocal(date: Date): string;
7
+ /** Use formatUTC when all users should see the same information, regardless
8
+ * of their geographical location. i.e. dates pertaining to what happened on
9
+ * the job site */
10
+ formatUTC(date: moment.MomentInput): string;
11
+ formatRangeLocal(startDate: Date, endDate?: Date): string;
12
+ parseUTC(date: string | null): Date;
13
+ private readonly formatString;
14
+ private readonly secondaryFormat?;
15
+ }
16
+ export default DateFormatter;
@@ -0,0 +1,48 @@
1
+ import moment from "moment";
2
+ export class DateFormatter {
3
+ constructor(format, secondaryFormat) {
4
+ this.formatString = format;
5
+ this.secondaryFormat = secondaryFormat;
6
+ }
7
+ /** Use formatLocal when displaying times relative to the user i.e. when
8
+ * somebody else replied to their comment, or when a file was uploaded. */
9
+ formatLocal(date) {
10
+ if (date) {
11
+ return moment(date).format(this.formatString);
12
+ }
13
+ else {
14
+ return "";
15
+ }
16
+ }
17
+ /** Use formatUTC when all users should see the same information, regardless
18
+ * of their geographical location. i.e. dates pertaining to what happened on
19
+ * the job site */
20
+ formatUTC(date) {
21
+ if (date) {
22
+ return moment(date).utc().format(this.formatString);
23
+ }
24
+ else {
25
+ return "";
26
+ }
27
+ }
28
+ formatRangeLocal(startDate, endDate) {
29
+ let formatted = this.formatLocal(startDate);
30
+ if (endDate != null) {
31
+ formatted += " - ";
32
+ let endMoment = moment(endDate);
33
+ if (this.secondaryFormat
34
+ && moment(startDate).isSame(endMoment, "day")) {
35
+ formatted += endMoment.format(this.secondaryFormat);
36
+ }
37
+ else {
38
+ formatted += this.formatLocal(endDate);
39
+ }
40
+ }
41
+ return formatted;
42
+ }
43
+ parseUTC(date) {
44
+ return moment.utc(date, this.formatString).toDate();
45
+ }
46
+ }
47
+ export default DateFormatter;
48
+ //# sourceMappingURL=date_formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date_formatter.js","sourceRoot":"","sources":["../../../source/converters/date_formatter.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,OAAO,aAAa;IACxB,YAAY,MAAc,EAAE,eAAwB;QAClD,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC3B,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IACzC,CAAC;IAED;8EAC0E;IAC1E,WAAW,CAAC,IAAU;QACpB,IAAI,IAAI,EAAE;YACR,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;SAC/C;aAAM;YACL,OAAO,EAAE,CAAC;SACX;IACH,CAAC;IAED;;sBAEkB;IAClB,SAAS,CAAC,IAAwB;QAChC,IAAI,IAAI,EAAE;YACR,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;SACrD;aAAM;YACL,OAAO,EAAE,CAAC;SACX;IACH,CAAC;IAED,gBAAgB,CAAC,SAAe,EAAE,OAAc;QAC9C,IAAI,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,OAAO,IAAI,IAAI,EAAE;YACnB,SAAS,IAAI,KAAK,CAAC;YACnB,IAAI,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;YAChC,IAAI,IAAI,CAAC,eAAe;mBACjB,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,EACjD;gBACE,SAAS,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;aACrD;iBAAM;gBACL,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;aACxC;SACF;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,QAAQ,CAAC,IAAmB;QAC1B,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,CAAC;IACtD,CAAC;CAIF;AAED,eAAe,aAAa,CAAC"}
@@ -1,4 +1,5 @@
1
- export { DateConverter, DateFormatter } from "./date_converter";
1
+ export { DateConverter } from "./date_converter";
2
+ export { DateFormatter } from "./date_formatter";
2
3
  export { kebabCase } from "./kebab_case";
3
4
  export { Matrix3Converter } from "./matrix_3_converter";
4
5
  export { Matrix4Converter } from "./matrix_4_converter";
@@ -1,4 +1,5 @@
1
- export { DateConverter, DateFormatter } from "./date_converter";
1
+ export { DateConverter } from "./date_converter";
2
+ export { DateFormatter } from "./date_formatter";
2
3
  export { kebabCase } from "./kebab_case";
3
4
  export { Matrix3Converter } from "./matrix_3_converter";
4
5
  export { Matrix4Converter } from "./matrix_4_converter";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../source/converters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAE,aAAa,EAAC,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AACvC,OAAO,EAAC,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAC,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAC,oBAAoB,EAAC,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../source/converters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -8,11 +8,20 @@ export function addInstantGetterAndSetterToApiModel(modelInstance, propertyName,
8
8
  },
9
9
  set(val) {
10
10
  if (typeof val === "string") {
11
- dateVal = DateConverter.dateToInstant(moment(val, "MMM D, YYYY").utc(true));
11
+ const date = moment(val, "MMM D, YYYY").utc(true).toDate();
12
+ if (DateConverter.isValidDate(date)) {
13
+ dateVal = DateConverter.dateToInstant(date);
14
+ }
15
+ else {
16
+ dateVal = null;
17
+ }
12
18
  }
13
- else if (val instanceof Date || moment.isMoment(val)) {
19
+ else if (val instanceof Date) {
14
20
  dateVal = DateConverter.dateToInstant(val);
15
21
  }
22
+ else if (moment.isMoment(val)) {
23
+ dateVal = DateConverter.dateToInstant(val.toDate());
24
+ }
16
25
  else {
17
26
  dateVal = val;
18
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"add_instant_getter_and_setter_to_api_model.js","sourceRoot":"","sources":["../../../source/mixins/add_instant_getter_and_setter_to_api_model.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,aAAa,MAAM,8BAA8B,CAAC;AAGzD,MAAM,UAAU,mCAAmC,CAAC,aAAqB,EAAE,YAAoB,EAAE,YAAuB;IACtH,IAAI,OAAO,CAAC;IACZ,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,YAAY,EAAE;QACjD,GAAG;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,GAAG,CAAC,GAAG;YACL,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;gBAC3B,OAAO,GAAG,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;aAC7E;iBAAM,IAAI,GAAG,YAAY,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBACtD,OAAO,GAAG,aAAa,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;aAC5C;iBAAM;gBACL,OAAO,GAAG,GAAG,CAAC;aACf;QACH,CAAC;QACD,UAAU,EAAE,IAAI;QAChB,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IAEH,IAAI,YAAY,EAAE;QAChB,aAAa,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;KAC5C;AACH,CAAC;AAED,eAAe,mCAAmC,CAAC"}
1
+ {"version":3,"file":"add_instant_getter_and_setter_to_api_model.js","sourceRoot":"","sources":["../../../source/mixins/add_instant_getter_and_setter_to_api_model.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,aAAa,MAAM,8BAA8B,CAAC;AAGzD,MAAM,UAAU,mCAAmC,CAAC,aAAqB,EACrB,YAAoB,EACpB,YAAuB;IAEzE,IAAI,OAAO,CAAC;IACZ,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,YAAY,EAAE;QACjD,GAAG;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,GAAG,CAAC,GAAG;YACL,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;gBAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;gBAC3D,IAAI,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;oBACnC,OAAO,GAAG,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;iBAC7C;qBAAM;oBACL,OAAO,GAAG,IAAI,CAAC;iBAChB;aACF;iBAAM,IAAI,GAAG,YAAY,IAAI,EAAE;gBAC9B,OAAO,GAAG,aAAa,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;aAC5C;iBAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBAC/B,OAAO,GAAG,aAAa,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;aACrD;iBAAM;gBACL,OAAO,GAAG,GAAG,CAAC;aACf;QACH,CAAC;QACD,UAAU,EAAE,IAAI;QAChB,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IAEH,IAAI,YAAY,EAAE;QAChB,aAAa,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;KAC5C;AACH,CAAC;AAED,eAAe,mCAAmC,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "avvir",
3
3
  "repository": "git@github.com:Avvir/avvir-javascript-client.git",
4
- "version": "0.4.17",
4
+ "version": "0.4.18",
5
5
  "description": "Javascript client for Avvir APIs",
6
6
  "license": "Apache-2.0",
7
7
  "module": "dist/esm/index.js",
@@ -1,40 +1,20 @@
1
1
  import moment, { Moment } from "moment";
2
- import {DateLike} from "../models";
3
2
 
4
- export class DateFormatter {
5
- constructor(format: string) {
6
- this.formatString = format;
7
- }
3
+ import DateFormatter from "./date_formatter";
4
+ import { DateLike } from "../models";
8
5
 
9
- format(date?: Date): string {
10
- if (date) {
11
- return moment(date).format(this.formatString);
12
- } else {
13
- return "";
14
- }
6
+ export class DateConverter {
7
+ static getLocalizedDateFormatter(): DateFormatter {
8
+ return new DateFormatter("l");
15
9
  }
16
10
 
17
- private readonly formatString: string;
18
- }
19
-
20
- export class DateConverter {
21
- static getDateFormatter(format: string): DateFormatter {
22
- return new DateFormatter(format);
11
+ static getDateFormatter(format: string, secondaryFormat?: string): DateFormatter {
12
+ return new DateFormatter(format, secondaryFormat);
23
13
  }
24
14
 
25
- static dateToText(date: Date | Moment, format?: string): string {
15
+ static dateToText(date: Date, format: string): string {
26
16
  if (date instanceof Date) {
27
- if (format) {
28
- return moment(date).format(format);
29
- } else {
30
- return `last scanned: ${moment(date).format("MMM D, YYYY")}`;
31
- }
32
- } else if (moment.isMoment(date)) {
33
- if (format) {
34
- return date.format(format);
35
- } else {
36
- return `last scanned: ${date.format("MMM D, YYYY")}`;
37
- }
17
+ return moment(date).format(format);
38
18
  } else {
39
19
  return "";
40
20
  }
@@ -43,37 +23,40 @@ export class DateConverter {
43
23
  static instantToDate(instant: number): Date | null {
44
24
  if (typeof instant === "number") {
45
25
  const epochMillis = instant * 1000;
46
- return moment(epochMillis).toDate();
26
+ return new Date(epochMillis);
47
27
  } else {
48
28
  return null;
49
29
  }
50
30
  }
51
31
 
52
- static dateToISO(date: DateLike): string {
53
- if (date == null) {
54
- return ""
55
- } else if (date instanceof Date || moment.isMoment(date)) {
56
- return date.toISOString();
32
+ static dateToInstant(date: Date): number | null {
33
+ if (date instanceof Date) {
34
+ return date.getTime() / 1000;
35
+ } else {
36
+ return null;
57
37
  }
38
+ }
58
39
 
59
- return date + "";
40
+ static localDateToMoment(localDate: string): Moment | null {
41
+ if (this.isValidDateString(localDate)) {
42
+ return moment(localDate);
43
+ }
44
+ return null;
60
45
  }
61
46
 
62
- static dateToInstant(date: Date | Moment): number | null {
47
+ static dateToLocalDate(date: DateLike): string {
63
48
  if (date instanceof Date) {
64
- const epochMillis = moment(date).utc(false).toDate().valueOf();
65
- return epochMillis / 1000;
66
- } else if (moment.isMoment(date) && date.isValid()) {
67
- const epochMillis = date.utc(false).toDate().valueOf();
68
- return epochMillis / 1000;
49
+ return date.toISOString().substring(0, 10);
50
+ } else if (moment.isMoment(date)) {
51
+ return moment(date).format("YYYY-MM-DD");
69
52
  } else {
70
53
  return null;
71
54
  }
72
55
  }
73
56
 
74
57
  static millisecondsToDate(epochMillis: number): Date | null {
75
- if (epochMillis || epochMillis === 0) {
76
- return moment(epochMillis).toDate();
58
+ if (typeof epochMillis === "number") {
59
+ return new Date(epochMillis);
77
60
  } else {
78
61
  return null;
79
62
  }
@@ -83,13 +66,71 @@ export class DateConverter {
83
66
  return (value instanceof Date && !isNaN(value.valueOf())) || value === null;
84
67
  }
85
68
 
86
- static tsvStringToDate(dateString) {
87
- if (dateString) {
69
+ static isValidDateString(value: string): boolean {
70
+ return (typeof value === "string")
71
+ && !!value.match(/^\d{4}-\d{2}-\d{2}$/);
72
+ }
73
+
74
+ static tsvStringToDate(dateString: string): Date {
75
+ if (typeof dateString === "string") {
88
76
  return moment(dateString, "MM/DD/YYYY").toDate();
89
77
  } else {
90
78
  return null;
91
79
  }
92
80
  }
81
+
82
+ /**
83
+ * truncate 2 dates to days and compare
84
+ * @param date1
85
+ * @param date2
86
+ * @returns true when date2 is on or after the day of date1;
87
+ * false if either date1 or date2 is null
88
+ */
89
+ static isOnOrAfterDay(date1: Date | string, date2: Date | string): boolean {
90
+ if (date1 == null || date2 == null) {
91
+ return false;
92
+ }
93
+
94
+ return this.dateToString(date1) <= this.dateToString(date2);
95
+ }
96
+
97
+ /**
98
+ * truncate 2 dates to days and compare
99
+ * @param date1
100
+ * @param date2
101
+ * @returns true when date2 is on the same day as date1
102
+ */
103
+ static isOnDay(date1: Date | string, date2: Date | string): boolean {
104
+ if (date1 == null || date2 == null) {
105
+ return false;
106
+ }
107
+
108
+ return this.dateToString(date1) === this.dateToString(date2);
109
+ }
110
+
111
+ private static dateToString(date: Date | string): string {
112
+ if (date instanceof Date) {
113
+ return `${this.pad(date.getUTCFullYear())}-${this.pad(date.getUTCMonth() + 1)}-${this.pad(date.getUTCDate())}`;
114
+ }
115
+ if (this.isValidDateString(date)) {
116
+ return date;
117
+ }
118
+ throw new TypeError("Expected date to be a Date or string");
119
+ }
120
+
121
+ static dateToISO(date: DateLike): string {
122
+ if (date == null) {
123
+ return "";
124
+ } else if (date instanceof Date || moment.isMoment(date)) {
125
+ return date.toISOString();
126
+ }
127
+
128
+ return date + "";
129
+ }
130
+
131
+ private static pad(i: number): string {
132
+ return i.toString().padStart(2, "0");
133
+ }
93
134
  }
94
135
 
95
136
  export default DateConverter;
@@ -0,0 +1,55 @@
1
+ import moment from "moment";
2
+
3
+ export class DateFormatter {
4
+ constructor(format: string, secondaryFormat?: string) {
5
+ this.formatString = format;
6
+ this.secondaryFormat = secondaryFormat;
7
+ }
8
+
9
+ /** Use formatLocal when displaying times relative to the user i.e. when
10
+ * somebody else replied to their comment, or when a file was uploaded. */
11
+ formatLocal(date: Date): string {
12
+ if (date) {
13
+ return moment(date).format(this.formatString);
14
+ } else {
15
+ return "";
16
+ }
17
+ }
18
+
19
+ /** Use formatUTC when all users should see the same information, regardless
20
+ * of their geographical location. i.e. dates pertaining to what happened on
21
+ * the job site */
22
+ formatUTC(date: moment.MomentInput): string {
23
+ if (date) {
24
+ return moment(date).utc().format(this.formatString);
25
+ } else {
26
+ return "";
27
+ }
28
+ }
29
+
30
+ formatRangeLocal(startDate: Date, endDate?: Date): string {
31
+ let formatted = this.formatLocal(startDate);
32
+ if (endDate != null) {
33
+ formatted += " - ";
34
+ let endMoment = moment(endDate);
35
+ if (this.secondaryFormat
36
+ && moment(startDate).isSame(endMoment, "day"))
37
+ {
38
+ formatted += endMoment.format(this.secondaryFormat);
39
+ } else {
40
+ formatted += this.formatLocal(endDate);
41
+ }
42
+ }
43
+
44
+ return formatted;
45
+ }
46
+
47
+ parseUTC(date: string | null): Date {
48
+ return moment.utc(date, this.formatString).toDate();
49
+ }
50
+
51
+ private readonly formatString: string;
52
+ private readonly secondaryFormat?: string;
53
+ }
54
+
55
+ export default DateFormatter;
@@ -1,5 +1,6 @@
1
- export {DateConverter, DateFormatter} from "./date_converter";
2
- export {kebabCase} from "./kebab_case";
3
- export {Matrix3Converter} from "./matrix_3_converter";
4
- export {Matrix4Converter} from "./matrix_4_converter";
5
- export {PurposeTypeConverter} from "./purpose_type_converter";
1
+ export { DateConverter } from "./date_converter";
2
+ export { DateFormatter } from "./date_formatter";
3
+ export { kebabCase } from "./kebab_case";
4
+ export { Matrix3Converter } from "./matrix_3_converter";
5
+ export { Matrix4Converter } from "./matrix_4_converter";
6
+ export { PurposeTypeConverter } from "./purpose_type_converter";
@@ -1,8 +1,12 @@
1
1
  import moment from "moment";
2
+
2
3
  import DateConverter from "../converters/date_converter";
3
- import {DateLike} from "../models";
4
+ import { DateLike } from "../models";
4
5
 
5
- export function addInstantGetterAndSetterToApiModel(modelInstance: Object, propertyName: string, initialValue?: DateLike) {
6
+ export function addInstantGetterAndSetterToApiModel(modelInstance: Object,
7
+ propertyName: string,
8
+ initialValue?: DateLike)
9
+ {
6
10
  let dateVal;
7
11
  Object.defineProperty(modelInstance, propertyName, {
8
12
  get() {
@@ -10,9 +14,16 @@ export function addInstantGetterAndSetterToApiModel(modelInstance: Object, prope
10
14
  },
11
15
  set(val) {
12
16
  if (typeof val === "string") {
13
- dateVal = DateConverter.dateToInstant(moment(val, "MMM D, YYYY").utc(true));
14
- } else if (val instanceof Date || moment.isMoment(val)) {
17
+ const date = moment(val, "MMM D, YYYY").utc(true).toDate();
18
+ if (DateConverter.isValidDate(date)) {
19
+ dateVal = DateConverter.dateToInstant(date);
20
+ } else {
21
+ dateVal = null;
22
+ }
23
+ } else if (val instanceof Date) {
15
24
  dateVal = DateConverter.dateToInstant(val);
25
+ } else if (moment.isMoment(val)) {
26
+ dateVal = DateConverter.dateToInstant(val.toDate());
16
27
  } else {
17
28
  dateVal = val;
18
29
  }