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,202 +1,233 @@
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"] = {
init: function () {
this.setTooltip(Blockly.Msg.senseBox_osem_connection_tip);
this.setHelpUrl("");
this.setColour(getColour().sensebox);
this.appendDummyInput()
.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("SSL")
.appendField(new Blockly.FieldCheckbox("TRUE"), "SSL");
this.appendDummyInput()
.setAlign(Blockly.ALIGN_LEFT)
.appendField(Blockly.Msg.senseBox_osem_exposure)
.appendField(
new Blockly.FieldDropdown([
[Blockly.Msg.senseBox_osem_stationary, "Stationary"],
[Blockly.Msg.senseBox_osem_mobile, "Mobile"],
]),
"type"
);
if (!boxes) {
this.appendDummyInput()
.setAlign(Blockly.ALIGN_LEFT)
.appendField("senseBox ID")
.appendField(new Blockly.FieldTextInput("senseBox ID"), "BoxID");
} else {
var dropdown = [];
for (var i = 0; i < boxes.length; i++) {
dropdown.push([boxes[i].name, boxes[i]._id]);
}
this.appendDummyInput()
.setAlign(Blockly.ALIGN_LEFT)
.appendField("senseBox ID")
.appendField(new Blockly.FieldDropdown(dropdown), "BoxID");
}
this.appendDummyInput()
.setAlign(Blockly.ALIGN_LEFT)
.appendField(Blockly.Msg.senseBox_osem_access_token)
.appendField(new Blockly.FieldTextInput("access_token"), "access_token");
this.appendStatementInput("DO")
.appendField(Blockly.Msg.senseBox_sensor)
.setCheck(null);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.getField("type").setValidator(
function (val) {
this.updateShape_(val === "Mobile");
}.bind(this)
);
},
onchange: function (e) {
var legal = false;
// Is the block nested in a loop?
var block = this;
do {
if (this.LOOP_TYPES.indexOf(block.type) !== -1) {
legal = true;
break;
}
block = block.getSurroundParent();
} while (block);
if (legal) {
this.setWarningText(null);
} else {
this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING);
}
Blockly.Blocks['sensebox_osem_connection'] = {
init: function () {
this.setTooltip(Blockly.Msg.senseBox_osem_connection_tip);
this.setHelpUrl('');
this.setColour(getColour().sensebox);
this.appendDummyInput()
.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('SSL')
.appendField(new Blockly.FieldCheckbox("TRUE"), "SSL");
this.appendDummyInput()
.setAlign(Blockly.ALIGN_LEFT)
.appendField(Blockly.Msg.senseBox_osem_exposure)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.senseBox_osem_stationary, 'Stationary'], [Blockly.Msg.senseBox_osem_mobile, 'Mobile']]), "type");
if (!boxes) {
this.appendDummyInput()
.setAlign(Blockly.ALIGN_LEFT)
.appendField("senseBox ID")
.appendField(new Blockly.FieldTextInput("senseBox ID"), "BoxID");
} else {
var dropdown = []
for (var i = 0; i < boxes.length; i++) {
dropdown.push([boxes[i].name, boxes[i]._id])
}
this.appendDummyInput()
.setAlign(Blockly.ALIGN_LEFT)
.appendField("senseBox ID")
.appendField(new Blockly.FieldDropdown(dropdown), 'BoxID');
}
this.appendDummyInput()
.setAlign(Blockly.ALIGN_LEFT)
.appendField(Blockly.Msg.senseBox_osem_access_token)
.appendField(new Blockly.FieldTextInput("access_token"), "access_token");
this.appendStatementInput('DO')
.appendField(Blockly.Msg.senseBox_sensor)
.setCheck(null);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
},
onchange: function (e) {
var legal = false;
// Is the block nested in a loop?
var block = this;
do {
if (this.LOOP_TYPES.indexOf(block.type) !== -1) {
legal = true;
break;
}
block = block.getSurroundParent();
} while (block);
if (legal) {
this.setWarningText(null);
} else {
this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING);
}
/**
* List of block types that are loops and thus do not need warnings.
* To add a new loop type add this to your code:
* Blockly.Blocks['controls_flow_statements'].LOOP_TYPES.push('custom_loop');
*/
selectedBox = this.getFieldValue('BoxID');
if (selectedBox !== '' && boxes) {
var accessToken = boxes.find(element => element._id === selectedBox).access_token
if (accessToken !== undefined) {
this.getField('access_token').setValue(accessToken)
} else {
this.getField('access_token').setValue('access_token')
}
}
},
mutationToDom: function () {
var container = document.createElement('mutation');
var input = this.getFieldValue('type');
this.updateShape_(input);
container.setAttribute('type', input);
return container;
},
domToMutation: function (xmlElement) {
var connections = xmlElement.getAttribute('connections');
this.updateShape_(connections);
},
/** /**
* Modify this block to have the correct number of pins available. * List of block types that are loops and thus do not need warnings.
* @param {boolean} * To add a new loop type add this to your code:
* @private * Blockly.Blocks['controls_flow_statements'].LOOP_TYPES.push('custom_loop');
* @this Blockly.Block
*/ */
updateShape_: function () { selectedBox = this.getFieldValue("BoxID");
var extraFieldExist = this.getFieldValue('gps'); if (selectedBox !== "" && boxes) {
var input = this.getFieldValue('type'); var accessToken = boxes.find(
if ((input === 'Mobile') && extraFieldExist === null) { (element) => element._id === selectedBox
this.appendValueInput('lat', 'Number') ).access_token;
.appendField(Blockly.Msg.senseBox_gps_lat, 'gps'); if (accessToken !== undefined) {
this.appendValueInput('lng', 'Number') this.getField("access_token").setValue(accessToken);
.appendField(Blockly.Msg.senseBox_gps_lng); } else {
this.appendValueInput('altitude', 'Number') this.getField("access_token").setValue("access_token");
.appendField(Blockly.Msg.senseBox_gps_alt); }
this.appendValueInput('timeStamp', 'Number') }
.appendField(Blockly.Msg.senseBox_gps_timeStamp); },
}
if (input === 'Stationary' && extraFieldExist !== null) { updateShape_(isMobile) {
this.removeInput('lat'); if (isMobile) {
this.removeInput('lng'); if (this.getInput("lat") == null) {
this.removeInput('altitude'); this.appendValueInput("lat", "Number").appendField(
this.removeInput('timeStamp'); Blockly.Msg.senseBox_gps_lat,
} "gps"
}, );
LOOP_TYPES: ['sensebox_interval_timer'] 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 {
this.removeInput("lat", true);
this.removeInput("lng", true);
this.removeInput("altitude", true);
this.removeInput("timeStamp", true);
}
},
// 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(
.appendField(new Blockly.FieldDropdown( new Blockly.FieldDropdown(this.generateOptions),
this.generateOptions), 'SensorID'); "SensorID"
} else { );
this.appendValueInput('Value') } else {
.setAlign(Blockly.ALIGN_LEFT) this.appendValueInput("Value")
.appendField('Phänomen') .setAlign(Blockly.ALIGN_LEFT)
.appendField(new Blockly.FieldTextInput( .appendField("Phänomen")
'sensorID'), 'SensorID') .appendField(new Blockly.FieldTextInput("sensorID"), "SensorID");
}
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
},
generateOptions: function () {
var dropdown = [["", ""]];
var boxID = selectedBox;
if (boxID !== "" && boxes) {
let box = boxes.find((el) => el._id === boxID);
if (box !== undefined) {
for (var i = 0; i < box.sensors.length; i++) {
dropdown.push([box.sensors[i].title, box.sensors[i]._id]);
} }
}
this.setPreviousStatement(true, null); if (dropdown.length > 1) {
this.setNextStatement(true, null); var options = dropdown.slice(1);
}, return options;
} else {
generateOptions: function () { return dropdown;
var dropdown = [['', '']]; }
var boxID = selectedBox; }
if (boxID !== '' && boxes) { return dropdown;
},
let box = boxes.find(el => el._id === boxID); /**
if (box !== undefined) { * Called whenever anything on the workspace changes.
for (var i = 0; i < box.sensors.length; i++) { * Add warning if block is not nested inside a the correct loop.
dropdown.push([box.sensors[i].title, box.sensors[i]._id]) * @param {!Blockly.Events.Abstract} e Change event.
} * @this Blockly.Block
} */
if (dropdown.length > 1) { onchange: function () {
var options = dropdown.slice(1) var legal = false;
return options // Is the block nested in a loop?
} else { var block = this;
return dropdown do {
} if (this.LOOP_TYPES.indexOf(block.type) !== -1) {
} legal = true;
return dropdown break;
}, }
/** block = block.getSurroundParent();
* Called whenever anything on the workspace changes. } while (block);
* Add warning if block is not nested inside a the correct loop. if (legal) {
* @param {!Blockly.Events.Abstract} e Change event. this.setWarningText(null);
* @this Blockly.Block } else {
*/ this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING);
onchange: function () { }
},
var legal = false; /**
// Is the block nested in a loop? * List of block types that are loops and thus do not need warnings.
var block = this; * To add a new loop type add this to your code:
do { * Blockly.Blocks['controls_flow_statements'].LOOP_TYPES.push('custom_loop');
if (this.LOOP_TYPES.indexOf(block.type) !== -1) { */
legal = true; LOOP_TYPES: ["sensebox_osem_connection"],
break;
}
block = block.getSurroundParent();
} while (block);
if (legal) {
this.setWarningText(null);
} else {
this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING);
}
},
/**
* List of block types that are loops and thus do not need warnings.
* To add a new loop type add this to your code:
* Blockly.Blocks['controls_flow_statements'].LOOP_TYPES.push('custom_loop');
*/
LOOP_TYPES: ['sensebox_osem_connection']
}; };

View File

@ -129,48 +129,35 @@ 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) {
}, this.appendValueInput("lat", "Number").appendField(
/** Blockly.Msg.senseBox_gps_lat,
* Modify this block to have the correct number of pins available. "gps"
* @param {boolean} );
* @private this.appendValueInput("lng", "Number").appendField(
* @this Blockly.Block Blockly.Msg.senseBox_gps_lng
*/ );
updateShape_: function () { this.appendValueInput("altitude", "Number").appendField(
var extraFieldExist = this.getFieldValue("gps"); Blockly.Msg.senseBox_gps_alt
var input = this.getFieldValue("type"); );
if (input === "Mobile" && extraFieldExist === null) { }
this.appendValueInput("lat", "Number").appendField( } else {
Blockly.Msg.senseBox_gps_lat, this.removeInput("lat", true);
"gps" this.removeInput("lng", true);
); this.removeInput("altitude", true);
this.appendValueInput("lng", "Number").appendField(
Blockly.Msg.senseBox_gps_lng
);
this.appendValueInput("altitude", "Number").appendField(
Blockly.Msg.senseBox_gps_alt
);
}
if (input === "Stationary" && extraFieldExist !== null) {
this.removeInput("lat");
this.removeInput("lng");
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 this.appendDummyInput("extraField")
*/ .setAlign(Blockly.ALIGN_RIGHT)
.appendField(Blockly.Msg.senseBox_pressure_referencePressure)
domToMutation: function (xmlElement) { .appendField(new Blockly.FieldTextInput("1013"), "referencePressure")
xmlElement.getAttribute("port"); .appendField(Blockly.Msg.senseBox_pressure_referencePressure_dim);
}, }
/** } else {
* Create XML to represent number of pins selection. this.removeInput("extraField", true);
* @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")
.setAlign(Blockly.ALIGN_RIGHT)
.appendField(Blockly.Msg.senseBox_pressure_referencePressure)
.appendField(new Blockly.FieldTextInput("1013"), "referencePressure")
.appendField(Blockly.Msg.senseBox_pressure_referencePressure_dim);
}
if (
(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 this.appendDummyInput("extraField")
*/ .setAlign(Blockly.ALIGN_RIGHT)
.appendField(Blockly.Msg.senseBox_pressure_referencePressure)
domToMutation: function (xmlElement) { .appendField(new Blockly.FieldTextInput("1000"), "time")
xmlElement.getAttribute("port"); .appendField("ms");
}, }
/** } else {
* Create XML to represent number of pins selection. this.removeInput("extraField", true);
* @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")
.setAlign(Blockly.ALIGN_RIGHT)
.appendField(Blockly.Msg.senseBox_pressure_referencePressure)
.appendField(new Blockly.FieldTextInput("1000"), "time")
.appendField("ms");
}
if (
(input === "isPressed" || input === "wasPressed" || input === "Switch") &&
extraFieldExist !== null
) {
this.removeInput("extraField");
} }
}, },
}; };

3988
yarn.lock

File diff suppressed because it is too large Load Diff