fix loading of blocks with dynamic extra fields

This commit is contained in:
Mario Pesch 2021-12-09 10:44:38 +01:00
parent 9487a490e0
commit 59a226f22e
6 changed files with 8665 additions and 9413 deletions

13494
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -15,8 +15,8 @@
"@material-ui/core": "^4.11.0", "@material-ui/core": "^4.11.0",
"@sentry/react": "^6.0.0", "@sentry/react": "^6.0.0",
"@sentry/tracing": "^6.0.0", "@sentry/tracing": "^6.0.0",
"@testing-library/jest-dom": "^4.2.4", "@testing-library/jest-dom": "^5.16.1",
"@testing-library/react": "^9.5.0", "@testing-library/react": "^12.1.2",
"@testing-library/user-event": "^7.2.1", "@testing-library/user-event": "^7.2.1",
"axios": "^0.22.0", "axios": "^0.22.0",
"blockly": "^6.20210701.0", "blockly": "^6.20210701.0",
@ -25,7 +25,7 @@
"moment": "^2.28.0", "moment": "^2.28.0",
"prismjs": "^1.25.0", "prismjs": "^1.25.0",
"react": "^17.0.2", "react": "^17.0.2",
"react-cookie-consent": "^5.2.0", "react-cookie-consent": "^7.0.0",
"react-dom": "^17.0.2", "react-dom": "^17.0.2",
"react-markdown": "^5.0.2", "react-markdown": "^5.0.2",
"react-mde": "^11.5.0", "react-mde": "^11.5.0",

View File

@ -1,56 +1,76 @@
import * as Blockly from 'blockly/core'; import * as Blockly from "blockly/core";
import { getColour } from '../helpers/colour'; import { getColour } from "../helpers/colour";
import store from '../../../store'; import store from "../../../store";
var boxes = store.getState().auth.user ? store.getState().auth.user.boxes : null; var boxes = store.getState().auth.user
? store.getState().auth.user.boxes
: null;
store.subscribe(() => { store.subscribe(() => {
boxes = store.getState().auth.user ? store.getState().auth.user.boxes : null; boxes = store.getState().auth.user ? store.getState().auth.user.boxes : null;
}); });
var selectedBox = ''; var selectedBox = "";
Blockly.Blocks["sensebox_osem_connection"] = {
Blockly.Blocks['sensebox_osem_connection'] = {
init: function () { init: function () {
this.setTooltip(Blockly.Msg.senseBox_osem_connection_tip); this.setTooltip(Blockly.Msg.senseBox_osem_connection_tip);
this.setHelpUrl(''); this.setHelpUrl("");
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.appendDummyInput() this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_osem_connection) .appendField(Blockly.Msg.senseBox_osem_connection)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_osem_host, '"ingress.opensensemap.org"'], [Blockly.Msg.senseBox_osem_host_workshop, '"ingress.workshop.opensensemap.org"']]), "host") .appendField(
.appendField('SSL') new Blockly.FieldDropdown([
[Blockly.Msg.senseBox_osem_host, '"ingress.opensensemap.org"'],
[
Blockly.Msg.senseBox_osem_host_workshop,
'"ingress.workshop.opensensemap.org"',
],
]),
"host"
)
.appendField("SSL")
.appendField(new Blockly.FieldCheckbox("TRUE"), "SSL"); .appendField(new Blockly.FieldCheckbox("TRUE"), "SSL");
this.appendDummyInput() this.appendDummyInput()
.setAlign(Blockly.ALIGN_LEFT) .setAlign(Blockly.ALIGN_LEFT)
.appendField(Blockly.Msg.senseBox_osem_exposure) .appendField(Blockly.Msg.senseBox_osem_exposure)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_osem_stationary, 'Stationary'], [Blockly.Msg.senseBox_osem_mobile, 'Mobile']]), "type"); .appendField(
new Blockly.FieldDropdown([
[Blockly.Msg.senseBox_osem_stationary, "Stationary"],
[Blockly.Msg.senseBox_osem_mobile, "Mobile"],
]),
"type"
);
if (!boxes) { if (!boxes) {
this.appendDummyInput() this.appendDummyInput()
.setAlign(Blockly.ALIGN_LEFT) .setAlign(Blockly.ALIGN_LEFT)
.appendField("senseBox ID") .appendField("senseBox ID")
.appendField(new Blockly.FieldTextInput("senseBox ID"), "BoxID"); .appendField(new Blockly.FieldTextInput("senseBox ID"), "BoxID");
} else { } else {
var dropdown = [] var dropdown = [];
for (var i = 0; i < boxes.length; i++) { for (var i = 0; i < boxes.length; i++) {
dropdown.push([boxes[i].name, boxes[i]._id]) dropdown.push([boxes[i].name, boxes[i]._id]);
} }
this.appendDummyInput() this.appendDummyInput()
.setAlign(Blockly.ALIGN_LEFT) .setAlign(Blockly.ALIGN_LEFT)
.appendField("senseBox ID") .appendField("senseBox ID")
.appendField(new Blockly.FieldDropdown(dropdown), 'BoxID'); .appendField(new Blockly.FieldDropdown(dropdown), "BoxID");
} }
this.appendDummyInput() this.appendDummyInput()
.setAlign(Blockly.ALIGN_LEFT) .setAlign(Blockly.ALIGN_LEFT)
.appendField(Blockly.Msg.senseBox_osem_access_token) .appendField(Blockly.Msg.senseBox_osem_access_token)
.appendField(new Blockly.FieldTextInput("access_token"), "access_token"); .appendField(new Blockly.FieldTextInput("access_token"), "access_token");
this.appendStatementInput('DO') this.appendStatementInput("DO")
.appendField(Blockly.Msg.senseBox_sensor) .appendField(Blockly.Msg.senseBox_sensor)
.setCheck(null); .setCheck(null);
this.setPreviousStatement(true, null); this.setPreviousStatement(true, null);
this.setNextStatement(true, null); this.setNextStatement(true, null);
this.getField("type").setValidator(
function (val) {
this.updateShape_(val === "Mobile");
}.bind(this)
);
}, },
onchange: function (e) { onchange: function (e) {
var legal = false; var legal = false;
// Is the block nested in a loop? // Is the block nested in a loop?
var block = this; var block = this;
@ -72,77 +92,90 @@ Blockly.Blocks['sensebox_osem_connection'] = {
* To add a new loop type add this to your code: * To add a new loop type add this to your code:
* Blockly.Blocks['controls_flow_statements'].LOOP_TYPES.push('custom_loop'); * Blockly.Blocks['controls_flow_statements'].LOOP_TYPES.push('custom_loop');
*/ */
selectedBox = this.getFieldValue('BoxID'); selectedBox = this.getFieldValue("BoxID");
if (selectedBox !== '' && boxes) { if (selectedBox !== "" && boxes) {
var accessToken = boxes.find(element => element._id === selectedBox).access_token var accessToken = boxes.find(
(element) => element._id === selectedBox
).access_token;
if (accessToken !== undefined) { if (accessToken !== undefined) {
this.getField('access_token').setValue(accessToken) this.getField("access_token").setValue(accessToken);
} else { } else {
this.getField('access_token').setValue('access_token') this.getField("access_token").setValue("access_token");
} }
} }
}, },
mutationToDom: function () { updateShape_(isMobile) {
var container = document.createElement('mutation'); if (isMobile) {
var input = this.getFieldValue('type'); if (this.getInput("lat") == null) {
this.updateShape_(input); this.appendValueInput("lat", "Number").appendField(
container.setAttribute('type', input); Blockly.Msg.senseBox_gps_lat,
return container; "gps"
}, );
this.appendValueInput("lng", "Number").appendField(
domToMutation: function (xmlElement) { Blockly.Msg.senseBox_gps_lng
var connections = xmlElement.getAttribute('connections'); );
this.updateShape_(connections); this.appendValueInput("altitude", "Number").appendField(
}, Blockly.Msg.senseBox_gps_alt
/** );
* Modify this block to have the correct number of pins available. this.appendValueInput("timeStamp", "Number").appendField(
* @param {boolean} Blockly.Msg.senseBox_gps_timeStamp
* @private );
* @this Blockly.Block
*/
updateShape_: function () {
var extraFieldExist = this.getFieldValue('gps');
var input = this.getFieldValue('type');
if ((input === 'Mobile') && extraFieldExist === null) {
this.appendValueInput('lat', 'Number')
.appendField(Blockly.Msg.senseBox_gps_lat, 'gps');
this.appendValueInput('lng', 'Number')
.appendField(Blockly.Msg.senseBox_gps_lng);
this.appendValueInput('altitude', 'Number')
.appendField(Blockly.Msg.senseBox_gps_alt);
this.appendValueInput('timeStamp', 'Number')
.appendField(Blockly.Msg.senseBox_gps_timeStamp);
} }
} else {
if (input === 'Stationary' && extraFieldExist !== null) { this.removeInput("lat", true);
this.removeInput('lat'); this.removeInput("lng", true);
this.removeInput('lng'); this.removeInput("altitude", true);
this.removeInput('altitude'); this.removeInput("timeStamp", true);
this.removeInput('timeStamp');
} }
}, },
LOOP_TYPES: ['sensebox_interval_timer']
// updateShape_: function () {
// var extraFieldExist = this.getFieldValue("gps");
// var input = this.getFieldValue("type");
// if (input === "Mobile" && extraFieldExist === null) {
// this.appendValueInput("lat", "Number").appendField(
// Blockly.Msg.senseBox_gps_lat,
// "gps"
// );
// this.appendValueInput("lng", "Number").appendField(
// Blockly.Msg.senseBox_gps_lng
// );
// this.appendValueInput("altitude", "Number").appendField(
// Blockly.Msg.senseBox_gps_alt
// );
// this.appendValueInput("timeStamp", "Number").appendField(
// Blockly.Msg.senseBox_gps_timeStamp
// );
// }
// if (input === "Stationary" && extraFieldExist !== null) {
// this.removeInput("lat");
// this.removeInput("lng");
// this.removeInput("altitude");
// this.removeInput("timeStamp");
// }
// },
LOOP_TYPES: ["sensebox_interval_timer"],
}; };
Blockly.Blocks['sensebox_send_to_osem'] = { Blockly.Blocks["sensebox_send_to_osem"] = {
init: function () { init: function () {
this.setTooltip(Blockly.Msg.senseBox_send_to_osem_tip); this.setTooltip(Blockly.Msg.senseBox_send_to_osem_tip);
this.setHelpUrl(''); this.setHelpUrl("");
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.appendDummyInput() this.appendDummyInput().appendField(Blockly.Msg.senseBox_send_to_osem);
.appendField(Blockly.Msg.senseBox_send_to_osem);
if (boxes) { if (boxes) {
this.appendValueInput('Value') this.appendValueInput("Value")
.appendField('Phänomen') .appendField("Phänomen")
.appendField(new Blockly.FieldDropdown( .appendField(
this.generateOptions), 'SensorID'); new Blockly.FieldDropdown(this.generateOptions),
"SensorID"
);
} else { } else {
this.appendValueInput('Value') this.appendValueInput("Value")
.setAlign(Blockly.ALIGN_LEFT) .setAlign(Blockly.ALIGN_LEFT)
.appendField('Phänomen') .appendField("Phänomen")
.appendField(new Blockly.FieldTextInput( .appendField(new Blockly.FieldTextInput("sensorID"), "SensorID");
'sensorID'), 'SensorID')
} }
this.setPreviousStatement(true, null); this.setPreviousStatement(true, null);
@ -150,24 +183,23 @@ Blockly.Blocks['sensebox_send_to_osem'] = {
}, },
generateOptions: function () { generateOptions: function () {
var dropdown = [['', '']]; var dropdown = [["", ""]];
var boxID = selectedBox; var boxID = selectedBox;
if (boxID !== '' && boxes) { if (boxID !== "" && boxes) {
let box = boxes.find((el) => el._id === boxID);
let box = boxes.find(el => el._id === boxID);
if (box !== undefined) { if (box !== undefined) {
for (var i = 0; i < box.sensors.length; i++) { for (var i = 0; i < box.sensors.length; i++) {
dropdown.push([box.sensors[i].title, box.sensors[i]._id]) dropdown.push([box.sensors[i].title, box.sensors[i]._id]);
} }
} }
if (dropdown.length > 1) { if (dropdown.length > 1) {
var options = dropdown.slice(1) var options = dropdown.slice(1);
return options return options;
} else { } else {
return dropdown return dropdown;
} }
} }
return dropdown return dropdown;
}, },
/** /**
* Called whenever anything on the workspace changes. * Called whenever anything on the workspace changes.
@ -176,7 +208,6 @@ Blockly.Blocks['sensebox_send_to_osem'] = {
* @this Blockly.Block * @this Blockly.Block
*/ */
onchange: function () { onchange: function () {
var legal = false; var legal = false;
// Is the block nested in a loop? // Is the block nested in a loop?
var block = this; var block = this;
@ -198,5 +229,5 @@ Blockly.Blocks['sensebox_send_to_osem'] = {
* To add a new loop type add this to your code: * To add a new loop type add this to your code:
* Blockly.Blocks['controls_flow_statements'].LOOP_TYPES.push('custom_loop'); * Blockly.Blocks['controls_flow_statements'].LOOP_TYPES.push('custom_loop');
*/ */
LOOP_TYPES: ['sensebox_osem_connection'] LOOP_TYPES: ["sensebox_osem_connection"],
}; };

View File

@ -129,29 +129,16 @@ Blockly.Blocks["sensebox_sd_osem"] = {
.setCheck(null); .setCheck(null);
this.setPreviousStatement(true, null); this.setPreviousStatement(true, null);
this.setNextStatement(true, null); this.setNextStatement(true, null);
}, this.getField("type").setValidator(
mutationToDom: function () { function (val) {
var container = document.createElement("mutation"); this.updateShape_(val === "Mobile");
var input = this.getFieldValue("type"); }.bind(this)
this.updateShape_(input); );
container.setAttribute("type", input);
return container;
}, },
domToMutation: function (xmlElement) { updateShape_(isMobile) {
var connections = xmlElement.getAttribute("connections"); if (isMobile) {
this.updateShape_(connections); if (this.getInput("lat") == null) {
},
/**
* Modify this block to have the correct number of pins available.
* @param {boolean}
* @private
* @this Blockly.Block
*/
updateShape_: function () {
var extraFieldExist = this.getFieldValue("gps");
var input = this.getFieldValue("type");
if (input === "Mobile" && extraFieldExist === null) {
this.appendValueInput("lat", "Number").appendField( this.appendValueInput("lat", "Number").appendField(
Blockly.Msg.senseBox_gps_lat, Blockly.Msg.senseBox_gps_lat,
"gps" "gps"
@ -163,14 +150,14 @@ Blockly.Blocks["sensebox_sd_osem"] = {
Blockly.Msg.senseBox_gps_alt Blockly.Msg.senseBox_gps_alt
); );
} }
} else {
if (input === "Stationary" && extraFieldExist !== null) { this.removeInput("lat", true);
this.removeInput("lat"); this.removeInput("lng", true);
this.removeInput("lng"); this.removeInput("altitude", true);
this.removeInput("altitude");
} }
}, },
}; };
Blockly.Blocks["sensebox_sd_save_for_osem"] = { Blockly.Blocks["sensebox_sd_save_for_osem"] = {
init: function () { init: function () {
this.setTooltip(Blockly.Msg.sensebox_sd_save_for_osem_tip); this.setTooltip(Blockly.Msg.sensebox_sd_save_for_osem_tip);

View File

@ -157,50 +157,23 @@ Blockly.Blocks["sensebox_sensor_pressure"] = {
this.setOutput(true, Types.DECIMAL.typeName); this.setOutput(true, Types.DECIMAL.typeName);
this.setTooltip(Blockly.Msg.senseBox_pressure_tooltip); this.setTooltip(Blockly.Msg.senseBox_pressure_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_pressure_helpurl); this.setHelpUrl(Blockly.Msg.senseBox_pressure_helpurl);
this.getField("NAME").setValidator(
function (val) {
this.updateShape_(val === "Altitude");
}.bind(this)
);
}, },
/** updateShape_(isAltitude) {
* Parse XML to restore the number of pins available. if (isAltitude) {
* @param {!Element} xmlElement XML storage element. if (this.getInput("extraField") == null) {
* @this Blockly.Block
*/
domToMutation: function (xmlElement) {
xmlElement.getAttribute("port");
},
/**
* Create XML to represent number of pins selection.
* @return {!Element} XML storage element.
* @this Blockly.Block
*/
mutationToDom: function () {
var container = document.createElement("mutation");
var input = this.getFieldValue("NAME");
this.updateShape_(input);
container.setAttribute("NAME", input);
return container;
},
/**
* Modify this block to have the correct number of pins available.
* @param {boolean}
* @private
* @this Blockly.Block
*/
updateShape_: function () {
var extraFieldExist = this.getFieldValue("referencePressure");
var input = this.getFieldValue("NAME");
if (input === "Altitude" && extraFieldExist === null) {
this.appendDummyInput("extraField") this.appendDummyInput("extraField")
.setAlign(Blockly.ALIGN_RIGHT) .setAlign(Blockly.ALIGN_RIGHT)
.appendField(Blockly.Msg.senseBox_pressure_referencePressure) .appendField(Blockly.Msg.senseBox_pressure_referencePressure)
.appendField(new Blockly.FieldTextInput("1013"), "referencePressure") .appendField(new Blockly.FieldTextInput("1013"), "referencePressure")
.appendField(Blockly.Msg.senseBox_pressure_referencePressure_dim); .appendField(Blockly.Msg.senseBox_pressure_referencePressure_dim);
} }
} else {
if ( this.removeInput("extraField", true);
(input === "Pressure" || input === "Temperature") &&
extraFieldExist !== null
) {
this.removeInput("extraField");
} }
}, },
}; };
@ -370,50 +343,23 @@ Blockly.Blocks["sensebox_button"] = {
this.setOutput(true, Types.BOOLEAN.typeName); this.setOutput(true, Types.BOOLEAN.typeName);
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.setTooltip(Blockly.Msg.senseBox_button_tooltip); this.setTooltip(Blockly.Msg.senseBox_button_tooltip);
this.getField("FUNCTION").setValidator(
function (val) {
this.updateShape_(val === "longPress");
}.bind(this)
);
}, },
/** updateShape_(isLongPress) {
* Parse XML to restore the number of pins available. if (isLongPress) {
* @param {!Element} xmlElement XML storage element. if (this.getInput("extraField") == null) {
* @this Blockly.Block
*/
domToMutation: function (xmlElement) {
xmlElement.getAttribute("port");
},
/**
* Create XML to represent number of pins selection.
* @return {!Element} XML storage element.
* @this Blockly.Block
*/
mutationToDom: function () {
var container = document.createElement("mutation");
var input = this.getFieldValue("FUNCTION");
this.updateShape_(input);
container.setAttribute("FUNCTION", input);
return container;
},
/**
* Modify this block to have the correct number of pins available.
* @param {boolean}
* @private
* @this Blockly.Block
*/
updateShape_: function () {
var extraFieldExist = this.getFieldValue("time");
var input = this.getFieldValue("FUNCTION");
if (input === "longPress" && extraFieldExist === null) {
this.appendDummyInput("extraField") this.appendDummyInput("extraField")
.setAlign(Blockly.ALIGN_RIGHT) .setAlign(Blockly.ALIGN_RIGHT)
.appendField(Blockly.Msg.senseBox_pressure_referencePressure) .appendField(Blockly.Msg.senseBox_pressure_referencePressure)
.appendField(new Blockly.FieldTextInput("1000"), "time") .appendField(new Blockly.FieldTextInput("1000"), "time")
.appendField("ms"); .appendField("ms");
} }
} else {
if ( this.removeInput("extraField", true);
(input === "isPressed" || input === "wasPressed" || input === "Switch") &&
extraFieldExist !== null
) {
this.removeInput("extraField");
} }
}, },
}; };

3988
yarn.lock

File diff suppressed because it is too large Load Diff