diff --git a/.yarn/cache/data-uri-to-buffer-npm-4.0.1-5c66a78beb-0d0790b67f.zip b/.yarn/cache/data-uri-to-buffer-npm-4.0.1-5c66a78beb-0d0790b67f.zip
new file mode 100644
index 0000000..dc18c88
Binary files /dev/null and b/.yarn/cache/data-uri-to-buffer-npm-4.0.1-5c66a78beb-0d0790b67f.zip differ
diff --git a/.yarn/cache/fetch-blob-npm-3.2.0-28e01becfc-f19bc28a2a.zip b/.yarn/cache/fetch-blob-npm-3.2.0-28e01becfc-f19bc28a2a.zip
new file mode 100644
index 0000000..e90e7e2
Binary files /dev/null and b/.yarn/cache/fetch-blob-npm-3.2.0-28e01becfc-f19bc28a2a.zip differ
diff --git a/.yarn/cache/formdata-polyfill-npm-4.0.10-e03013c013-82a34df292.zip b/.yarn/cache/formdata-polyfill-npm-4.0.10-e03013c013-82a34df292.zip
new file mode 100644
index 0000000..118da5c
Binary files /dev/null and b/.yarn/cache/formdata-polyfill-npm-4.0.10-e03013c013-82a34df292.zip differ
diff --git a/.yarn/cache/node-domexception-npm-1.0.0-e1e813b76f-ee1d37dd2a.zip b/.yarn/cache/node-domexception-npm-1.0.0-e1e813b76f-ee1d37dd2a.zip
new file mode 100644
index 0000000..d58ba92
Binary files /dev/null and b/.yarn/cache/node-domexception-npm-1.0.0-e1e813b76f-ee1d37dd2a.zip differ
diff --git a/.yarn/cache/node-fetch-npm-3.3.2-5267e015f2-06a04095a2.zip b/.yarn/cache/node-fetch-npm-3.3.2-5267e015f2-06a04095a2.zip
new file mode 100644
index 0000000..9b17e87
Binary files /dev/null and b/.yarn/cache/node-fetch-npm-3.3.2-5267e015f2-06a04095a2.zip differ
diff --git a/.yarn/cache/web-streams-polyfill-npm-3.2.1-835bd3857e-b119c78574.zip b/.yarn/cache/web-streams-polyfill-npm-3.2.1-835bd3857e-b119c78574.zip
new file mode 100644
index 0000000..8476915
Binary files /dev/null and b/.yarn/cache/web-streams-polyfill-npm-3.2.1-835bd3857e-b119c78574.zip differ
diff --git a/.yarn/install-state.gz b/.yarn/install-state.gz
index f083dc5..0fdf29c 100644
Binary files a/.yarn/install-state.gz and b/.yarn/install-state.gz differ
diff --git a/README.md b/README.md
index 4f9f05b..aed5376 100644
--- a/README.md
+++ b/README.md
@@ -5,6 +5,8 @@
**THIS IS A VERY EARLY DEVELOPMENT VERSION** USE AT YOUR OWN RISK
### Included Nodes
-- `records` - Read records of a table
+- `get records` - Read records of a table
+- `update records` - Update records of a table
+- `add records` - Add records of a table
- `server` - Config node for a grist server instance
- `document` - Config node for a grist document
\ No newline at end of file
diff --git a/node-red-grist/add-records.html b/node-red-grist/add-records.html
new file mode 100644
index 0000000..b0aeaa3
--- /dev/null
+++ b/node-red-grist/add-records.html
@@ -0,0 +1,55 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/node-red-grist/add-records.js b/node-red-grist/add-records.js
new file mode 100644
index 0000000..d2fcb13
--- /dev/null
+++ b/node-red-grist/add-records.js
@@ -0,0 +1,24 @@
+const { GristDocAPI } = require('grist-api');
+const mustache = require('mustache');
+module.exports = function (RED) {
+ function AddRecordsNode(config) {
+ RED.nodes.createNode(this, config);
+ let node = this;
+ this.document = RED.nodes.getNode(config.document);
+ this.server = RED.nodes.getNode(config.server);
+ this.table = config.tableId
+
+ node.on('input', async function (msg, send, done) {
+ const protocol = this.server.tlsEnabled === true ? "https" : "http";
+ const url = protocol + "://" + this.server.hostname + ":" + this.server.port;
+ const api = new GristDocAPI(this.document.docid, { apiKey: this.server.apiKey, server: url });
+ const data = Array.isArray(msg.payload) ? msg.payload : [msg.payload]
+
+ api.addRecords(this.table, data).then(data => {
+ node.send({ payload: data, topic: this.table })
+ }).catch(reason => done(reason, "Failed to perform grist request to " + url));
+
+ });
+ }
+ RED.nodes.registerType("grist-add-records", AddRecordsNode);
+}
\ No newline at end of file
diff --git a/node-red-grist/records.html b/node-red-grist/get-records.html
similarity index 86%
rename from node-red-grist/records.html
rename to node-red-grist/get-records.html
index 6c5ebe4..7262ce0 100644
--- a/node-red-grist/records.html
+++ b/node-red-grist/get-records.html
@@ -1,5 +1,5 @@
-
-
+
+
+
+
\ No newline at end of file
diff --git a/node-red-grist/update-records.js b/node-red-grist/update-records.js
new file mode 100644
index 0000000..db797c9
--- /dev/null
+++ b/node-red-grist/update-records.js
@@ -0,0 +1,24 @@
+const { GristDocAPI } = require('grist-api');
+const mustache = require('mustache');
+module.exports = function (RED) {
+ function UpdateRecordsNode(config) {
+ RED.nodes.createNode(this, config);
+ let node = this;
+ this.document = RED.nodes.getNode(config.document);
+ this.server = RED.nodes.getNode(config.server);
+ this.table = config.tableId
+
+ node.on('input', async function (msg, send, done) {
+ const protocol = this.server.tlsEnabled === true ? "https" : "http";
+ const url = protocol + "://" + this.server.hostname + ":" + this.server.port;
+ const api = new GristDocAPI(this.document.docid, { apiKey: this.server.apiKey, server: url });
+ const data = Array.isArray(msg.payload) ? msg.payload : [msg.payload]
+
+ api.updateRecords(this.table, data).then(data => {
+ node.send({ payload: data, topic: this.table })
+ }).catch(reason => done(reason, "Failed to perform grist request to " + url));
+
+ });
+ }
+ RED.nodes.registerType("grist-update-records", UpdateRecordsNode);
+}
\ No newline at end of file
diff --git a/package.json b/package.json
index 63967f1..acfcff4 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@gorootde/node-red-grist",
- "version": "1.1.0",
+ "version": "2.0.0",
"description": "getgrist.com connectivity for NodeRed",
"main": "index.js",
"packageManager": "yarn@3.3.1",
@@ -19,7 +19,9 @@
"node-red": {
"version": ">=2.0.0",
"nodes": {
- "grist-records": "node-red-grist/records.js",
+ "grist-add-records": "node-red-grist/add-records.js",
+ "grist-get-records": "node-red-grist/get-records.js",
+ "grist-update-records": "node-red-grist/update-records.js",
"grist-document": "node-red-grist/document.js",
"grist-server": "node-red-grist/server.js"
}
@@ -31,4 +33,4 @@
"grist-api": "^0.1.7",
"mustache": "^4.2.0"
}
-}
+}
\ No newline at end of file
diff --git a/yarn.lock b/yarn.lock
index f92b349..12cfaed 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -11,6 +11,7 @@ __metadata:
dependencies:
grist-api: ^0.1.7
mustache: ^4.2.0
+ node-fetch: ^3.3.2
languageName: unknown
linkType: soft
@@ -23,6 +24,13 @@ __metadata:
languageName: node
linkType: hard
+"data-uri-to-buffer@npm:^4.0.0":
+ version: 4.0.1
+ resolution: "data-uri-to-buffer@npm:4.0.1"
+ checksum: 0d0790b67ffec5302f204c2ccca4494f70b4e2d940fea3d36b09f0bb2b8539c2e86690429eb1f1dc4bcc9e4df0644193073e63d9ee48ac9fce79ec1506e4aa4c
+ languageName: node
+ linkType: hard
+
"debug@npm:^4.1.1":
version: 4.3.4
resolution: "debug@npm:4.3.4"
@@ -35,6 +43,16 @@ __metadata:
languageName: node
linkType: hard
+"fetch-blob@npm:^3.1.2, fetch-blob@npm:^3.1.4":
+ version: 3.2.0
+ resolution: "fetch-blob@npm:3.2.0"
+ dependencies:
+ node-domexception: ^1.0.0
+ web-streams-polyfill: ^3.0.3
+ checksum: f19bc28a2a0b9626e69fd7cf3a05798706db7f6c7548da657cbf5026a570945f5eeaedff52007ea35c8bcd3d237c58a20bf1543bc568ab2422411d762dd3d5bf
+ languageName: node
+ linkType: hard
+
"follow-redirects@npm:^1.14.0":
version: 1.15.3
resolution: "follow-redirects@npm:1.15.3"
@@ -45,6 +63,15 @@ __metadata:
languageName: node
linkType: hard
+"formdata-polyfill@npm:^4.0.10":
+ version: 4.0.10
+ resolution: "formdata-polyfill@npm:4.0.10"
+ dependencies:
+ fetch-blob: ^3.1.2
+ checksum: 82a34df292afadd82b43d4a740ce387bc08541e0a534358425193017bf9fb3567875dc5f69564984b1da979979b70703aa73dee715a17b6c229752ae736dd9db
+ languageName: node
+ linkType: hard
+
"fs-extra@npm:^8.1.0":
version: 8.1.0
resolution: "fs-extra@npm:8.1.0"
@@ -110,9 +137,34 @@ __metadata:
languageName: node
linkType: hard
+"node-domexception@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "node-domexception@npm:1.0.0"
+ checksum: ee1d37dd2a4eb26a8a92cd6b64dfc29caec72bff5e1ed9aba80c294f57a31ba4895a60fd48347cf17dd6e766da0ae87d75657dfd1f384ebfa60462c2283f5c7f
+ languageName: node
+ linkType: hard
+
+"node-fetch@npm:^3.3.2":
+ version: 3.3.2
+ resolution: "node-fetch@npm:3.3.2"
+ dependencies:
+ data-uri-to-buffer: ^4.0.0
+ fetch-blob: ^3.1.4
+ formdata-polyfill: ^4.0.10
+ checksum: 06a04095a2ddf05b0830a0d5302699704d59bda3102894ea64c7b9d4c865ecdff2d90fd042df7f5bc40337266961cb6183dcc808ea4f3000d024f422b462da92
+ languageName: node
+ linkType: hard
+
"universalify@npm:^0.1.0":
version: 0.1.2
resolution: "universalify@npm:0.1.2"
checksum: 40cdc60f6e61070fe658ca36016a8f4ec216b29bf04a55dce14e3710cc84c7448538ef4dad3728d0bfe29975ccd7bfb5f414c45e7b78883567fb31b246f02dff
languageName: node
linkType: hard
+
+"web-streams-polyfill@npm:^3.0.3":
+ version: 3.2.1
+ resolution: "web-streams-polyfill@npm:3.2.1"
+ checksum: b119c78574b6d65935e35098c2afdcd752b84268e18746606af149e3c424e15621b6f1ff0b42b2676dc012fc4f0d313f964b41a4b5031e525faa03997457da02
+ languageName: node
+ linkType: hard