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.
- package/dist/avvir_api.node.js +170 -63
- package/dist/esm/api/project_api.d.ts +4 -4
- package/dist/esm/api/project_api.js +7 -5
- package/dist/esm/api/project_api.js.map +1 -1
- 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 +9 -1
- package/source/api/project_api.ts +28 -26
- 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
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
|
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.
|
|
1772
|
-
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);
|
|
1773
1764
|
};
|
|
1774
1765
|
DateConverter.dateToText = function (date, format) {
|
|
1775
1766
|
if (date instanceof Date) {
|
|
1776
|
-
|
|
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
|
|
1776
|
+
return new Date(epochMillis);
|
|
1799
1777
|
}
|
|
1800
1778
|
else {
|
|
1801
1779
|
return null;
|
|
1802
1780
|
}
|
|
1803
1781
|
};
|
|
1804
|
-
DateConverter.
|
|
1805
|
-
if (date
|
|
1806
|
-
return
|
|
1782
|
+
DateConverter.dateToInstant = function (date) {
|
|
1783
|
+
if (date instanceof Date) {
|
|
1784
|
+
return date.getTime() / 1000;
|
|
1807
1785
|
}
|
|
1808
|
-
else
|
|
1809
|
-
return
|
|
1786
|
+
else {
|
|
1787
|
+
return null;
|
|
1810
1788
|
}
|
|
1811
|
-
return date + "";
|
|
1812
1789
|
};
|
|
1813
|
-
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) {
|
|
1814
1797
|
if (date instanceof Date) {
|
|
1815
|
-
|
|
1816
|
-
return epochMillis / 1000;
|
|
1798
|
+
return date.toISOString().substring(0, 10);
|
|
1817
1799
|
}
|
|
1818
|
-
else if (moment__WEBPACK_IMPORTED_MODULE_0___default().isMoment(date)
|
|
1819
|
-
|
|
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 (
|
|
1828
|
-
return
|
|
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 */
|
|
1861
|
-
/* harmony export */ "kebabCase": () => (/* reexport safe */
|
|
1862
|
-
/* harmony export */ "Matrix3Converter": () => (/* reexport safe */
|
|
1863
|
-
/* harmony export */ "Matrix4Converter": () => (/* reexport safe */
|
|
1864
|
-
/* 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)
|
|
1865
1960
|
/* harmony export */ });
|
|
1866
1961
|
/* harmony import */ var _date_converter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2024);
|
|
1867
|
-
/* harmony import */ var
|
|
1868
|
-
/* harmony import */ var
|
|
1869
|
-
/* harmony import */ var
|
|
1870
|
-
/* 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
|
+
|
|
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
|
-
|
|
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
|
|
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 {
|
|
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):
|
|
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
|
-
|
|
48
|
-
|
|
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
|
-
|
|
60
|
-
|
|
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
|
|
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;
|
|
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
|
|
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,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "avvir",
|
|
3
3
|
"repository": "git@github.com:Avvir/avvir-javascript-client.git",
|
|
4
|
-
"version": "0.4.
|
|
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,
|
|
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
|
-
|
|
71
|
-
|
|
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,
|
|
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,
|
|
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
|
-
|
|
86
|
-
|
|
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):
|
|
97
|
+
static getProjectDeviationsReportTsvUrl({ projectId }: AssociationIds, fileName: string, user: User): string {
|
|
96
98
|
const baseUrl = `${Http.baseUrl()}/projects/${projectId}/${fileName}_deviation-report.tsv`;
|
|
97
|
-
return
|
|
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
|
-
|
|
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
|
}
|