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.
- package/dist/avvir_api.node.js +163 -58
- package/dist/esm/converters/date_converter.d.ts +27 -10
- package/dist/esm/converters/date_converter.js +76 -45
- package/dist/esm/converters/date_converter.js.map +1 -1
- package/dist/esm/converters/date_formatter.d.ts +16 -0
- package/dist/esm/converters/date_formatter.js +48 -0
- package/dist/esm/converters/date_formatter.js.map +1 -0
- package/dist/esm/converters/index.d.ts +2 -1
- package/dist/esm/converters/index.js +2 -1
- package/dist/esm/converters/index.js.map +1 -1
- package/dist/esm/mixins/add_instant_getter_and_setter_to_api_model.js +11 -2
- package/dist/esm/mixins/add_instant_getter_and_setter_to_api_model.js.map +1 -1
- package/package.json +1 -1
- package/source/converters/date_converter.ts +87 -46
- package/source/converters/date_formatter.ts +55 -0
- package/source/converters/index.ts +6 -5
- package/source/mixins/add_instant_getter_and_setter_to_api_model.ts +15 -4
package/dist/avvir_api.node.js
CHANGED
|
@@ -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.
|
|
1774
|
-
return new
|
|
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
|
-
|
|
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
|
|
1776
|
+
return new Date(epochMillis);
|
|
1801
1777
|
}
|
|
1802
1778
|
else {
|
|
1803
1779
|
return null;
|
|
1804
1780
|
}
|
|
1805
1781
|
};
|
|
1806
|
-
DateConverter.
|
|
1807
|
-
if (date
|
|
1808
|
-
return
|
|
1782
|
+
DateConverter.dateToInstant = function (date) {
|
|
1783
|
+
if (date instanceof Date) {
|
|
1784
|
+
return date.getTime() / 1000;
|
|
1809
1785
|
}
|
|
1810
|
-
else
|
|
1811
|
-
return
|
|
1786
|
+
else {
|
|
1787
|
+
return null;
|
|
1812
1788
|
}
|
|
1813
|
-
return date + "";
|
|
1814
1789
|
};
|
|
1815
|
-
DateConverter.
|
|
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
|
-
|
|
1818
|
-
return epochMillis / 1000;
|
|
1798
|
+
return date.toISOString().substring(0, 10);
|
|
1819
1799
|
}
|
|
1820
|
-
else if (moment__WEBPACK_IMPORTED_MODULE_0___default().isMoment(date)
|
|
1821
|
-
|
|
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 (
|
|
1830
|
-
return
|
|
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 */
|
|
1863
|
-
/* harmony export */ "kebabCase": () => (/* reexport safe */
|
|
1864
|
-
/* harmony export */ "Matrix3Converter": () => (/* reexport safe */
|
|
1865
|
-
/* harmony export */ "Matrix4Converter": () => (/* reexport safe */
|
|
1866
|
-
/* harmony export */ "PurposeTypeConverter": () => (/* reexport safe */
|
|
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
|
|
1870
|
-
/* harmony import */ var
|
|
1871
|
-
/* harmony import */ var
|
|
1872
|
-
/* harmony import */ var
|
|
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
|
-
|
|
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
|
|
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
|
|
10
|
-
static
|
|
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
|
|
13
|
-
static
|
|
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
|
|
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
|
-
|
|
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
|
|
17
|
-
return new DateFormatter(
|
|
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
|
-
|
|
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
|
|
21
|
+
return new Date(epochMillis);
|
|
44
22
|
}
|
|
45
23
|
else {
|
|
46
24
|
return null;
|
|
47
25
|
}
|
|
48
26
|
}
|
|
49
|
-
static
|
|
50
|
-
if (date
|
|
51
|
-
return
|
|
27
|
+
static dateToInstant(date) {
|
|
28
|
+
if (date instanceof Date) {
|
|
29
|
+
return date.getTime() / 1000;
|
|
52
30
|
}
|
|
53
|
-
else
|
|
54
|
-
return
|
|
31
|
+
else {
|
|
32
|
+
return null;
|
|
55
33
|
}
|
|
56
|
-
return date + "";
|
|
57
34
|
}
|
|
58
|
-
static
|
|
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
|
-
|
|
61
|
-
return epochMillis / 1000;
|
|
43
|
+
return date.toISOString().substring(0, 10);
|
|
62
44
|
}
|
|
63
|
-
else if (moment.isMoment(date)
|
|
64
|
-
|
|
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 (
|
|
73
|
-
return
|
|
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":"AAAA,OAAO,MAAkB,MAAM,QAAQ,CAAC;
|
|
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
|
|
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
|
|
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,
|
|
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
|
-
|
|
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
|
|
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;
|
|
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,40 +1,20 @@
|
|
|
1
1
|
import moment, { Moment } from "moment";
|
|
2
|
-
import {DateLike} from "../models";
|
|
3
2
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
this.formatString = format;
|
|
7
|
-
}
|
|
3
|
+
import DateFormatter from "./date_formatter";
|
|
4
|
+
import { DateLike } from "../models";
|
|
8
5
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
} else {
|
|
13
|
-
return "";
|
|
14
|
-
}
|
|
6
|
+
export class DateConverter {
|
|
7
|
+
static getLocalizedDateFormatter(): DateFormatter {
|
|
8
|
+
return new DateFormatter("l");
|
|
15
9
|
}
|
|
16
10
|
|
|
17
|
-
|
|
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
|
|
15
|
+
static dateToText(date: Date, format: string): string {
|
|
26
16
|
if (date instanceof Date) {
|
|
27
|
-
|
|
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
|
|
26
|
+
return new Date(epochMillis);
|
|
47
27
|
} else {
|
|
48
28
|
return null;
|
|
49
29
|
}
|
|
50
30
|
}
|
|
51
31
|
|
|
52
|
-
static
|
|
53
|
-
if (date
|
|
54
|
-
return
|
|
55
|
-
} else
|
|
56
|
-
return
|
|
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
|
-
|
|
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
|
|
47
|
+
static dateToLocalDate(date: DateLike): string {
|
|
63
48
|
if (date instanceof Date) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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 (
|
|
76
|
-
return
|
|
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
|
|
87
|
-
|
|
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
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
4
|
-
export {
|
|
5
|
-
export {
|
|
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,
|
|
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
|
-
|
|
14
|
-
|
|
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
|
}
|