avvir 0.4.16 → 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.
@@ -942,9 +942,10 @@ var ProjectApi = /** @class */ (function () {
942
942
  var url = _utilities_http__WEBPACK_IMPORTED_MODULE_0__["default"].baseUrl() + "/projects/" + projectId + "/masterformat-progress";
943
943
  return _utilities_http__WEBPACK_IMPORTED_MODULE_0__["default"].post(url, user, progress);
944
944
  };
945
- ProjectApi.saveScheduledProjectMasterformatProgress = function (_a, progress, user) {
945
+ // TODO: Make schedule type an enum?
946
+ ProjectApi.saveScheduledProjectMasterformatProgress = function (_a, progress, scheduleType, user) {
946
947
  var projectId = _a.projectId;
947
- var url = _utilities_http__WEBPACK_IMPORTED_MODULE_0__["default"].baseUrl() + "/projects/" + projectId + "/scheduled-masterformat-progress";
948
+ var url = _utilities_http__WEBPACK_IMPORTED_MODULE_0__["default"].baseUrl() + "/projects/" + projectId + "/scheduled-masterformat-progress/" + scheduleType;
948
949
  return _utilities_http__WEBPACK_IMPORTED_MODULE_0__["default"].post(url, user, progress);
949
950
  };
950
951
  ProjectApi.getProjectCostAnalysisProgress = function (_a, user) {
@@ -957,9 +958,10 @@ var ProjectApi = /** @class */ (function () {
957
958
  var url = _utilities_http__WEBPACK_IMPORTED_MODULE_0__["default"].baseUrl() + "/projects/" + projectId + "/masterformat-progress";
958
959
  return _utilities_http__WEBPACK_IMPORTED_MODULE_0__["default"].get(url, user);
959
960
  };
960
- ProjectApi.getScheduledProjectMasterformatProgress = function (_a, user) {
961
+ // TODO: Make schedule type an enum?
962
+ ProjectApi.getScheduledProjectMasterformatProgress = function (_a, scheduleType, user) {
961
963
  var projectId = _a.projectId;
962
- var url = _utilities_http__WEBPACK_IMPORTED_MODULE_0__["default"].baseUrl() + "/projects/" + projectId + "/scheduled-masterformat-progress";
964
+ var url = _utilities_http__WEBPACK_IMPORTED_MODULE_0__["default"].baseUrl() + "/projects/" + projectId + "/scheduled-masterformat-progress/" + scheduleType;
963
965
  return _utilities_http__WEBPACK_IMPORTED_MODULE_0__["default"].get(url, user);
964
966
  };
965
967
  ProjectApi.listProjectFloorFiles = function (_a, user) {
@@ -970,7 +972,7 @@ var ProjectApi = /** @class */ (function () {
970
972
  ProjectApi.getProjectDeviationsReportTsvUrl = function (_a, fileName, user) {
971
973
  var projectId = _a.projectId;
972
974
  var baseUrl = _utilities_http__WEBPACK_IMPORTED_MODULE_0__["default"].baseUrl() + "/projects/" + projectId + "/" + fileName + "_deviation-report.tsv";
973
- return Promise.resolve(_utilities_http__WEBPACK_IMPORTED_MODULE_0__["default"].addAuthToDownloadUrl(baseUrl, user));
975
+ return _utilities_http__WEBPACK_IMPORTED_MODULE_0__["default"].addAuthToDownloadUrl(baseUrl, user);
974
976
  };
975
977
  ProjectApi.getProjectDeviationsReportTsv = function (_a, user) {
976
978
  var projectId = _a.projectId;
@@ -1743,50 +1745,26 @@ var Config = {
1743
1745
  "use strict";
1744
1746
  __webpack_require__.r(__webpack_exports__);
1745
1747
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1746
- /* harmony export */ "DateFormatter": () => (/* binding */ DateFormatter),
1747
1748
  /* harmony export */ "DateConverter": () => (/* binding */ DateConverter),
1748
1749
  /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1749
1750
  /* harmony export */ });
1750
1751
  /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2245);
1751
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);
1752
1754
 
1753
- var DateFormatter = /** @class */ (function () {
1754
- function DateFormatter(format) {
1755
- this.formatString = format;
1756
- }
1757
- DateFormatter.prototype.format = function (date) {
1758
- if (date) {
1759
- return moment__WEBPACK_IMPORTED_MODULE_0___default()(date).format(this.formatString);
1760
- }
1761
- else {
1762
- return "";
1763
- }
1764
- };
1765
- return DateFormatter;
1766
- }());
1767
1755
 
1768
1756
  var DateConverter = /** @class */ (function () {
1769
1757
  function DateConverter() {
1770
1758
  }
1771
- DateConverter.getDateFormatter = function (format) {
1772
- 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);
1773
1764
  };
1774
1765
  DateConverter.dateToText = function (date, format) {
1775
1766
  if (date instanceof Date) {
1776
- if (format) {
1777
- return moment__WEBPACK_IMPORTED_MODULE_0___default()(date).format(format);
1778
- }
1779
- else {
1780
- return "last scanned: " + moment__WEBPACK_IMPORTED_MODULE_0___default()(date).format("MMM D, YYYY");
1781
- }
1782
- }
1783
- else if (moment__WEBPACK_IMPORTED_MODULE_0___default().isMoment(date)) {
1784
- if (format) {
1785
- return date.format(format);
1786
- }
1787
- else {
1788
- return "last scanned: " + date.format("MMM D, YYYY");
1789
- }
1767
+ return moment__WEBPACK_IMPORTED_MODULE_0___default()(date).format(format);
1790
1768
  }
1791
1769
  else {
1792
1770
  return "";
@@ -1795,37 +1773,40 @@ var DateConverter = /** @class */ (function () {
1795
1773
  DateConverter.instantToDate = function (instant) {
1796
1774
  if (typeof instant === "number") {
1797
1775
  var epochMillis = instant * 1000;
1798
- return moment__WEBPACK_IMPORTED_MODULE_0___default()(epochMillis).toDate();
1776
+ return new Date(epochMillis);
1799
1777
  }
1800
1778
  else {
1801
1779
  return null;
1802
1780
  }
1803
1781
  };
1804
- DateConverter.dateToISO = function (date) {
1805
- if (date == null) {
1806
- return "";
1782
+ DateConverter.dateToInstant = function (date) {
1783
+ if (date instanceof Date) {
1784
+ return date.getTime() / 1000;
1807
1785
  }
1808
- else if (date instanceof Date || moment__WEBPACK_IMPORTED_MODULE_0___default().isMoment(date)) {
1809
- return date.toISOString();
1786
+ else {
1787
+ return null;
1810
1788
  }
1811
- return date + "";
1812
1789
  };
1813
- 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) {
1814
1797
  if (date instanceof Date) {
1815
- var epochMillis = moment__WEBPACK_IMPORTED_MODULE_0___default()(date).utc(false).toDate().valueOf();
1816
- return epochMillis / 1000;
1798
+ return date.toISOString().substring(0, 10);
1817
1799
  }
1818
- else if (moment__WEBPACK_IMPORTED_MODULE_0___default().isMoment(date) && date.isValid()) {
1819
- var epochMillis = date.utc(false).toDate().valueOf();
1820
- 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");
1821
1802
  }
1822
1803
  else {
1823
1804
  return null;
1824
1805
  }
1825
1806
  };
1826
1807
  DateConverter.millisecondsToDate = function (epochMillis) {
1827
- if (epochMillis || epochMillis === 0) {
1828
- return moment__WEBPACK_IMPORTED_MODULE_0___default()(epochMillis).toDate();
1808
+ if (typeof epochMillis === "number") {
1809
+ return new Date(epochMillis);
1829
1810
  }
1830
1811
  else {
1831
1812
  return null;
@@ -1834,20 +1815,134 @@ var DateConverter = /** @class */ (function () {
1834
1815
  DateConverter.isValidDate = function (value) {
1835
1816
  return (value instanceof Date && !isNaN(value.valueOf())) || value === null;
1836
1817
  };
1818
+ DateConverter.isValidDateString = function (value) {
1819
+ return (typeof value === "string")
1820
+ && !!value.match(/^\d{4}-\d{2}-\d{2}$/);
1821
+ };
1837
1822
  DateConverter.tsvStringToDate = function (dateString) {
1838
- if (dateString) {
1823
+ if (typeof dateString === "string") {
1839
1824
  return moment__WEBPACK_IMPORTED_MODULE_0___default()(dateString, "MM/DD/YYYY").toDate();
1840
1825
  }
1841
1826
  else {
1842
1827
  return null;
1843
1828
  }
1844
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
+ };
1845
1876
  return DateConverter;
1846
1877
  }());
1847
1878
 
1848
1879
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (DateConverter);
1849
1880
 
1850
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
+
1851
1946
  /***/ }),
1852
1947
 
1853
1948
  /***/ 6781:
@@ -1857,17 +1952,19 @@ var DateConverter = /** @class */ (function () {
1857
1952
  __webpack_require__.r(__webpack_exports__);
1858
1953
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1859
1954
  /* harmony export */ "DateConverter": () => (/* reexport safe */ _date_converter__WEBPACK_IMPORTED_MODULE_0__.DateConverter),
1860
- /* harmony export */ "DateFormatter": () => (/* reexport safe */ _date_converter__WEBPACK_IMPORTED_MODULE_0__.DateFormatter),
1861
- /* harmony export */ "kebabCase": () => (/* reexport safe */ _kebab_case__WEBPACK_IMPORTED_MODULE_1__.kebabCase),
1862
- /* harmony export */ "Matrix3Converter": () => (/* reexport safe */ _matrix_3_converter__WEBPACK_IMPORTED_MODULE_2__.Matrix3Converter),
1863
- /* harmony export */ "Matrix4Converter": () => (/* reexport safe */ _matrix_4_converter__WEBPACK_IMPORTED_MODULE_3__.Matrix4Converter),
1864
- /* 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)
1865
1960
  /* harmony export */ });
1866
1961
  /* harmony import */ var _date_converter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2024);
1867
- /* harmony import */ var _kebab_case__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5519);
1868
- /* harmony import */ var _matrix_3_converter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(28);
1869
- /* harmony import */ var _matrix_4_converter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(2908);
1870
- /* 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
+
1871
1968
 
1872
1969
 
1873
1970
 
@@ -2380,11 +2477,20 @@ function addInstantGetterAndSetterToApiModel(modelInstance, propertyName, initia
2380
2477
  },
2381
2478
  set: function (val) {
2382
2479
  if (typeof val === "string") {
2383
- 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
+ }
2384
2487
  }
2385
- else if (val instanceof Date || moment__WEBPACK_IMPORTED_MODULE_0___default().isMoment(val)) {
2488
+ else if (val instanceof Date) {
2386
2489
  dateVal = _converters_date_converter__WEBPACK_IMPORTED_MODULE_1__["default"].dateToInstant(val);
2387
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
+ }
2388
2494
  else {
2389
2495
  dateVal = val;
2390
2496
  }
@@ -6343,6 +6449,7 @@ var map = {
6343
6449
  "./avvir_api.ts": 5489,
6344
6450
  "./config.ts": 5508,
6345
6451
  "./converters/date_converter.ts": 2024,
6452
+ "./converters/date_formatter.ts": 2228,
6346
6453
  "./converters/index.ts": 6781,
6347
6454
  "./converters/kebab_case.ts": 5519,
6348
6455
  "./converters/matrix_3_converter.ts": 28,
@@ -1,5 +1,5 @@
1
1
  import { User } from "../utilities/get_authorization_headers";
2
- import { AssociationIds, ApiProject, ApiProjectMasterformatProgress, ApiProjectCostAnalysisProgress, ApiCloudFile, ApiWorkPackage, ApiProjectListing } from "../models";
2
+ import { ApiCloudFile, ApiProject, ApiProjectCostAnalysisProgress, ApiProjectListing, ApiProjectMasterformatProgress, ApiWorkPackage, AssociationIds } from "../models";
3
3
  export default class ProjectApi {
4
4
  static listProjectsForOrganization(accountId: string, user: User): Promise<ApiProject[]>;
5
5
  static listAllProjectsForUser(user: User): Promise<ApiProject[]>;
@@ -16,12 +16,12 @@ export default class ProjectApi {
16
16
  static archiveProject(accountId: string, projectId: string, user: User): Promise<void>;
17
17
  static saveProjectCostAnalysisProgress({ projectId }: AssociationIds, progress: any, user: User): Promise<void>;
18
18
  static saveScannedProjectMasterformatProgress({ projectId }: AssociationIds, progress: ApiProjectMasterformatProgress, user: User): Promise<void>;
19
- static saveScheduledProjectMasterformatProgress({ projectId }: AssociationIds, progress: ApiProjectMasterformatProgress, user: User): Promise<void>;
19
+ static saveScheduledProjectMasterformatProgress({ projectId }: AssociationIds, progress: ApiProjectMasterformatProgress, scheduleType: "current" | "baseline", user: User): Promise<void>;
20
20
  static getProjectCostAnalysisProgress({ projectId }: AssociationIds, user: User): Promise<ApiProjectCostAnalysisProgress[]>;
21
21
  static getScannedProjectMasterformatProgress({ projectId }: AssociationIds, user: User): Promise<ApiProjectMasterformatProgress[]>;
22
- static getScheduledProjectMasterformatProgress({ projectId }: AssociationIds, user: User): Promise<ApiProjectMasterformatProgress[]>;
22
+ static getScheduledProjectMasterformatProgress({ projectId }: AssociationIds, scheduleType: "current" | "baseline", user: User): Promise<ApiProjectMasterformatProgress[]>;
23
23
  static listProjectFloorFiles({ projectId }: AssociationIds, user: User): Promise<ApiCloudFile[]>;
24
- static getProjectDeviationsReportTsvUrl({ projectId }: AssociationIds, fileName: string, user: User): Promise<string>;
24
+ static getProjectDeviationsReportTsvUrl({ projectId }: AssociationIds, fileName: string, user: User): string;
25
25
  static getProjectDeviationsReportTsv({ projectId }: AssociationIds, user: User): Promise<string>;
26
26
  static getWorkPackages(projectId: string, user: User): Promise<ApiWorkPackage[]>;
27
27
  static saveWorkPackages(projectId: string, user: User, workPackages: ApiWorkPackage[]): Promise<ApiWorkPackage[]>;
@@ -44,8 +44,9 @@ export default class ProjectApi {
44
44
  const url = `${Http.baseUrl()}/projects/${projectId}/masterformat-progress`;
45
45
  return Http.post(url, user, progress);
46
46
  }
47
- static saveScheduledProjectMasterformatProgress({ projectId }, progress, user) {
48
- const url = `${Http.baseUrl()}/projects/${projectId}/scheduled-masterformat-progress`;
47
+ // TODO: Make schedule type an enum?
48
+ static saveScheduledProjectMasterformatProgress({ projectId }, progress, scheduleType, user) {
49
+ const url = `${Http.baseUrl()}/projects/${projectId}/scheduled-masterformat-progress/${scheduleType}`;
49
50
  return Http.post(url, user, progress);
50
51
  }
51
52
  static getProjectCostAnalysisProgress({ projectId }, user) {
@@ -56,8 +57,9 @@ export default class ProjectApi {
56
57
  let url = `${Http.baseUrl()}/projects/${projectId}/masterformat-progress`;
57
58
  return Http.get(url, user);
58
59
  }
59
- static getScheduledProjectMasterformatProgress({ projectId }, user) {
60
- let url = `${Http.baseUrl()}/projects/${projectId}/scheduled-masterformat-progress`;
60
+ // TODO: Make schedule type an enum?
61
+ static getScheduledProjectMasterformatProgress({ projectId }, scheduleType, user) {
62
+ let url = `${Http.baseUrl()}/projects/${projectId}/scheduled-masterformat-progress/${scheduleType}`;
61
63
  return Http.get(url, user);
62
64
  }
63
65
  static listProjectFloorFiles({ projectId }, user) {
@@ -66,7 +68,7 @@ export default class ProjectApi {
66
68
  }
67
69
  static getProjectDeviationsReportTsvUrl({ projectId }, fileName, user) {
68
70
  const baseUrl = `${Http.baseUrl()}/projects/${projectId}/${fileName}_deviation-report.tsv`;
69
- return Promise.resolve(Http.addAuthToDownloadUrl(baseUrl, user));
71
+ return Http.addAuthToDownloadUrl(baseUrl, user);
70
72
  }
71
73
  static getProjectDeviationsReportTsv({ projectId }, user) {
72
74
  const baseUrl = `${Http.baseUrl()}/projects/${projectId}/project_deviation-report.tsv`;
@@ -1 +1 @@
1
- {"version":3,"file":"project_api.js","sourceRoot":"","sources":["../../../source/api/project_api.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,mBAAmB,CAAC;AACrC,OAAO,gBAAgB,MAAM,iCAAiC,CAAC;AAa/D,MAAM,CAAC,OAAO,OAAO,UAAU;IAC7B,MAAM,CAAC,2BAA2B,CAAC,SAAiB,EAAE,IAAU;QAC9D,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,oBAAoB,SAAS,WAAW,CAAC;QACpE,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAqC,CAAC;IACjE,CAAC;IAED,MAAM,CAAC,sBAAsB,CAAC,IAAU;QACtC,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,8BAA8B,CAAC;QAC1D,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAqC,CAAC;IACjE,CAAC;IAED,MAAM,CAAC,mBAAmB,CAAC,IAAU;QACnC,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC;QAC9C,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAA4C,CAAC;IACxE,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,SAAiB,EAAE,IAAU;QAC/C,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,SAAS,OAAO,CAAC;QACzD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAqC,CAAC;IACjE,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,SAAiB,EAAE,IAAU;QAC7C,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,SAAS,EAAE,CAAC;QACpD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAmC,CAAC;IAC/D,CAAC;IAED,MAAM,CAAC,aAAa,CAAC,SAAiB,EAAE,OAAmB,EAAE,IAAU;QACrE,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,oBAAoB,SAAS,WAAW,CAAC;QACpE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAA+C,CAAC;IACrF,CAAC;IAED,MAAM,CAAC,aAAa,CAAC,SAAiB,EAAE,OAAmB,EAAE,IAAU;QACrE,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,SAAS,EAAE,CAAC;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAA6B,CAAC;IACpE,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,SAAiB,EAAE,SAAiB,EAAE,IAAU;QACpE,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,SAAS,UAAU,CAAC;QAC5D,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAA6B,CAAC;IAChE,CAAC;IAED,MAAM,CAAC,+BAA+B,CAAC,EAAC,SAAS,EAAiB,EAAE,QAAQ,EAAE,IAAU;QACtF,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,SAAS,yBAAyB,CAAC;QAC7E,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAA6B,CAAC;IACpE,CAAC;IAED,MAAM,CAAC,sCAAsC,CAAC,EAAC,SAAS,EAAiB,EAAE,QAAwC,EAAE,IAAU;QAC7H,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,SAAS,wBAAwB,CAAC;QAC5E,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAA6B,CAAC;IACpE,CAAC;IAED,MAAM,CAAC,wCAAwC,CAAC,EAAC,SAAS,EAAiB,EAAE,QAAwC,EAAE,IAAU;QAC/H,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,SAAS,kCAAkC,CAAC;QACtF,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAA6B,CAAC;IACpE,CAAC;IAED,MAAM,CAAC,8BAA8B,CAAC,EAAC,SAAS,EAAiB,EAAE,IAAU;QAC3E,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,SAAS,yBAAyB,CAAC;QAC7E,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAyD,CAAC;IACrF,CAAC;IAED,MAAM,CAAC,qCAAqC,CAAC,EAAC,SAAS,EAAiB,EAAE,IAAU;QAClF,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,SAAS,wBAAwB,CAAC;QAC1E,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAyD,CAAC;IACrF,CAAC;IAED,MAAM,CAAC,uCAAuC,CAAC,EAAC,SAAS,EAAiB,EAAE,IAAU;QACpF,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,SAAS,kCAAkC,CAAC;QACpF,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAyD,CAAC;IACrF,CAAC;IAED,MAAM,CAAC,qBAAqB,CAAC,EAAC,SAAS,EAAiB,EAAE,IAAU;QAClE,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,SAAS,cAAc,CAAC;QAChE,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAuC,CAAC;IACnE,CAAC;IAED,MAAM,CAAC,gCAAgC,CAAC,EAAC,SAAS,EAAiB,EAAE,QAAgB,EAAE,IAAU;QAC/F,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,SAAS,IAAI,QAAQ,uBAAuB,CAAC;QAC3F,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,CAAC,6BAA6B,CAAC,EAAC,SAAS,EAAiB,EAAE,IAAU;QAC1E,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,SAAS,+BAA+B,CAAC;QACvF,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,0CAA0C,CAA+B,CAAC;IACvG,CAAC;IAED,MAAM,CAAC,eAAe,CAAC,SAAiB,EAAE,IAAS;QACjD,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,SAAS,gBAAgB,CAAC;QAClE,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAyC,CAAC;IACrE,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,SAAiB,EAAE,IAAS,EAAE,YAA8B;QAClF,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,SAAS,gBAAgB,CAAC;QAClE,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,YAAY,CAAyC,CAAC;IACnF,CAAC;CACF;AAED,gBAAgB,CAAC,UAAU,CAAC,CAAC"}
1
+ {"version":3,"file":"project_api.js","sourceRoot":"","sources":["../../../source/api/project_api.ts"],"names":[],"mappings":"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"}
@@ -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.16",
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",
@@ -76,5 +76,13 @@
76
76
  "three": "0.110.0",
77
77
  "underscore": "^1.12.0",
78
78
  "util": "^0.12.4"
79
+ },
80
+ "mocha": {
81
+ "require": [
82
+ "./tests/test_utils/mocha_setup.js",
83
+ "./tests/test_utils/setup_tests.ts"
84
+ ],
85
+ "exit": true,
86
+ "ui": "bdd"
79
87
  }
80
88
  }
@@ -1,17 +1,8 @@
1
- import {User} from "../utilities/get_authorization_headers";
1
+ import { User } from "../utilities/get_authorization_headers";
2
2
  import Http from "../utilities/http";
3
3
  import makeErrorsPretty from "../utilities/make_errors_pretty";
4
4
 
5
- import {
6
- AssociationIds,
7
- ApiProject,
8
- ApiProjectMasterformatProgress,
9
- ApiProjectCostAnalysisProgress,
10
- ApiCloudFile,
11
- ApiWorkPackage,
12
- ApiProjectListing, ApiPurposeType, PurposeType
13
- } from "../models";
14
- import PurposeTypeConverter from "../converters/purpose_type_converter";
5
+ import { ApiCloudFile, ApiProject, ApiProjectCostAnalysisProgress, ApiProjectListing, ApiProjectMasterformatProgress, ApiWorkPackage, AssociationIds } from "../models";
15
6
 
16
7
  export default class ProjectApi {
17
8
  static listProjectsForOrganization(accountId: string, user: User): Promise<ApiProject[]> {
@@ -57,61 +48,72 @@ export default class ProjectApi {
57
48
  return Http.post(url, user, null) as unknown as Promise<void>;
58
49
  }
59
50
 
60
- static saveProjectCostAnalysisProgress({projectId}: AssociationIds, progress, user: User): Promise<void> {
51
+ static saveProjectCostAnalysisProgress({ projectId }: AssociationIds, progress, user: User): Promise<void> {
61
52
  const url = `${Http.baseUrl()}/projects/${projectId}/cost-analysis-progress`;
62
53
  return Http.post(url, user, progress) as unknown as Promise<void>;
63
54
  }
64
55
 
65
- static saveScannedProjectMasterformatProgress({projectId}: AssociationIds, progress: ApiProjectMasterformatProgress, user: User): Promise<void> {
56
+ static saveScannedProjectMasterformatProgress({ projectId }: AssociationIds,
57
+ progress: ApiProjectMasterformatProgress,
58
+ user: User): Promise<void> {
66
59
  const url = `${Http.baseUrl()}/projects/${projectId}/masterformat-progress`;
67
60
  return Http.post(url, user, progress) as unknown as Promise<void>;
68
61
  }
69
62
 
70
- static saveScheduledProjectMasterformatProgress({projectId}: AssociationIds, progress: ApiProjectMasterformatProgress, user: User): Promise<void> {
71
- const url = `${Http.baseUrl()}/projects/${projectId}/scheduled-masterformat-progress`;
63
+ // TODO: Make schedule type an enum?
64
+ static saveScheduledProjectMasterformatProgress({ projectId }: AssociationIds,
65
+ progress: ApiProjectMasterformatProgress,
66
+ scheduleType: "current" | "baseline",
67
+ user: User): Promise<void> {
68
+ const url = `${Http.baseUrl()}/projects/${projectId}/scheduled-masterformat-progress/${scheduleType}`;
72
69
  return Http.post(url, user, progress) as unknown as Promise<void>;
73
70
  }
74
71
 
75
- static getProjectCostAnalysisProgress({projectId}: AssociationIds, user: User): Promise<ApiProjectCostAnalysisProgress[]> {
72
+ static getProjectCostAnalysisProgress({ projectId }: AssociationIds,
73
+ user: User): Promise<ApiProjectCostAnalysisProgress[]> {
76
74
  const url = `${Http.baseUrl()}/projects/${projectId}/cost-analysis-progress`;
77
75
  return Http.get(url, user) as unknown as Promise<ApiProjectCostAnalysisProgress[]>;
78
76
  }
79
77
 
80
- static getScannedProjectMasterformatProgress({projectId}: AssociationIds, user: User): Promise<ApiProjectMasterformatProgress[]> {
78
+ static getScannedProjectMasterformatProgress({ projectId }: AssociationIds,
79
+ user: User): Promise<ApiProjectMasterformatProgress[]> {
81
80
  let url = `${Http.baseUrl()}/projects/${projectId}/masterformat-progress`;
82
81
  return Http.get(url, user) as unknown as Promise<ApiProjectMasterformatProgress[]>;
83
82
  }
84
83
 
85
- static getScheduledProjectMasterformatProgress({projectId}: AssociationIds, user: User): Promise<ApiProjectMasterformatProgress[]> {
86
- let url = `${Http.baseUrl()}/projects/${projectId}/scheduled-masterformat-progress`;
84
+ // TODO: Make schedule type an enum?
85
+ static getScheduledProjectMasterformatProgress({ projectId }: AssociationIds,
86
+ scheduleType: "current" | "baseline",
87
+ user: User): Promise<ApiProjectMasterformatProgress[]> {
88
+ let url = `${Http.baseUrl()}/projects/${projectId}/scheduled-masterformat-progress/${scheduleType}`;
87
89
  return Http.get(url, user) as unknown as Promise<ApiProjectMasterformatProgress[]>;
88
90
  }
89
91
 
90
- static listProjectFloorFiles({projectId}: AssociationIds, user: User): Promise<ApiCloudFile[]> {
92
+ static listProjectFloorFiles({ projectId }: AssociationIds, user: User): Promise<ApiCloudFile[]> {
91
93
  let url = `${Http.baseUrl()}/projects/${projectId}/floor-files`;
92
94
  return Http.get(url, user) as unknown as Promise<ApiCloudFile[]>;
93
95
  }
94
96
 
95
- static getProjectDeviationsReportTsvUrl({projectId}: AssociationIds, fileName: string, user: User): Promise<string> {
97
+ static getProjectDeviationsReportTsvUrl({ projectId }: AssociationIds, fileName: string, user: User): string {
96
98
  const baseUrl = `${Http.baseUrl()}/projects/${projectId}/${fileName}_deviation-report.tsv`;
97
- return Promise.resolve(Http.addAuthToDownloadUrl(baseUrl, user));
99
+ return Http.addAuthToDownloadUrl(baseUrl, user);
98
100
  }
99
101
 
100
- static getProjectDeviationsReportTsv({projectId}: AssociationIds, user: User): Promise<string> {
102
+ static getProjectDeviationsReportTsv({ projectId }: AssociationIds, user: User): Promise<string> {
101
103
  const baseUrl = `${Http.baseUrl()}/projects/${projectId}/project_deviation-report.tsv`;
102
104
  const url = Http.addAuthToDownloadUrl(baseUrl, user);
103
105
  return Http.get(url, user, "text/tab-separated-values; charset=utf-8") as unknown as Promise<string>;
104
106
  }
105
107
 
106
- static getWorkPackages(projectId: string, user:User) {
108
+ static getWorkPackages(projectId: string, user: User) {
107
109
  let url = `${Http.baseUrl()}/projects/${projectId}/work-packages`;
108
110
  return Http.get(url, user) as unknown as Promise<ApiWorkPackage[]>;
109
111
  }
110
112
 
111
- static saveWorkPackages(projectId: string, user:User, workPackages: ApiWorkPackage[]) {
113
+ static saveWorkPackages(projectId: string, user: User, workPackages: ApiWorkPackage[]) {
112
114
  let url = `${Http.baseUrl()}/projects/${projectId}/work-packages`;
113
115
  return Http.put(url, user, workPackages) as unknown as Promise<ApiWorkPackage[]>;
114
116
  }
115
117
  }
116
118
 
117
- makeErrorsPretty(ProjectApi);
119
+ makeErrorsPretty(ProjectApi);
@@ -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
  }