import * as Blockly from 'blockly/core'; import { getColour } from '../helpers/colour'; import store from '../../../store'; var boxes = store.getState().auth.user ? store.getState().auth.user.boxes : null; store.subscribe(() => { boxes = store.getState().auth.user ? store.getState().auth.user.boxes : null; }); 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); }, 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. * @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(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'] = { init: function () { this.setTooltip(Blockly.Msg.senseBox_send_to_osem_tip); this.setHelpUrl(''); this.setColour(getColour().sensebox); this.appendDummyInput() .appendField(Blockly.Msg.senseBox_send_to_osem); if (boxes) { this.appendValueInput('Value') .appendField('Phänomen') .appendField(new Blockly.FieldDropdown( this.generateOptions), 'SensorID'); } else { this.appendValueInput('Value') .setAlign(Blockly.ALIGN_LEFT) .appendField('Phänomen') .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]) } } if (dropdown.length > 1) { var options = dropdown.slice(1) return options } else { return dropdown } } return dropdown }, /** * Called whenever anything on the workspace changes. * Add warning if block is not nested inside a the correct loop. * @param {!Blockly.Events.Abstract} e Change event. * @this Blockly.Block */ onchange: function () { 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'); */ LOOP_TYPES: ['sensebox_osem_connection'] };