@jd-data-limited/easy-fm 3.0.4 → 3.0.6
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/package.json +1 -1
- package/src/index.js +130 -110
- package/src/index.ts +154 -132
package/package.json
CHANGED
package/src/index.js
CHANGED
|
@@ -1366,8 +1366,8 @@ class LayoutRecordManager {
|
|
|
1366
1366
|
range(start = 0, limit = 100) {
|
|
1367
1367
|
return new RecordGetRange(this.layout, start, limit);
|
|
1368
1368
|
}
|
|
1369
|
-
find() {
|
|
1370
|
-
return new Find(this.layout);
|
|
1369
|
+
find(start = 0, limit = 100) {
|
|
1370
|
+
return new Find(this.layout, start, limit);
|
|
1371
1371
|
}
|
|
1372
1372
|
}
|
|
1373
1373
|
export class RecordBase extends EventEmitter {
|
|
@@ -1384,19 +1384,6 @@ export class RecordBase extends EventEmitter {
|
|
|
1384
1384
|
get edited() {
|
|
1385
1385
|
return !!this.fields.find(i => i.edited);
|
|
1386
1386
|
}
|
|
1387
|
-
processPortalData(portalData) {
|
|
1388
|
-
this.portals = [];
|
|
1389
|
-
for (let item of Object.keys(portalData)) {
|
|
1390
|
-
let _portal = new Portal(this, item);
|
|
1391
|
-
_portal.records = portalData[item].map(item => {
|
|
1392
|
-
let fieldData = item;
|
|
1393
|
-
delete fieldData.recordId;
|
|
1394
|
-
delete fieldData.modId;
|
|
1395
|
-
return new PortalRecord(this, _portal, item.recordId, item.modId, fieldData);
|
|
1396
|
-
});
|
|
1397
|
-
this.portals.push(_portal);
|
|
1398
|
-
}
|
|
1399
|
-
}
|
|
1400
1387
|
processFieldData(fieldData) {
|
|
1401
1388
|
return Object.keys(fieldData).map(item => {
|
|
1402
1389
|
let _field = new Field(this, item, fieldData[item]);
|
|
@@ -1429,36 +1416,62 @@ export class RecordBase extends EventEmitter {
|
|
|
1429
1416
|
return _field;
|
|
1430
1417
|
});
|
|
1431
1418
|
}
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
this.
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1419
|
+
_onSave() {
|
|
1420
|
+
this.emit("saved");
|
|
1421
|
+
for (let field of this.fields)
|
|
1422
|
+
field.edited = false;
|
|
1423
|
+
}
|
|
1424
|
+
getField(field) {
|
|
1425
|
+
return this.fields.find(_field => _field.id === field);
|
|
1426
|
+
}
|
|
1427
|
+
toObject(filter = (a) => a.edited, portalFilter = (a) => a.records.find(record => record.edited), portalRowFilter = (a) => a.edited, portalFieldFilter = (a) => a.edited) {
|
|
1428
|
+
let fields_processed = {};
|
|
1429
|
+
for (let field of this.fields.filter(field => filter(field))) {
|
|
1430
|
+
let value = field.value;
|
|
1431
|
+
if (value instanceof Date) {
|
|
1432
|
+
// @ts-ignore
|
|
1433
|
+
let _value = moment.default(value)
|
|
1434
|
+
.utcOffset(this.layout.database.host.timezoneOffset);
|
|
1435
|
+
// @ts-ignore
|
|
1436
|
+
switch (field.metadata.result) {
|
|
1437
|
+
case "time":
|
|
1438
|
+
value = _value.format(this.layout.database.host.metadata.productInfo.timeFormat.replace("dd", "DD"));
|
|
1439
|
+
break;
|
|
1440
|
+
case "date":
|
|
1441
|
+
value = _value.format(this.layout.database.host.metadata.productInfo.dateFormat.replace("dd", "DD"));
|
|
1442
|
+
break;
|
|
1443
|
+
default:
|
|
1444
|
+
value = _value.format(this.layout.database.host.metadata.productInfo.timeStampFormat.replace("dd", "DD"));
|
|
1456
1445
|
}
|
|
1457
|
-
}
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1446
|
+
}
|
|
1447
|
+
fields_processed[field.id] = value;
|
|
1448
|
+
}
|
|
1449
|
+
let obj = {
|
|
1450
|
+
"recordId": this.recordId,
|
|
1451
|
+
"modId": this.modId,
|
|
1452
|
+
"fieldData": fields_processed
|
|
1453
|
+
};
|
|
1454
|
+
// Check if there's been any edited portal information
|
|
1455
|
+
let portals = this.portals.filter(a => portalFilter(a));
|
|
1456
|
+
if (portals) {
|
|
1457
|
+
obj["portalData"] = {};
|
|
1458
|
+
for (let portal of portals) {
|
|
1459
|
+
obj["portalData"][portal.name] = portal.records.filter(a => portalRowFilter(a)).map(record => {
|
|
1460
|
+
return record.toObject(portalFieldFilter);
|
|
1461
|
+
});
|
|
1462
|
+
}
|
|
1463
|
+
}
|
|
1464
|
+
return obj;
|
|
1465
|
+
}
|
|
1466
|
+
}
|
|
1467
|
+
export class LayoutRecord extends RecordBase {
|
|
1468
|
+
constructor(layout, recordId, modId = recordId, fieldData = {}, portalData = null) {
|
|
1469
|
+
super(layout, recordId, modId);
|
|
1470
|
+
this.fields = this.processFieldData(fieldData);
|
|
1471
|
+
this.portals = [];
|
|
1472
|
+
if (portalData) {
|
|
1473
|
+
this.processPortalData(portalData);
|
|
1474
|
+
}
|
|
1462
1475
|
}
|
|
1463
1476
|
commit(extraBody = {}) {
|
|
1464
1477
|
let trace = new Error();
|
|
@@ -1531,31 +1544,40 @@ export class RecordBase extends EventEmitter {
|
|
|
1531
1544
|
});
|
|
1532
1545
|
}));
|
|
1533
1546
|
}
|
|
1534
|
-
|
|
1535
|
-
this.
|
|
1536
|
-
for (let
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1547
|
+
processPortalData(portalData) {
|
|
1548
|
+
this.portals = [];
|
|
1549
|
+
for (let item of Object.keys(portalData)) {
|
|
1550
|
+
let _portal = new Portal(this, item);
|
|
1551
|
+
_portal.records = portalData[item].map(item => {
|
|
1552
|
+
let fieldData = item;
|
|
1553
|
+
delete fieldData.recordId;
|
|
1554
|
+
delete fieldData.modId;
|
|
1555
|
+
return new PortalRecord(this, _portal, item.recordId, item.modId, fieldData);
|
|
1556
|
+
});
|
|
1557
|
+
this.portals.push(_portal);
|
|
1558
|
+
}
|
|
1544
1559
|
}
|
|
1545
|
-
|
|
1560
|
+
get() {
|
|
1546
1561
|
let trace = new Error();
|
|
1562
|
+
if (this.recordId === -1) {
|
|
1563
|
+
throw "Cannot get this RecordBase until a commit() is done.";
|
|
1564
|
+
}
|
|
1547
1565
|
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
|
|
1566
|
+
if (!this.layout.metadata)
|
|
1567
|
+
yield this.layout.getLayoutMeta();
|
|
1548
1568
|
this.layout.database.apiRequest(this.endpoint, {
|
|
1549
1569
|
port: 443,
|
|
1550
|
-
method: "
|
|
1570
|
+
method: "GET"
|
|
1551
1571
|
})
|
|
1552
1572
|
.then(res => {
|
|
1553
|
-
if (
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
this.
|
|
1558
|
-
|
|
1573
|
+
if (res.messages[0].code === "0") {
|
|
1574
|
+
// console.log(res, res.response.data)
|
|
1575
|
+
this.modId = res.response.data[0].modId;
|
|
1576
|
+
this.fields = this.processFieldData(res.response.data[0].fieldData);
|
|
1577
|
+
this.portalData = [];
|
|
1578
|
+
if (res.response.data[0].portalData)
|
|
1579
|
+
this.processPortalData(res.response.data[0].portalData);
|
|
1580
|
+
resolve(this);
|
|
1559
1581
|
}
|
|
1560
1582
|
else {
|
|
1561
1583
|
reject(new FMError(res.messages[0].code, res.status, res, trace));
|
|
@@ -1566,6 +1588,9 @@ export class RecordBase extends EventEmitter {
|
|
|
1566
1588
|
});
|
|
1567
1589
|
}));
|
|
1568
1590
|
}
|
|
1591
|
+
getPortal(portal) {
|
|
1592
|
+
return this.portals.find(p => p.name === portal);
|
|
1593
|
+
}
|
|
1569
1594
|
duplicate() {
|
|
1570
1595
|
let trace = new Error();
|
|
1571
1596
|
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
|
|
@@ -1592,54 +1617,29 @@ export class RecordBase extends EventEmitter {
|
|
|
1592
1617
|
});
|
|
1593
1618
|
}));
|
|
1594
1619
|
}
|
|
1595
|
-
|
|
1596
|
-
let
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
case "time":
|
|
1606
|
-
value = _value.format(this.layout.database.host.metadata.productInfo.timeFormat.replace("dd", "DD"));
|
|
1607
|
-
break;
|
|
1608
|
-
case "date":
|
|
1609
|
-
value = _value.format(this.layout.database.host.metadata.productInfo.dateFormat.replace("dd", "DD"));
|
|
1610
|
-
break;
|
|
1611
|
-
default:
|
|
1612
|
-
value = _value.format(this.layout.database.host.metadata.productInfo.timeStampFormat.replace("dd", "DD"));
|
|
1620
|
+
delete() {
|
|
1621
|
+
let trace = new Error();
|
|
1622
|
+
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
|
|
1623
|
+
this.layout.database.apiRequest(this.endpoint, {
|
|
1624
|
+
port: 443,
|
|
1625
|
+
method: "DELETE"
|
|
1626
|
+
})
|
|
1627
|
+
.then(res => {
|
|
1628
|
+
if (typeof res.response.scriptError !== "undefined" && res.response.scriptError !== '0') {
|
|
1629
|
+
reject(new FMError(res.response.scriptError, res.status, res, trace));
|
|
1613
1630
|
}
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
for (let portal of portals) {
|
|
1627
|
-
obj["portalData"][portal.name] = portal.records.filter(a => portalRowFilter(a)).map(record => {
|
|
1628
|
-
return record.toObject(portalFieldFilter);
|
|
1629
|
-
});
|
|
1630
|
-
}
|
|
1631
|
-
}
|
|
1632
|
-
return obj;
|
|
1633
|
-
}
|
|
1634
|
-
}
|
|
1635
|
-
export class LayoutRecord extends RecordBase {
|
|
1636
|
-
constructor(layout, recordId, modId = recordId, fieldData = {}, portalData = null) {
|
|
1637
|
-
super(layout, recordId, modId);
|
|
1638
|
-
this.fields = this.processFieldData(fieldData);
|
|
1639
|
-
this.portals = [];
|
|
1640
|
-
if (portalData) {
|
|
1641
|
-
this.processPortalData(portalData);
|
|
1642
|
-
}
|
|
1631
|
+
else if (res.messages[0].code === "0") {
|
|
1632
|
+
this.emit("deleted");
|
|
1633
|
+
resolve();
|
|
1634
|
+
}
|
|
1635
|
+
else {
|
|
1636
|
+
reject(new FMError(res.messages[0].code, res.status, res, trace));
|
|
1637
|
+
}
|
|
1638
|
+
})
|
|
1639
|
+
.catch(e => {
|
|
1640
|
+
reject(e);
|
|
1641
|
+
});
|
|
1642
|
+
}));
|
|
1643
1643
|
}
|
|
1644
1644
|
}
|
|
1645
1645
|
export class Field {
|
|
@@ -1722,6 +1722,24 @@ export class Field {
|
|
|
1722
1722
|
// if (this.metadata.result === "container") throw "Use await field.stream() to get the contents of a container field, instead of field.value"
|
|
1723
1723
|
return this._value;
|
|
1724
1724
|
}
|
|
1725
|
+
get string() {
|
|
1726
|
+
if (typeof this._value === "string") {
|
|
1727
|
+
return this._value;
|
|
1728
|
+
}
|
|
1729
|
+
throw "Field value is not a string";
|
|
1730
|
+
}
|
|
1731
|
+
get date() {
|
|
1732
|
+
if (this._value instanceof Date) {
|
|
1733
|
+
return this._value;
|
|
1734
|
+
}
|
|
1735
|
+
throw "Field value is not a date";
|
|
1736
|
+
}
|
|
1737
|
+
get number() {
|
|
1738
|
+
if (typeof this._value === "number") {
|
|
1739
|
+
return this._value;
|
|
1740
|
+
}
|
|
1741
|
+
throw "Field value is not a number";
|
|
1742
|
+
}
|
|
1725
1743
|
upload(buffer, filename, mime) {
|
|
1726
1744
|
let trace = new Error();
|
|
1727
1745
|
if (this.metadata.result !== "container")
|
|
@@ -1940,8 +1958,10 @@ export class RecordGetRange extends RecordGetOperation {
|
|
|
1940
1958
|
}
|
|
1941
1959
|
}
|
|
1942
1960
|
export class Find extends RecordGetOperation {
|
|
1943
|
-
constructor(layout) {
|
|
1961
|
+
constructor(layout, start = 0, limit = 100) {
|
|
1944
1962
|
super(layout);
|
|
1963
|
+
this.setOffset(start);
|
|
1964
|
+
this.setLimit(limit);
|
|
1945
1965
|
this.queries = [];
|
|
1946
1966
|
}
|
|
1947
1967
|
toObject() {
|
package/src/index.ts
CHANGED
|
@@ -1423,14 +1423,14 @@ export class Layout {
|
|
|
1423
1423
|
/**
|
|
1424
1424
|
* @deprecated use layout.records.create() instead
|
|
1425
1425
|
*/
|
|
1426
|
-
createRecord(): Promise<
|
|
1426
|
+
createRecord(): Promise<LayoutRecord> {
|
|
1427
1427
|
return this.records.create()
|
|
1428
1428
|
}
|
|
1429
1429
|
|
|
1430
1430
|
/**
|
|
1431
1431
|
* @deprecated use layout.records.get() instead
|
|
1432
1432
|
*/
|
|
1433
|
-
getRecord(recordId): Promise<
|
|
1433
|
+
getRecord(recordId): Promise<LayoutRecord> {
|
|
1434
1434
|
return this.records.get(recordId)
|
|
1435
1435
|
}
|
|
1436
1436
|
|
|
@@ -1441,7 +1441,7 @@ export class Layout {
|
|
|
1441
1441
|
return this.records.find()
|
|
1442
1442
|
}
|
|
1443
1443
|
|
|
1444
|
-
runScript(script): Promise<string
|
|
1444
|
+
runScript(script): Promise<string> {
|
|
1445
1445
|
let trace = new Error()
|
|
1446
1446
|
return new Promise(async (resolve, reject) => {
|
|
1447
1447
|
let url = `${this.endpoint}/script/${encodeURIComponent(script.name)}`
|
|
@@ -1488,7 +1488,7 @@ class LayoutRecordManager {
|
|
|
1488
1488
|
this.layout = layout
|
|
1489
1489
|
}
|
|
1490
1490
|
|
|
1491
|
-
create(): Promise<
|
|
1491
|
+
create(): Promise<LayoutRecord> {
|
|
1492
1492
|
return new Promise((resolve, reject) => {
|
|
1493
1493
|
// Get the layout's metadata
|
|
1494
1494
|
this.layout.getLayoutMeta().then(layout => {
|
|
@@ -1505,7 +1505,7 @@ class LayoutRecordManager {
|
|
|
1505
1505
|
})
|
|
1506
1506
|
}
|
|
1507
1507
|
|
|
1508
|
-
get(recordId): Promise<
|
|
1508
|
+
get(recordId): Promise<LayoutRecord> {
|
|
1509
1509
|
return new Promise((resolve, reject) => {
|
|
1510
1510
|
let record
|
|
1511
1511
|
this.layout.getLayoutMeta()
|
|
@@ -1526,8 +1526,8 @@ class LayoutRecordManager {
|
|
|
1526
1526
|
return new RecordGetRange(this.layout, start, limit)
|
|
1527
1527
|
}
|
|
1528
1528
|
|
|
1529
|
-
find(): Find {
|
|
1530
|
-
return new Find(this.layout)
|
|
1529
|
+
find(start = 0, limit = 100): Find {
|
|
1530
|
+
return new Find(this.layout, start, limit)
|
|
1531
1531
|
}
|
|
1532
1532
|
}
|
|
1533
1533
|
|
|
@@ -1554,20 +1554,6 @@ export class RecordBase extends EventEmitter {
|
|
|
1554
1554
|
return !!this.fields.find(i => i.edited)
|
|
1555
1555
|
}
|
|
1556
1556
|
|
|
1557
|
-
protected processPortalData(portalData): void {
|
|
1558
|
-
this.portals = []
|
|
1559
|
-
for (let item of Object.keys(portalData)) {
|
|
1560
|
-
let _portal = new Portal(this, item)
|
|
1561
|
-
_portal.records = portalData[item].map(item => {
|
|
1562
|
-
let fieldData = item;
|
|
1563
|
-
delete fieldData.recordId;
|
|
1564
|
-
delete fieldData.modId;
|
|
1565
|
-
return new PortalRecord(this, _portal, item.recordId, item.modId, fieldData);
|
|
1566
|
-
})
|
|
1567
|
-
this.portals.push(_portal);
|
|
1568
|
-
}
|
|
1569
|
-
}
|
|
1570
|
-
|
|
1571
1557
|
processFieldData(fieldData): Field[] {
|
|
1572
1558
|
return Object.keys(fieldData).map(item => {
|
|
1573
1559
|
let _field = new Field(this, item, fieldData[item])
|
|
@@ -1602,38 +1588,76 @@ export class RecordBase extends EventEmitter {
|
|
|
1602
1588
|
})
|
|
1603
1589
|
}
|
|
1604
1590
|
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1591
|
+
_onSave() {
|
|
1592
|
+
this.emit("saved")
|
|
1593
|
+
for (let field of this.fields) field.edited = false
|
|
1594
|
+
}
|
|
1595
|
+
|
|
1596
|
+
getField(field) {
|
|
1597
|
+
return this.fields.find(_field => _field.id === field)
|
|
1598
|
+
}
|
|
1599
|
+
|
|
1600
|
+
toObject(filter = (a) => a.edited,
|
|
1601
|
+
portalFilter = (a) => a.records.find(record => record.edited),
|
|
1602
|
+
portalRowFilter = (a) => a.edited,
|
|
1603
|
+
portalFieldFilter = (a) => a.edited
|
|
1604
|
+
): recordObject {
|
|
1605
|
+
let fields_processed = {}
|
|
1606
|
+
for (let field of this.fields.filter(field => filter(field))) {
|
|
1607
|
+
let value = field.value
|
|
1608
|
+
if (value instanceof Date) {
|
|
1609
|
+
// @ts-ignore
|
|
1610
|
+
let _value = moment.default(value)
|
|
1611
|
+
.utcOffset(this.layout.database.host.timezoneOffset)
|
|
1612
|
+
|
|
1613
|
+
// @ts-ignore
|
|
1614
|
+
|
|
1615
|
+
switch (field.metadata.result) {
|
|
1616
|
+
case "time":
|
|
1617
|
+
value = _value.format(this.layout.database.host.metadata.productInfo.timeFormat.replace("dd", "DD"))
|
|
1618
|
+
break
|
|
1619
|
+
case "date":
|
|
1620
|
+
value = _value.format(this.layout.database.host.metadata.productInfo.dateFormat.replace("dd", "DD"))
|
|
1621
|
+
break
|
|
1622
|
+
default:
|
|
1623
|
+
value = _value.format(this.layout.database.host.metadata.productInfo.timeStampFormat.replace("dd", "DD"))
|
|
1624
|
+
}
|
|
1625
|
+
}
|
|
1626
|
+
fields_processed[field.id] = value
|
|
1627
|
+
}
|
|
1628
|
+
let obj = {
|
|
1629
|
+
"recordId": this.recordId,
|
|
1630
|
+
"modId": this.modId,
|
|
1631
|
+
"fieldData": fields_processed
|
|
1609
1632
|
}
|
|
1610
|
-
return new Promise(async (resolve, reject) => {
|
|
1611
|
-
if (!this.layout.metadata) await this.layout.getLayoutMeta()
|
|
1612
1633
|
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
}
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
this.modId = res.response.data[0].modId
|
|
1621
|
-
this.fields = this.processFieldData(res.response.data[0].fieldData)
|
|
1622
|
-
this.portalData = []
|
|
1623
|
-
if (res.response.data[0].portalData) this.processPortalData(res.response.data[0].portalData)
|
|
1624
|
-
resolve(this)
|
|
1625
|
-
}
|
|
1626
|
-
else {
|
|
1627
|
-
reject(new FMError(res.messages[0].code, res.status, res, trace))
|
|
1628
|
-
}
|
|
1629
|
-
})
|
|
1630
|
-
.catch(e => {
|
|
1631
|
-
reject(e)
|
|
1634
|
+
// Check if there's been any edited portal information
|
|
1635
|
+
let portals = this.portals.filter(a => portalFilter(a))
|
|
1636
|
+
if (portals) {
|
|
1637
|
+
obj["portalData"] = {}
|
|
1638
|
+
for (let portal of portals) {
|
|
1639
|
+
obj["portalData"][portal.name] = portal.records.filter(a => portalRowFilter(a)).map(record => {
|
|
1640
|
+
return record.toObject(portalFieldFilter)
|
|
1632
1641
|
})
|
|
1633
|
-
|
|
1642
|
+
}
|
|
1643
|
+
}
|
|
1644
|
+
return obj
|
|
1645
|
+
}
|
|
1646
|
+
}
|
|
1647
|
+
|
|
1648
|
+
export class LayoutRecord extends RecordBase {
|
|
1649
|
+
portals: Portal[];
|
|
1650
|
+
|
|
1651
|
+
constructor(layout, recordId, modId = recordId, fieldData = {}, portalData = null) {
|
|
1652
|
+
super(layout, recordId, modId);
|
|
1653
|
+
this.fields = this.processFieldData(fieldData)
|
|
1654
|
+
this.portals = []
|
|
1655
|
+
if (portalData) {
|
|
1656
|
+
this.processPortalData(portalData)
|
|
1657
|
+
}
|
|
1634
1658
|
}
|
|
1635
1659
|
|
|
1636
|
-
commit(extraBody: extraBodyOptions = {}): Promise<
|
|
1660
|
+
commit(extraBody: extraBodyOptions = {}): Promise<this> {
|
|
1637
1661
|
let trace = new Error()
|
|
1638
1662
|
return new Promise(async (resolve, reject) => {
|
|
1639
1663
|
let data = this.toObject()
|
|
@@ -1706,33 +1730,72 @@ export class RecordBase extends EventEmitter {
|
|
|
1706
1730
|
})
|
|
1707
1731
|
}
|
|
1708
1732
|
|
|
1709
|
-
|
|
1710
|
-
this.
|
|
1711
|
-
for (let
|
|
1733
|
+
protected processPortalData(portalData): void {
|
|
1734
|
+
this.portals = []
|
|
1735
|
+
for (let item of Object.keys(portalData)) {
|
|
1736
|
+
let _portal = new Portal(this, item)
|
|
1737
|
+
_portal.records = portalData[item].map(item => {
|
|
1738
|
+
let fieldData = item;
|
|
1739
|
+
delete fieldData.recordId;
|
|
1740
|
+
delete fieldData.modId;
|
|
1741
|
+
return new PortalRecord(this, _portal, item.recordId, item.modId, fieldData);
|
|
1742
|
+
})
|
|
1743
|
+
this.portals.push(_portal);
|
|
1744
|
+
}
|
|
1712
1745
|
}
|
|
1713
1746
|
|
|
1714
|
-
|
|
1715
|
-
|
|
1747
|
+
get(): Promise<this> {
|
|
1748
|
+
let trace = new Error()
|
|
1749
|
+
if (this.recordId === -1) {
|
|
1750
|
+
throw "Cannot get this RecordBase until a commit() is done."
|
|
1751
|
+
}
|
|
1752
|
+
return new Promise(async (resolve, reject) => {
|
|
1753
|
+
if (!this.layout.metadata) await this.layout.getLayoutMeta()
|
|
1754
|
+
|
|
1755
|
+
this.layout.database.apiRequest(this.endpoint, {
|
|
1756
|
+
port: 443,
|
|
1757
|
+
method: "GET"
|
|
1758
|
+
})
|
|
1759
|
+
.then(res => {
|
|
1760
|
+
if (res.messages[0].code === "0") {
|
|
1761
|
+
// console.log(res, res.response.data)
|
|
1762
|
+
this.modId = res.response.data[0].modId
|
|
1763
|
+
this.fields = this.processFieldData(res.response.data[0].fieldData)
|
|
1764
|
+
this.portalData = []
|
|
1765
|
+
if (res.response.data[0].portalData) this.processPortalData(res.response.data[0].portalData)
|
|
1766
|
+
resolve(this)
|
|
1767
|
+
}
|
|
1768
|
+
else {
|
|
1769
|
+
reject(new FMError(res.messages[0].code, res.status, res, trace))
|
|
1770
|
+
}
|
|
1771
|
+
})
|
|
1772
|
+
.catch(e => {
|
|
1773
|
+
reject(e)
|
|
1774
|
+
})
|
|
1775
|
+
})
|
|
1716
1776
|
}
|
|
1717
1777
|
|
|
1718
1778
|
getPortal(portal) {
|
|
1719
1779
|
return this.portals.find(p => p.name === portal)
|
|
1720
1780
|
}
|
|
1721
1781
|
|
|
1722
|
-
|
|
1782
|
+
duplicate(): Promise<LayoutRecord> {
|
|
1723
1783
|
let trace = new Error()
|
|
1724
1784
|
return new Promise(async (resolve, reject) => {
|
|
1725
1785
|
this.layout.database.apiRequest(this.endpoint, {
|
|
1726
1786
|
port: 443,
|
|
1727
|
-
method: "
|
|
1787
|
+
method: "POST"
|
|
1728
1788
|
})
|
|
1729
1789
|
.then(res => {
|
|
1730
1790
|
if (typeof res.response.scriptError !== "undefined" && res.response.scriptError !== '0') {
|
|
1731
1791
|
reject(new FMError(res.response.scriptError, res.status, res, trace))
|
|
1732
1792
|
}
|
|
1733
1793
|
else if (res.messages[0].code === "0") {
|
|
1734
|
-
this.
|
|
1735
|
-
|
|
1794
|
+
let data = this.toObject((a) => true, (a) => true, (a) => false, (a) => false)
|
|
1795
|
+
let _res = new LayoutRecord(this.layout, res.response.recordId, res.response.modId, data.fieldData, data.portalData)
|
|
1796
|
+
|
|
1797
|
+
this.emit("duplicated")
|
|
1798
|
+
resolve(_res)
|
|
1736
1799
|
}
|
|
1737
1800
|
else {
|
|
1738
1801
|
reject(new FMError(res.messages[0].code, res.status, res, trace))
|
|
@@ -1744,23 +1807,20 @@ export class RecordBase extends EventEmitter {
|
|
|
1744
1807
|
})
|
|
1745
1808
|
}
|
|
1746
1809
|
|
|
1747
|
-
|
|
1810
|
+
delete(): Promise<void> {
|
|
1748
1811
|
let trace = new Error()
|
|
1749
1812
|
return new Promise(async (resolve, reject) => {
|
|
1750
1813
|
this.layout.database.apiRequest(this.endpoint, {
|
|
1751
1814
|
port: 443,
|
|
1752
|
-
method: "
|
|
1815
|
+
method: "DELETE"
|
|
1753
1816
|
})
|
|
1754
1817
|
.then(res => {
|
|
1755
1818
|
if (typeof res.response.scriptError !== "undefined" && res.response.scriptError !== '0') {
|
|
1756
1819
|
reject(new FMError(res.response.scriptError, res.status, res, trace))
|
|
1757
1820
|
}
|
|
1758
1821
|
else if (res.messages[0].code === "0") {
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
this.emit("duplicated")
|
|
1763
|
-
resolve(_res)
|
|
1822
|
+
this.emit("deleted")
|
|
1823
|
+
resolve()
|
|
1764
1824
|
}
|
|
1765
1825
|
else {
|
|
1766
1826
|
reject(new FMError(res.messages[0].code, res.status, res, trace))
|
|
@@ -1771,67 +1831,6 @@ export class RecordBase extends EventEmitter {
|
|
|
1771
1831
|
})
|
|
1772
1832
|
})
|
|
1773
1833
|
}
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
toObject(filter = (a) => a.edited,
|
|
1777
|
-
portalFilter = (a) => a.records.find(record => record.edited),
|
|
1778
|
-
portalRowFilter = (a) => a.edited,
|
|
1779
|
-
portalFieldFilter = (a) => a.edited
|
|
1780
|
-
): recordObject {
|
|
1781
|
-
let fields_processed = {}
|
|
1782
|
-
for (let field of this.fields.filter(field => filter(field))) {
|
|
1783
|
-
let value = field.value
|
|
1784
|
-
if (value instanceof Date) {
|
|
1785
|
-
// @ts-ignore
|
|
1786
|
-
let _value = moment.default(value)
|
|
1787
|
-
.utcOffset(this.layout.database.host.timezoneOffset)
|
|
1788
|
-
|
|
1789
|
-
// @ts-ignore
|
|
1790
|
-
|
|
1791
|
-
switch (field.metadata.result) {
|
|
1792
|
-
case "time":
|
|
1793
|
-
value = _value.format(this.layout.database.host.metadata.productInfo.timeFormat.replace("dd", "DD"))
|
|
1794
|
-
break
|
|
1795
|
-
case "date":
|
|
1796
|
-
value = _value.format(this.layout.database.host.metadata.productInfo.dateFormat.replace("dd", "DD"))
|
|
1797
|
-
break
|
|
1798
|
-
default:
|
|
1799
|
-
value = _value.format(this.layout.database.host.metadata.productInfo.timeStampFormat.replace("dd", "DD"))
|
|
1800
|
-
}
|
|
1801
|
-
}
|
|
1802
|
-
fields_processed[field.id] = value
|
|
1803
|
-
}
|
|
1804
|
-
let obj = {
|
|
1805
|
-
"recordId": this.recordId,
|
|
1806
|
-
"modId": this.modId,
|
|
1807
|
-
"fieldData": fields_processed
|
|
1808
|
-
}
|
|
1809
|
-
|
|
1810
|
-
// Check if there's been any edited portal information
|
|
1811
|
-
let portals = this.portals.filter(a => portalFilter(a))
|
|
1812
|
-
if (portals) {
|
|
1813
|
-
obj["portalData"] = {}
|
|
1814
|
-
for (let portal of portals) {
|
|
1815
|
-
obj["portalData"][portal.name] = portal.records.filter(a => portalRowFilter(a)).map(record => {
|
|
1816
|
-
return record.toObject(portalFieldFilter)
|
|
1817
|
-
})
|
|
1818
|
-
}
|
|
1819
|
-
}
|
|
1820
|
-
return obj
|
|
1821
|
-
}
|
|
1822
|
-
}
|
|
1823
|
-
|
|
1824
|
-
export class LayoutRecord extends RecordBase {
|
|
1825
|
-
portals: Portal[];
|
|
1826
|
-
|
|
1827
|
-
constructor(layout, recordId, modId = recordId, fieldData = {}, portalData = null) {
|
|
1828
|
-
super(layout, recordId, modId);
|
|
1829
|
-
this.fields = this.processFieldData(fieldData)
|
|
1830
|
-
this.portals = []
|
|
1831
|
-
if (portalData) {
|
|
1832
|
-
this.processPortalData(portalData)
|
|
1833
|
-
}
|
|
1834
|
-
}
|
|
1835
1834
|
}
|
|
1836
1835
|
|
|
1837
1836
|
export class Field {
|
|
@@ -1924,7 +1923,28 @@ export class Field {
|
|
|
1924
1923
|
return this._value
|
|
1925
1924
|
}
|
|
1926
1925
|
|
|
1927
|
-
|
|
1926
|
+
get string(): string {
|
|
1927
|
+
if (typeof this._value === "string") {
|
|
1928
|
+
return this._value
|
|
1929
|
+
}
|
|
1930
|
+
throw "Field value is not a string"
|
|
1931
|
+
}
|
|
1932
|
+
|
|
1933
|
+
get date(): Date {
|
|
1934
|
+
if (this._value instanceof Date) {
|
|
1935
|
+
return this._value
|
|
1936
|
+
}
|
|
1937
|
+
throw "Field value is not a date"
|
|
1938
|
+
}
|
|
1939
|
+
|
|
1940
|
+
get number(): number {
|
|
1941
|
+
if (typeof this._value === "number") {
|
|
1942
|
+
return this._value
|
|
1943
|
+
}
|
|
1944
|
+
throw "Field value is not a number"
|
|
1945
|
+
}
|
|
1946
|
+
|
|
1947
|
+
upload(buffer: Buffer, filename: string, mime: string): Promise<void> {
|
|
1928
1948
|
let trace = new Error()
|
|
1929
1949
|
if (this.metadata.result !== "container") throw "Cannot upload a file to the field; " + this.id + " (not a container field)"
|
|
1930
1950
|
return new Promise(async (resolve, reject) => {
|
|
@@ -1985,11 +2005,11 @@ export class Field {
|
|
|
1985
2005
|
}
|
|
1986
2006
|
|
|
1987
2007
|
export class Portal {
|
|
1988
|
-
readonly record:
|
|
2008
|
+
readonly record: LayoutRecord;
|
|
1989
2009
|
readonly name: string;
|
|
1990
2010
|
public records: PortalRecord[];
|
|
1991
2011
|
|
|
1992
|
-
constructor(record:
|
|
2012
|
+
constructor(record: LayoutRecord, name: string) {
|
|
1993
2013
|
this.record = record
|
|
1994
2014
|
this.name = name
|
|
1995
2015
|
}
|
|
@@ -2126,11 +2146,11 @@ export class RecordGetRange extends RecordGetOperation {
|
|
|
2126
2146
|
/**
|
|
2127
2147
|
* @deprecated in favour of .fetch()
|
|
2128
2148
|
*/
|
|
2129
|
-
run(extraBody: extraBodyOptions = {}): Promise<
|
|
2149
|
+
run(extraBody: extraBodyOptions = {}): Promise<LayoutRecord[]> {
|
|
2130
2150
|
return this.fetch(extraBody)
|
|
2131
2151
|
}
|
|
2132
2152
|
|
|
2133
|
-
fetch(extraBody: extraBodyOptions = {}): Promise<
|
|
2153
|
+
fetch(extraBody: extraBodyOptions = {}): Promise<LayoutRecord[]> {
|
|
2134
2154
|
let trace = new Error()
|
|
2135
2155
|
return new Promise((resolve, reject) => {
|
|
2136
2156
|
// console.log(this.#toObject())
|
|
@@ -2163,8 +2183,10 @@ export class RecordGetRange extends RecordGetOperation {
|
|
|
2163
2183
|
export class Find extends RecordGetOperation {
|
|
2164
2184
|
protected queries: object[]
|
|
2165
2185
|
|
|
2166
|
-
constructor(layout) {
|
|
2186
|
+
constructor(layout, start = 0, limit = 100) {
|
|
2167
2187
|
super(layout)
|
|
2188
|
+
this.setOffset(start)
|
|
2189
|
+
this.setLimit(limit)
|
|
2168
2190
|
this.queries = []
|
|
2169
2191
|
}
|
|
2170
2192
|
|
|
@@ -2204,7 +2226,7 @@ export class Find extends RecordGetOperation {
|
|
|
2204
2226
|
return this.fetch()
|
|
2205
2227
|
}
|
|
2206
2228
|
|
|
2207
|
-
fetch(): Promise<
|
|
2229
|
+
fetch(): Promise<LayoutRecord[]> {
|
|
2208
2230
|
let trace = new Error()
|
|
2209
2231
|
return new Promise((resolve, reject) => {
|
|
2210
2232
|
// console.log(this.#toObject())
|