@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.
Files changed (3) hide show
  1. package/package.json +1 -1
  2. package/src/index.js +130 -110
  3. package/src/index.ts +154 -132
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jd-data-limited/easy-fm",
3
- "version": "3.0.4",
3
+ "version": "3.0.6",
4
4
  "dependencies": {
5
5
  "@types/btoa": "^1.2.3",
6
6
  "@types/events": "^3.0.0",
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
- get() {
1433
- let trace = new Error();
1434
- if (this.recordId === -1) {
1435
- throw "Cannot get this RecordBase until a commit() is done.";
1436
- }
1437
- return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
1438
- if (!this.layout.metadata)
1439
- yield this.layout.getLayoutMeta();
1440
- this.layout.database.apiRequest(this.endpoint, {
1441
- port: 443,
1442
- method: "GET"
1443
- })
1444
- .then(res => {
1445
- if (res.messages[0].code === "0") {
1446
- // console.log(res, res.response.data)
1447
- this.modId = res.response.data[0].modId;
1448
- this.fields = this.processFieldData(res.response.data[0].fieldData);
1449
- this.portalData = [];
1450
- if (res.response.data[0].portalData)
1451
- this.processPortalData(res.response.data[0].portalData);
1452
- resolve(this);
1453
- }
1454
- else {
1455
- reject(new FMError(res.messages[0].code, res.status, res, trace));
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
- .catch(e => {
1459
- reject(e);
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
- _onSave() {
1535
- this.emit("saved");
1536
- for (let field of this.fields)
1537
- field.edited = false;
1538
- }
1539
- getField(field) {
1540
- return this.fields.find(_field => _field.id === field);
1541
- }
1542
- getPortal(portal) {
1543
- return this.portals.find(p => p.name === portal);
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
- delete() {
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: "DELETE"
1570
+ method: "GET"
1551
1571
  })
1552
1572
  .then(res => {
1553
- if (typeof res.response.scriptError !== "undefined" && res.response.scriptError !== '0') {
1554
- reject(new FMError(res.response.scriptError, res.status, res, trace));
1555
- }
1556
- else if (res.messages[0].code === "0") {
1557
- this.emit("deleted");
1558
- resolve();
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
- toObject(filter = (a) => a.edited, portalFilter = (a) => a.records.find(record => record.edited), portalRowFilter = (a) => a.edited, portalFieldFilter = (a) => a.edited) {
1596
- let fields_processed = {};
1597
- for (let field of this.fields.filter(field => filter(field))) {
1598
- let value = field.value;
1599
- if (value instanceof Date) {
1600
- // @ts-ignore
1601
- let _value = moment.default(value)
1602
- .utcOffset(this.layout.database.host.timezoneOffset);
1603
- // @ts-ignore
1604
- switch (field.metadata.result) {
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
- fields_processed[field.id] = value;
1616
- }
1617
- let obj = {
1618
- "recordId": this.recordId,
1619
- "modId": this.modId,
1620
- "fieldData": fields_processed
1621
- };
1622
- // Check if there's been any edited portal information
1623
- let portals = this.portals.filter(a => portalFilter(a));
1624
- if (portals) {
1625
- obj["portalData"] = {};
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<RecordBase | Error | void> {
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<RecordBase> {
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 | FMError | Error> {
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<RecordBase | Error | void> {
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<RecordBase> {
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
- get() {
1606
- let trace = new Error()
1607
- if (this.recordId === -1) {
1608
- throw "Cannot get this RecordBase until a commit() is done."
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
- this.layout.database.apiRequest(this.endpoint, {
1614
- port: 443,
1615
- method: "GET"
1616
- })
1617
- .then(res => {
1618
- if (res.messages[0].code === "0") {
1619
- // console.log(res, res.response.data)
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<RecordBase | FMError> {
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
- _onSave() {
1710
- this.emit("saved")
1711
- for (let field of this.fields) field.edited = false
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
- getField(field) {
1715
- return this.fields.find(_field => _field.id === field)
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
- delete(): Promise<void> {
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: "DELETE"
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.emit("deleted")
1735
- resolve()
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
- duplicate(): Promise<RecordBase> {
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: "POST"
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
- let data = this.toObject((a) => true, (a) => true, (a) => false, (a) => false)
1760
- let _res = new LayoutRecord(this.layout, res.response.recordId, res.response.modId, data.fieldData, data.portalData)
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
- upload(buffer: Buffer, filename: string, mime: string): Promise<void | FMError> {
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: RecordBase;
2008
+ readonly record: LayoutRecord;
1989
2009
  readonly name: string;
1990
2010
  public records: PortalRecord[];
1991
2011
 
1992
- constructor(record: RecordBase, name: string) {
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<RecordBase[]> {
2149
+ run(extraBody: extraBodyOptions = {}): Promise<LayoutRecord[]> {
2130
2150
  return this.fetch(extraBody)
2131
2151
  }
2132
2152
 
2133
- fetch(extraBody: extraBodyOptions = {}): Promise<RecordBase[]> {
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<RecordBase[]> {
2229
+ fetch(): Promise<LayoutRecord[]> {
2208
2230
  let trace = new Error()
2209
2231
  return new Promise((resolve, reject) => {
2210
2232
  // console.log(this.#toObject())