UNPKG

iobroker.javascript

Version:
1,182 lines (979 loc) 43.1 kB
'use strict'; if (typeof goog !== 'undefined') { goog.provide('Blockly.JavaScript.System'); goog.require('Blockly.JavaScript'); } Blockly.CustomBlocks = Blockly.CustomBlocks || []; Blockly.CustomBlocks.push('System'); Blockly.System = { HUE: 210, blocks: {} }; // --- Debug output -------------------------------------------------- Blockly.System.blocks['debug'] = '<block type="debug">' + ' <value name="TEXT">' + ' <shadow type="text">' + ' <field name="TEXT">test</field>' + ' </shadow>' + ' </value>' + '</block>'; Blockly.Blocks['debug'] = { init: function() { this.appendValueInput('TEXT') .setCheck(null) .appendField(Blockly.Translate('debug')); this.appendDummyInput() .appendField(new Blockly.FieldDropdown([['info', 'log'], ['debug', 'debug'], ['warning', 'warn'], ['error', 'error']]), 'Severity'); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setInputsInline(false); this.setColour(Blockly.System.HUE); this.setTooltip(Blockly.Translate('debug_tooltip')); this.setHelpUrl(getHelp('debug_help')); } }; Blockly.JavaScript['debug'] = function(block) { const value_text = Blockly.JavaScript.valueToCode(block, 'TEXT', Blockly.JavaScript.ORDER_ATOMIC); const dropdown_severity = block.getFieldValue('Severity'); return `console.${dropdown_severity}(${value_text});\n`; }; // --- comment -------------------------------------------------- Blockly.System.blocks['comment'] = '<block type="comment">' + ' <value name="COMMENT">' + ' </value>' + '</block>'; Blockly.Blocks['comment'] = { init: function() { this.appendDummyInput('COMMENT') .appendField(new Blockly.FieldTextInput(Blockly.Translate('comment')), 'COMMENT'); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setInputsInline(false); this.setColour('#FFFF00'); this.setTooltip(Blockly.Translate('comment_tooltip')); } }; Blockly.JavaScript['comment'] = function(block) { const comment = block.getFieldValue('COMMENT'); return `// ${comment}\n`; }; // --- control ----------------------------------------------------------- Blockly.System.blocks['control'] = '<block type="control">' + ' <value name="OID">' + ' </value>' + ' <value name="VALUE">' + ' </value>' + ' <value name="WITH_DELAY">' + ' </value>' + ' <mutation delay_input="false"></mutation>' + ' <value name="DELAY_MS">' + ' </value>' + ' <value name="UNIT">' + ' </value>' + ' <value name="CLEAR_RUNNING">' + ' </value>' + '</block>'; Blockly.Blocks['control'] = { init: function() { this.appendDummyInput() .appendField(Blockly.Translate('control')); this.appendDummyInput('OID') .appendField(new Blockly.FieldOID('Object ID'), 'OID'); this.appendValueInput('VALUE') .setCheck(null) .appendField(Blockly.Translate('control_with')); this.appendDummyInput('WITH_DELAY') .appendField(Blockly.Translate('control_delay')) .appendField(new Blockly.FieldCheckbox('FALSE', function(option) { this.sourceBlock_.updateShape_(option === true || option === 'true' || option === 'TRUE'); }), 'WITH_DELAY'); this.setInputsInline(true); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setColour(Blockly.System.HUE); this.setTooltip(Blockly.Translate('control_tooltip')); this.setHelpUrl(getHelp('control_help')); }, mutationToDom: function() { const container = document.createElement('mutation'); const option = this.getFieldValue('WITH_DELAY'); container.setAttribute('delay_input', option === true || option === 'true' || option === 'TRUE'); return container; }, domToMutation: function(xmlElement) { const option = xmlElement.getAttribute('delay_input'); this.updateShape_(option === true || option === 'true' || option === 'TRUE'); }, updateShape_: function(delayInput) { // Add or remove a delay Input. let inputExists = this.getInput('DELAY'); if (delayInput) { if (!inputExists) { this.appendDummyInput('DELAY') .appendField(' ') .appendField(new Blockly.FieldTextInput('1000'), 'DELAY_MS') .appendField(new Blockly.FieldDropdown([ [Blockly.Translate('control_ms'), 'ms'], [Blockly.Translate('control_sec'), 'sec'], [Blockly.Translate('control_min'), 'min'] ]), 'UNIT'); } } else if (inputExists) { this.removeInput('DELAY'); } inputExists = this.getInput('CLEAR_RUNNING_INPUT'); if (delayInput) { if (!inputExists) { this.appendDummyInput('CLEAR_RUNNING_INPUT') .appendField(Blockly.Translate('control_clear_running')) .appendField(new Blockly.FieldCheckbox(), 'CLEAR_RUNNING'); } } else if (inputExists) { this.removeInput('CLEAR_RUNNING_INPUT'); } } }; Blockly.JavaScript['control'] = function(block) { const valueObjectID = block.getFieldValue('OID'); Blockly.Msg.VARIABLES_DEFAULT_NAME = 'value'; let valueDelay = parseInt(block.getFieldValue('DELAY_MS'), 10); const unit = block.getFieldValue('UNIT'); if (unit === 'min') { valueDelay *= 60000; } else if (unit === 'sec') { valueDelay *= 1000; } let clearRunning = block.getFieldValue('CLEAR_RUNNING'); clearRunning = clearRunning === 'TRUE' || clearRunning === 'true' || clearRunning === true; const valueValue = Blockly.JavaScript.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC); const withDelay = this.getFieldValue('WITH_DELAY'); let objectName = main.objects[valueObjectID] && main.objects[valueObjectID].common && main.objects[valueObjectID].common.name ? main.objects[valueObjectID].common.name : ''; if (typeof objectName === 'object') { objectName = objectName[systemLang] || objectName.en; } let code; if (withDelay === 'true' || withDelay === true || withDelay === 'TRUE') { code = `setStateDelayed('${valueObjectID}'${objectName ? ` /* ${objectName} */` : ''}, ${valueValue}, ${valueDelay}, ${clearRunning});\n`; } else { code = `setState('${valueObjectID}'${objectName ? ` /* ${objectName} */` : ''}, ${valueValue});\n`; } return code; }; // --- toggle ----------------------------------------------------------- Blockly.System.blocks['toggle'] = '<block type="toggle">' + ' <value name="OID">' + ' </value>' + ' <value name="WITH_DELAY">' + ' </value>' + ' <mutation delay_input="false"></mutation>' + ' <value name="DELAY_MS">' + ' </value>' + ' <value name="UNIT">' + ' </value>' + ' <value name="CLEAR_RUNNING">' + ' </value>' + '</block>'; Blockly.Blocks['toggle'] = { init: function() { this.appendDummyInput() .appendField(Blockly.Translate('toggle')); this.appendDummyInput('OID') .appendField(new Blockly.FieldOID('Object ID'), 'OID'); this.appendDummyInput('WITH_DELAY') .appendField(Blockly.Translate('toggle_delay')) .appendField(new Blockly.FieldCheckbox('FALSE', function(option) { this.sourceBlock_.updateShape_(option === true || option === 'true' || option === 'TRUE'); }), 'WITH_DELAY'); this.setInputsInline(true); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setColour(Blockly.System.HUE); this.setTooltip(Blockly.Translate('toggle_tooltip')); this.setHelpUrl(getHelp('toggle_help')); }, mutationToDom: function() { const container = document.createElement('mutation'); const option = this.getFieldValue('WITH_DELAY'); container.setAttribute('delay_input', option === true || option === 'true' || option === 'TRUE'); return container; }, domToMutation: function(xmlElement) { const option = xmlElement.getAttribute('delay_input'); this.updateShape_(option === true || option === 'true' || option === 'TRUE'); }, updateShape_: function(delayInput) { // Add or remove a delay Input. let inputExists = this.getInput('DELAY'); if (delayInput) { if (!inputExists) { this.appendDummyInput('DELAY') .appendField(' ') .appendField(new Blockly.FieldTextInput('1000'), 'DELAY_MS') .appendField(new Blockly.FieldDropdown([ [Blockly.Translate('control_ms'), 'ms'], [Blockly.Translate('control_sec'), 'sec'], [Blockly.Translate('control_min'), 'min'] ]), 'UNIT'); //.appendField(Blockly.Translate('toggle_ms')); } } else if (inputExists) { this.removeInput('DELAY'); } inputExists = this.getInput('CLEAR_RUNNING_INPUT'); if (delayInput) { if (!inputExists) { this.appendDummyInput('CLEAR_RUNNING_INPUT') .appendField(Blockly.Translate('toggle_clear_running')) .appendField(new Blockly.FieldCheckbox(), 'CLEAR_RUNNING'); } } else if (inputExists) { this.removeInput('CLEAR_RUNNING_INPUT'); } } }; Blockly.JavaScript['toggle'] = function(block) { const valueObjectID = block.getFieldValue('OID'); const unit = block.getFieldValue('UNIT'); Blockly.Msg.VARIABLES_DEFAULT_NAME = 'value'; let valueDelay = parseInt(block.getFieldValue('DELAY_MS'), 10); if (unit === 'min') { valueDelay *= 60000; } else if (unit === 'sec') { valueDelay *= 1000; } const objectType = main.objects[valueObjectID] && main.objects[valueObjectID].common && main.objects[valueObjectID].common.type ? main.objects[valueObjectID].common.type : 'boolean'; let objectName = main.objects[valueObjectID] && main.objects[valueObjectID].common && main.objects[valueObjectID].common.name ? main.objects[valueObjectID].common.name : ''; if (typeof objectName === 'object') { objectName = objectName[systemLang] || objectName.en; } let clearRunning = block.getFieldValue('CLEAR_RUNNING'); clearRunning = clearRunning === 'TRUE' || clearRunning === 'true' || clearRunning === true; let setCommand; if (objectType === 'number') { let max = 100; let min = 0; if (main.objects[valueObjectID].common.max !== undefined) { max = parseFloat(main.objects[valueObjectID].common.max); } if (main.objects[valueObjectID].common.min !== undefined) { min = parseFloat(main.objects[valueObjectID].common.min); } setCommand = `setState('${valueObjectID}'${objectName ? ` /* ${objectName} */` : ''}, state ? (state.val === ${min} ? ${max} : ${min}) : ${max});`; } else { setCommand = `setState('${valueObjectID}'${objectName ? ` /* ${objectName} */` : ''}, state ? !state.val : true);`; } const withDelay = block.getFieldValue('WITH_DELAY'); let code; if (withDelay === 'TRUE' || withDelay === 'true' || withDelay === true) { code = `getState('${valueObjectID}', (err, state) => {\n` + Blockly.JavaScript.prefixLines(`setStateDelayed('${valueObjectID}'${objectName ? ` /* ${objectName} */` : ''}, state ? !state.val : true, ${valueDelay}, ${clearRunning});`, Blockly.JavaScript.INDENT) + '\n' + '});\n'; } else { code = `getState('${valueObjectID}', (err, state) => {\n` + Blockly.JavaScript.prefixLines(setCommand, Blockly.JavaScript.INDENT) + '\n' + '});\n'; } return code; }; // --- update ----------------------------------------------------------- Blockly.System.blocks['update'] = '<block type="update">' + ' <value name="OID">' + ' </value>' + ' <value name="VALUE">' + ' </value>' + ' <value name="WITH_DELAY">' + ' </value>' + ' <mutation delay_input="false"></mutation>' + ' <value name="DELAY_MS">' + ' </value>' + ' <value name="UNIT">' + ' </value>' + ' <value name="CLEAR_RUNNING">' + ' </value>' + '</block>'; Blockly.Blocks['update'] = { init: function() { this.appendDummyInput() .appendField(Blockly.Translate('update')); this.appendDummyInput('OID') .appendField(new Blockly.FieldOID('Object ID'), 'OID'); this.appendValueInput('VALUE') .setCheck(null) .appendField(Blockly.Translate('update_with')); this.appendDummyInput('WITH_DELAY') .appendField(Blockly.Translate('update_delay')) .appendField(new Blockly.FieldCheckbox('FALSE', function(option) { this.sourceBlock_.updateShape_(option === true || option === 'true' || option === 'TRUE'); }), 'WITH_DELAY'); this.setInputsInline(true); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setColour(Blockly.System.HUE); this.setTooltip(Blockly.Translate('update_tooltip')); this.setHelpUrl(getHelp('update_help')); }, mutationToDom: function() { const container = document.createElement('mutation'); const option = this.getFieldValue('WITH_DELAY'); container.setAttribute('delay_input', option === true || option === 'true' || option === 'TRUE'); return container; }, domToMutation: function(xmlElement) { const option = xmlElement.getAttribute('delay_input'); this.updateShape_(option === true || option === 'true' || option === 'TRUE'); }, updateShape_: function(delayInput) { // Add or remove a delay Input. let inputExists = this.getInput('DELAY'); if (delayInput) { if (!inputExists) { this.appendDummyInput('DELAY') .appendField(' ') .appendField(new Blockly.FieldTextInput('1000'), 'DELAY_MS') .appendField(new Blockly.FieldDropdown([ [Blockly.Translate('control_ms'), 'ms'], [Blockly.Translate('control_sec'), 'sec'], [Blockly.Translate('control_min'), 'min'] ]), 'UNIT'); //.appendField(Blockly.Translate('update_ms')); } } else if (inputExists) { this.removeInput('DELAY'); } inputExists = this.getInput('CLEAR_RUNNING_INPUT'); if (delayInput) { if (!inputExists) { this.appendDummyInput('CLEAR_RUNNING_INPUT') .appendField(Blockly.Translate('control_clear_running')) .appendField(new Blockly.FieldCheckbox(), 'CLEAR_RUNNING'); } } else if (inputExists) { this.removeInput('CLEAR_RUNNING_INPUT'); } } }; Blockly.JavaScript['update'] = function(block) { const value_objectid = block.getFieldValue('OID'); Blockly.Msg.VARIABLES_DEFAULT_NAME = 'value'; const value_value = Blockly.JavaScript.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC); const unit = block.getFieldValue('UNIT'); let value_delay = parseInt(block.getFieldValue('DELAY_MS'), 10); if (unit === 'min') { value_delay *= 60000; } else if (unit === 'sec') { value_delay *= 1000; } let clearRunning = block.getFieldValue('CLEAR_RUNNING'); clearRunning = clearRunning === 'TRUE' || clearRunning === 'true' || clearRunning === true; const withDelay = this.getFieldValue('WITH_DELAY'); let objectName = main.objects[value_objectid] && main.objects[value_objectid].common && main.objects[value_objectid].common.name ? main.objects[value_objectid].common.name : ''; if (typeof objectName === 'object') { objectName = objectName[systemLang] || objectName.en; } let code; if (withDelay === true || withDelay === 'true' || withDelay === 'TRUE') { code = `setStateDelayed('${value_objectid}'${objectName ? ` /* ${objectName} */` : ''}, ${value_value}, true, ${value_delay}, ${clearRunning});\n`; } else { code = `setState('${value_objectid}'${objectName ? ` /* ${objectName} */` : ''}, ${value_value}, true);\n`; } return code; }; // --- direct binding ----------------------------------------------------------- Blockly.System.blocks['direct'] = '<block type="direct">' + ' <value name="OID_SRC">' + ' <shadow type="field_oid">' + ' <field name="oid">Object ID 1</field>' + ' </shadow>' + ' </value>' + ' <value name="OID_DST">' + ' <shadow type="field_oid">' + ' <field name="oid">Object ID 2</field>' + ' </shadow>' + ' </value>' + ' <value name="ONLY_CHANGES">' + ' </value>' + '</block>'; Blockly.Blocks['direct'] = { init: function() { this.appendDummyInput() .appendField(Blockly.Translate('direct')); this.appendValueInput('OID_SRC') .setCheck('String') .appendField(Blockly.Translate('direct_oid_src')); this.appendValueInput('OID_DST') .setCheck('String') .appendField(Blockly.Translate('direct_oid_dst')); this.appendDummyInput('ONLY_CHANGES') .appendField(Blockly.Translate('direct_only_changes')) .appendField(new Blockly.FieldCheckbox('TRUE'), 'ONLY_CHANGES'); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setColour(Blockly.Trigger.HUE); this.setTooltip(Blockly.Translate('direct_tooltip')); this.setHelpUrl(getHelp('direct_help')); } }; Blockly.JavaScript['direct'] = function(block) { const oidSrc = Blockly.JavaScript.valueToCode(block, 'OID_SRC', Blockly.JavaScript.ORDER_ATOMIC); const oidDest = Blockly.JavaScript.valueToCode(block, 'OID_DST', Blockly.JavaScript.ORDER_ATOMIC); let onlyChanges = block.getFieldValue('ONLY_CHANGES'); onlyChanges = onlyChanges === true || onlyChanges === 'true' || onlyChanges === 'TRUE'; return `on({ id: ${oidSrc}, change: '${onlyChanges ? 'ne' : 'any'}' }, (obj) => {\n` + Blockly.JavaScript.prefixLines(`setState(${oidDest}, obj.state.val);`, Blockly.JavaScript.INDENT) + '\n' + '});\n'; }; // --- control ex ----------------------------------------------------------- Blockly.System.blocks['control_ex'] = '<block type="control_ex">' + ' <value name="OID">' + ' <shadow type="field_oid">' + ' <field name="oid">Object ID</field>' + ' </shadow>' + ' </value>' + ' <value name="VALUE">' + ' <shadow type="logic_boolean">' + ' <field name="BOOL">TRUE</field>' + ' </shadow>' + ' </value>' + ' <value name="TYPE">' + ' </value>' + ' <value name="DELAY_MS">' + ' <shadow type="math_number">' + ' <field name="NUM">0</field>' + ' </shadow>' + ' </value>' + ' <value name="CLEAR_RUNNING">' + ' </value>' + '</block>'; Blockly.Blocks['control_ex'] = { init: function() { this.appendDummyInput() .appendField(Blockly.Translate('control_ex')); this.appendValueInput('OID') .setCheck('String') .appendField(Blockly.Translate('field_oid_OID')); this.appendDummyInput('TYPE') .appendField(new Blockly.FieldDropdown([ [Blockly.Translate('control_ex_control'), 'false'], [Blockly.Translate('control_ex_update'), 'true'] ]), 'TYPE'); this.appendValueInput('VALUE') .setCheck(null) .appendField(Blockly.Translate('control_ex_value')); this.appendValueInput('DELAY_MS') .setCheck('Number') .appendField(Blockly.Translate('control_ex_delay')); this.appendDummyInput('CLEAR_RUNNING_INPUT') .appendField(Blockly.Translate('control_ex_clear_running')) .appendField(new Blockly.FieldCheckbox(), 'CLEAR_RUNNING'); this.setInputsInline(false); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setColour(Blockly.System.HUE); this.setTooltip(Blockly.Translate('control_tooltip')); this.setHelpUrl(getHelp('control_help')); } }; Blockly.JavaScript['control_ex'] = function(block) { const valueObjectID = Blockly.JavaScript.valueToCode(block, 'OID', Blockly.JavaScript.ORDER_ATOMIC); const value = Blockly.JavaScript.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC); const valueDelay = Blockly.JavaScript.valueToCode(block, 'DELAY_MS', Blockly.JavaScript.ORDER_ATOMIC); let clearRunning = block.getFieldValue('CLEAR_RUNNING'); clearRunning = clearRunning === true || clearRunning === 'true' || clearRunning === 'TRUE'; let type = block.getFieldValue('TYPE'); type = type === true || type === 'true' || type === 'TRUE'; return `setStateDelayed(${valueObjectID}, ${value}, ${type}, parseInt(((${valueDelay}) || '').toString(), 10), ${clearRunning});\n`; }; // --- create state -------------------------------------------------- Blockly.System.blocks['create'] = '<block type="create">' + ' <value name="NAME">' + ' </value>' + ' <value name="VALUE">' + ' </value>' + ' <value name="COMMON">' + ' </value>' + ' <value name="STATEMENT">' + ' </value>' + '</block>'; Blockly.Blocks['create'] = { init: function() { this.appendDummyInput() .appendField(Blockly.Translate('create')); this.appendDummyInput('NAME') .appendField(Blockly.Translate('create_oid')) .appendField(new Blockly.FieldTextInput(Blockly.Translate('create_jsState')), 'NAME'); this.appendValueInput('VALUE') .setCheck(null) .appendField(Blockly.Translate('create_init')); this.appendValueInput('COMMON') .setCheck(null) .appendField(Blockly.Translate('create_common')); this.appendStatementInput('STATEMENT') .setCheck(null); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setInputsInline(false); this.setColour(Blockly.System.HUE); this.setTooltip(Blockly.Translate('create_tooltip')); this.setHelpUrl(getHelp('create_help')); } }; Blockly.JavaScript['create'] = function(block) { const name = block.getFieldValue('NAME'); const value = Blockly.JavaScript.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC); const common = Blockly.JavaScript.valueToCode(block, 'COMMON', Blockly.JavaScript.ORDER_ATOMIC); const statement = Blockly.JavaScript.statementToCode(block, 'STATEMENT'); let paraV = ''; let paraC = ''; if (value !== null && value !== '') { paraV = ', ' + value; } if (common !== null && common !== '') { if (typeof common === 'object') { paraC = `, JSON.parse(${JSON.stringify(common)})`; } else { paraC = `, JSON.parse(${common})`; } } return `createState('${name}'${paraV}${paraC}, async () => {\n` + statement + '});\n'; }; // --- create state ex -------------------------------------------------- Blockly.System.blocks['create_ex'] = '<block type="create_ex">' + ' <value name="NAME">' + ' </value>' + ' <value name="TYPE">' + ' </value>' + ' <value name="VALUE">' + ' </value>' + ' <value name="READABLE">' + ' </value>' + ' <value name="WRITEABLE">' + ' </value>' + ' <value name="STATEMENT">' + ' </value>' + '</block>'; Blockly.Blocks['create_ex'] = { init: function() { this.appendDummyInput() .appendField(Blockly.Translate('create')); this.appendDummyInput('NAME') .appendField(Blockly.Translate('create_oid')) .appendField(new Blockly.FieldTextInput(Blockly.Translate('create_jsState')), 'NAME'); this.appendDummyInput('TYPE') .appendField(Blockly.Translate('create_type')) .appendField(new Blockly.FieldDropdown([ [Blockly.Translate('create_type_string'), 'string'], [Blockly.Translate('create_type_number'), 'number'], [Blockly.Translate('create_type_boolean'), 'boolean'], [Blockly.Translate('create_type_json'), 'json'], //[Blockly.Translate('create_type_object'), 'object'], //[Blockly.Translate('create_type_array'), 'array'], //[Blockly.Translate('create_type_file'), 'file'], ]), 'TYPE'); this.appendValueInput('VALUE') .setCheck(null) .appendField(Blockly.Translate('create_init')); this.appendDummyInput('READABLE_INPUT') .appendField(Blockly.Translate('create_readable')) .appendField(new Blockly.FieldCheckbox('FALSE'), 'READABLE'); this.appendDummyInput('WRITEABLE_INPUT') .appendField(Blockly.Translate('create_writeable')) .appendField(new Blockly.FieldCheckbox('FALSE'), 'WRITEABLE'); this.appendStatementInput('STATEMENT') .setCheck(null); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setInputsInline(false); this.setColour(Blockly.System.HUE); this.setTooltip(Blockly.Translate('create_tooltip')); this.setHelpUrl(getHelp('create_help')); } }; Blockly.JavaScript['create_ex'] = function(block) { const name = block.getFieldValue('NAME'); const type = block.getFieldValue('TYPE'); const value = Blockly.JavaScript.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_ATOMIC); const statement = Blockly.JavaScript.statementToCode(block, 'STATEMENT'); let paraV = ''; if (value !== null && value !== '') { if (type === 'number') { paraV = `, parseFloat(${value})`; } else { paraV = ', ' + value; } } let readable = block.getFieldValue('READABLE'); readable = readable === 'TRUE' || readable === 'true' || readable === true; let writeable = block.getFieldValue('WRITEABLE'); writeable = writeable === 'TRUE' || writeable === 'true' || writeable === true; return `createState('${name}'${paraV}, { type: '${type}', read: ${readable}, write: ${writeable} }, async () => {\n` + statement + '});\n'; }; // --- get value -------------------------------------------------- Blockly.System.blocks['get_value'] = '<block type="get_value">' + ' <value name="ATTR">' + ' </value>' + ' <value name="OID">' + ' </value>' + '</block>'; Blockly.Blocks['get_value'] = { // Checkbox. init: function() { this.appendDummyInput('ATTR') .appendField(new Blockly.FieldDropdown([ [Blockly.Translate('get_value_val'), 'val'], [Blockly.Translate('get_value_ack'), 'ack'], [Blockly.Translate('get_value_ts'), 'ts'], [Blockly.Translate('get_value_lc'), 'lc'], [Blockly.Translate('get_value_q') , 'q'], [Blockly.Translate('get_value_comment') , 'c'], [Blockly.Translate('get_value_from'), 'from'], [Blockly.Translate('get_common_name'), 'common.name'], [Blockly.Translate('get_common_desc'), 'common.desc'], [Blockly.Translate('get_common_unit'), 'common.unit'], [Blockly.Translate('get_common_role'), 'common.role'], [Blockly.Translate('get_common_state_type'), 'common.type'], [Blockly.Translate('get_common_object_type'), 'type'], [Blockly.Translate('get_common_read'), 'common.read'], [Blockly.Translate('get_common_write'), 'common.write'], ]), 'ATTR'); this.appendDummyInput() .appendField(Blockly.Translate('get_value_OID')); this.appendDummyInput() .appendField(new Blockly.FieldOID(Blockly.Translate('get_value_default')), 'OID'); this.setInputsInline(true); this.setOutput(true); this.setColour(Blockly.System.HUE); this.setTooltip(Blockly.Translate('get_value_tooltip')); this.setHelpUrl(getHelp('get_value_help')); } }; Blockly.JavaScript['get_value'] = function(block) { const oid = block.getFieldValue('OID'); const attr = block.getFieldValue('ATTR'); if (attr === 'type' || attr.startsWith('common.')) { return [`(await getObjectAsync('${oid}')).${attr}`, Blockly.JavaScript.ORDER_ATOMIC]; } else { return [`getState('${oid}').${attr}`, Blockly.JavaScript.ORDER_ATOMIC]; } }; // --- get value var -------------------------------------------------- Blockly.System.blocks['get_value_var'] = '<block type="get_value_var">' + ' <value name="ATTR">' + ' </value>' + ' <value name="OID">' + ' <shadow type="field_oid">' + ' <field name="oid">Object ID</field>' + ' </shadow>' + ' </value>' + '</block>'; Blockly.Blocks['get_value_var'] = { init: function() { this.appendDummyInput('ATTR') .appendField(new Blockly.FieldDropdown([ [Blockly.Translate('get_value_val'), 'val'], [Blockly.Translate('get_value_ack'), 'ack'], [Blockly.Translate('get_value_ts'), 'ts'], [Blockly.Translate('get_value_lc'), 'lc'], [Blockly.Translate('get_value_q') , 'q'], [Blockly.Translate('get_value_comment') , 'c'], [Blockly.Translate('get_value_from'), 'from'], [Blockly.Translate('get_common_name'), 'common.name'], [Blockly.Translate('get_common_desc'), 'common.desc'], [Blockly.Translate('get_common_unit'), 'common.unit'], [Blockly.Translate('get_common_role'), 'common.role'], [Blockly.Translate('get_common_state_type'), 'common.type'], [Blockly.Translate('get_common_object_type'), 'type'], [Blockly.Translate('get_common_read'), 'common.read'], [Blockly.Translate('get_common_write'), 'common.write'], ]), 'ATTR'); this.appendDummyInput() .appendField(Blockly.Translate('get_value_OID')); this.appendValueInput('OID') .setCheck(null); this.setInputsInline(true); this.setOutput(true); this.setColour(Blockly.System.HUE); this.setTooltip(Blockly.Translate('get_value_tooltip')); this.setHelpUrl(getHelp('get_value_help')); } }; Blockly.JavaScript['get_value_var'] = function(block) { const oid = Blockly.JavaScript.valueToCode(block, 'OID', Blockly.JavaScript.ORDER_ATOMIC); const attr = block.getFieldValue('ATTR'); if (attr === 'type' || attr.startsWith('common.')) { return [`(await getObjectAsync(${oid})).${attr}`, Blockly.JavaScript.ORDER_ATOMIC]; } else { return [`getState(${oid}).${attr}`, Blockly.JavaScript.ORDER_ATOMIC]; } }; // --- get value async-------------------------------------------------- Blockly.System.blocks['get_value_async'] = '<block type="get_value_async">' + ' <value name="ATTR">' + ' </value>' + ' <value name="OID">' + ' </value>' + ' <value name="STATEMENT">' + ' </value>' + '</block>'; Blockly.Blocks['get_value_async'] = { init: function() { this.appendDummyInput('ATTR') .appendField(new Blockly.FieldDropdown([ [Blockly.Translate('get_value_val'), 'val'], [Blockly.Translate('get_value_ack'), 'ack'], [Blockly.Translate('get_value_ts'), 'ts'], [Blockly.Translate('get_value_lc'), 'lc'], [Blockly.Translate('get_value_q') , 'q'], [Blockly.Translate('get_value_comment') , 'c'], [Blockly.Translate('get_value_from'), 'from'], [Blockly.Translate('get_common_name'), 'common.name'], [Blockly.Translate('get_common_desc'), 'common.desc'], [Blockly.Translate('get_common_unit'), 'common.unit'], [Blockly.Translate('get_common_role'), 'common.role'], [Blockly.Translate('get_common_state_type'), 'common.type'], [Blockly.Translate('get_common_object_type'), 'type'], [Blockly.Translate('get_common_read'), 'common.read'], [Blockly.Translate('get_common_write'), 'common.write'], ]), 'ATTR'); this.appendDummyInput() .appendField(Blockly.Translate('get_value_OID')); this.appendDummyInput() .appendField(new Blockly.FieldOID(Blockly.Translate('get_value_default')), 'OID'); this.appendStatementInput('STATEMENT') .setCheck(null); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setInputsInline(true); this.setColour(Blockly.System.HUE); this.setTooltip(Blockly.Translate('get_value_tooltip')); this.setHelpUrl(getHelp('get_value_help')); } }; Blockly.JavaScript['get_value_async'] = function(block) { const oid = block.getFieldValue('OID'); const attr = block.getFieldValue('ATTR'); const statement = Blockly.JavaScript.statementToCode(block, 'STATEMENT'); if (attr === 'type' || attr.startsWith('common.')) { return `getObjectAsync('${oid}', async (err, obj) => {\n` + Blockly.JavaScript.prefixLines(`let value = obj.${attr};`, Blockly.JavaScript.INDENT) + '\n' + statement + '});\n'; } else { return `getState('${oid}', async (err, state) => {\n` + Blockly.JavaScript.prefixLines(`let value = state.${attr};`, Blockly.JavaScript.INDENT) + '\n' + statement + '});\n'; } }; // --- get object -------------------------------------------------- Blockly.System.blocks['get_object'] = '<block type="get_object">' + ' <value name="OID">' + ' </value>' + '</block>'; Blockly.Blocks['get_object'] = { // Checkbox. init: function() { this.appendDummyInput() .appendField(Blockly.Translate('get_object')); this.appendDummyInput() .appendField(new Blockly.FieldOID(Blockly.Translate('get_object_default')), 'OID'); this.setInputsInline(true); this.setOutput(true); this.setColour(Blockly.System.HUE); this.setTooltip(Blockly.Translate('get_object_tooltip')); this.setHelpUrl(getHelp('get_object_help')); } }; Blockly.JavaScript['get_object'] = function(block) { const oid = block.getFieldValue('OID'); return [`getObject('${oid}')`, Blockly.JavaScript.ORDER_ATOMIC]; }; // --- get object async-------------------------------------------------- Blockly.System.blocks['get_object_async'] = '<block type="get_object_async">' + ' <value name="OID">' + ' </value>' + ' <value name="STATEMENT">' + ' </value>' + '</block>'; Blockly.Blocks['get_object_async'] = { init: function() { this.appendDummyInput() .appendField(Blockly.Translate('get_object')); this.appendDummyInput() .appendField(new Blockly.FieldOID(Blockly.Translate('get_object_default')), 'OID'); this.appendStatementInput('STATEMENT') .setCheck(null); this.setPreviousStatement(true, null); this.setNextStatement(true, null); this.setInputsInline(true); this.setColour(Blockly.System.HUE); this.setTooltip(Blockly.Translate('get_object_tooltip')); this.setHelpUrl(getHelp('get_object_help')); } }; Blockly.JavaScript['get_object_async'] = function(block) { const oid = block.getFieldValue('OID'); const statement = Blockly.JavaScript.statementToCode(block, 'STATEMENT'); return `getObjectAsync('${oid}').then(async (obj) => {\n` + statement + '});\n'; }; // --- select OID -------------------------------------------------- Blockly.System.blocks['field_oid'] = '<block type="field_oid">' + ' <value name="TEXT">' + ' </value>' + '</block>'; Blockly.Blocks['field_oid'] = { init: function() { this.appendDummyInput() .appendField(Blockly.Translate('field_oid_OID')); this.appendDummyInput() .appendField(new Blockly.FieldOID('default'), 'oid'); this.setInputsInline(true); this.setColour("%{BKY_TEXTS_HUE}"); this.setOutput(true, 'String'); this.setTooltip(Blockly.Translate('field_oid_tooltip')); } }; Blockly.JavaScript['field_oid'] = function(block) { const oid = block.getFieldValue('oid'); return [`'${oid}'`, Blockly.JavaScript.ORDER_ATOMIC]; }; // --- select OID meta-------------------------------------------------- Blockly.System.blocks['field_oid_meta'] = '<block type="field_oid_meta">' + ' <value name="TEXT">' + ' </value>' + '</block>'; Blockly.Blocks['field_oid_meta'] = { init: function() { this.appendDummyInput() .appendField(Blockly.Translate('field_oid_OID_meta')); this.appendDummyInput() .appendField(new Blockly.FieldOID('default', 'meta'), 'oid'); this.setInputsInline(true); this.setColour("%{BKY_TEXTS_HUE}"); this.setOutput(true, 'String'); this.setTooltip(Blockly.Translate('field_oid_tooltip')); } }; Blockly.JavaScript['field_oid_meta'] = function(block) { const oid = block.getFieldValue('oid'); return [`'${oid}'`, Blockly.JavaScript.ORDER_ATOMIC]; }; // --- select OID script-------------------------------------------------- Blockly.System.blocks['field_oid_script'] = '<block type="field_oid_script">' + ' <value name="TEXT">' + ' </value>' + '</block>'; Blockly.Blocks['field_oid_script'] = { init: function() { this.appendDummyInput() .appendField(Blockly.Translate('field_oid_OID_script')); this.appendDummyInput() .appendField(new Blockly.FieldOID('default', 'script'), 'oid'); this.setInputsInline(true); this.setColour("%{BKY_TEXTS_HUE}"); this.setOutput(true, 'String'); this.setTooltip(Blockly.Translate('field_oid_tooltip')); } }; Blockly.JavaScript['field_oid_script'] = function(block) { const oid = block.getFieldValue('oid'); return [`'${oid}'`, Blockly.JavaScript.ORDER_ATOMIC]; }; // --- get attribute -------------------------------------------------- Blockly.System.blocks['get_attr'] = '<block type="get_attr">' + ' <value name="PATH">' + ' <shadow type="text">' + ' <field name="PATH">attr1.attr2</field>' + ' </shadow>' + ' </value>' + ' <value name="OBJECT">' + ' </value>' + '</block>'; Blockly.Blocks['get_attr'] = { init: function() { this.appendValueInput('PATH') .setCheck(null) .appendField(Blockly.Translate('get_attr_path')); this.appendValueInput('OBJECT') .appendField(Blockly.Translate('get_attr_by')); this.setInputsInline(true); this.setOutput(true); this.setColour(Blockly.System.HUE); this.setTooltip(Blockly.Translate('get_attr_tooltip')); this.setHelpUrl(getHelp('get_attr_help')); } }; Blockly.JavaScript['get_attr'] = function(block) { const path = Blockly.JavaScript.valueToCode(block, 'PATH', Blockly.JavaScript.ORDER_ATOMIC); const obj = Blockly.JavaScript.valueToCode(block, 'OBJECT', Blockly.JavaScript.ORDER_ATOMIC); return [`getAttr(${obj}, ${path})`, Blockly.JavaScript.ORDER_ATOMIC]; }; // --- regex -------------------------------------------------- Blockly.System.blocks['regex'] = '<block type="regex">' + ' <value name="TEXT">' + ' </value>' + '</block>'; Blockly.Blocks['regex'] = { init: function() { this.appendDummyInput() .appendField('RegExp'); this.appendDummyInput('TEXT') .appendField(new Blockly.FieldTextInput('(.*)'), 'TEXT'); this.setInputsInline(true); this.setColour(Blockly.System.HUE); this.setOutput(true, 'Array'); this.setTooltip(Blockly.Translate('field_oid_tooltip')); } }; Blockly.JavaScript['regex'] = function(block) { const oid = block.getFieldValue('TEXT'); return [`new RegExp('${oid}')`, Blockly.JavaScript.ORDER_ATOMIC]; }; // --- selector -------------------------------------------------- Blockly.System.blocks['selector'] = '<block type="selector">' + ' <value name="TEXT">' + ' </value>' + '</block>'; Blockly.Blocks['selector'] = { init: function() { this.appendDummyInput() .appendField(Blockly.Translate('selector') + ' $('); this.appendDummyInput('TEXT') .appendField(new Blockly.FieldTextInput('channel[state.id=*]'), 'TEXT'); this.appendDummyInput() .appendField(')'); this.setInputsInline(true); this.setColour(Blockly.System.HUE); this.setOutput(true, 'Array'); this.setTooltip(Blockly.Translate('field_oid_tooltip')); } }; Blockly.JavaScript['selector'] = function(block) { const oid = block.getFieldValue('TEXT'); return [`Array.prototype.slice.apply($('${oid}'))`, Blockly.JavaScript.ORDER_ATOMIC]; };