diff --git a/src/assets/sass/scratch/_toolbox.scss b/src/assets/sass/scratch/_toolbox.scss index 2c5ee790..3b87b70b 100644 --- a/src/assets/sass/scratch/_toolbox.scss +++ b/src/assets/sass/scratch/_toolbox.scss @@ -1,6 +1,23 @@ @import '../base/mixins'; $category-colours: ( + search : #afffda, + trade-definition: #303f9f, + before-purchase : #00897b, + during-purchase : #78909c, + after-purchase : #d81b60, + mathematical : #689f38, + logic : #8e24aa, + text : #fb8c00, + variables : #5d4037, + functions : #1976d2, + loop : #e53935, + list : #00acc1, + indicators : #616161, + time : #afb42b, + tick-analysis : #2e7d32, + candle : #5e35b1, + miscellaneous : #ffb300, trade_parameters : #30409f, purchase_conditions: #00897b, sell_conditions : #78909c, @@ -144,6 +161,13 @@ $category-colours: ( } } } + + #search_input { + padding: 10px; + border-radius: 5px; + border: solid $grey 1px; + margin: 3px; + } &__separator { padding: 20px 0; border-top: 1px solid $lightgrey; diff --git a/src/scratch/blocks/Advanced/Functions/procedures_callnoreturn.js b/src/scratch/blocks/Advanced/Functions/procedures_callnoreturn.js index 4cc6a83e..f75ae92e 100755 --- a/src/scratch/blocks/Advanced/Functions/procedures_callnoreturn.js +++ b/src/scratch/blocks/Advanced/Functions/procedures_callnoreturn.js @@ -7,7 +7,16 @@ Blockly.Blocks.procedures_callnoreturn = { this.argumentVarModels = []; this.previousDisabledState = false; - this.jsonInit({ + this.jsonInit(this.definition()); + }, + /** + * Block definitions describe how a block looks and behaves, including the text, + * the colour, the shape, and what other blocks it can connect to. We've separated + * the block definition from the init function so we can search through it. + * https://developers.google.com/blockly/guides/create-custom-blocks/define-blocks + */ + definition() { + return { message0: '%1 %2', args0 : [ { @@ -25,7 +34,20 @@ Blockly.Blocks.procedures_callnoreturn = { colourTertiary : Blockly.Colours.BinaryProcedures.colourTertiary, previousStatement: null, nextStatement : null, - }); + tooltip : translate('Function with no return value tooltip'), + category : Blockly.Categories.Functions, + }; + }, + /** + * Meta returns an object with with properties that contain human readable strings, + * these strings are used in the flyout help content, as well as used for searching + * for specific blocks. + */ + meta() { + return { + 'display_name': translate('Function With no Return name'), + 'description' : translate('Function with no return value description'), + }; }, /** * Procedure calls cannot exist without the corresponding procedure diff --git a/src/scratch/blocks/Advanced/Functions/procedures_callreturn.js b/src/scratch/blocks/Advanced/Functions/procedures_callreturn.js index 9118dcd7..1c99dcd2 100755 --- a/src/scratch/blocks/Advanced/Functions/procedures_callreturn.js +++ b/src/scratch/blocks/Advanced/Functions/procedures_callreturn.js @@ -1,9 +1,14 @@ +import { translate } from '../../../../utils/lang/i18n'; + Blockly.Blocks.procedures_callreturn = { init() { this.arguments = []; this.previousDisabledState = false; - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: '%1 %2', args0 : [ { @@ -20,7 +25,15 @@ Blockly.Blocks.procedures_callreturn = { colour : Blockly.Colours.BinaryProcedures.colour, colourSecondary: Blockly.Colours.BinaryProcedures.colourSecondary, colourTertiary : Blockly.Colours.BinaryProcedures.colourTertiary, - }); + tooltip : translate('Function with return value'), + category : Blockly.Categories.Functions, + }; + }, + meta(){ + return { + 'display_name': translate('Function with return value'), + 'description' : translate('Function with return value Description'), + }; }, onchange : Blockly.Blocks.procedures_callnoreturn.onchange, getProcedureDefinition: Blockly.Blocks.procedures_callnoreturn.getProcedureDefinition, diff --git a/src/scratch/blocks/Advanced/Functions/procedures_defnoreturn.js b/src/scratch/blocks/Advanced/Functions/procedures_defnoreturn.js index 6d6c7239..c3d8bec7 100755 --- a/src/scratch/blocks/Advanced/Functions/procedures_defnoreturn.js +++ b/src/scratch/blocks/Advanced/Functions/procedures_defnoreturn.js @@ -7,7 +7,20 @@ Blockly.Blocks.procedures_defnoreturn = { this.arguments = []; this.argumentVarModels = []; - this.jsonInit({ + this.jsonInit(this.definition()); + + // Enforce unique procedure names + const nameField = this.getField('NAME'); + nameField.setValidator(Blockly.Procedures.rename); + + // Render a ➕-icon for adding parameters + const fieldImage = new Blockly.FieldImage(plusIconLight, 24, 24, '+', () => this.onAddClick()); + this.appendDummyInput('ADD_ICON').appendField(fieldImage); + + this.setStatements(true); + }, + definition() { + return { message0: translate('function %1 %2'), args0 : [ { @@ -24,17 +37,15 @@ Blockly.Blocks.procedures_defnoreturn = { colour : Blockly.Colours.BinaryProcedures.colour, colourSecondary: Blockly.Colours.BinaryProcedures.colourSecondary, colourTertiary : Blockly.Colours.BinaryProcedures.colourTertiary, - }); - - // Enforce unique procedure names - const nameField = this.getField('NAME'); - nameField.setValidator(Blockly.Procedures.rename); - - // Render a ➕-icon for adding parameters - const fieldImage = new Blockly.FieldImage(plusIconLight, 24, 24, '+', () => this.onAddClick()); - this.appendDummyInput('ADD_ICON').appendField(fieldImage); - - this.setStatements(true); + tooltip : translate('function with no return tooltip'), + category : Blockly.Categories.Functions, + }; + }, + meta() { + return { + 'display_name': translate('Function with no return value'), + 'description' : translate('Function with no return value description'), + }; }, /** * Sets the block colour and updates this procedure's caller blocks diff --git a/src/scratch/blocks/Advanced/Functions/procedures_defreturn.js b/src/scratch/blocks/Advanced/Functions/procedures_defreturn.js index 4e175a50..1c604a39 100755 --- a/src/scratch/blocks/Advanced/Functions/procedures_defreturn.js +++ b/src/scratch/blocks/Advanced/Functions/procedures_defreturn.js @@ -6,7 +6,21 @@ Blockly.Blocks.procedures_defreturn = { this.arguments = []; this.argumentVarModels = []; - this.jsonInit({ + this.jsonInit(this.definition()); + + // Enforce unique procedure names + const nameField = this.getField('NAME'); + nameField.setValidator(Blockly.Procedures.rename); + + // Render a ➕-icon for adding parameters + const fieldImage = new Blockly.FieldImage(plusIconDark, 24, 24, '+', () => this.onAddClick()); + this.appendDummyInput('ADD_ICON').appendField(fieldImage); + this.moveInputBefore('ADD_ICON', 'RETURN'); + + this.setStatements(true); + }, + definition(){ + return { message0: translate('function %1 %2 %3'), message1: 'return %1', args0 : [ @@ -35,18 +49,15 @@ Blockly.Blocks.procedures_defreturn = { colour : Blockly.Colours.BinaryProcedures.colour, colourSecondary: Blockly.Colours.BinaryProcedures.colourSecondary, colourTertiary : Blockly.Colours.BinaryProcedures.colourTertiary, - }); - - // Enforce unique procedure names - const nameField = this.getField('NAME'); - nameField.setValidator(Blockly.Procedures.rename); - - // Render a ➕-icon for adding parameters - const fieldImage = new Blockly.FieldImage(plusIconDark, 24, 24, '+', () => this.onAddClick()); - this.appendDummyInput('ADD_ICON').appendField(fieldImage); - this.moveInputBefore('ADD_ICON', 'RETURN'); - - this.setStatements(true); + tooltip : translate('Function def with return value'), + category : Blockly.Categories.Functions, + }; + }, + meta(){ + return { + 'display_name': translate('Function def with return value'), + 'description' : translate('Function def with return value Description'), + }; }, onAddClick : Blockly.Blocks.procedures_defnoreturn.onAddClick, onchange : Blockly.Blocks.procedures_defnoreturn.onchange, diff --git a/src/scratch/blocks/Advanced/Functions/procedures_ifreturn.js b/src/scratch/blocks/Advanced/Functions/procedures_ifreturn.js index c8cca8fd..72dede04 100755 --- a/src/scratch/blocks/Advanced/Functions/procedures_ifreturn.js +++ b/src/scratch/blocks/Advanced/Functions/procedures_ifreturn.js @@ -9,7 +9,10 @@ Blockly.Blocks.procedures_ifreturn = { init() { this.hasReturnValue = true; - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('if %1 return %2'), args0 : [ { @@ -26,7 +29,15 @@ Blockly.Blocks.procedures_ifreturn = { colourTertiary : Blockly.Colours.BinaryProcedures.colourTertiary, previousStatement: null, nextStatement : null, - }); + tooltip : translate('Function If Else'), + category : Blockly.Categories.Functions, + }; + }, + meta(){ + return { + 'display_name': translate('Function If else'), + 'description' : translate('Function If else Description'), + }; }, /** * Create XML to represent whether this block has a return value. diff --git a/src/scratch/blocks/Advanced/List/lists_create_with.js b/src/scratch/blocks/Advanced/List/lists_create_with.js index cd2c2c82..d32b81d2 100755 --- a/src/scratch/blocks/Advanced/List/lists_create_with.js +++ b/src/scratch/blocks/Advanced/List/lists_create_with.js @@ -3,7 +3,15 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.lists_create_with = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + + // Render a ➕-icon for adding additional `lists_statement` blocks + const fieldImage = new Blockly.FieldImage(plusIconDark, 25, 25, '', () => this.onIconClick()); + this.appendDummyInput('ADD_ICON').appendField(fieldImage); + this.moveInputBefore('ADD_ICON', 'STACK'); + }, + definition(){ + return { message0: translate('set %1 to create list with'), message1: '%1', args0 : [ @@ -24,12 +32,15 @@ Blockly.Blocks.lists_create_with = { colourTertiary : Blockly.Colours.Binary.colourTertiary, previousStatement: null, nextStatement : null, - }); - - // Render a ➕-icon for adding additional `lists_statement` blocks - const fieldImage = new Blockly.FieldImage(plusIconDark, 25, 25, '', () => this.onIconClick()); - this.appendDummyInput('ADD_ICON').appendField(fieldImage); - this.moveInputBefore('ADD_ICON', 'STACK'); + tooltip : translate('Create List with'), + category : Blockly.Categories.List, + }; + }, + meta(){ + return { + 'display_name': translate('Create list with'), + 'description' : translate('Create list with description'), + }; }, onIconClick() { if (!this.workspace || this.isInFlyout) { diff --git a/src/scratch/blocks/Advanced/List/lists_getIndex.js b/src/scratch/blocks/Advanced/List/lists_getIndex.js index 88becfa8..28793a1c 100755 --- a/src/scratch/blocks/Advanced/List/lists_getIndex.js +++ b/src/scratch/blocks/Advanced/List/lists_getIndex.js @@ -34,6 +34,12 @@ Blockly.Blocks.lists_getIndex = { this.updateAt(true); }, + meta(){ + return { + 'display_name': translate('List Get Index'), + 'description' : translate('List Get Index Description'), + }; + }, mutationToDom() { const container = document.createElement('mutation'); const isStatement = !this.outputConnection; diff --git a/src/scratch/blocks/Advanced/List/lists_getSublist.js b/src/scratch/blocks/Advanced/List/lists_getSublist.js index aeda49a8..0ae4e7c7 100755 --- a/src/scratch/blocks/Advanced/List/lists_getSublist.js +++ b/src/scratch/blocks/Advanced/List/lists_getSublist.js @@ -29,6 +29,12 @@ Blockly.Blocks.lists_getSublist = { this.updateAt(1, true); this.updateAt(2, true); }, + meta() { + return { + 'display_name': translate('List get sublit'), + 'description' : translate('List get sublist description'), + }; + }, mutationToDom() { const container = document.createElement('mutation'); const isAt1 = this.getInput('AT1').type === Blockly.INPUT_VALUE; diff --git a/src/scratch/blocks/Advanced/List/lists_indexOf.js b/src/scratch/blocks/Advanced/List/lists_indexOf.js index 5ae99e1f..1cdaea6b 100755 --- a/src/scratch/blocks/Advanced/List/lists_indexOf.js +++ b/src/scratch/blocks/Advanced/List/lists_indexOf.js @@ -2,7 +2,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.lists_indexOf = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('in list %1 find %2 occurence of item %3'), args0 : [ { @@ -24,7 +27,15 @@ Blockly.Blocks.lists_indexOf = { colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); + tooltip : translate('Index of List Tooltip'), + category : Blockly.Categories.List, + }; + }, + meta(){ + return { + 'display_name': translate('Index Of List'), + 'description' : translate('Index of List Description'), + }; }, }; diff --git a/src/scratch/blocks/Advanced/List/lists_isEmpty.js b/src/scratch/blocks/Advanced/List/lists_isEmpty.js index b22d2d9e..c9264cd6 100755 --- a/src/scratch/blocks/Advanced/List/lists_isEmpty.js +++ b/src/scratch/blocks/Advanced/List/lists_isEmpty.js @@ -2,7 +2,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.lists_isEmpty = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('list %1 is empty'), args0 : [ { @@ -16,7 +19,15 @@ Blockly.Blocks.lists_isEmpty = { colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); + tooltip : translate('List is Empty Tooltip'), + category : Blockly.Categories.List, + }; + }, + meta(){ + return { + 'display_name': translate('List is Empty'), + 'description' : translate('List is empty Description'), + }; }, }; diff --git a/src/scratch/blocks/Advanced/List/lists_length.js b/src/scratch/blocks/Advanced/List/lists_length.js index 9e73be6e..f321e057 100755 --- a/src/scratch/blocks/Advanced/List/lists_length.js +++ b/src/scratch/blocks/Advanced/List/lists_length.js @@ -2,7 +2,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.lists_length = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('length of %1'), args0 : [ { @@ -15,7 +18,15 @@ Blockly.Blocks.lists_length = { colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); + tooltip : translate('List Length Tooltip'), + category : Blockly.Categories.List, + }; + }, + meta(){ + return { + 'display_name': translate('List Length'), + 'description' : translate('List Length Description'), + }; }, }; diff --git a/src/scratch/blocks/Advanced/List/lists_repeat.js b/src/scratch/blocks/Advanced/List/lists_repeat.js index af19acff..92b47b87 100755 --- a/src/scratch/blocks/Advanced/List/lists_repeat.js +++ b/src/scratch/blocks/Advanced/List/lists_repeat.js @@ -2,7 +2,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.lists_repeat = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('set %1 to item %2 repeated %3 times'), args0 : [ { @@ -24,7 +27,15 @@ Blockly.Blocks.lists_repeat = { colourTertiary : Blockly.Colours.Binary.colourTertiary, previousStatement: null, nextStatement : null, - }); + tooltip : translate('List Repeat Tooltip'), + category : Blockly.Categories.List, + }; + }, + meta(){ + return { + 'display_name': translate('List Repeat'), + 'description' : translate('List Repeat Description'), + }; }, }; diff --git a/src/scratch/blocks/Advanced/List/lists_setIndex.js b/src/scratch/blocks/Advanced/List/lists_setIndex.js index 79227619..21227b49 100755 --- a/src/scratch/blocks/Advanced/List/lists_setIndex.js +++ b/src/scratch/blocks/Advanced/List/lists_setIndex.js @@ -29,6 +29,12 @@ Blockly.Blocks.lists_setIndex = { this.updateAt(true); }, + meta(){ + return { + 'display_name': translate('List set Index'), + 'description' : translate('List set Index'), + }; + }, mutationToDom() { const container = document.createElement('mutation'); const isAt = this.getInput('AT').type === Blockly.INPUT_VALUE; diff --git a/src/scratch/blocks/Advanced/List/lists_sort.js b/src/scratch/blocks/Advanced/List/lists_sort.js index 197855c2..5146ca6c 100755 --- a/src/scratch/blocks/Advanced/List/lists_sort.js +++ b/src/scratch/blocks/Advanced/List/lists_sort.js @@ -2,7 +2,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.lists_sort = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('sort %1 %2 %3'), args0 : [ { @@ -25,7 +28,15 @@ Blockly.Blocks.lists_sort = { colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); + tooltip : translate('List Sort Tooltip'), + category : Blockly.Categories.List, + }; + }, + meta(){ + return { + 'display_name': translate('List Sort'), + 'description' : translate('List Sort Description'), + }; }, }; diff --git a/src/scratch/blocks/Advanced/List/lists_split.js b/src/scratch/blocks/Advanced/List/lists_split.js index 6c193107..2f87d28f 100755 --- a/src/scratch/blocks/Advanced/List/lists_split.js +++ b/src/scratch/blocks/Advanced/List/lists_split.js @@ -26,6 +26,12 @@ Blockly.Blocks.lists_split = { Blockly.Colours.Binary.colourTertiary ); }, + meta(){ + return { + 'display_name': translate('List Split'), + 'description' : translate('List SPlit Description'), + }; + }, mutationToDom() { const container = document.createElement('mutation'); container.setAttribute('mode', this.getFieldValue('MODE')); diff --git a/src/scratch/blocks/Advanced/List/lists_statement.js b/src/scratch/blocks/Advanced/List/lists_statement.js index 468dd6de..42fda6cb 100755 --- a/src/scratch/blocks/Advanced/List/lists_statement.js +++ b/src/scratch/blocks/Advanced/List/lists_statement.js @@ -1,10 +1,18 @@ import { minusIconDark } from '../../images'; +import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.lists_statement = { init() { this.requiredParentId = ''; - this.jsonInit({ + this.jsonInit(this.definition()); + + // Render a ➖-icon for removing self + const fieldImage = new Blockly.FieldImage(minusIconDark, 25, 25, '', () => this.onIconClick()); + this.appendDummyInput('REMOVE_ICON').appendField(fieldImage); + }, + definition(){ + return { message0: '%1', args0 : [ { @@ -17,11 +25,15 @@ Blockly.Blocks.lists_statement = { colourTertiary : Blockly.Colours.BinaryLessGray.colourTertiary, previousStatement: null, nextStatement : null, - }); - - // Render a ➖-icon for removing self - const fieldImage = new Blockly.FieldImage(minusIconDark, 25, 25, '', () => this.onIconClick()); - this.appendDummyInput('REMOVE_ICON').appendField(fieldImage); + tooltip : translate('List Statement Tooltip'), + category : Blockly.Categories.List, + }; + }, + meta(){ + return { + 'display_name': translate('List Statement'), + 'description' : translate('List Statement Description'), + }; }, onIconClick() { if (!this.workspace || this.isInFlyout) { diff --git a/src/scratch/blocks/Advanced/Loops/controls_flow_statements.js b/src/scratch/blocks/Advanced/Loops/controls_flow_statements.js index 21ff0c09..cbbf9358 100755 --- a/src/scratch/blocks/Advanced/Loops/controls_flow_statements.js +++ b/src/scratch/blocks/Advanced/Loops/controls_flow_statements.js @@ -2,7 +2,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.controls_flow_statements = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('%1 of loop'), args0 : [ { @@ -19,7 +22,15 @@ Blockly.Blocks.controls_flow_statements = { colourTertiary : Blockly.Colours.Binary.colourTertiary, previousStatement: null, nextStatement : null, - }); + tooltip : translate('Control Statement Tooltip'), + category : Blockly.Categories.Loop, + }; + }, + meta(){ + return { + 'display_name': translate('Control Statement'), + 'description' : translate('Control Statement Description'), + }; }, }; diff --git a/src/scratch/blocks/Advanced/Loops/controls_for.js b/src/scratch/blocks/Advanced/Loops/controls_for.js index 9b9e30c8..1f191b7f 100755 --- a/src/scratch/blocks/Advanced/Loops/controls_for.js +++ b/src/scratch/blocks/Advanced/Loops/controls_for.js @@ -2,7 +2,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.controls_for = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('count with %1 from %2 to %3 by %4'), args0 : [ { @@ -38,7 +41,15 @@ Blockly.Blocks.controls_for = { colourTertiary : Blockly.Colours.Binary.colourTertiary, previousStatement: null, nextStatement : null, - }); + tooltip : translate('Control For Tooltip'), + category : Blockly.Categories.Loop, + }; + }, + meta(){ + return { + 'display_name': translate('Control For'), + 'description' : translate('Control For Description'), + }; }, }; diff --git a/src/scratch/blocks/Advanced/Loops/controls_forEach.js b/src/scratch/blocks/Advanced/Loops/controls_forEach.js index 902f51ed..58e43dd0 100755 --- a/src/scratch/blocks/Advanced/Loops/controls_forEach.js +++ b/src/scratch/blocks/Advanced/Loops/controls_forEach.js @@ -2,7 +2,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.controls_forEach = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('for each item %1 in list %2'), args0 : [ { @@ -28,7 +31,15 @@ Blockly.Blocks.controls_forEach = { colourTertiary : Blockly.Colours.Binary.colourTertiary, previousStatement: null, nextStatement : null, - }); + tooltip : translate('Control Foreach Tooltip'), + category : Blockly.Categories.Loop, + }; + }, + meta(){ + return { + 'display_name': translate('Control Foreach'), + 'description' : translate('Control Foreach'), + }; }, }; diff --git a/src/scratch/blocks/Advanced/Loops/controls_repeat.js b/src/scratch/blocks/Advanced/Loops/controls_repeat.js index ee2dee68..849a0fc0 100755 --- a/src/scratch/blocks/Advanced/Loops/controls_repeat.js +++ b/src/scratch/blocks/Advanced/Loops/controls_repeat.js @@ -2,7 +2,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.controls_repeat = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { type : 'controls_repeat', message0: translate('repeat %1 times'), args0 : [ @@ -26,7 +29,15 @@ Blockly.Blocks.controls_repeat = { colourTertiary : Blockly.Colours.Binary.colourTertiary, previousStatement: null, nextStatement : null, - }); + tooltip : translate('Control Repeat Tooltip'), + category : Blockly.Categories.Loop, + }; + }, + meta(){ + return { + 'display_name': translate('Control Repeat'), + 'description' : translate('Control Repeat Description'), + }; }, }; diff --git a/src/scratch/blocks/Advanced/Loops/controls_repeat_ext.js b/src/scratch/blocks/Advanced/Loops/controls_repeat_ext.js index 91917016..43ab6ceb 100755 --- a/src/scratch/blocks/Advanced/Loops/controls_repeat_ext.js +++ b/src/scratch/blocks/Advanced/Loops/controls_repeat_ext.js @@ -2,7 +2,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.controls_repeat_ext = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('repeat %1 times'), args0 : [ { @@ -23,7 +26,15 @@ Blockly.Blocks.controls_repeat_ext = { colourTertiary : Blockly.Colours.Binary.colourTertiary, previousStatement: null, nextStatement : null, - }); + tooltip : translate('Control Repeat Tooltip'), + category : Blockly.Categories.Loop, + }; + }, + meta(){ + return { + 'display_name': translate('Control Repeat'), + 'description' : translate('Control Repeat Description'), + }; }, }; diff --git a/src/scratch/blocks/Advanced/Loops/controls_whileUntil.js b/src/scratch/blocks/Advanced/Loops/controls_whileUntil.js index 71b33141..92bdc143 100755 --- a/src/scratch/blocks/Advanced/Loops/controls_whileUntil.js +++ b/src/scratch/blocks/Advanced/Loops/controls_whileUntil.js @@ -2,7 +2,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.controls_whileUntil = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('repeat %1 %2'), args0 : [ { @@ -28,7 +31,15 @@ Blockly.Blocks.controls_whileUntil = { colourTertiary : Blockly.Colours.Binary.colourTertiary, previousStatement: null, nextStatement : null, - }); + tooltip : translate('Control While Tooltip'), + category : Blockly.Categories.Loop, + }; + }, + meta(){ + return { + 'display_name': translate('Control While'), + 'description' : translate('Control While Description'), + }; }, }; diff --git a/src/scratch/blocks/Advanced/Variable/variables_get.js b/src/scratch/blocks/Advanced/Variable/variables_get.js index de7c7b09..4114ddc0 100755 --- a/src/scratch/blocks/Advanced/Variable/variables_get.js +++ b/src/scratch/blocks/Advanced/Variable/variables_get.js @@ -2,7 +2,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.variables_get = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { type : 'variables_get', message0: '%1', args0 : [ @@ -17,8 +20,15 @@ Blockly.Blocks.variables_get = { colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - tooltip : '', - }); + tooltip : translate('Get Variable Tooltip'), + category : Blockly.Categories.Variables, + }; + }, + meta(){ + return { + 'display_name': translate('Get Variable Value'), + 'description' : translate('Get Variable Value Description'), + }; }, }; diff --git a/src/scratch/blocks/Advanced/Variable/variables_set.js b/src/scratch/blocks/Advanced/Variable/variables_set.js index ac8c05c3..f910c66e 100755 --- a/src/scratch/blocks/Advanced/Variable/variables_set.js +++ b/src/scratch/blocks/Advanced/Variable/variables_set.js @@ -2,7 +2,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.variables_set = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { type : 'field_variable', message0: translate('set %1 to %2'), args0 : [ @@ -21,8 +24,15 @@ Blockly.Blocks.variables_set = { colourTertiary : Blockly.Colours.Binary.colourTertiary, previousStatement: null, nextStatement : null, - tooltip : '', - }); + tooltip : translate('Set Variable Tooltip'), + category : Blockly.Categories.Variables, + }; + }, + meta(){ + return { + 'display_name': translate('Set Variable'), + 'description' : translate('Set Variable Description'), + }; }, }; diff --git a/src/scratch/blocks/Binary/After Purchase/after_purchase.js b/src/scratch/blocks/Binary/After Purchase/after_purchase.js index a604df20..ccd2d42d 100755 --- a/src/scratch/blocks/Binary/After Purchase/after_purchase.js +++ b/src/scratch/blocks/Binary/After Purchase/after_purchase.js @@ -4,7 +4,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.after_purchase = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('%1 (4) Get your trade result and trade again %2'), message1: '%1', args0 : [ @@ -32,7 +35,14 @@ Blockly.Blocks.after_purchase = { tooltip : translate( 'Get the previous trade information and result, then trade again (Runs on trade finish)' ), - }); + category: Blockly.Categories.After_Purchase, + }; + }, + meta(){ + return { + 'display_name': translate('After Purchase'), + 'description' : translate('After Purchase Description'), + }; }, onchange(event) { setBlockTextColor(this); diff --git a/src/scratch/blocks/Binary/After Purchase/check_result.js b/src/scratch/blocks/Binary/After Purchase/check_result.js index 976a68ed..22eedbca 100755 --- a/src/scratch/blocks/Binary/After Purchase/check_result.js +++ b/src/scratch/blocks/Binary/After Purchase/check_result.js @@ -3,7 +3,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.contract_check_result = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('Result is %1'), args0 : [ { @@ -18,7 +21,14 @@ Blockly.Blocks.contract_check_result = { colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, tooltip : translate('True if the result matches the selection'), - }); + category : Blockly.Categories.After_Purchase, + }; + }, + meta(){ + return { + 'display_name': translate('Check Result'), + 'description' : translate('Check Result Description'), + }; }, onchange(event) { if (!this.workspace || this.isInFlyout || this.workspace.isDragging()) { diff --git a/src/scratch/blocks/Binary/After Purchase/read_details.js b/src/scratch/blocks/Binary/After Purchase/read_details.js index c131b86a..5a8a347b 100755 --- a/src/scratch/blocks/Binary/After Purchase/read_details.js +++ b/src/scratch/blocks/Binary/After Purchase/read_details.js @@ -3,7 +3,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.read_details = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('Contract Detail: %1'), args0 : [ { @@ -17,7 +20,15 @@ Blockly.Blocks.read_details = { colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, tooltip : translate('Reads a selected option from contract details list'), - }); + category : Blockly.Categories.After_Purchase, + }; + }, + meta(){ + return { + 'display_name': translate('Read Detail Block'), + 'description' : translate('Read Detail Description'), + + }; }, onchange(event) { if (!this.workspace || this.isInFlyout || this.workspace.isDragging()) { diff --git a/src/scratch/blocks/Binary/After Purchase/trade_again.js b/src/scratch/blocks/Binary/After Purchase/trade_again.js index ff387d6c..b626f4d1 100755 --- a/src/scratch/blocks/Binary/After Purchase/trade_again.js +++ b/src/scratch/blocks/Binary/After Purchase/trade_again.js @@ -2,17 +2,27 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.trade_again = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + + // Ensure one of this type per statement-stack + this.setNextStatement(false); + }, + definition(){ + return { message0 : translate('Trade Again'), colour : Blockly.Colours.Binary.colour, colourSecondary : Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, previousStatement: null, tooltip : translate('Runs the trade block again'), - }); - - // Ensure one of this type per statement-stack - this.setNextStatement(false); + category : Blockly.Categories.After_Purchase, + }; + }, + meta(){ + return { + 'display_name': translate('Trade Again'), + 'description' : translate('Trade Again Description'), + }; }, onchange(event) { if (!this.workspace || this.isInFlyout || this.workspace.isDragging()) { diff --git a/src/scratch/blocks/Binary/Before Purchase/ask_price.js b/src/scratch/blocks/Binary/Before Purchase/ask_price.js index feab3985..c375b512 100755 --- a/src/scratch/blocks/Binary/Before Purchase/ask_price.js +++ b/src/scratch/blocks/Binary/Before Purchase/ask_price.js @@ -3,7 +3,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.ask_price = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('Ask Price %1'), args0 : [ { @@ -18,7 +21,14 @@ Blockly.Blocks.ask_price = { colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, tooltip : translate('Ask Price for selected proposal'), - }); + category : Blockly.Categories.Before_Purchase, + }; + }, + meta(){ + return { + 'display_name': translate('Ask Price'), + 'description' : translate('Ask Price Description'), + }; }, onchange(event) { if (!this.workspace || this.isInFlyout || this.workspace.isDragging()) { diff --git a/src/scratch/blocks/Binary/Before Purchase/before_purchase.js b/src/scratch/blocks/Binary/Before Purchase/before_purchase.js index 35243125..3c70d786 100755 --- a/src/scratch/blocks/Binary/Before Purchase/before_purchase.js +++ b/src/scratch/blocks/Binary/Before Purchase/before_purchase.js @@ -4,7 +4,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.before_purchase = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition() { + return { message0: translate('%1 (2) Watch and purchase your contract %2'), message1: '%1', args0 : [ @@ -30,7 +33,14 @@ Blockly.Blocks.before_purchase = { colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, tooltip : translate('Watch the tick stream and purchase the desired contract (Runs on tick update)'), - }); + category : Blockly.Categories.Before_Purchase, + }; + }, + meta(){ + return { + 'display_name': translate('Before Purchase'), + 'description' : translate('Before Purchase Description'), + }; }, onchange(event) { setBlockTextColor(this); diff --git a/src/scratch/blocks/Binary/Before Purchase/payout.js b/src/scratch/blocks/Binary/Before Purchase/payout.js index 1c72825a..25de7ec1 100755 --- a/src/scratch/blocks/Binary/Before Purchase/payout.js +++ b/src/scratch/blocks/Binary/Before Purchase/payout.js @@ -3,7 +3,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.payout = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('Payout %1'), args0 : [ { @@ -18,7 +21,14 @@ Blockly.Blocks.payout = { colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, tooltip : translate('Payout for selected proposal'), - }); + category : Blockly.Categories.Before_Purchase, + }; + }, + meta(){ + return { + 'display_name': translate('Payout'), + 'description' : translate('Payout Description'), + }; }, onchange(event) { if (!this.workspace || this.isInFlyout || this.workspace.isDragging()) { diff --git a/src/scratch/blocks/Binary/Before Purchase/purchase.js b/src/scratch/blocks/Binary/Before Purchase/purchase.js index 360db245..99c22ceb 100755 --- a/src/scratch/blocks/Binary/Before Purchase/purchase.js +++ b/src/scratch/blocks/Binary/Before Purchase/purchase.js @@ -3,7 +3,13 @@ import { translate } from '../../../../utils/lan Blockly.Blocks.purchase = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + + // Ensure one of this type per statement-stack + this.setNextStatement(false); + }, + definition(){ + return { message0: translate('Purchase %1'), args0 : [ { @@ -17,10 +23,14 @@ Blockly.Blocks.purchase = { colourSecondary : Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, tooltip : translate('Payout for selected proposal'), - }); - - // Ensure one of this type per statement-stack - this.setNextStatement(false); + category : Blockly.Categories.Before_Purchase, + }; + }, + meta(){ + return { + 'display_name': translate('Puchase'), + 'description' : translate('Purchase Description'), + }; }, onchange(event) { if (!this.workspace || this.isInFlyout || this.workspace.isDragging()) { diff --git a/src/scratch/blocks/Binary/During Purchase/check_sell.js b/src/scratch/blocks/Binary/During Purchase/check_sell.js index f51196a7..ccbe2b2b 100755 --- a/src/scratch/blocks/Binary/During Purchase/check_sell.js +++ b/src/scratch/blocks/Binary/During Purchase/check_sell.js @@ -2,7 +2,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.check_sell = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0 : translate('Sell is available'), output : 'Boolean', outputShape : Blockly.OUTPUT_SHAPE_HEXAGONAL, @@ -10,7 +13,14 @@ Blockly.Blocks.check_sell = { colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, tooltip : translate('True if sell at market is available'), - }); + category : Blockly.Categories.During_Purchase, + }; + }, + meta(){ + return { + 'display_name': translate('Check Sell'), + 'description' : translate('Check Sell Description'), + }; }, onchange(event) { if (!this.workspace || this.isInFlyout || this.workspace.isDragging()) { diff --git a/src/scratch/blocks/Binary/During Purchase/during_purchase.js b/src/scratch/blocks/Binary/During Purchase/during_purchase.js index a373ffb9..65a41f32 100755 --- a/src/scratch/blocks/Binary/During Purchase/during_purchase.js +++ b/src/scratch/blocks/Binary/During Purchase/during_purchase.js @@ -4,7 +4,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.during_purchase = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('%1 (3) Watch and sell your purchased contract %2'), message1: '%1', args0 : [ @@ -32,7 +35,14 @@ Blockly.Blocks.during_purchase = { tooltip : translate( 'Watch the purchased contract info and sell at market if available (Runs on contract update)' ), - }); + category: Blockly.Categories.During_Purchase, + }; + }, + meta(){ + return { + 'display_name': translate('During Purchase'), + 'description' : translate('During Purchase Description'), + }; }, onchange(event) { setBlockTextColor(this); diff --git a/src/scratch/blocks/Binary/During Purchase/sell_at_market.js b/src/scratch/blocks/Binary/During Purchase/sell_at_market.js index 073e63e2..fb52574d 100755 --- a/src/scratch/blocks/Binary/During Purchase/sell_at_market.js +++ b/src/scratch/blocks/Binary/During Purchase/sell_at_market.js @@ -2,7 +2,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.sell_at_market = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0 : translate('Sell at market'), colour : Blockly.Colours.Binary.colour, colourSecondary : Blockly.Colours.Binary.colourSecondary, @@ -10,7 +13,14 @@ Blockly.Blocks.sell_at_market = { previousStatement: null, nextStatement : null, tooltip : translate('Sell at market'), - }); + category : Blockly.Categories.During_Purchase, + }; + }, + meta(){ + return { + 'display_name': translate('Sell at market'), + 'description' : translate('Sell at market description'), + }; }, onchange(event) { if (!this.workspace || this.isInFlyout || this.workspace.isDragging()) { diff --git a/src/scratch/blocks/Binary/During Purchase/sell_price.js b/src/scratch/blocks/Binary/During Purchase/sell_price.js index 341cf541..2044107b 100755 --- a/src/scratch/blocks/Binary/During Purchase/sell_price.js +++ b/src/scratch/blocks/Binary/During Purchase/sell_price.js @@ -2,7 +2,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.sell_price = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0 : translate('Sell profit/loss'), output : 'Number', outputShape : Blockly.OUTPUT_SHAPE_ROUND, @@ -10,7 +13,14 @@ Blockly.Blocks.sell_price = { colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, tooltip : translate('Returns the profit for sell at market.'), - }); + category : Blockly.Categories.During_Purchase, + }; + }, + meta(){ + return { + 'display_name': translate('Sell price'), + 'description' : translate('Sell price description'), + }; }, onchange(event) { if (!this.workspace || this.isInFlyout || this.workspace.isDragging()) { diff --git a/src/scratch/blocks/Binary/Indicators/bb_statement.js b/src/scratch/blocks/Binary/Indicators/bb_statement.js index 03db7bcb..7a8d7127 100755 --- a/src/scratch/blocks/Binary/Indicators/bb_statement.js +++ b/src/scratch/blocks/Binary/Indicators/bb_statement.js @@ -4,7 +4,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.bb_statement = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('set %1 to Bollinger Bands %2 %3'), message1: '%1', args0 : [ @@ -35,7 +38,14 @@ Blockly.Blocks.bb_statement = { tooltip : translate('Calculates Bollinger Bands (BB) from a list with a period'), previousStatement: null, nextStatement : null, - }); + category : Blockly.Categories.Indicators, + }; + }, + meta(){ + return { + 'display_name': translate('BB Statement'), + 'descriptionL': translate('BB Statement Description'), + }; }, onchange(event) { if (!this.workspace || this.isInFlyout || this.workspace.isDragging()) { diff --git a/src/scratch/blocks/Binary/Indicators/bba_statement.js b/src/scratch/blocks/Binary/Indicators/bba_statement.js index c3f065b4..9056a5ce 100755 --- a/src/scratch/blocks/Binary/Indicators/bba_statement.js +++ b/src/scratch/blocks/Binary/Indicators/bba_statement.js @@ -4,7 +4,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.bba_statement = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('set %1 to Bollinger Bands Array %2 %3'), message1: '%1', args0 : [ @@ -35,7 +38,14 @@ Blockly.Blocks.bba_statement = { tooltip : translate('Calculates Bollinger Bands (BB) list from a list with a period'), previousStatement: null, nextStatement : null, - }); + category : Blockly.Categories.Indicators, + }; + }, + meta(){ + return { + 'display_name': translate('Bollinger Bands Statement'), + 'description' : translate('Bollinger Bands Description'), + }; }, onchange : Blockly.Blocks.bb_statement.onchange, requiredParamBlocks: ['input_list', 'period', 'std_dev_multiplier_up', 'std_dev_multiplier_down'], diff --git a/src/scratch/blocks/Binary/Indicators/ema_statement.js b/src/scratch/blocks/Binary/Indicators/ema_statement.js index 95cc508b..13c525d6 100755 --- a/src/scratch/blocks/Binary/Indicators/ema_statement.js +++ b/src/scratch/blocks/Binary/Indicators/ema_statement.js @@ -3,7 +3,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.ema_statement = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('set %1 to Exponentional Moving Average %2'), message1: '%1', args0 : [ @@ -29,7 +32,14 @@ Blockly.Blocks.ema_statement = { tooltip : translate('Calculates Exponential Moving Average (EMA) from a list with a period'), previousStatement: null, nextStatement : null, - }); + category : Blockly.Categories.Indicators, + }; + }, + meta(){ + return { + 'display_name': translate('Exponential Moving Average Statement'), + 'description' : translate('Exponential Moving Average Statement Description'), + }; }, onchange : Blockly.Blocks.bb_statement.onchange, requiredParamBlocks: ['input_list', 'period'], diff --git a/src/scratch/blocks/Binary/Indicators/emaa_statement.js b/src/scratch/blocks/Binary/Indicators/emaa_statement.js index c4365ca2..492c5295 100755 --- a/src/scratch/blocks/Binary/Indicators/emaa_statement.js +++ b/src/scratch/blocks/Binary/Indicators/emaa_statement.js @@ -3,7 +3,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.emaa_statement = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('set %1 to Exponentional Moving Average Array %2'), message1: '%1', args0 : [ @@ -29,7 +32,13 @@ Blockly.Blocks.emaa_statement = { tooltip : translate('Calculates Exponential Moving Average (EMA) list from a list of values with a period'), previousStatement: null, nextStatement : null, - }); + category : Blockly.Categories.Indicators, + }; + }, meta(){ + return { + 'display_name': translate('Exponential Moving Average Statement'), + 'description' : translate('Exponential Moving Average Statement Dscription'), + }; }, onchange : Blockly.Blocks.bb_statement.onchange, requiredParamBlocks: ['input_list', 'period'], diff --git a/src/scratch/blocks/Binary/Indicators/macda_statement.js b/src/scratch/blocks/Binary/Indicators/macda_statement.js index 2c0f9d69..8e1bb62c 100755 --- a/src/scratch/blocks/Binary/Indicators/macda_statement.js +++ b/src/scratch/blocks/Binary/Indicators/macda_statement.js @@ -4,7 +4,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.macda_statement = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('set %1 to MACD Array %2 %3'), message1: '%1', args0 : [ @@ -35,7 +38,14 @@ Blockly.Blocks.macda_statement = { tooltip : translate('Calculates Moving Average Convergence Divergence (MACD) list from a list'), previousStatement: null, nextStatement : null, - }); + category : Blockly.Categories.Indicators, + }; + }, + meta(){ + return { + 'display_name': translate('Moving Average Convergence Divergence'), + 'decription' : translate('Moving Average Convergence Divergence Description'), + }; }, onchange : Blockly.Blocks.bb_statement.onchange, requiredParamBlocks: ['input_list', 'fast_ema_period', 'slow_ema_period', 'signal_ema_period'], diff --git a/src/scratch/blocks/Binary/Indicators/rsi_statement.js b/src/scratch/blocks/Binary/Indicators/rsi_statement.js index 0c282aa4..2c750083 100755 --- a/src/scratch/blocks/Binary/Indicators/rsi_statement.js +++ b/src/scratch/blocks/Binary/Indicators/rsi_statement.js @@ -3,7 +3,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.rsi_statement = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('set %1 to Relative Strength Index %2'), message1: '%1', args0 : [ @@ -29,7 +32,14 @@ Blockly.Blocks.rsi_statement = { tooltip : translate('Relative Strength Index (RSI) from a list with a period'), previousStatement: null, nextStatement : null, - }); + category : Blockly.Categories.Indicators, + }; + }, + meta(){ + return { + 'display_name': translate('Relative Strength Index Statement'), + 'description' : translate('Relative Strength Index Statement Description'), + }; }, onchange : Blockly.Blocks.bb_statement.onchange, requiredParamBlocks: ['input_list', 'period'], diff --git a/src/scratch/blocks/Binary/Indicators/rsia_statement.js b/src/scratch/blocks/Binary/Indicators/rsia_statement.js index 5a8300e3..c0d2b028 100755 --- a/src/scratch/blocks/Binary/Indicators/rsia_statement.js +++ b/src/scratch/blocks/Binary/Indicators/rsia_statement.js @@ -3,7 +3,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.rsia_statement = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('set %1 to Relative Strength Index Array %2'), message1: '%1', args0 : [ @@ -29,7 +32,14 @@ Blockly.Blocks.rsia_statement = { tooltip : translate('Calculates Relative Strength Index (RSI) list from a list of values with a period'), previousStatement: null, nextStatement : null, - }); + category : Blockly.Categories.Indicators, + }; + }, + meta(){ + return { + 'display_name': translate('Relative Strength Index Statement'), + 'description' : translate('Relative Strength Index Statement Description'), + }; }, onchange : Blockly.Blocks.bb_statement.onchange, requiredParamBlocks: ['input_list', 'period'], diff --git a/src/scratch/blocks/Binary/Indicators/sma_statement.js b/src/scratch/blocks/Binary/Indicators/sma_statement.js index 89d79736..864ea054 100755 --- a/src/scratch/blocks/Binary/Indicators/sma_statement.js +++ b/src/scratch/blocks/Binary/Indicators/sma_statement.js @@ -3,7 +3,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.sma_statement = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('set %1 to Simple Moving Average %2'), message1: '%1', args0 : [ @@ -29,7 +32,14 @@ Blockly.Blocks.sma_statement = { tooltip : translate('Calculates Simple Moving Average (SMA) from a list with a period'), previousStatement: null, nextStatement : null, - }); + category : Blockly.Categories.Indicators, + }; + }, + meta(){ + return { + 'display_name': translate('SImple Moving Average Statement'), + 'description' : translate('Simple Moving Average Statement Description'), + }; }, onchange : Blockly.Blocks.bb_statement.onchange, requiredParamBlocks: ['input_list', 'period'], diff --git a/src/scratch/blocks/Binary/Indicators/smaa_statement.js b/src/scratch/blocks/Binary/Indicators/smaa_statement.js index 4ebab4a8..b2c30790 100755 --- a/src/scratch/blocks/Binary/Indicators/smaa_statement.js +++ b/src/scratch/blocks/Binary/Indicators/smaa_statement.js @@ -3,7 +3,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.smaa_statement = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('set %1 to Simple Moving Average Array %2'), message1: '%1', args0 : [ @@ -29,7 +32,14 @@ Blockly.Blocks.smaa_statement = { tooltip : translate('Calculates Simple Moving Average (SMA) from a list with a period'), previousStatement: null, nextStatement : null, - }); + category : Blockly.Categories.Indicators, + }; + }, + meta(){ + return { + 'display_name': translate('Simple Moving Average Statement'), + 'description' : translate('Simple Moving Average Statement Description'), + }; }, onchange: Blockly.Blocks.bb_statement.onchange, }; diff --git a/src/scratch/blocks/Binary/Tick Analysis/check_direction.js b/src/scratch/blocks/Binary/Tick Analysis/check_direction.js index f675ad7a..83281301 100755 --- a/src/scratch/blocks/Binary/Tick Analysis/check_direction.js +++ b/src/scratch/blocks/Binary/Tick Analysis/check_direction.js @@ -3,7 +3,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.check_direction = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('Direction is %1'), args0 : [ { @@ -18,7 +21,14 @@ Blockly.Blocks.check_direction = { colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, tooltip : translate('True if the direction matches the selection'), - }); + category : Blockly.Categories.Tick_Analysis, + }; + }, + meta(){ + return { + 'display_name': translate('Check Direction'), + 'description' : translate('Check Direction Description'), + }; }, onchange(event) { if (!this.workspace || this.isInFlyout || this.workspace.isDragging()) { diff --git a/src/scratch/blocks/Binary/Tick Analysis/get_ohlc.js b/src/scratch/blocks/Binary/Tick Analysis/get_ohlc.js index 09810aa4..851e5b4e 100755 --- a/src/scratch/blocks/Binary/Tick Analysis/get_ohlc.js +++ b/src/scratch/blocks/Binary/Tick Analysis/get_ohlc.js @@ -3,7 +3,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.get_ohlc = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('in candle list get # from end %1'), message1: translate('with interval: %1'), args0 : [ @@ -26,7 +29,14 @@ Blockly.Blocks.get_ohlc = { colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, tooltip : translate('Get the nth recent candle'), - }); + category : Blockly.Categories.Tick_Analysis, + }; + }, + meta(){ + return { + 'display_name': translate('Nth recent Candle'), + 'description' : translate('Nth recent Candle Description'), + }; }, onchange(event) { if (!this.workspace || this.isInFlyout || this.workspace.isDragging()) { diff --git a/src/scratch/blocks/Binary/Tick Analysis/lastDigitList.js b/src/scratch/blocks/Binary/Tick Analysis/lastDigitList.js index bf981718..b894da0d 100755 --- a/src/scratch/blocks/Binary/Tick Analysis/lastDigitList.js +++ b/src/scratch/blocks/Binary/Tick Analysis/lastDigitList.js @@ -2,7 +2,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.lastDigitList = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0 : translate('Last Digit List'), output : 'Array', outputShape : Blockly.OUTPUT_SHAPE_ROUND, @@ -10,7 +13,14 @@ Blockly.Blocks.lastDigitList = { colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, tooltip : translate('Returns the list of last digit values'), - }); + category : Blockly.Categories.Tick_Analysis, + }; + }, + meta(){ + return { + 'display_name': translate('Last Digit List'), + 'description' : translate('Last Digit List Description'), + }; }, onchange(event) { if (!this.workspace || this.isInFlyout || this.workspace.isDragging()) { diff --git a/src/scratch/blocks/Binary/Tick Analysis/last_digit.js b/src/scratch/blocks/Binary/Tick Analysis/last_digit.js index 3ea26998..f4bdf800 100755 --- a/src/scratch/blocks/Binary/Tick Analysis/last_digit.js +++ b/src/scratch/blocks/Binary/Tick Analysis/last_digit.js @@ -2,7 +2,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.last_digit = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0 : translate('Last Digit'), output : 'Number', outputShape : Blockly.OUTPUT_SHAPE_ROUND, @@ -10,7 +13,14 @@ Blockly.Blocks.last_digit = { colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, tooltip : translate('Returns the last digit of the latest tick'), - }); + category : Blockly.Categories.Tick_Analysis, + }; + }, + meta(){ + return { + 'display_name': translate('Last Digit'), + 'description' : translate('Last Digit Description'), + }; }, onchange(event) { if (!this.workspace || this.isInFlyout || this.workspace.isDragging()) { diff --git a/src/scratch/blocks/Binary/Tick Analysis/ohlc.js b/src/scratch/blocks/Binary/Tick Analysis/ohlc.js index 118615a2..d5cd4c8f 100755 --- a/src/scratch/blocks/Binary/Tick Analysis/ohlc.js +++ b/src/scratch/blocks/Binary/Tick Analysis/ohlc.js @@ -3,7 +3,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.ohlc = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('Candles List'), message1: translate('with interval: %1'), args1 : [ @@ -19,7 +22,14 @@ Blockly.Blocks.ohlc = { colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, tooltip : translate('Returns the candle list'), - }); + category : Blockly.Categories.Tick_Analysis, + }; + }, + meta(){ + return { + 'display_name': translate('Candle List'), + 'description' : translate('Candle List Description'), + }; }, onchange(event) { if (!this.workspace || this.isInFlyout || this.workspace.isDragging()) { diff --git a/src/scratch/blocks/Binary/Tick Analysis/ohlc_values.js b/src/scratch/blocks/Binary/Tick Analysis/ohlc_values.js index c988ef85..df6d61b7 100755 --- a/src/scratch/blocks/Binary/Tick Analysis/ohlc_values.js +++ b/src/scratch/blocks/Binary/Tick Analysis/ohlc_values.js @@ -3,7 +3,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.ohlc_values = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('Make a List of %1 values in candles list with interval: %2'), args0 : [ { @@ -23,7 +26,14 @@ Blockly.Blocks.ohlc_values = { colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, tooltip : translate('Returns a list of the selected candle values'), - }); + category : Blockly.Categories.Tick_Analysis, + }; + }, + meta(){ + return { + 'display_name': translate('Selected Candle Value'), + 'description' : translate('Selected Candle Value Description'), + }; }, onchange(event) { if (!this.workspace || this.isInFlyout || this.workspace.isDragging()) { diff --git a/src/scratch/blocks/Binary/Tick Analysis/readOhlc.js b/src/scratch/blocks/Binary/Tick Analysis/readOhlc.js index 217694e7..0129f697 100755 --- a/src/scratch/blocks/Binary/Tick Analysis/readOhlc.js +++ b/src/scratch/blocks/Binary/Tick Analysis/readOhlc.js @@ -3,7 +3,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.read_ohlc = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('In candles list read %1 from end %2'), message1: translate('with interval: %1'), args0 : [ @@ -31,7 +34,14 @@ Blockly.Blocks.read_ohlc = { colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, tooltip : translate('Read the selected candle value in the nth recent candle'), - }); + category : Blockly.Categories.Tick_Analysis, + }; + }, + meta(){ + return { + 'display_name': translate('Read selected candle'), + 'description' : translate('Read selected candle description'), + }; }, onchange(event) { if (!this.workspace || this.isInFlyout || this.workspace.isDragging()) { diff --git a/src/scratch/blocks/Binary/Tick Analysis/tick.js b/src/scratch/blocks/Binary/Tick Analysis/tick.js index 6db85d18..c9b4bbdf 100755 --- a/src/scratch/blocks/Binary/Tick Analysis/tick.js +++ b/src/scratch/blocks/Binary/Tick Analysis/tick.js @@ -2,7 +2,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.tick = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0 : translate('Last Tick'), output : 'Number', outputShape : Blockly.OUTPUT_SHAPE_ROUND, @@ -10,7 +13,14 @@ Blockly.Blocks.tick = { colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, tooltip : translate('Returns the tick value received by a before purchase block'), - }); + category : Blockly.Categories.Tick_Analysis, + }; + }, + meta(){ + return { + 'display_name': translate('Tick value'), + 'description' : translate('Tick value Description'), + }; }, onchange(event) { if (!this.workspace || this.isInFlyout || this.workspace.isDragging()) { diff --git a/src/scratch/blocks/Binary/Tick Analysis/tick_analysis.js b/src/scratch/blocks/Binary/Tick Analysis/tick_analysis.js index 9b19d529..b5c54f2d 100755 --- a/src/scratch/blocks/Binary/Tick Analysis/tick_analysis.js +++ b/src/scratch/blocks/Binary/Tick Analysis/tick_analysis.js @@ -2,7 +2,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.tick_analysis = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('This block is called on every tick %1 %2'), args0 : [ { @@ -18,7 +21,14 @@ Blockly.Blocks.tick_analysis = { colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, tooltip : translate('You can use this block to analyze the ticks, regardless of your trades'), - }); + category : Blockly.Categories.Tick_Analysis, + }; + }, + meta(){ + return { + 'display_name': translate('Tick Analysis'), + 'description' : translate('Tick Analysis Description'), + }; }, }; diff --git a/src/scratch/blocks/Binary/Tick Analysis/ticks.js b/src/scratch/blocks/Binary/Tick Analysis/ticks.js index 0fc84f39..bfcf4756 100755 --- a/src/scratch/blocks/Binary/Tick Analysis/ticks.js +++ b/src/scratch/blocks/Binary/Tick Analysis/ticks.js @@ -2,7 +2,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.ticks = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0 : translate('Ticks List'), output : 'Array', outputShape : Blockly.OUTPUT_SHAPE_ROUND, @@ -10,7 +13,14 @@ Blockly.Blocks.ticks = { colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, tooltip : translate('Returns the list of tick values'), - }); + category : Blockly.Categories.Tick_Analysis, + }; + }, + meta(){ + return { + 'display_name': translate('Tick List'), + 'description' : translate('Tick List Description'), + }; }, onchange(event) { if (!this.workspace || this.isInFlyout || this.workspace.isDragging()) { diff --git a/src/scratch/blocks/Binary/Tools/Candle/is_candle_black.js b/src/scratch/blocks/Binary/Tools/Candle/is_candle_black.js index 6b2b5618..7862d50f 100755 --- a/src/scratch/blocks/Binary/Tools/Candle/is_candle_black.js +++ b/src/scratch/blocks/Binary/Tools/Candle/is_candle_black.js @@ -2,7 +2,10 @@ import { translate } from '../../../../../utils/lang/i18n'; Blockly.Blocks.is_candle_black = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('Is candle black? %1'), args0 : [ { @@ -19,7 +22,14 @@ Blockly.Blocks.is_candle_black = { tooltip : translate( 'Checks if the given candle is black, returns true if close is less than open in the given candle.' ), - }); + category: Blockly.Categories.Candle, + }; + }, + meta(){ + return { + 'display_name': translate('Is Candle Block'), + 'description' : translate('Is Candle Black Description'), + }; }, }; diff --git a/src/scratch/blocks/Binary/Tools/Candle/ohlc_values_in_list.js b/src/scratch/blocks/Binary/Tools/Candle/ohlc_values_in_list.js index e329810f..7bfe9ce4 100755 --- a/src/scratch/blocks/Binary/Tools/Candle/ohlc_values_in_list.js +++ b/src/scratch/blocks/Binary/Tools/Candle/ohlc_values_in_list.js @@ -3,7 +3,10 @@ import { translate } from '../../../../../utils/lang/i18n'; Blockly.Blocks.ohlc_values_in_list = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('Make a list of %1 values from candles list %2'), args0 : [ { @@ -22,7 +25,14 @@ Blockly.Blocks.ohlc_values_in_list = { colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, tooltip : translate('Returns a list of the selected candle values'), - }); + category : Blockly.Categories.Candle, + }; + }, + meta(){ + return { + 'display_name': translate('Selected Candle list value'), + 'description' : translate('Selected Candle list value description'), + }; }, }; diff --git a/src/scratch/blocks/Binary/Tools/Candle/read_ohlc_obj.js b/src/scratch/blocks/Binary/Tools/Candle/read_ohlc_obj.js index 31ec0140..edc8f09d 100755 --- a/src/scratch/blocks/Binary/Tools/Candle/read_ohlc_obj.js +++ b/src/scratch/blocks/Binary/Tools/Candle/read_ohlc_obj.js @@ -3,7 +3,10 @@ import { translate } from '../../../../../utils/lang/i18n'; Blockly.Blocks.read_ohlc_obj = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('Read %1 value in candle %2'), args0 : [ { @@ -22,7 +25,14 @@ Blockly.Blocks.read_ohlc_obj = { colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, tooltip : translate('Read a field in a candle (read from the Candles list)'), - }); + category : Blockly.Categories.Candle, + }; + }, + meta(){ + return { + 'display_name': translate('Read candle '), + 'description' : translate('Read candle Description'), + }; }, }; diff --git a/src/scratch/blocks/Binary/Tools/Misc./balance.js b/src/scratch/blocks/Binary/Tools/Misc./balance.js index 7be83f61..f5b096f6 100755 --- a/src/scratch/blocks/Binary/Tools/Misc./balance.js +++ b/src/scratch/blocks/Binary/Tools/Misc./balance.js @@ -3,20 +3,7 @@ import { translate } from '../../../../../utils/lang/i18n'; Blockly.Blocks.balance = { init() { - this.jsonInit({ - message0: translate('Balance: %1'), - args0 : [ - { - type : 'field_dropdown', - name : 'BALANCE_TYPE', - options: config.lists.BALANCE_TYPE, - }, - ], - output : null, - colour : Blockly.Colours.Binary.colour, - colourSecondary: Blockly.Colours.Binary.colourSecondary, - colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); + this.jsonInit(this.definition()); // Change shape based on selected type const balanceTypeField = this.getField('BALANCE_TYPE'); @@ -33,6 +20,30 @@ Blockly.Blocks.balance = { return undefined; }); }, + definition(){ + return { + message0: translate('Balance: %1'), + args0 : [ + { + type : 'field_dropdown', + name : 'BALANCE_TYPE', + options: config.lists.BALANCE_TYPE, + }, + ], + output : null, + colour : Blockly.Colours.Binary.colour, + colourSecondary: Blockly.Colours.Binary.colourSecondary, + colourTertiary : Blockly.Colours.Binary.colourTertiary, + tooltip : translate('Balance Tooltip'), + category : Blockly.Categories.Miscellaneous, + }; + }, + meta(){ + return { + 'display_name': translate('Balance'), + 'description' : translate('Balance Description'), + }; + }, }; Blockly.JavaScript.balance = block => { diff --git a/src/scratch/blocks/Binary/Tools/Misc./block_holder.js b/src/scratch/blocks/Binary/Tools/Misc./block_holder.js index a09592ed..c80ceba9 100755 --- a/src/scratch/blocks/Binary/Tools/Misc./block_holder.js +++ b/src/scratch/blocks/Binary/Tools/Misc./block_holder.js @@ -2,7 +2,10 @@ import { translate } from '../../../../../utils/lang/i18n'; Blockly.Blocks.block_holder = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('Blocks inside are ignored %1 %2'), args0 : [ { @@ -18,7 +21,14 @@ Blockly.Blocks.block_holder = { colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, tooltip : translate('Put your blocks in here to prevent them from being removed'), - }); + category : Blockly.Categories.Miscellaneous, + }; + }, + meta(){ + return { + 'display_name': translate('Block Holder'), + 'description' : translate('Block Holder Description'), + }; }, }; diff --git a/src/scratch/blocks/Binary/Tools/Misc./loader.js b/src/scratch/blocks/Binary/Tools/Misc./loader.js index b6d66b0b..bbae88ad 100755 --- a/src/scratch/blocks/Binary/Tools/Misc./loader.js +++ b/src/scratch/blocks/Binary/Tools/Misc./loader.js @@ -8,7 +8,14 @@ Blockly.Blocks.loader = { this.loadedVariables = []; this.currentUrl = ''; - this.jsonInit({ + this.jsonInit(this.definition()); + + const urlField = this.getField('URL'); + // eslint-disable-next-line no-underscore-dangle + urlField.onFinishEditing_ = newValue => this.onFinishEditingUrl(newValue); + }, + definition(){ + return { message0: translate('Load block from: %1'), args0 : [ { @@ -21,11 +28,13 @@ Blockly.Blocks.loader = { colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, tooltip : translate('Load blocks from URL'), - }); - - const urlField = this.getField('URL'); - // eslint-disable-next-line no-underscore-dangle - urlField.onFinishEditing_ = newValue => this.onFinishEditingUrl(newValue); + category : Blockly.Categories.Miscellaneous, + }; + }, meta(){ + return { + 'display_name': translate('Lodear'), + 'description' : translate('Loeder Description'), + }; }, onFinishEditingUrl(newValue) { if (this.currentUrl === newValue) { diff --git a/src/scratch/blocks/Binary/Tools/Misc./notify.js b/src/scratch/blocks/Binary/Tools/Misc./notify.js index 97c3df09..747ad962 100755 --- a/src/scratch/blocks/Binary/Tools/Misc./notify.js +++ b/src/scratch/blocks/Binary/Tools/Misc./notify.js @@ -3,7 +3,10 @@ import { translate } from '../../../../../utils/lang/i18n'; Blockly.Blocks.notify = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('Notify %1 with sound: %2 %3'), args0 : [ { @@ -28,7 +31,14 @@ Blockly.Blocks.notify = { previousStatement: null, nextStatement : null, tooltip : translate('Creates a notification'), - }); + cateogry : Blockly.Categories.Miscellaneous, + }; + }, + meta(){ + return { + 'display_name': translate('Pop out notify'), + 'description' : translate('Pop out notify description'), + }; }, }; diff --git a/src/scratch/blocks/Binary/Tools/Misc./total_profit.js b/src/scratch/blocks/Binary/Tools/Misc./total_profit.js index 97c3a8f1..aa5719b1 100755 --- a/src/scratch/blocks/Binary/Tools/Misc./total_profit.js +++ b/src/scratch/blocks/Binary/Tools/Misc./total_profit.js @@ -2,7 +2,10 @@ import { translate } from '../../../../../utils/lang/i18n'; Blockly.Blocks.total_profit = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0 : translate('Total Profit'), output : 'Number', outputShape : Blockly.OUTPUT_SHAPE_ROUND, @@ -10,7 +13,14 @@ Blockly.Blocks.total_profit = { colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, tooltip : translate('Returns the total profit'), - }); + category : Blockly.Categories.Miscellaneous, + }; + }, + meta(){ + return { + 'display_name': translate('Total Profit'), + 'description' : translate('Total Profit Description'), + }; }, }; diff --git a/src/scratch/blocks/Binary/Tools/Misc./total_runs.js b/src/scratch/blocks/Binary/Tools/Misc./total_runs.js index 46baca5c..8ffbc196 100755 --- a/src/scratch/blocks/Binary/Tools/Misc./total_runs.js +++ b/src/scratch/blocks/Binary/Tools/Misc./total_runs.js @@ -2,7 +2,10 @@ import { translate } from '../../../../../utils/lang/i18n'; Blockly.Blocks.total_runs = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0 : translate('Number of Runs'), output : 'Number', outputShape : Blockly.OUTPUT_SHAPE_ROUND, @@ -10,7 +13,14 @@ Blockly.Blocks.total_runs = { colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, tooltip : translate('Returns the number of runs since the beginning'), - }); + category : Blockly.Categories.Miscellaneous, + }; + }, + meta(){ + return { + 'display_name': translate('Total Runs'), + 'description' : translate('Total Runs Description'), + }; }, }; diff --git a/src/scratch/blocks/Binary/Tools/Time/epoch.js b/src/scratch/blocks/Binary/Tools/Time/epoch.js index c7c7655d..6c75f99c 100755 --- a/src/scratch/blocks/Binary/Tools/Time/epoch.js +++ b/src/scratch/blocks/Binary/Tools/Time/epoch.js @@ -2,7 +2,10 @@ import { translate } from '../../../../../utils/lang/i18n'; Blockly.Blocks.epoch = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0 : translate('Seconds Since Epoch'), output : 'Number', outputShape : Blockly.OUTPUT_SHAPE_ROUND, @@ -10,7 +13,14 @@ Blockly.Blocks.epoch = { colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, tooltip : translate('Returns the epoch time (seconds since epoch)'), - }); + category : Blockly.Categories.Time, + }; + }, + meta(){ + return { + 'display_name': translate('Second Since Epoch'), + 'description' : translate('Seconds Since Epoch Decription'), + }; }, }; diff --git a/src/scratch/blocks/Binary/Tools/Time/timeout.js b/src/scratch/blocks/Binary/Tools/Time/timeout.js index a4a4ac68..8c7d14bf 100755 --- a/src/scratch/blocks/Binary/Tools/Time/timeout.js +++ b/src/scratch/blocks/Binary/Tools/Time/timeout.js @@ -2,7 +2,10 @@ import { translate } from '../../../../../utils/lang/i18n'; Blockly.Blocks.timeout = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('%1 %2 Run after %3 second(s)'), args0 : [ { @@ -23,7 +26,14 @@ Blockly.Blocks.timeout = { previousStatement: null, nextStatement : null, tooltip : translate('Run the blocks inside every n seconds'), - }); + category : Blockly.Categories.Time, + }; + }, + meta(){ + return { + 'display_name': translate('Timeout'), + 'description' : translate('Timeout Description'), + }; }, onchange(event) { if (!this.workspace || this.isInFlyout || this.workspace.isDragging()) { diff --git a/src/scratch/blocks/Binary/Trade Definition/trade_definition.js b/src/scratch/blocks/Binary/Trade Definition/trade_definition.js index 9475d722..05c9a499 100755 --- a/src/scratch/blocks/Binary/Trade Definition/trade_definition.js +++ b/src/scratch/blocks/Binary/Trade Definition/trade_definition.js @@ -5,7 +5,10 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.trade_definition = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition() { + return { message0: translate('%1 (1) Define your trade contract %2'), message1: '%1', message2: translate('Run Once at Start: %1'), @@ -56,7 +59,15 @@ Blockly.Blocks.trade_definition = { colour : '#2a3052', colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); + tooltip : translate('Trade Definition tooltip'), + category : Blockly.Categories.Trade_Definition, + }; + }, + meta() { + return { + 'display_name': translate('Trade Definition'), + 'description' : translate('Define market type, stake, trade type and duration in trade'), + }; }, onchange(event) { setBlockTextColor(this); diff --git a/src/scratch/blocks/Binary/Trade Definition/trade_definition_tradeoptions.js b/src/scratch/blocks/Binary/Trade Definition/trade_definition_tradeoptions.js index a21aae4b..7a66bfc1 100755 --- a/src/scratch/blocks/Binary/Trade Definition/trade_definition_tradeoptions.js +++ b/src/scratch/blocks/Binary/Trade Definition/trade_definition_tradeoptions.js @@ -8,7 +8,13 @@ import { translate } from '../../../../utils/lang/i18n'; Blockly.Blocks.trade_definition_tradeoptions = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + + // Ensure one of this type per statement-stack + this.setNextStatement(false); + }, + definition(){ + return { message0: translate('Duration: %1 %2 Stake: %3 %4'), args0 : [ { @@ -36,10 +42,15 @@ Blockly.Blocks.trade_definition_tradeoptions = { colourTertiary : Blockly.Colours.BinaryLessPurple.colourTertiary, previousStatement: null, nextStatement : null, - }); - - // Ensure one of this type per statement-stack - this.setNextStatement(false); + tooltip : translate('Trade Options Tooltip'), + category : Blockly.Categories.Trade_Definition, + }; + }, + meta(){ + return { + 'display_name': translate('Trade Options'), + 'description' : translate('Trade Options Description'), + }; }, onchange(event) { const allowedEvents = [Blockly.Events.BLOCK_CREATE, Blockly.Events.BLOCK_CHANGE, Blockly.Events.END_DRAG]; diff --git a/src/scratch/blocks/Logic/controls_if.js b/src/scratch/blocks/Logic/controls_if.js index 8432a7b4..629857ec 100755 --- a/src/scratch/blocks/Logic/controls_if.js +++ b/src/scratch/blocks/Logic/controls_if.js @@ -9,7 +9,13 @@ Blockly.Blocks.controls_if = { this.elseIfCount = 0; this.elseCount = 0; - this.jsonInit({ + this.jsonInit(this.definition()); + + const addInputIcon = this.getAddInputIcon(); + this.appendDummyInput('MUTATOR').appendField(addInputIcon); + }, + definition(){ + return { message0: translate('if %1 then'), message1: '%1', args0 : [ @@ -28,13 +34,18 @@ Blockly.Blocks.controls_if = { colour : Blockly.Colours.Binary.colour, colourSecondary : Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - category : Blockly.Categories.control, + // category : Blockly.Categories.control, previousStatement: null, nextStatement : null, - }); - - const addInputIcon = this.getAddInputIcon(); - this.appendDummyInput('MUTATOR').appendField(addInputIcon); + tooltip : translate('If else statement tooltip'), + category : Blockly.Categories.Logic, + }; + }, + meta(){ + return { + 'display_name': 'If else statement', + 'description' : 'If else statement description', + }; }, /** * Create XML to represent the number of else-if and else inputs. diff --git a/src/scratch/blocks/Logic/logic_boolean.js b/src/scratch/blocks/Logic/logic_boolean.js index 11914f3c..81d1d61d 100755 --- a/src/scratch/blocks/Logic/logic_boolean.js +++ b/src/scratch/blocks/Logic/logic_boolean.js @@ -2,7 +2,10 @@ import { translate } from '../../../utils/lang/i18n'; Blockly.Blocks.logic_boolean = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: '%1', args0 : [ { @@ -16,8 +19,15 @@ Blockly.Blocks.logic_boolean = { colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - category : Blockly.Categories.operators, - }); + tooltip : translate('Logic Boolean Tooltip'), + category : Blockly.Categories.Logic, + }; + }, + meta(){ + return { + 'display_name': translate('Logic Boolean'), + 'description' : translate('Logic Boolean Description'), + }; }, }; diff --git a/src/scratch/blocks/Logic/logic_compare.js b/src/scratch/blocks/Logic/logic_compare.js index f6475b51..3e314f1b 100755 --- a/src/scratch/blocks/Logic/logic_compare.js +++ b/src/scratch/blocks/Logic/logic_compare.js @@ -1,6 +1,11 @@ +import { translate } from '../../../utils/lang/i18n'; + Blockly.Blocks.logic_compare = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: '%1 %2 %3', args0 : [ { @@ -29,7 +34,15 @@ Blockly.Blocks.logic_compare = { colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); + tooltip : translate('Logic Compare Tooltip'), + category : Blockly.Categories.Logic, + }; + }, + meta(){ + return { + 'display_name': translate('Logic Compare'), + 'description' : translate('Logic Compare Description'), + }; }, }; diff --git a/src/scratch/blocks/Logic/logic_negate.js b/src/scratch/blocks/Logic/logic_negate.js index abfc0d2f..be679f85 100755 --- a/src/scratch/blocks/Logic/logic_negate.js +++ b/src/scratch/blocks/Logic/logic_negate.js @@ -2,7 +2,10 @@ import { translate } from '../../../utils/lang/i18n'; Blockly.Blocks.logic_negate = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('not %1'), args0 : [ { @@ -15,7 +18,15 @@ Blockly.Blocks.logic_negate = { colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); + tooltip : translate('Logic Negate Tooltip'), + category : Blockly.Categories.Logic, + }; + }, + meta(){ + return { + 'display_name': translate('Logic Negate'), + 'description' : translate('Logic Negate Description'), + }; }, }; diff --git a/src/scratch/blocks/Logic/logic_null.js b/src/scratch/blocks/Logic/logic_null.js index 1a7fa47f..9437aa85 100755 --- a/src/scratch/blocks/Logic/logic_null.js +++ b/src/scratch/blocks/Logic/logic_null.js @@ -1,13 +1,26 @@ +import { translate } from '../../../utils/tools'; + Blockly.Blocks.logic_null = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0 : 'null', output : null, outputShape : Blockly.OUTPUT_SHAPE_ROUND, colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); + tooltip : translate('Logic Null Tooltip'), + category : Blockly.Categories.Logic, + }; + }, + meta(){ + return { + 'display_name': translate('Logic Null'), + 'description' : translate('Logic Null Description'), + }; }, }; Blockly.JavaScript.logic_null = () => ['null', Blockly.JavaScript.ORDER_ATOMIC]; diff --git a/src/scratch/blocks/Logic/logic_operation.js b/src/scratch/blocks/Logic/logic_operation.js index c8f8f33f..047d2c89 100755 --- a/src/scratch/blocks/Logic/logic_operation.js +++ b/src/scratch/blocks/Logic/logic_operation.js @@ -2,7 +2,10 @@ import { translate } from '../../../utils/lang/i18n'; Blockly.Blocks.logic_operation = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: '%1 %2 %3', args0 : [ { @@ -24,7 +27,15 @@ Blockly.Blocks.logic_operation = { colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); + tooltip : translate('Logic Operator Tooltip'), + category : Blockly.Categories.Logic, + }; + }, + meta(){ + return { + 'display_name': translate('Logic Operator'), + 'description' : translate('Logic Operator Description'), + }; }, }; diff --git a/src/scratch/blocks/Logic/logic_ternary.js b/src/scratch/blocks/Logic/logic_ternary.js index 19b89a01..00a156a4 100755 --- a/src/scratch/blocks/Logic/logic_ternary.js +++ b/src/scratch/blocks/Logic/logic_ternary.js @@ -2,7 +2,10 @@ import { translate } from '../../../utils/lang/i18n'; Blockly.Blocks.logic_ternary = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('test %1'), message1: translate('if true %1'), message2: translate('if false %1'), @@ -30,7 +33,15 @@ Blockly.Blocks.logic_ternary = { colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); + tooltip : translate('Logic Ternary Tooltip'), + category : Blockly.Categories.Logic, + }; + }, + meta(){ + return { + 'display_name': translate('Logic Ternary'), + 'description' : translate('Logic Ternary Description'), + }; }, }; diff --git a/src/scratch/blocks/Math/math_arithmetic.js b/src/scratch/blocks/Math/math_arithmetic.js index ad4b0be6..3c4a897c 100755 --- a/src/scratch/blocks/Math/math_arithmetic.js +++ b/src/scratch/blocks/Math/math_arithmetic.js @@ -1,6 +1,11 @@ +import { translate } from '../../../utils/lang/i18n'; + Blockly.Blocks.math_arithmetic = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: '%1 %2 %3', args0 : [ { @@ -24,7 +29,15 @@ Blockly.Blocks.math_arithmetic = { colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); + tooltip : translate('Mathematic Arithmetic (Add, minus, mutiply, divide, power)'), + category : Blockly.Categories.Mathematical, + }; + }, + meta(){ + return { + 'display_name': translate('Mathematic Arithmetic'), + 'description' : translate('Mathematic Arithmetic Description'), + }; }, }; diff --git a/src/scratch/blocks/Math/math_change.js b/src/scratch/blocks/Math/math_change.js index 52c3d99d..3d3c5cf6 100755 --- a/src/scratch/blocks/Math/math_change.js +++ b/src/scratch/blocks/Math/math_change.js @@ -1,8 +1,22 @@ import { translate } from '../../../utils/lang/i18n'; Blockly.Blocks.math_change = { + /** + * Initializes the block, in most cases this calls the jsonInit function, in some + * cases it may add extra properties to the block object. + * https://developers.google.com/blockly/reference/js/Blockly.Block#jsonInit + */ init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + /** + * Block definitions describe how a block looks and behaves, including the text, + * the colour, the shape, and what other blocks it can connect to. We've separated + * the block definition from the init function so we can search through it. + * https://developers.google.com/blockly/guides/create-custom-blocks/define-blocks + */ + definition() { + return { message0: translate('change %1 by %2'), args0 : [ { @@ -21,7 +35,20 @@ Blockly.Blocks.math_change = { colourTertiary : Blockly.Colours.Binary.colourTertiary, previousStatement: null, nextStatement : null, - }); + tooltip : translate('Change Number variable'), + category : Blockly.Categories.Mathematical, + }; + }, + /** + * Meta returns an object with with properties that contain human readable strings, + * these strings are used in the flyout help content, as well as used for searching + * for specific blocks. + */ + meta() { + return { + 'display_name': translate('Change Math'), + 'description' : translate('Change Number Type Variable'), + }; }, }; diff --git a/src/scratch/blocks/Math/math_constant.js b/src/scratch/blocks/Math/math_constant.js index b7d4be83..dbd1388f 100755 --- a/src/scratch/blocks/Math/math_constant.js +++ b/src/scratch/blocks/Math/math_constant.js @@ -1,6 +1,11 @@ +import { translate } from '../../../utils/lang/i18n'; + Blockly.Blocks.math_constant = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: '%1', args0 : [ { @@ -21,7 +26,15 @@ Blockly.Blocks.math_constant = { colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); + tooltip : translate('Math Constant Tooltip'), + category : Blockly.Categories.Mathematical, + }; + }, + meta(){ + return { + 'display_name': translate('Math Constant'), + 'description' : translate('Math Constant Description'), + }; }, }; diff --git a/src/scratch/blocks/Math/math_constrain.js b/src/scratch/blocks/Math/math_constrain.js index 3d3c6dee..fddc5d41 100755 --- a/src/scratch/blocks/Math/math_constrain.js +++ b/src/scratch/blocks/Math/math_constrain.js @@ -2,7 +2,10 @@ import { translate } from '../../../utils/lang/i18n'; Blockly.Blocks.math_constrain = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('constrain %1 low %2 high %3'), args0 : [ { @@ -26,7 +29,15 @@ Blockly.Blocks.math_constrain = { colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); + tooltip : translate('Math Constrain Tooltip'), + category : Blockly.Categories.Mathematical, + }; + }, + meta(){ + return { + 'display_name': translate('Math Constrain'), + 'description' : translate('Math Constrain Description'), + }; }, }; diff --git a/src/scratch/blocks/Math/math_modulo.js b/src/scratch/blocks/Math/math_modulo.js index f060bd60..22df88a3 100755 --- a/src/scratch/blocks/Math/math_modulo.js +++ b/src/scratch/blocks/Math/math_modulo.js @@ -2,7 +2,10 @@ import { translate } from '../../../utils/lang/i18n'; Blockly.Blocks.math_modulo = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('remainder of %1 ÷ %2'), args0 : [ { @@ -21,7 +24,15 @@ Blockly.Blocks.math_modulo = { colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); + tooltip : translate('Math Modulo Tooltip'), + category : Blockly.Categories.Mathematical, + }; + }, + meta(){ + return { + 'display_name': translate('Math Modulo'), + 'description' : translate('Math Modulo Description'), + }; }, }; diff --git a/src/scratch/blocks/Math/math_number.js b/src/scratch/blocks/Math/math_number.js index 1110039b..4746ef58 100755 --- a/src/scratch/blocks/Math/math_number.js +++ b/src/scratch/blocks/Math/math_number.js @@ -1,6 +1,14 @@ +import { translate } from '../../../utils/lang/i18n'; + Blockly.Blocks.math_number = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + + const fieldInput = this.getField('NUM'); + fieldInput.setValidator(input => this.numberValidator(input)); + }, + definition(){ + return { message0: '%1', args0 : [ { @@ -14,10 +22,15 @@ Blockly.Blocks.math_number = { colour : '#dedede', colourSecondary: '#ffffff', colourTertiary : '#ffffff', - }); - - const fieldInput = this.getField('NUM'); - fieldInput.setValidator(input => this.numberValidator(input)); + tooltip : translate('Math Number Tooltip'), + category : Blockly.Categories.Mathematical, + }; + }, + meta(){ + return { + 'display_name': translate('Math Number'), + 'description' : translate('Math Number Decscription'), + }; }, numberValidator(input) { if (/^-?([0][,.]|[1-9]+[,.])?([0]|[1-9])*$/.test(input)) { diff --git a/src/scratch/blocks/Math/math_number_positive.js b/src/scratch/blocks/Math/math_number_positive.js index bfb77a34..33f1d159 100755 --- a/src/scratch/blocks/Math/math_number_positive.js +++ b/src/scratch/blocks/Math/math_number_positive.js @@ -1,5 +1,14 @@ +import { translate } from '../../../utils/lang/i18n'; + Blockly.Blocks.math_number_positive = { - init: Blockly.Blocks.math_number.init, + init : Blockly.Blocks.math_number.init, + definition: Blockly.Blocks.math_number.definition, + meta() { + return { + 'display_name': translate('Math Number Positive'), + 'description' : translate('Math Number Description'), + }; + }, numberValidator(input) { if (/^([0][,.]|[1-9]+[,.])?([0]|[1-9])*$/.test(input)) { return undefined; @@ -8,7 +17,4 @@ Blockly.Blocks.math_number_positive = { }, }; -Blockly.JavaScript.math_number_positive = block => { - const code = block.getFieldValue('NUM'); - return [code, Blockly.JavaScript.ORDER_ATOMIC]; -}; +Blockly.JavaScript.math_number_positive = Blockly.JavaScript.math_number; diff --git a/src/scratch/blocks/Math/math_number_property.js b/src/scratch/blocks/Math/math_number_property.js index b68f6c02..48d0cff4 100755 --- a/src/scratch/blocks/Math/math_number_property.js +++ b/src/scratch/blocks/Math/math_number_property.js @@ -2,7 +2,17 @@ import { translate } from '../../../utils/lang/i18n'; Blockly.Blocks.math_number_property = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + + this.setOnChange(event => { + if (event.name === 'PROPERTY') { + const hasDivisorInput = this.getFieldValue('PROPERTY') === 'DIVISIBLE_BY'; + this.updateShape(hasDivisorInput); + } + }); + }, + definition(){ + return { message0: translate('%1 is %2'), args0 : [ { @@ -28,14 +38,15 @@ Blockly.Blocks.math_number_property = { colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); - - this.setOnChange(event => { - if (event.name === 'PROPERTY') { - const hasDivisorInput = this.getFieldValue('PROPERTY') === 'DIVISIBLE_BY'; - this.updateShape(hasDivisorInput); - } - }); + toolip : translate('Math Number Tooltip'), + category : Blockly.Categories.Mathematical, + }; + }, + meta(){ + return { + 'display_name': translate('Math Number'), + 'description' : translate('Math Number Description'), + }; }, domToMutation(xmlElement) { const hasDivisorInput = xmlElement.getAttribute('divisor_input') === 'true'; diff --git a/src/scratch/blocks/Math/math_on_list.js b/src/scratch/blocks/Math/math_on_list.js index 4659b937..b41d4474 100755 --- a/src/scratch/blocks/Math/math_on_list.js +++ b/src/scratch/blocks/Math/math_on_list.js @@ -2,7 +2,10 @@ import { translate } from '../../../utils/lang/i18n'; Blockly.Blocks.math_on_list = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('%1 of list %2'), args0 : [ { @@ -29,7 +32,15 @@ Blockly.Blocks.math_on_list = { colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); + tooltip : translate('Math On List'), + category : Blockly.Categories.Mathematical, + }; + }, + meta(){ + return { + 'display_name': translate('Math On List'), + 'description' : translate('Math On List Description'), + }; }, }; diff --git a/src/scratch/blocks/Math/math_random_float.js b/src/scratch/blocks/Math/math_random_float.js index c74d43e4..425038e5 100755 --- a/src/scratch/blocks/Math/math_random_float.js +++ b/src/scratch/blocks/Math/math_random_float.js @@ -2,14 +2,25 @@ import { translate } from '../../../utils/lang/i18n'; Blockly.Blocks.math_random_float = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0 : translate('random fraction'), output : 'Number', outputShape : Blockly.OUTPUT_SHAPE_ROUND, colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); + tooltip : translate('Math Random Float Tooltip'), + category : Blockly.Categories.Mathematical, + }; + }, + meta(){ + return { + 'display_name': translate('Math Random Float'), + 'description' : translate('Math Random Float Description'), + }; }, }; diff --git a/src/scratch/blocks/Math/math_random_int.js b/src/scratch/blocks/Math/math_random_int.js index 2b843a3b..e0300b31 100755 --- a/src/scratch/blocks/Math/math_random_int.js +++ b/src/scratch/blocks/Math/math_random_int.js @@ -2,7 +2,10 @@ import { translate } from '../../../utils/lang/i18n'; Blockly.Blocks.math_random_int = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('random integer from %1 to %2'), args0 : [ { @@ -21,7 +24,15 @@ Blockly.Blocks.math_random_int = { colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); + tooltip : translate('Math Random Integer Tooltip'), + category : Blockly.Categories.Mathematical, + }; + }, + meta(){ + return { + 'display_name': translate('Math Random Integer'), + 'description' : translate('Math Random Integer Description'), + }; }, }; diff --git a/src/scratch/blocks/Math/math_round.js b/src/scratch/blocks/Math/math_round.js index 4df760b1..9dcd2c53 100755 --- a/src/scratch/blocks/Math/math_round.js +++ b/src/scratch/blocks/Math/math_round.js @@ -1,3 +1,5 @@ +import { translate } from '../../../utils/lang/i18n'; + // https://github.com/google/blockly/blob/master/generators/javascript/math.js Blockly.Blocks.math_round = { /** @@ -6,7 +8,10 @@ Blockly.Blocks.math_round = { * @this Blockly.Block */ init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: '%1 %2', args0 : [ { @@ -24,7 +29,15 @@ Blockly.Blocks.math_round = { colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); + tooltip : translate('Math Round Tooltip'), + category : Blockly.Categories.Mathematical, + }; + }, + meta(){ + return { + 'display_name': translate('Math Round'), + 'description' : translate('Math Round Description'), + }; }, }; diff --git a/src/scratch/blocks/Math/math_single.js b/src/scratch/blocks/Math/math_single.js index df1bc163..af16987a 100755 --- a/src/scratch/blocks/Math/math_single.js +++ b/src/scratch/blocks/Math/math_single.js @@ -2,7 +2,10 @@ import { translate } from '../../../utils/lang/i18n'; Blockly.Blocks.math_single = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('%1 %2'), args0 : [ { @@ -28,7 +31,15 @@ Blockly.Blocks.math_single = { colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); + tooltip : translate('Mathematical Single Tooltip'), + category : Blockly.Categories.Mathematical, + }; + }, + meta(){ + return { + 'display_name': translate('Mathematical Single'), + 'description' : translate('Mathematical Single Description'), + }; }, }; diff --git a/src/scratch/blocks/Math/math_trig.js b/src/scratch/blocks/Math/math_trig.js index 62ad80f2..5ad697bf 100755 --- a/src/scratch/blocks/Math/math_trig.js +++ b/src/scratch/blocks/Math/math_trig.js @@ -2,7 +2,10 @@ import { translate } from '../../../utils/lang/i18n'; Blockly.Blocks.math_trig = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('%1 %2'), args0 : [ { @@ -28,7 +31,15 @@ Blockly.Blocks.math_trig = { colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); + tooltip : translate('Mathematical Trig Tooltip'), + category : Blockly.Categories.Mathematical, + }; + }, + meta(){ + return { + 'display_name': translate('Mathematical Trig'), + 'description' : translate('Mathematical Trig Description'), + }; }, }; diff --git a/src/scratch/blocks/Text/text.js b/src/scratch/blocks/Text/text.js index 90cce4b4..9b8a06c3 100755 --- a/src/scratch/blocks/Text/text.js +++ b/src/scratch/blocks/Text/text.js @@ -1,6 +1,11 @@ +import { translate } from '../../../utils/tools'; + Blockly.Blocks.text = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: '%1', args0 : [ { @@ -13,7 +18,15 @@ Blockly.Blocks.text = { colour : '#dedede', colourSecondary: '#ffffff', colourTertiary : '#ffffff', - }); + tooltip : translate('Text Tooltip'), + category : Blockly.Categories.Text, + }; + }, + meta(){ + return { + 'display_name': translate('text'), + 'description' : translate('Text Description'), + }; }, }; diff --git a/src/scratch/blocks/Text/text_append.js b/src/scratch/blocks/Text/text_append.js index c01314a0..a7984466 100755 --- a/src/scratch/blocks/Text/text_append.js +++ b/src/scratch/blocks/Text/text_append.js @@ -2,7 +2,10 @@ import { translate } from '../../../utils/lang/i18n'; Blockly.Blocks.text_append = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('to %1 append text %2'), args0 : [ { @@ -20,7 +23,15 @@ Blockly.Blocks.text_append = { colourTertiary : Blockly.Colours.Binary.colourTertiary, previousStatement: null, nextStatement : null, - }); + tooltip : translate('Text Append Tooltip'), + category : Blockly.Categories.Text, + }; + }, + meta(){ + return { + 'display_name': translate('Text Append'), + 'description' : translate('Text Append Description'), + }; }, }; diff --git a/src/scratch/blocks/Text/text_changeCase.js b/src/scratch/blocks/Text/text_changeCase.js index 5d84e5f5..6ed8c7cc 100755 --- a/src/scratch/blocks/Text/text_changeCase.js +++ b/src/scratch/blocks/Text/text_changeCase.js @@ -2,7 +2,10 @@ import { translate } from '../../../utils/lang/i18n'; Blockly.Blocks.text_changeCase = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('to %1 %2'), args0 : [ { @@ -24,7 +27,15 @@ Blockly.Blocks.text_changeCase = { colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); + tooltip : translate('Text Change Case Tooltip'), + category : Blockly.Categories.Text, + }; + }, + meta(){ + return { + 'display_name': translate('Text Change Case'), + 'description' : translate('Text Change Case Description'), + }; }, }; diff --git a/src/scratch/blocks/Text/text_charAt.js b/src/scratch/blocks/Text/text_charAt.js index 81e7ef44..74dd347a 100755 --- a/src/scratch/blocks/Text/text_charAt.js +++ b/src/scratch/blocks/Text/text_charAt.js @@ -2,7 +2,23 @@ import { translate } from '../../../utils/lang/i18n'; Blockly.Blocks.text_charAt = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + + const dropdown = this.getField('WHERE'); + dropdown.setValidator(value => { + const newAt = ['FROM_START', 'FROM_END'].includes(value); + if (newAt !== this.isAt) { + this.updateAt(newAt); + this.setFieldValue(value, 'WHERE'); + return null; + } + return undefined; + }); + + this.updateAt(true); + }, + definition(){ + return { message0: translate('in text %1 get %2'), args0 : [ { @@ -26,20 +42,15 @@ Blockly.Blocks.text_charAt = { colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); - - const dropdown = this.getField('WHERE'); - dropdown.setValidator(value => { - const newAt = ['FROM_START', 'FROM_END'].includes(value); - if (newAt !== this.isAt) { - this.updateAt(newAt); - this.setFieldValue(value, 'WHERE'); - return null; - } - return undefined; - }); - - this.updateAt(true); + tooltip : translate('Text Char At Tooltip'), + category : Blockly.Categories.Text, + }; + }, + meta(){ + return { + 'display_name': translate('Text Char At'), + 'description' : translate('Text Char At Description'), + }; }, mutationToDom() { const container = document.createElement('mutation'); diff --git a/src/scratch/blocks/Text/text_getSubstring.js b/src/scratch/blocks/Text/text_getSubstring.js index 7786a5c9..d65b5967 100755 --- a/src/scratch/blocks/Text/text_getSubstring.js +++ b/src/scratch/blocks/Text/text_getSubstring.js @@ -13,7 +13,13 @@ Blockly.Blocks.text_getSubstring = { [translate('last'), 'LAST'], ]; - this.jsonInit({ + this.jsonInit(this.definition()); + + this.updateAt(1, true); + this.updateAt(2, true); + }, + definition(){ + return { message0: translate('in text %1 get substring from %2 %3 to %4 %5'), args0 : [ { @@ -44,10 +50,15 @@ Blockly.Blocks.text_getSubstring = { colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); - - this.updateAt(1, true); - this.updateAt(2, true); + tooltip : translate('Text Substring tooltip'), + category : Blockly.Categories.Text, + }; + }, + meta(){ + return { + 'display_name': translate('Text Substring'), + 'description' : translate('Text Substring Description'), + }; }, mutationToDom() { const container = document.createElement('mutation'); diff --git a/src/scratch/blocks/Text/text_indexOf.js b/src/scratch/blocks/Text/text_indexOf.js index 89e7aebc..c039216f 100755 --- a/src/scratch/blocks/Text/text_indexOf.js +++ b/src/scratch/blocks/Text/text_indexOf.js @@ -2,7 +2,10 @@ import { translate } from '../../../utils/lang/i18n'; Blockly.Blocks.text_indexOf = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('in text %1 find %2 occurence of text %3'), args0 : [ { @@ -26,7 +29,15 @@ Blockly.Blocks.text_indexOf = { colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); + tooltip : translate('Text Index of Tooltip'), + cateogry : Blockly.Categories.Text, + }; + }, + meta(){ + return { + 'display_name': translate('Text Index of'), + 'description' : translate('Text Index of Description'), + }; }, }; diff --git a/src/scratch/blocks/Text/text_isEmpty.js b/src/scratch/blocks/Text/text_isEmpty.js index aeffa106..f67273b1 100755 --- a/src/scratch/blocks/Text/text_isEmpty.js +++ b/src/scratch/blocks/Text/text_isEmpty.js @@ -2,7 +2,10 @@ import { translate } from '../../../utils/lang/i18n'; Blockly.Blocks.text_isEmpty = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('text %1 is empty'), args0 : [ { @@ -16,7 +19,15 @@ Blockly.Blocks.text_isEmpty = { colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); + tooltip : translate('Text Is empty'), + category : Blockly.Categories.Text, + }; + }, + meta(){ + return { + 'display_name': translate('Text Is empty'), + 'description' : translate('Text Is empty'), + }; }, }; diff --git a/src/scratch/blocks/Text/text_join.js b/src/scratch/blocks/Text/text_join.js index a8801d3c..d6dae53b 100755 --- a/src/scratch/blocks/Text/text_join.js +++ b/src/scratch/blocks/Text/text_join.js @@ -3,7 +3,15 @@ import { translate } from '../../../utils/lang/i18n'; Blockly.Blocks.text_join = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + + const fieldImage = new Blockly.FieldImage(plusIconDark, 25, 25, '', this.onIconClick.bind(this)); + + this.appendDummyInput('ADD_ICON').appendField(fieldImage); + this.moveInputBefore('ADD_ICON', 'STACK'); + }, + definition(){ + return { message0: translate('set %1 to create text with'), message1: '%1', args0 : [ @@ -24,12 +32,15 @@ Blockly.Blocks.text_join = { colourTertiary : Blockly.Colours.Binary.colourTertiary, previousStatement: null, nextStatement : null, - }); - - const fieldImage = new Blockly.FieldImage(plusIconDark, 25, 25, '', this.onIconClick.bind(this)); - - this.appendDummyInput('ADD_ICON').appendField(fieldImage); - this.moveInputBefore('ADD_ICON', 'STACK'); + tooltip : translate('Text Join Tooltip'), + category : Blockly.Categories.Text, + }; + }, + meta(){ + return { + 'display_name': translate('Text Join'), + 'description' : translate('Text Join Description'), + }; }, onIconClick() { if (!this.workspace || this.isInFlyout) { diff --git a/src/scratch/blocks/Text/text_length.js b/src/scratch/blocks/Text/text_length.js index 65e794ca..0043236b 100755 --- a/src/scratch/blocks/Text/text_length.js +++ b/src/scratch/blocks/Text/text_length.js @@ -2,7 +2,10 @@ import { translate } from '../../../utils/lang/i18n'; Blockly.Blocks.text_length = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('length of %1'), args0 : [ { @@ -15,7 +18,15 @@ Blockly.Blocks.text_length = { colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); + tooltip : translate('Text Length Tooltip'), + category : Blockly.Categories.Text, + }; + }, + meta(){ + return { + 'display_name': translate('Text Length'), + 'description' : translate('Text Length Description'), + }; }, }; diff --git a/src/scratch/blocks/Text/text_print.js b/src/scratch/blocks/Text/text_print.js index 4178ee54..621ec8ca 100755 --- a/src/scratch/blocks/Text/text_print.js +++ b/src/scratch/blocks/Text/text_print.js @@ -2,7 +2,10 @@ import { translate } from '../../../utils/lang/i18n'; Blockly.Blocks.text_print = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('print %1'), args0 : [ { @@ -15,7 +18,15 @@ Blockly.Blocks.text_print = { colourTertiary : Blockly.Colours.Binary.colourTertiary, previousStatement: null, nextStatement : null, - }); + tooltip : translate('Text Print Tooltip'), + category : Blockly.Categories.Text, + }; + }, + meta(){ + return { + 'display_name': translate('Text Print'), + 'description' : translate('Text Print Description'), + }; }, }; diff --git a/src/scratch/blocks/Text/text_prompt_ext.js b/src/scratch/blocks/Text/text_prompt_ext.js index 0ec135aa..688eaadb 100755 --- a/src/scratch/blocks/Text/text_prompt_ext.js +++ b/src/scratch/blocks/Text/text_prompt_ext.js @@ -2,7 +2,25 @@ import { translate } from '../../../utils/lang/i18n'; Blockly.Blocks.text_prompt_ext = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + + // Change shape based on selected type + const typeField = this.getField('TYPE'); + typeField.setValidator(value => { + if (value === 'TEXT') { + this.setOutputShape(Blockly.OUTPUT_SHAPE_SQUARE); + this.setOutput(true, 'String'); + } else if (value === 'NUMBER') { + this.setOutputShape(Blockly.OUTPUT_SHAPE_ROUND); + this.setOutput(true, 'Number'); + } + this.initSvg(); + this.render(false); + return undefined; + }); + }, + definition(){ + return { message0: translate('prompt for %1 with message %2'), args0 : [ { @@ -20,22 +38,15 @@ Blockly.Blocks.text_prompt_ext = { colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); - - // Change shape based on selected type - const typeField = this.getField('TYPE'); - typeField.setValidator(value => { - if (value === 'TEXT') { - this.setOutputShape(Blockly.OUTPUT_SHAPE_SQUARE); - this.setOutput(true, 'String'); - } else if (value === 'NUMBER') { - this.setOutputShape(Blockly.OUTPUT_SHAPE_ROUND); - this.setOutput(true, 'Number'); - } - this.initSvg(); - this.render(false); - return undefined; - }); + tooltip : translate('Text Prompt Tooltip'), + category : Blockly.Categories.Text, + }; + }, + meta(){ + return { + 'trade_name' : translate('Text Prompt'), + 'description': translate('Text Prompt Description'), + }; }, }; diff --git a/src/scratch/blocks/Text/text_statement.js b/src/scratch/blocks/Text/text_statement.js index 47b965a7..506f0eec 100755 --- a/src/scratch/blocks/Text/text_statement.js +++ b/src/scratch/blocks/Text/text_statement.js @@ -1,10 +1,18 @@ import { minusIconDark } from '../images'; +import { translate } from '../../../utils/tools'; Blockly.Blocks.text_statement = { init() { this.requiredParentId = ''; - this.jsonInit({ + this.jsonInit(this.definition()); + + const fieldImage = new Blockly.FieldImage(minusIconDark, 25, 25, '', () => this.onIconClick()); + + this.appendDummyInput('REMOVE_ICON').appendField(fieldImage); + }, + definition(){ + return { message0: '%1', args0 : [ { @@ -17,11 +25,15 @@ Blockly.Blocks.text_statement = { colourTertiary : Blockly.Colours.BinaryLessGray.colourTertiary, previousStatement: null, nextStatement : null, - }); - - const fieldImage = new Blockly.FieldImage(minusIconDark, 25, 25, '', () => this.onIconClick()); - - this.appendDummyInput('REMOVE_ICON').appendField(fieldImage); + tooltip : translate('Text Statement Tooltip'), + category : Blockly.Categories.Text, + }; + }, + meta(){ + return { + 'display_name': translate('Text Statement'), + 'description' : translate('Text Statement Description'), + }; }, onIconClick() { if (!this.workspace || this.isInFlyout) { diff --git a/src/scratch/blocks/Text/text_trim.js b/src/scratch/blocks/Text/text_trim.js index 1bf2a13e..7290f99e 100755 --- a/src/scratch/blocks/Text/text_trim.js +++ b/src/scratch/blocks/Text/text_trim.js @@ -2,7 +2,10 @@ import { translate } from '../../../utils/lang/i18n'; Blockly.Blocks.text_trim = { init() { - this.jsonInit({ + this.jsonInit(this.definition()); + }, + definition(){ + return { message0: translate('trim spaces from %1 of %2'), args0 : [ { @@ -24,7 +27,15 @@ Blockly.Blocks.text_trim = { colour : Blockly.Colours.Binary.colour, colourSecondary: Blockly.Colours.Binary.colourSecondary, colourTertiary : Blockly.Colours.Binary.colourTertiary, - }); + tooltip : translate('Text Trim Tooltip'), + category : Blockly.Categories.Text, + }; + }, + meta(){ + return { + 'display_name': translate('Text Trim'), + 'description' : translate('Text Trim Description'), + }; }, }; diff --git a/src/scratch/hooks/block.js b/src/scratch/hooks/block.js index b95986ca..2de62b9a 100644 --- a/src/scratch/hooks/block.js +++ b/src/scratch/hooks/block.js @@ -76,3 +76,4 @@ Blockly.Block.prototype.getTopParent = function() { } return null; }; + diff --git a/src/scratch/hooks/constant.js b/src/scratch/hooks/constant.js new file mode 100644 index 00000000..c068f5b9 --- /dev/null +++ b/src/scratch/hooks/constant.js @@ -0,0 +1,23 @@ +import { translate } from '../../utils/lang/i18n'; + +/** + * ENUM for categories. + * @const + */ +Blockly.Categories = { + 'Trade_Definition': translate('trade-definition'), + 'Before_Purchase' : translate('before-purhcase'), + 'During_Purchase' : translate('during-purhcase'), + 'After_Purchase' : translate('after-purchase'), + 'Mathematical' : translate('mathematical'), + 'Logic' : translate('logic'), + 'Text' : translate('text'), + 'Variables' : translate('variable'), + 'Functions' : translate('functions'), + 'List' : translate('list'), + 'Indicators' : translate('indicators'), + 'Time' : translate('time'), + 'Tick_Analysis' : translate('tick-analysis'), + 'Candle' : translate('candle'), + 'Miscellaneous' : translate('miscellaneous'), +}; diff --git a/src/scratch/hooks/data_category.js b/src/scratch/hooks/data_category.js index f8b03767..4bdf1703 100644 --- a/src/scratch/hooks/data_category.js +++ b/src/scratch/hooks/data_category.js @@ -8,11 +8,19 @@ import { translate } from '../../utils/lang/i18n'; */ Blockly.DataCategory = function(workspace) { const variableModelList = workspace.getVariablesOfType(''); - const xmlList = []; - + let xmlList = []; + // `Create Variable`-button Blockly.DataCategory.addCreateButton(xmlList, workspace); + const block_types = ['variables_set', 'variables_get', 'math_change']; + xmlList = xmlList.concat(Blockly.DataCategory.search(variableModelList, block_types)); + + return xmlList; +}; + +Blockly.DataCategory.search = function(variableModelList, blockTypesToShow){ + const xmlList = []; if (variableModelList.length > 0) { const generateVariableFieldXmlString = variableModel => { // The variable name may be user input, so it may contain characters that @@ -23,15 +31,15 @@ Blockly.DataCategory = function(workspace) { return escapedText; }; - // TEMP: Label for testing only - const operationsLabel = document.createElement('label'); - operationsLabel.setAttribute('text', translate('variables_set')); - xmlList.push(operationsLabel); - const firstVariable = variableModelList[0]; // Create 'Set `var` to'-block - if (Blockly.Blocks.variables_set) { + if (blockTypesToShow.includes('variables_set') && Blockly.Blocks.variables_set) { + // TEMP: Label for testing only + const operationsLabel = document.createElement('label'); + operationsLabel.setAttribute('text', translate('variables_set')); + xmlList.push(operationsLabel); + const gap = Blockly.Blocks.math_change ? 8 : 24; const setBlockText = `${generateVariableFieldXmlString( firstVariable @@ -40,13 +48,13 @@ Blockly.DataCategory = function(workspace) { xmlList.push(setBlock); } - // TEMP: Label for testing only - const changeLabel = document.createElement('label'); - changeLabel.setAttribute('text', translate('math_change')); - xmlList.push(changeLabel); - // Create 'Change `var` by `1`'-block - if (Blockly.Blocks.math_change) { + if (blockTypesToShow.includes('math_change') && Blockly.Blocks.math_change) { + // TEMP: Label for testing only + const changeLabel = document.createElement('label'); + changeLabel.setAttribute('text', translate('math_change')); + xmlList.push(changeLabel); + const gap = Blockly.Blocks.variables_get ? 20 : 8; const changeBlockText = `${generateVariableFieldXmlString( firstVariable @@ -55,13 +63,13 @@ Blockly.DataCategory = function(workspace) { xmlList.push(changeBlock); } - // TEMP: Label for testing only - const variablesLabel = document.createElement('label'); - variablesLabel.setAttribute('text', translate('variable_get')); - xmlList.push(variablesLabel); - // Create `variable_get` block for each variable - if (Blockly.Blocks.variables_get) { + if (blockTypesToShow.includes('variables_get') && Blockly.Blocks.variables_get) { + // TEMP: Label for testing only + const variablesLabel = document.createElement('label'); + variablesLabel.setAttribute('text', translate('variable_get')); + xmlList.push(variablesLabel); + variableModelList.sort(Blockly.VariableModel.compareByName); variableModelList.forEach(variable => { diff --git a/src/scratch/hooks/flyout_base.js b/src/scratch/hooks/flyout_base.js index cdb83795..6cf54324 100644 --- a/src/scratch/hooks/flyout_base.js +++ b/src/scratch/hooks/flyout_base.js @@ -1,3 +1,6 @@ + +import { translate } from '../../utils/lang/i18n'; + /* eslint-disable func-names, no-underscore-dangle */ /** @@ -38,7 +41,7 @@ Blockly.Flyout.prototype.scrollAnimationFraction = 1.0; * @param {number} y The computed y origin of the flyout's SVG group. * @protected */ -Blockly.Flyout.prototype.positionAt_ = function(width, height, x, y) { +Blockly.Flyout.prototype.positionAt_ = function (width, height, x, y) { this.svgGroup_.setAttribute('width', width); this.svgGroup_.setAttribute('height', height); @@ -73,6 +76,53 @@ Blockly.Flyout.prototype.positionAt_ = function(width, height, x, y) { * @return {number} The width of the flyout. * deriv-bot: Return actual width rather than this.DEFAULT_WIDTH. */ -Blockly.Flyout.prototype.getWidth = function() { +Blockly.Flyout.prototype.getWidth = function () { return this.width_; }; + +const addSearchFlyout = (callback, xmlList, flyout) => { + let xml_search_list = xmlList; + if (xmlList.type === 'search') { + const blocks = xmlList.blocks; + const fn_blocks = xmlList.fn_blocks; + const var_blocks = xmlList.var_blocks; + const no_result = !blocks.length + && !Object.keys(fn_blocks).length + && !Object.keys(var_blocks.blocks).length; + + xml_search_list = []; + + if (no_result) { + const label = document.createElement('label'); + label.setAttribute('text', translate('No Blocks Found')); + + xml_search_list.push(label); + } else { + const label = document.createElement('label'); + label.setAttribute('text', translate('Result(s)')); + + xml_search_list.push(label); + } + + if (Object.keys(fn_blocks).length) { + const func_xml_list = Blockly.Procedures.flyoutCategory(flyout.workspace_); + + xml_search_list = xml_search_list.concat(func_xml_list); + } + + if (Object.keys(var_blocks).length) { + const var_xml_list = Blockly.DataCategory.search(var_blocks.blocks, var_blocks.blocks_type); + + xml_search_list = xml_search_list.concat(var_xml_list); + } + + xml_search_list = xml_search_list.concat(blocks); + } + + callback(xml_search_list); +}; + +const originalFlyoutShowFn = Blockly.Flyout.prototype.show; +Blockly.Flyout.prototype.show = function (xmlList) { + addSearchFlyout(originalFlyoutShowFn.bind(this), xmlList, this); +}; diff --git a/src/scratch/hooks/index.js b/src/scratch/hooks/index.js index 88a3727b..6979d4f9 100644 --- a/src/scratch/hooks/index.js +++ b/src/scratch/hooks/index.js @@ -11,3 +11,4 @@ import './icon'; import './procedures'; import './toolbox'; import './variables'; +import './constant'; diff --git a/src/scratch/hooks/toolbox.js b/src/scratch/hooks/toolbox.js index b52c0470..0ecc004f 100644 --- a/src/scratch/hooks/toolbox.js +++ b/src/scratch/hooks/toolbox.js @@ -1,5 +1,5 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; +import React from 'react'; +import ReactDOM from 'react-dom'; import { ArrowIcon } from '../../components/Icons.jsx'; import { translate } from '../../utils/lang/i18n'; @@ -8,10 +8,10 @@ import { translate } from '../../utils/lang/i18n'; /** * Initializes the toolbox. */ -Blockly.Toolbox.prototype.init = function() { +Blockly.Toolbox.prototype.init = function () { const workspace = this.workspace_; const svg = this.workspace_.getParentSvg(); - + /** * HTML container for the Toolbox menu. * @type {Element} @@ -28,9 +28,26 @@ Blockly.Toolbox.prototype.init = function() { this.HtmlDiv.appendChild(el_toolbox_header); svg.parentNode.insertBefore(this.HtmlDiv, svg); - + + // deriv-bot: Clicking on toolbox arrow collapses it + Blockly.bindEventWithChecks_(el_toolbox_arrow, 'mousedown', this, () => { + const is_collapsed = this.HtmlDiv.classList.contains('toolbox--collapsed'); + const searchInput = document.getElementById('search_input'); + + if (is_collapsed) { + searchInput.style.display = 'block'; + this.HtmlDiv.classList.remove('toolbox--collapsed'); + } else { + searchInput.style.display = 'none'; + this.HtmlDiv.classList.add('toolbox--collapsed'); + } + + // Fire an event to re-position flyout. + window.dispatchEvent(new Event('resize')); + }); + // Clicking on toolbox closes popups. - Blockly.bindEventWithChecks_(this.HtmlDiv, 'mousedown', this, function(e) { + Blockly.bindEventWithChecks_(this.HtmlDiv, 'mousedown', this, function (e) { // Cancel any gestures in progress. this.workspace_.cancelCurrentGesture(); @@ -43,7 +60,7 @@ Blockly.Toolbox.prototype.init = function() { } Blockly.Touch.clearTouchIdentifier(); // Don't block future drags. }, /* opt_noCaptureIdentifier */ false, /* opt_noPreventDefault */ true); - + this.createFlyout_(); this.categoryMenu_ = new Blockly.Toolbox.CategoryMenu(this, this.HtmlDiv); this.populate_(workspace.options.languageTree); @@ -65,17 +82,179 @@ Blockly.Toolbox.prototype.populate_ = function (newTree) { * @private */ Blockly.Toolbox.prototype.showCategory_ = function (category_id) { - let allContents = []; + let flyout_content; + + if (category_id === 'search') { + let search_term = document.getElementById('search_input').value; + const all_variables = this.flyout_.workspace_.getVariablesOfType(''); + + if (search_term.length <= 1) { + this.flyout_.hide(); + return; + } + + flyout_content = { + type : 'search', + blocks : [], + fn_blocks : {}, + var_blocks: { + blocks : [], + blocks_type: [], + }, + }; + + if (typeof search_term === 'string') { + search_term = search_term.trim().toLowerCase(); + search_term = search_term.split(' '); + } + + const blocks = Blockly.Blocks; + Object.keys(blocks).forEach(blockKey => { + let keywords = ` ${blockKey}`; + const block = blocks[blockKey]; + const block_meta = block.meta instanceof Function && block.meta(); + const block_definition = block.definition instanceof Function && block.definition(); + + if (!block_meta) { + return; + } + + Object.keys(block_meta).forEach(key => { + const meta = block_meta[key]; + keywords += ` ${meta}`; + }); + + Object.keys(block_definition).forEach(key => { + const definition = block_definition[key]; + + if (typeof definition === 'string') { + keywords += ` ${definition}`; + } else if (definition instanceof Array) { + definition.forEach(def => { + if (def instanceof Object) { + keywords += !def.type.includes('image') ? ` ${JSON.stringify(def)}` : ''; + } else { + keywords += ` ${def}`; + } + }); + } + }); + + const block_category = block_definition && block_definition.category; + const category = + this.categoryMenu_.categories_ + .find(menuCategory => menuCategory.id_ === block_category); + const contents = category && category.getContents(); + search_term.forEach(term => { + if (keywords.toLowerCase().includes(term)) { + if (contents === 'PROCEDURE') { + flyout_content.fn_blocks[blockKey] = block; + } else if (contents === 'VARIABLE') { + flyout_content.var_blocks.blocks_type.push(blockKey); + flyout_content.var_blocks.blocks = all_variables; + } else if (contents instanceof Array) { + const blockContents = contents + .filter(content => content.attributes[0].nodeValue === blockKey); + + if (blockContents.length && flyout_content.blocks.indexOf(blockContents[0]) === -1) { + flyout_content.blocks.push(blockContents[0]); + } + } + } + }); + }); + + all_variables.forEach(variable => { + search_term.forEach(term => { + if (variable.name.toLowerCase().includes(term) + && flyout_content.var_blocks.blocks.indexOf(variable) === -1) { + flyout_content.var_blocks.blocks.push(variable); + flyout_content.var_blocks.blocks_type = ['variables_get', 'variables_set', 'math_change']; + } + }); + }); + } else { + const category = this.categoryMenu_.categories_.find(menuCategory => menuCategory.id_ === category_id); + if (!category) { + return; + } + + flyout_content = []; + flyout_content = flyout_content.concat(category.getContents()); + } + + this.flyout_.autoClose = true; + this.flyout_.show(flyout_content); +}; + +/** + * Create the DOM for the category menu. + * deriv-bot: Custom class names + */ +Blockly.Toolbox.CategoryMenu.prototype.createDom = function () { + const className = this.parent_.horizontalLayout_ ? 'toolbox__horizontal-category-menu' : 'toolbox__category-menu'; + + this.table = goog.dom.createDom('div', className); + this.search = goog.dom.createDom('input', { + id : 'search_input', + type : 'text', + placeholder: 'Search', + }); + this.parentHtml_.appendChild(this.table).appendChild(this.search); + + const search = document.getElementById('search_input'); + search.addEventListener('keyup', () => { + const toolbox = this.parent_; + + toolbox.setSelectedItem(toolbox.categoryMenu_.categories_.find(menuCategory => menuCategory.id_ === 'search')); + }); + + // Hide flyout on scrolling the toolbox category menu in + // order to ensure correct positioning of flyout. + this.table.addEventListener('scroll', () => { + const toolbox = this.parent_; + const flyout = toolbox.flyout_; + + toolbox.setSelectedItem(null); + flyout.hide(); + }); +}; - const category = this.categoryMenu_.categories_.find(menuCategory => menuCategory.id_ === category_id); - if (!category) { +/** + * Fill the toolbox with categories and blocks by creating a new + * {Blockly.Toolbox.Category} for every category tag in the toolbox xml. + * deriv-bot: Port from Google Blockly + * @param {Node} domTree DOM tree of blocks, or null. + */ +Blockly.Toolbox.CategoryMenu.prototype.populate = function (domTree) { + if (!domTree) { return; } - allContents = allContents.concat(category.getContents()); + // Remove old categories + this.dispose(); + this.createDom(); - this.flyout_.autoClose = true; - this.flyout_.show(allContents); + const categories = []; + + // Find actual categories from the DOM tree. + domTree.childNodes.forEach((child) => { + if (child.tagName && child.tagName.toUpperCase() === 'CATEGORY') { + categories.push(child); + } + }); + + categories.forEach((child) => { + const row = goog.dom.createDom(goog.dom.TagName.DIV, 'toolbox__row'); + + this.table.appendChild(row); + + if (child) { + this.categories_.push(new Blockly.Toolbox.Category(this, row, child)); + } + }); + + this.height_ = this.table.offsetHeight; }; /** @@ -86,7 +265,7 @@ Blockly.Toolbox.prototype.showCategory_ = function (category_id) { * @return {string} The css class names to be applied, space-separated. * deriv-bot: Custom class names */ -Blockly.Toolbox.Category.prototype.getMenuItemClassName_ = function(selected) { +Blockly.Toolbox.Category.prototype.getMenuItemClassName_ = function (selected) { const classNames = ['toolbox__item', `toolbox__category--${this.id_}`]; if (selected) { @@ -216,7 +395,6 @@ Blockly.Toolbox.prototype.setSelectedItem = function (item) { * deriv-bot: Calls showAll() in Scratch, we don't want that. */ Blockly.Toolbox.prototype.refreshSelection = function () { - // Hello, I'm doing nothing. :) }; /** diff --git a/src/scratch/xml/toolbox.xml b/src/scratch/xml/toolbox.xml index f0a4e5cf..9025d405 100644 --- a/src/scratch/xml/toolbox.xml +++ b/src/scratch/xml/toolbox.xml @@ -1,5 +1,7 @@ + +