init implementation of procedures
This commit is contained in:
		
							parent
							
								
									4601439ae3
								
							
						
					
					
						commit
						8e2deed1d5
					
				| @ -1,5 +1,4 @@ | |||||||
| import Blockly, { FieldDropdown } from 'blockly/core'; | import Blockly, { FieldDropdown } from 'blockly/core' | ||||||
| import { selectedBoard } from '../helpers/board' |  | ||||||
| import * as Types from '../helpers/types' | import * as Types from '../helpers/types' | ||||||
| import { getColour } from '../helpers/colour'; | import { getColour } from '../helpers/colour'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -50,8 +50,6 @@ Blockly.Blocks['sensebox_display_printDisplay'] = { | |||||||
|             .setCheck(null); |             .setCheck(null); | ||||||
|         this.setPreviousStatement(true, null); |         this.setPreviousStatement(true, null); | ||||||
|         this.setNextStatement(true, null); |         this.setNextStatement(true, null); | ||||||
|         let variableName = this.getField('COLOR'); |  | ||||||
|         console.log(variableName.getValue()); |  | ||||||
|         this.setTooltip(Blockly.Msg.senseBox_display_printDisplay_tip); |         this.setTooltip(Blockly.Msg.senseBox_display_printDisplay_tip); | ||||||
|         this.setHelpUrl('https://sensebox.de/books'); |         this.setHelpUrl('https://sensebox.de/books'); | ||||||
|     }, |     }, | ||||||
|  | |||||||
| @ -103,13 +103,10 @@ Blockly.Blocks['sensebox_send_to_osem'] = { | |||||||
|             for (var i = 0; i < apiData.sensors.length; i++) { |             for (var i = 0; i < apiData.sensors.length; i++) { | ||||||
|                 options.push([apiData.sensors[i].title, apiData.sensors[i]._id]); |                 options.push([apiData.sensors[i].title, apiData.sensors[i]._id]); | ||||||
|             } |             } | ||||||
|             console.log(options); |  | ||||||
| 
 |  | ||||||
|         } |         } | ||||||
|         if (options.length > 1) { |         if (options.length > 1) { | ||||||
| 
 | 
 | ||||||
|             var dropdown = options.slice(1) |             var dropdown = options.slice(1) | ||||||
|             console.log(dropdown); |  | ||||||
|             return dropdown; |             return dropdown; | ||||||
|         } else |         } else | ||||||
|             return options; |             return options; | ||||||
|  | |||||||
| @ -309,7 +309,7 @@ Blockly.Blocks['sensebox_button'] = { | |||||||
| 
 | 
 | ||||||
| Blockly.Blocks['sensebox_scd30'] = { | Blockly.Blocks['sensebox_scd30'] = { | ||||||
|   init: function () { |   init: function () { | ||||||
|     var dropdownOptions = [[Blockly.Msg.senseBox_temp, "temperature"], [Blockly.Msg.senseBox_hum, "humidity"], [Blockly.Msg.senseBox_bme_co2, "CO2"]]; |     var dropdownOptions = [[Blockly.Msg.senseBox_scd_co2, "CO2"], [Blockly.Msg.senseBox_temp, "temperature"], [Blockly.Msg.senseBox_hum, "humidity"]]; | ||||||
|     this.appendDummyInput() |     this.appendDummyInput() | ||||||
|       .appendField(Blockly.Msg.senseBox_scd30); |       .appendField(Blockly.Msg.senseBox_scd30); | ||||||
|     this.appendDummyInput() |     this.appendDummyInput() | ||||||
| @ -318,6 +318,14 @@ Blockly.Blocks['sensebox_scd30'] = { | |||||||
|       .appendField(new Blockly.FieldDropdown(dropdownOptions), "dropdown") |       .appendField(new Blockly.FieldDropdown(dropdownOptions), "dropdown") | ||||||
|     this.setOutput(true, Types.NUMBER.typeName); |     this.setOutput(true, Types.NUMBER.typeName); | ||||||
|     this.setColour(getColour().sensebox); |     this.setColour(getColour().sensebox); | ||||||
|     this.setTooltip(Blockly.Msg.senseBox_bme_tip); |     this.setTooltip(Blockly.Msg.senseBox_scd_tip); | ||||||
|  |   }, | ||||||
|  |   onchange: function (e) { | ||||||
|  |     var dropdown = this.getFieldValue('dropdown'); | ||||||
|  |     if (dropdown === 'temperature' || dropdown === 'humidity') { | ||||||
|  |       this.setOutput(true, Types.DECIMAL.typeName); | ||||||
|  |     } else if (dropdown === 'CO2') { | ||||||
|  |       this.setOutput(true, Types.NUMBER.typeName); | ||||||
|  |     } | ||||||
|   } |   } | ||||||
| }; | }; | ||||||
|  | |||||||
| @ -44,7 +44,7 @@ Blockly['Arduino'].addReservedWords( | |||||||
|     'setup,loop,if,else,for,switch,case,while,' + |     'setup,loop,if,else,for,switch,case,while,' + | ||||||
|     'do,break,continue,return,goto,define,include,' + |     'do,break,continue,return,goto,define,include,' + | ||||||
|     'HIGH,LOW,INPUT,OUTPUT,INPUT_PULLUP,true,false,' + |     'HIGH,LOW,INPUT,OUTPUT,INPUT_PULLUP,true,false,' + | ||||||
|     'interger, constants,floating,point,void,bookean,char,' + |     'interger, constants,floating,point,void,boolean,char,' + | ||||||
|     'unsigned,byte,int,word,long,float,double,string,String,array,' + |     'unsigned,byte,int,word,long,float,double,string,String,array,' + | ||||||
|     'static, volatile,const,sizeof,pinMode,digitalWrite,digitalRead,' + |     'static, volatile,const,sizeof,pinMode,digitalWrite,digitalRead,' + | ||||||
|     'analogReference,analogRead,analogWrite,tone,noTone,shiftOut,shitIn,' + |     'analogReference,analogRead,analogWrite,tone,noTone,shiftOut,shitIn,' + | ||||||
|  | |||||||
| @ -28,3 +28,97 @@ Blockly.Arduino['arduino_functions'] = function (block) { | |||||||
|     //var loopcode = Blockly.Arduino.scrub_(block, loopBranch); No comment block
 |     //var loopcode = Blockly.Arduino.scrub_(block, loopBranch); No comment block
 | ||||||
|     return loopBranch; |     return loopBranch; | ||||||
| }; | }; | ||||||
|  | 
 | ||||||
|  | Blockly.Arduino['procedures_defreturn'] = function (block: Block | any) { | ||||||
|  |     // Define a procedure with a return value.
 | ||||||
|  |     const funcName = Blockly.Arduino.variableDB_.getName( | ||||||
|  |         block.getFieldValue('NAME'), | ||||||
|  |         Blockly.Procedures.NAME_TYPE | ||||||
|  |     ); | ||||||
|  |     const branch = Blockly.Arduino.statementToCode(block, 'STACK'); | ||||||
|  |     const returnType = block.getFieldValue('RETURN TYPE') || 'void'; | ||||||
|  | 
 | ||||||
|  |     let returnValue = | ||||||
|  |         Blockly.Arduino.valueToCode(block, 'RETURN', Blockly.Arduino.ORDER_NONE) || | ||||||
|  |         ''; | ||||||
|  |     if (returnValue) { | ||||||
|  |         returnValue = Blockly.Arduino.INDENT + 'return ' + returnValue + ';\n'; | ||||||
|  |     } | ||||||
|  |     const args = []; | ||||||
|  |     for (let i = 0; i < block.argumentVarModels_.length; i++) { | ||||||
|  |         args[i] = | ||||||
|  |             translateType(block.argumentVarModels_[i].type) + | ||||||
|  |             ' ' + | ||||||
|  |             block.argumentVarModels_[i].name; | ||||||
|  |     } | ||||||
|  |     let code = | ||||||
|  |         translateType(returnType) + | ||||||
|  |         ' ' + | ||||||
|  |         funcName + | ||||||
|  |         '(' + | ||||||
|  |         args.join(', ') + | ||||||
|  |         ') {\n' + | ||||||
|  |         branch + | ||||||
|  |         returnValue + | ||||||
|  |         '}'; | ||||||
|  |     code = Blockly.Arduino.scrub_(block, code); | ||||||
|  |     // Add % so as not to collide with helper functions in definitions list.
 | ||||||
|  |     Blockly.Arduino.functionNames_['%' + funcName] = code; | ||||||
|  |     return null; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | function translateType(type) { | ||||||
|  |     switch (type) { | ||||||
|  |         case 'Number': | ||||||
|  |             return 'double'; | ||||||
|  |         case 'String': | ||||||
|  |             return 'String'; | ||||||
|  |         case 'Boolean': | ||||||
|  |             return 'boolean'; | ||||||
|  |         case 'void': | ||||||
|  |             return 'void'; | ||||||
|  |         default: | ||||||
|  |             throw new Error('Invalid Parameter Type'); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Blockly.Arduino['procedures_defnoreturn'] = | ||||||
|  |     Blockly.Arduino['procedures_defreturn']; | ||||||
|  | 
 | ||||||
|  | Blockly.Arduino['procedures_callreturn'] = function (block) { | ||||||
|  |     // Call a procedure with a return value.
 | ||||||
|  |     const funcName = Blockly.Arduino.variableDB_.getName( | ||||||
|  |         block.getFieldValue('NAME'), | ||||||
|  |         Blockly.Procedures.NAME_TYPE | ||||||
|  |     ); | ||||||
|  |     const args = []; | ||||||
|  |     for (let i = 0; i < block.arguments_.length; i++) { | ||||||
|  |         args[i] = | ||||||
|  |             Blockly.Arduino.valueToCode( | ||||||
|  |                 block, | ||||||
|  |                 'ARG' + i, | ||||||
|  |                 Blockly.Arduino.ORDER_COMMA | ||||||
|  |             ) || 'null'; | ||||||
|  |     } | ||||||
|  |     const code = funcName + '(' + args.join(', ') + ')'; | ||||||
|  |     return [code, Blockly.Arduino.ORDER_ATOMIC]; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | Blockly.Arduino['procedures_callnoreturn'] = function (block) { | ||||||
|  |     // Call a procedure with no return value.
 | ||||||
|  |     const funcName = Blockly.Arduino.variableDB_.getName( | ||||||
|  |         block.getFieldValue('NAME'), | ||||||
|  |         Blockly.Procedures.NAME_TYPE | ||||||
|  |     ); | ||||||
|  |     const args = []; | ||||||
|  |     for (let i = 0; i < block.arguments_.length; i++) { | ||||||
|  |         args[i] = | ||||||
|  |             Blockly.Arduino.valueToCode( | ||||||
|  |                 block, | ||||||
|  |                 'ARG' + i, | ||||||
|  |                 Blockly.Arduino.ORDER_COMMA | ||||||
|  |             ) || 'null'; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return funcName + '(' + args.join(', ') + ');\n'; | ||||||
|  | }; | ||||||
| @ -263,32 +263,22 @@ Blockly.Arduino.sensebox_scd30 = function () { | |||||||
|   Blockly.Arduino.libraries_['scd30_library'] = '#include "SparkFun_SCD30_Arduino_Library.h"' |   Blockly.Arduino.libraries_['scd30_library'] = '#include "SparkFun_SCD30_Arduino_Library.h"' | ||||||
|   Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"'; |   Blockly.Arduino.libraries_['library_senseBoxMCU'] = '#include "SenseBoxMCU.h"'; | ||||||
|   Blockly.Arduino.definitions_['SCD30'] = 'SCD30 airSensor;'; |   Blockly.Arduino.definitions_['SCD30'] = 'SCD30 airSensor;'; | ||||||
|   Blockly.Arduino.variables_['scd30_temp'] = 'float scd30_temp;'; |  | ||||||
|   Blockly.Arduino.variables_['scd30_humi'] = 'float scd30_humi;'; |  | ||||||
|   Blockly.Arduino.variables_['scd30_co2'] = 'float scd30_co2;'; |  | ||||||
|   Blockly.Arduino.setupCode_['init_scd30'] = ` Wire.begin();
 |   Blockly.Arduino.setupCode_['init_scd30'] = ` Wire.begin();
 | ||||||
|   if (airSensor.begin() == false) |   if (airSensor.begin() == false) | ||||||
|   { |   { | ||||||
|     Serial.println("Air sensor not detected. Please check wiring. Freezing..."); |  | ||||||
|     while (1) |     while (1) | ||||||
|       ; |       ; | ||||||
|   }`;
 |   }`;
 | ||||||
|   Blockly.Arduino.loopCodeOnce_['scd30_getData'] = `if (airSensor.dataAvailable())
 |  | ||||||
|   { |  | ||||||
|    scd30_co2 = airSensor.getCO2(); |  | ||||||
|    scd30_temp = airSensor.getTemperature(); |  | ||||||
|    scd30_humi = airSensor.getHumidity(); |  | ||||||
|   }` |  | ||||||
|   var code = ''; |   var code = ''; | ||||||
|   switch (dropdown) { |   switch (dropdown) { | ||||||
|     case 'temperature': |     case 'temperature': | ||||||
|       code = 'scd30_temp'; |       code = 'aireSensor.getTemperature()'; | ||||||
|       break; |       break; | ||||||
|     case 'humidity': |     case 'humidity': | ||||||
|       code = 'scd30_humi'; |       code = 'airSensor.getHumiditiy()'; | ||||||
|       break; |       break; | ||||||
|     case 'CO2': |     case 'CO2': | ||||||
|       code = 'scd30_co2'; |       code = 'aireSensor.getCO2()'; | ||||||
|       break; |       break; | ||||||
|     default: |     default: | ||||||
|       code = '' |       code = '' | ||||||
|  | |||||||
| @ -89,7 +89,7 @@ export const CHILD_BLOCK_MISSING = { | |||||||
| const compatibleTypes = { | const compatibleTypes = { | ||||||
|     Array: ['Array'], |     Array: ['Array'], | ||||||
|     boolean: ['boolean'], |     boolean: ['boolean'], | ||||||
|     int: ['int'], |     int: ['int', 'long', 'double', 'float'], | ||||||
|     char: ['char'], |     char: ['char'], | ||||||
|     String: ['String'], |     String: ['String'], | ||||||
|     void: ['void'], |     void: ['void'], | ||||||
|  | |||||||
| @ -774,6 +774,8 @@ Blockly.Msg.senseBox_telegram_message = "Nachricht" | |||||||
| Blockly.Msg.senseBox_telegram_send = "Sende Nachricht" | Blockly.Msg.senseBox_telegram_send = "Sende Nachricht" | ||||||
| //SCD30 CO2 Sensor
 | //SCD30 CO2 Sensor
 | ||||||
| Blockly.Msg.senseBox_scd30 = "CO2 Sensor (Sensirion SCD30)"; | Blockly.Msg.senseBox_scd30 = "CO2 Sensor (Sensirion SCD30)"; | ||||||
|  | Blockly.Msg.senseBox_scd_tip = "Gibt den Wert des CO2 Sensors"; | ||||||
|  | Blockly.Msg.senseBox_scd_co2 = "CO2 in ppm"; | ||||||
| //WS2818 RGB LED
 | //WS2818 RGB LED
 | ||||||
| Blockly.Msg.senseBox_ws2818_rgb_led = "senseBox WS2812 - RGB LED"; | Blockly.Msg.senseBox_ws2818_rgb_led = "senseBox WS2812 - RGB LED"; | ||||||
| Blockly.Msg.senseBox_ws2818_rgb_led_position = "Position"; | Blockly.Msg.senseBox_ws2818_rgb_led_position = "Position"; | ||||||
|  | |||||||
| @ -757,6 +757,9 @@ Blockly.Msg.sensebox_soil_smt50 = "Soil Moisture and Temperature (SMT50)"; | |||||||
| Blockly.Msg.sensebox_web_readHTML_filename = "File:"; | Blockly.Msg.sensebox_web_readHTML_filename = "File:"; | ||||||
| //SCD30 CO2 Sensor
 | //SCD30 CO2 Sensor
 | ||||||
| Blockly.Msg.senseBox_scd30 = "CO2 Sensor (Sensirion SCD30)"; | Blockly.Msg.senseBox_scd30 = "CO2 Sensor (Sensirion SCD30)"; | ||||||
|  | Blockly.Msg.senseBox_scd_co2 = "CO2 in ppm"; | ||||||
|  | Blockly.Msg.senseBox_scd_tip = "Returns value of the CO2 Sensor"; | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| //WS2818 RGB LED
 | //WS2818 RGB LED
 | ||||||
| Blockly.Msg.senseBox_ws2818_rgb_led = "senseBox WS2812 - RGB LED"; | Blockly.Msg.senseBox_ws2818_rgb_led = "senseBox WS2812 - RGB LED"; | ||||||
|  | |||||||
| @ -379,6 +379,7 @@ class Toolbox extends React.Component { | |||||||
|                     <Block type="array_getIndex" /> |                     <Block type="array_getIndex" /> | ||||||
|                     <Block type="lists_length" /> |                     <Block type="lists_length" /> | ||||||
|                 </Category> |                 </Category> | ||||||
|  |                 <Category name="Functions" custom="PROCEDURE"></Category> | ||||||
|                 <sep></sep> |                 <sep></sep> | ||||||
|                 <Category name="Eingang/Ausgang" colour={getColour().io}> |                 <Category name="Eingang/Ausgang" colour={getColour().io}> | ||||||
|                     <Block type="io_digitalwrite"></Block> |                     <Block type="io_digitalwrite"></Block> | ||||||
|  | |||||||
| @ -58,7 +58,6 @@ class GalleryHome extends Component { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     componentDidMount() { |     componentDidMount() { | ||||||
|         console.log(process.env.REACT_APP_BLOCKLY_API) |  | ||||||
|         fetch(process.env.REACT_APP_BLOCKLY_API + this.props.location.pathname) |         fetch(process.env.REACT_APP_BLOCKLY_API + this.props.location.pathname) | ||||||
|             .then(res => res.json()) |             .then(res => res.json()) | ||||||
|             .then((data) => { |             .then((data) => { | ||||||
|  | |||||||
| @ -88,19 +88,12 @@ class Home extends Component { | |||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   render() { |   render() { | ||||||
|     // console.log(this.props.match.params.galleryId);
 |  | ||||||
|     // console.log(gallery);
 |  | ||||||
|     // console.log(gallery.filter(project => project.id == this.props.match.params.galleryId));
 |  | ||||||
|     if (this.state.projectToLoad) { |  | ||||||
|       console.log(this.state.projectToLoad.xml) |  | ||||||
|     } |  | ||||||
|     console.log(this.props); |  | ||||||
|     return ( |     return ( | ||||||
|       <div> |       <div> | ||||||
|         <div style={{ float: 'right', height: '40px', marginBottom: '20px' }}><WorkspaceFunc /></div> |         <div style={{ float: 'right', height: '40px', marginBottom: '20px' }}><WorkspaceFunc /></div> | ||||||
|         <div style={{ float: 'left', height: '40px', position: 'relative' }}><WorkspaceStats /></div> |         <div style={{ float: 'left', height: '40px', position: 'relative' }}><WorkspaceStats /></div> | ||||||
|         <Grid container spacing={2}> |         <Grid container spacing={2}> | ||||||
|           <Grid item xs={12} md={this.state.codeOn ? 6 : 12} style={{ position: 'relative' }}> |           <Grid item xs={12} md={this.state.codeOn ? 8 : 12} style={{ position: 'relative' }}> | ||||||
|             <Tooltip title={this.state.codeOn ? 'Code ausblenden' : 'Code anzeigen'} > |             <Tooltip title={this.state.codeOn ? 'Code ausblenden' : 'Code anzeigen'} > | ||||||
|               <IconButton |               <IconButton | ||||||
|                 className={this.state.codeOn ? this.props.classes.codeOn : this.props.classes.codeOff} |                 className={this.state.codeOn ? this.props.classes.codeOn : this.props.classes.codeOff} | ||||||
| @ -117,7 +110,7 @@ class Home extends Component { | |||||||
| 
 | 
 | ||||||
|           </Grid> |           </Grid> | ||||||
|           {this.state.codeOn ? |           {this.state.codeOn ? | ||||||
|             <Grid item xs={12} md={6}> |             <Grid item xs={12} md={4}> | ||||||
|               <CodeViewer /> |               <CodeViewer /> | ||||||
|             </Grid> |             </Grid> | ||||||
|             : null} |             : null} | ||||||
|  | |||||||
| @ -51,7 +51,6 @@ class Builder extends Component { | |||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   submit = () => { |   submit = () => { | ||||||
|     console.log(this.props.id) |  | ||||||
|     if (this.props.id === null) { |     if (this.props.id === null) { | ||||||
|       var randomID = Date.now(); |       var randomID = Date.now(); | ||||||
|     } else { |     } else { | ||||||
| @ -115,7 +114,6 @@ class Builder extends Component { | |||||||
|       this.props.readJSON(result); |       this.props.readJSON(result); | ||||||
|       this.setState({ snackbar: true, key: Date.now(), message: `${isFile ? 'Die übergebene JSON-Datei' : 'Der übergebene JSON-String'} wurde erfolgreich übernommen.`, type: 'success' }); |       this.setState({ snackbar: true, key: Date.now(), message: `${isFile ? 'Die übergebene JSON-Datei' : 'Der übergebene JSON-String'} wurde erfolgreich übernommen.`, type: 'success' }); | ||||||
|     } catch (err) { |     } catch (err) { | ||||||
|       console.log(err); |  | ||||||
|       this.props.progress(false); |       this.props.progress(false); | ||||||
|       this.props.jsonString(''); |       this.props.jsonString(''); | ||||||
|       this.setState({ open: true, string: false, title: 'Ungültiges JSON-Format', content: `${isFile ? 'Die übergebene Datei' : 'Der übergebene String'} enthält nicht valides JSON. Bitte überprüfe ${isFile ? 'die JSON-Datei' : 'den JSON-String'} und versuche es erneut.` }); |       this.setState({ open: true, string: false, title: 'Ungültiges JSON-Format', content: `${isFile ? 'Die übergebene Datei' : 'Der übergebene String'} enthält nicht valides JSON. Bitte überprüfe ${isFile ? 'die JSON-Datei' : 'den JSON-String'} und versuche es erneut.` }); | ||||||
|  | |||||||
| @ -27,10 +27,9 @@ const styles = (theme) => ({ | |||||||
| 
 | 
 | ||||||
| class HintTutorialExists extends Component { | class HintTutorialExists extends Component { | ||||||
| 
 | 
 | ||||||
|   constructor(props){ |   constructor(props) { | ||||||
|     var previousPageWasAnotherDomain = props.pageVisits === 0; |     var previousPageWasAnotherDomain = props.pageVisits === 0; | ||||||
|     var userDoNotWantToSeeNews = window.localStorage.getItem('news') ? true : false; |     var userDoNotWantToSeeNews = window.localStorage.getItem('news') ? true : false; | ||||||
|     console.log(userDoNotWantToSeeNews); |  | ||||||
|     super(props); |     super(props); | ||||||
|     this.state = { |     this.state = { | ||||||
|       open: userDoNotWantToSeeNews ? !userDoNotWantToSeeNews : previousPageWasAnotherDomain |       open: userDoNotWantToSeeNews ? !userDoNotWantToSeeNews : previousPageWasAnotherDomain | ||||||
| @ -42,7 +41,7 @@ class HintTutorialExists extends Component { | |||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   onChange = (e) => { |   onChange = (e) => { | ||||||
|     if(e.target.checked){ |     if (e.target.checked) { | ||||||
|       window.localStorage.setItem('news', e.target.checked); |       window.localStorage.setItem('news', e.target.checked); | ||||||
|     } |     } | ||||||
|     else { |     else { | ||||||
| @ -66,8 +65,8 @@ class HintTutorialExists extends Component { | |||||||
|         <div> |         <div> | ||||||
|           Es gibt ab jetzt Tutorials zu verschiedenen Themen. Schau mal <Link to="/tutorial" className={this.props.classes.link}>hier</Link> vorbei. |           Es gibt ab jetzt Tutorials zu verschiedenen Themen. Schau mal <Link to="/tutorial" className={this.props.classes.link}>hier</Link> vorbei. | ||||||
|           <FormControlLabel |           <FormControlLabel | ||||||
|             style={{marginTop: '20px'}} |             style={{ marginTop: '20px' }} | ||||||
|             classes={{label: this.props.classes.label}} |             classes={{ label: this.props.classes.label }} | ||||||
|             control={ |             control={ | ||||||
|               <Checkbox |               <Checkbox | ||||||
|                 size={'small'} |                 size={'small'} | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user