I have got things narrowed down a bit more. My latest version of the flow demonstrates the columnMoved callback working as expected. But the rowSelectionChanged callback causing a "InternalError: too much recursion". The rowSelected callback never fires. I suspect the rowSelection column formatter has something to do with this.
This is the latest table setup node
[{"id":"845329d3.eb6ed","type":"change","z":"76e403d6.61e914","name":"Setup Tabulator","rules":[{"t":"set","p":"ui_control","pt":"msg","to":"{\"tabulator\":{\"columnMoved\":\"function(column, columns){ var newColumns=[]; columns.forEach(function (column) { newColumns.push({'field': column._column.field}); }); this.send({topic:this.config.topic,ui_control:{callback:'columnMoved',columns:newColumns}}); }\",\"rowSelected\":\"function(row_selected){ this.send({topic:this.config.topic,ui_control:{'callback':'rowSelected','row':row_selected}}); }\",\"rowSelectionChanged\":\"function(data, rows){var newData=[]; data.forEach(function(data){newData.push(data);}); var newRows=[]; rows.forEach(function(row){newRows.push(row);}); this.send({topic:this.config.topic,ui_control:{callback:'rowSelectionChanged', data:newData, rows:newRows}});}\",\"layout\":\"fitColumns\",\"selectable\":1,\"movableColumns\":true,\"columns\":[{\"formatter\":\"rowSelection\",\"align\":\"center\",\"width\":\"2%\",\"headerSort\":false},{\"title\":\"Torque\",\"field\":\"torque\",\"editor\":\"number\",\"editorParams\":{\"step\":0.1}},{\"title\":\"Duration\",\"field\":\"duration\",\"editor\":\"number\"}]},\"customHeight\":12}","tot":"json"},{"t":"set","p":"payload","pt":"msg","to":"[{\"torque\":1,\"duration\":10},{\"torque\":1,\"duration\":10},{\"torque\":1,\"duration\":10},{\"torque\":1,\"duration\":10},{\"torque\":1,\"duration\":10},{\"torque\":1,\"duration\":10},{\"torque\":1,\"duration\":10},{\"torque\":1,\"duration\":10},{\"torque\":1,\"duration\":10},{\"torque\":1,\"duration\":10}]","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":440,"y":100,"wires":[["b0495229.d891d8","840cb515.88f298"]]}]
Here is the the overall flow
[{"id":"76e403d6.61e914","type":"tab","label":"Sandpit","disabled":false,"info":""},{"id":"840cb515.88f298","type":"ui_table","z":"76e403d6.61e914","group":"880623ea.2d0768","name":"tabulator","order":0,"width":"5","height":"10","columns":[],"outputs":1,"cts":true,"x":680,"y":100,"wires":[["df0037a9.300af8"]]},{"id":"3721ea12.95402e","type":"inject","z":"76e403d6.61e914","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"str","x":210,"y":100,"wires":[["845329d3.eb6ed"]]},{"id":"b0495229.d891d8","type":"debug","z":"76e403d6.61e914","name":"table input sandpit","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":730,"y":20,"wires":[]},{"id":"df0037a9.300af8","type":"debug","z":"76e403d6.61e914","name":"table output sandpit","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":910,"y":100,"wires":[]},{"id":"a09ac705.964108","type":"function","z":"76e403d6.61e914","name":"Dummy function for verifying callback Javascript","func":"// I use this editor to write callback functions and check that the Javascript is valid.\n// I then compress the function onto a single line and then use the contents of the line after\n// the equals sign as a string value for value of the relevant callback property in the tabulator object.\n\n// This is line is for the columnMoved callback\n// \"function(column, columns){ var newColumns=[]; columns.forEach(function (column) { newColumns.push({'field': column._column.field}); }); this.send({topic:this.config.topic,ui_control:{callback:'columnMoved',columns:newColumns}}); }\"\nvar columnMoved = function(column, columns){ var newColumns=[]; columns.forEach(function (column) { newColumns.push({'field': column._column.field}); }); this.send({topic:this.config.topic,ui_control:{callback:'columnMoved',columns:newColumns}}); }\n\n// This line is for the row SelectedCallback\n// \"function(row_selected){ this.send({topic:this.config.topic,ui_control:{callback:'rowSelected',row:row_selected}}); }\"\nvar rowSelected = function(row_selected){ this.send({topic:this.config.topic,ui_control:{callback:'rowSelected',row:row_selected}}); }// This line is for the row SelectedCallback\n\n// This line is for the row SelectedCallback\n// \"function(data, rows){ this.send({topic:this.config.topic,ui_control:{callback:'rowSelectionChanged', 'rows':rows, 'data':data}});}\"\nvar rowSelectionChanged = function(data, rows){console.log(`rowSelectionChanged triggered - data ${JSON.stringify(data)} rows ${JSON.stringify(rows)}`); this.send({topic:this.config.topic,ui_control:{callback:'rowSelectionChanged', rows:rows, data:data}});}\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":740,"y":320,"wires":[[]]},{"id":"845329d3.eb6ed","type":"change","z":"76e403d6.61e914","name":"Setup Tabulator","rules":[{"t":"set","p":"ui_control","pt":"msg","to":"{\"tabulator\":{\"columnMoved\":\"function(column, columns){ var newColumns=[]; columns.forEach(function (column) { newColumns.push({'field': column._column.field}); }); this.send({topic:this.config.topic,ui_control:{callback:'columnMoved',columns:newColumns}}); }\",\"rowSelected\":\"function(row_selected){ this.send({topic:this.config.topic,ui_control:{'callback':'rowSelected','row':row_selected}}); }\",\"rowSelectionChanged\":\"function(data, rows){var newData=[]; data.forEach(function(data){newData.push(data);}); var newRows=[]; rows.forEach(function(row){newRows.push(row);}); this.send({topic:this.config.topic,ui_control:{callback:'rowSelectionChanged', data:newData, rows:newRows}});}\",\"layout\":\"fitColumns\",\"selectable\":1,\"movableColumns\":true,\"columns\":[{\"formatter\":\"rowSelection\",\"align\":\"center\",\"width\":\"2%\",\"headerSort\":false},{\"title\":\"Torque\",\"field\":\"torque\",\"editor\":\"number\",\"editorParams\":{\"step\":0.1}},{\"title\":\"Duration\",\"field\":\"duration\",\"editor\":\"number\"}]},\"customHeight\":12}","tot":"json"},{"t":"set","p":"payload","pt":"msg","to":"[{\"torque\":1,\"duration\":10},{\"torque\":1,\"duration\":10},{\"torque\":1,\"duration\":10},{\"torque\":1,\"duration\":10},{\"torque\":1,\"duration\":10},{\"torque\":1,\"duration\":10},{\"torque\":1,\"duration\":10},{\"torque\":1,\"duration\":10},{\"torque\":1,\"duration\":10},{\"torque\":1,\"duration\":10}]","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":440,"y":100,"wires":[["b0495229.d891d8","840cb515.88f298"]]},{"id":"4df1d3a9.a99b54","type":"inject","z":"76e403d6.61e914","name":"inject","props":[],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":210,"y":160,"wires":[["5ba8034e.9b85ac"]]},{"id":"5ba8034e.9b85ac","type":"change","z":"76e403d6.61e914","name":"Setup from example","rules":[{"t":"set","p":"ui_control","pt":"msg","to":"{\"tabulator\":{\"columnMoved\":\"function(column, columns){ var newColumns=[]; columns.forEach(function (column) { newColumns.push({'field': column._column.field}); }); this.send({topic:this.config.topic,ui_control:{callback:'columnMoved',columns:newColumns}}); }\",\"layout\":\"fitColumns\",\"movableColumns\":true,\"groupBy\":\"\",\"columns\":[{\"title\":\"eTorque\",\"field\":\"torque\",\"editor\":\"number\",\"editorParams\":{\"step\":0.1}},{\"title\":\"eDuration\",\"field\":\"duration\",\"editor\":\"number\"}]},\"customHeight\":12}","tot":"json"},{"t":"set","p":"payload","pt":"msg","to":"{\"command\":\"addRow\"}","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":420,"y":160,"wires":[["8b10457e.b151a"]]},{"id":"8b10457e.b151a","type":"debug","z":"76e403d6.61e914","name":"table input example sandpit","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":740,"y":160,"wires":[]},{"id":"fff5c16e.a75478","type":"comment","z":"76e403d6.61e914","name":"N.B. Do not open the UI window until you have done the inject!!!!","info":"","x":350,"y":40,"wires":[]},{"id":"9f010854.96371","type":"ui_button","z":"76e403d6.61e914","name":"add_at_top","group":"8e465b51.c1e048","order":2,"width":0,"height":0,"passthru":false,"label":"Add at top","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":230,"y":440,"wires":[[]]},{"id":"616a46e7.0e817","type":"ui_button","z":"76e403d6.61e914","name":"add_at_bottom","group":"8e465b51.c1e048","order":3,"width":0,"height":0,"passthru":false,"label":"Add at bottom","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":240,"y":480,"wires":[[]]},{"id":"d0397e09.3bb17","type":"ui_button","z":"76e403d6.61e914","name":"run","group":"ff6f54a4.60fab","order":1,"width":0,"height":0,"passthru":false,"label":"Run","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":210,"y":260,"wires":[[]]},{"id":"84cd1d53.5d903","type":"ui_button","z":"76e403d6.61e914","name":"stop","group":"ff6f54a4.60fab","order":1,"width":0,"height":0,"passthru":false,"label":"Stop","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":210,"y":300,"wires":[[]]},{"id":"5d905b1.c3f26a4","type":"ui_button","z":"76e403d6.61e914","name":"step","group":"ff6f54a4.60fab","order":1,"width":0,"height":0,"passthru":false,"label":"Step","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":210,"y":340,"wires":[[]]},{"id":"aefaf.1db0c052","type":"ui_button","z":"76e403d6.61e914","name":"insert_above","group":"8e465b51.c1e048","order":3,"width":0,"height":0,"passthru":false,"label":"Insert above","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":230,"y":520,"wires":[[]]},{"id":"77c8a8b0.24515","type":"ui_button","z":"76e403d6.61e914","name":"insert_below","group":"8e465b51.c1e048","order":3,"width":0,"height":0,"passthru":false,"label":"Insert below","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":230,"y":560,"wires":[[]]},{"id":"93e7d240.91488","type":"ui_button","z":"76e403d6.61e914","name":"delete_selected","group":"8e465b51.c1e048","order":3,"width":0,"height":0,"passthru":false,"label":"Delete selected","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":240,"y":600,"wires":[[]]},{"id":"9b7e7d72.5f74e","type":"ui_button","z":"76e403d6.61e914","name":"delete_all","group":"8e465b51.c1e048","order":3,"width":0,"height":0,"passthru":false,"label":"Delete All","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"topic","topicType":"msg","x":220,"y":640,"wires":[[]]},{"id":"880623ea.2d0768","type":"ui_group","name":"Programme","tab":"1d92acc1.5c9d03","order":2,"disp":true,"width":"5","collapse":false},{"id":"8e465b51.c1e048","type":"ui_group","name":"Edit","tab":"1d92acc1.5c9d03","order":3,"disp":true,"width":"3","collapse":false},{"id":"ff6f54a4.60fab","type":"ui_group","name":"Run","tab":"1d92acc1.5c9d03","order":1,"disp":true,"width":"3","collapse":false},{"id":"1d92acc1.5c9d03","type":"ui_tab","name":"Sandpit","icon":"dashboard","order":1,"disabled":false,"hidden":false}]
I seem to be whistling in the dark here. Once again any help gratefully received.