Compare commits

..

1 Commits

Author SHA1 Message Date
Mario Pesch
18b33946b5 add fields for ratelimit testing 2023-02-02 14:20:04 +01:00
106 changed files with 740 additions and 1437 deletions

View File

@ -1,41 +0,0 @@
name: Build and push image
on:
push:
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
container:
image: catthehacker/ubuntu:act-latest
#defaults:
# run:
# working-directory: /repo
steps:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0 # all history for all branches and tags
- name: Login to gitea.simonzeyer.de Repo
uses: docker/login-action@v2
with:
registry: gitea.simonzeyer.de
username: ${{ secrets.DOCKER_REPO_USER }}
password: ${{ secrets.DOCKER_REPO_PASSWD }}
- name: Get Meta
id: meta
run: |
echo REPO_NAME=$(echo ${GITHUB_REPOSITORY} | awk -F"/" '{print $2}') >> $GITHUB_OUTPUT
echo REPO_VERSION=$(git describe --always | sed 's/^v//') >> $GITHUB_OUTPUT
- name: Build and push
uses: docker/build-push-action@v4
env:
ACTIONS_RUNTIME_TOKEN: '' # See https://gitea.com/gitea/act_runner/issues/119
with:
context: .
file: ./Dockerfile
push: true
tags: |
gitea.simonzeyer.de/schuelerlabor-cleverlab/smarti:${{ steps.meta.outputs.REPO_VERSION }}

View File

@ -1,12 +0,0 @@
# specify the node base image with your desired version node:<version>
FROM node:16 as build
WORKDIR /app
copy ./ /app
RUN npm install --verbose
RUN npm run build --verbose
FROM nginx:alpine
COPY --from=build /app/build/ /usr/share/nginx/html
RUN chmod 755 /usr/share/nginx/html/ -R
EXPOSE 80
ENTRYPOINT ["sh", "-c", "cd /usr/share/nginx/html/ && nginx -g 'daemon off;'"]

View File

@ -1,11 +0,0 @@
# docker-compose.yml
services:
smarti:
mem_limit: 2048m
mem_reservation: 128M
cpus: 2
build:
dockerfile: Dockerfile
ports:
- "80"

View File

@ -3,27 +3,23 @@
"version": "1.0.0", "version": "1.0.0",
"private": true, "private": true,
"dependencies": { "dependencies": {
"@blockly/block-plus-minus": "^4.0.4", "@blockly/block-plus-minus": "^3.0.5",
"@blockly/field-grid-dropdown": "^2.0.4", "@blockly/field-grid-dropdown": "^1.0.31",
"@blockly/field-slider": "4.0.4", "@blockly/field-slider": "^3.0.5",
"@blockly/plugin-scroll-options": "^3.0.5", "@blockly/plugin-scroll-options": "^2.0.5",
"@blockly/plugin-typed-variable-modal": "^5.0.6", "@blockly/plugin-typed-variable-modal": "^4.0.5",
"@blockly/workspace-backpack": "^3.0.4", "@blockly/workspace-backpack": "^2.0.12",
"@blockly/zoom-to-fit": "^3.0.4", "@blockly/zoom-to-fit": "^2.0.14",
"@emotion/react": "^11.10.5", "@fortawesome/fontawesome-svg-core": "^1.2.36",
"@emotion/styled": "^11.10.5", "@fortawesome/free-solid-svg-icons": "^5.15.4",
"@fortawesome/fontawesome-svg-core": "^6.2.1", "@fortawesome/react-fontawesome": "^0.1.19",
"@fortawesome/free-solid-svg-icons": "^6.2.1", "@material-ui/core": "^4.12.4",
"@fortawesome/react-fontawesome": "^0.2.0",
"@monaco-editor/react": "^4.3.1", "@monaco-editor/react": "^4.3.1",
"@mui/lab": "^5.0.0-alpha.110",
"@mui/material": "^5.10.16",
"@mui/styles": "^5.10.16",
"@testing-library/jest-dom": "^5.16.1", "@testing-library/jest-dom": "^5.16.1",
"@testing-library/react": "^12.1.2", "@testing-library/react": "^12.1.2",
"@testing-library/user-event": "^7.2.1", "@testing-library/user-event": "^7.2.1",
"axios": "^0.22.0", "axios": "^0.22.0",
"blockly": "^9.2.0", "blockly": "^8.0.3",
"file-saver": "^2.0.5", "file-saver": "^2.0.5",
"markdown-it": "^12.3.2", "markdown-it": "^12.3.2",
"mnemonic-id": "^3.2.7", "mnemonic-id": "^3.2.7",
@ -39,13 +35,12 @@
"react-rating-stars-component": "^2.2.0", "react-rating-stars-component": "^2.2.0",
"react-redux": "^7.2.9", "react-redux": "^7.2.9",
"react-router-dom": "^5.3.3", "react-router-dom": "^5.3.3",
"react-scripts": "^5.0.1", "react-scripts": "^5.0.0",
"react-share": "^4.4.0", "react-share": "^4.4.0",
"react-spinners": "^0.13.3", "react-spinners": "^0.13.3",
"reactour": "^1.18.7", "reactour": "^1.18.7",
"redux": "^4.2.0", "redux": "^4.2.0",
"redux-thunk": "^2.4.1", "redux-thunk": "^2.4.1",
"rehype-raw": "^6.1.1",
"remark-gemoji": "^7.0.1", "remark-gemoji": "^7.0.1",
"remark-gfm": "^3.0.1", "remark-gfm": "^3.0.1",
"styled-components": "^4.4.1", "styled-components": "^4.4.1",
@ -70,8 +65,5 @@
">0.2%", ">0.2%",
"not dead", "not dead",
"not op_mini all" "not op_mini all"
], ]
"devDependencies": {
"@babel/plugin-proposal-private-property-in-object": "7.21.11"
}
} }

View File

@ -53,7 +53,7 @@ td {
padding-top: 12px; padding-top: 12px;
padding-bottom: 12px; padding-bottom: 12px;
text-align: left; text-align: left;
border-color: #4eaf47; background-color: #4eaf47;
color: white; color: white;
} }
@ -62,13 +62,3 @@ td {
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
} }
:root {
--url: url('./data/mcu_opacity.png');
}
.blocklySvg {
background-image: var(--url);
background-position: center;
background-repeat: no-repeat;
}

View File

@ -9,7 +9,7 @@ import { loadUser } from "./actions/authActions";
import "./App.css"; import "./App.css";
import { ThemeProvider, StyledEngineProvider, createTheme } from "@mui/material/styles"; import { ThemeProvider, createTheme } from "@material-ui/core/styles";
import Content from "./components/Content"; import Content from "./components/Content";
@ -36,7 +36,6 @@ class App extends Component {
render() { render() {
const customHistory = createBrowserHistory(); const customHistory = createBrowserHistory();
return ( return (
<StyledEngineProvider injectFirst>
<ThemeProvider theme={theme}> <ThemeProvider theme={theme}>
<Provider store={store}> <Provider store={store}>
<Router history={customHistory}> <Router history={customHistory}>
@ -44,7 +43,6 @@ class App extends Component {
</Router> </Router>
</Provider> </Provider>
</ThemeProvider> </ThemeProvider>
</StyledEngineProvider>
); );
} }
} }

View File

@ -1,13 +1,8 @@
import { import {
BOARD, BOARD,
} from "./types"; } from "./types";
import mini_opacity from "../data/mini_opacity.png"
import mcu_opacity from "../data/mcu_opacity.png"
export const setBoard = (board) => (dispatch) => { export const setBoard = (board) => (dispatch) => {
window.sessionStorage.setItem("board", board);
const root = document.querySelector(':root');
root.style.setProperty('--url', `url(${board === "mcu" ? mcu_opacity : mini_opacity})`);
dispatch({ dispatch({
type: BOARD, type: BOARD,
payload: board, payload: board,

View File

@ -1,18 +0,0 @@
import axios from 'axios'
const fetchSensorWikiSuccess = sensors => ({
type: 'FETCH_SENSORWIKI_SUCCESS',
payload: { sensors }
})
export const fetchSensors = () => {
return async dispatch => {
try {
let sensors = await axios.get('https://api.sensors.wiki/sensors/all')
dispatch(fetchSensorWikiSuccess(sensors.data))
}
catch(e){
console.log(e)
}
}
}

View File

@ -16,19 +16,13 @@ export const onChangeCode = () => (dispatch, getState) => {
code.arduino = Blockly.Arduino.workspaceToCode(workspace); code.arduino = Blockly.Arduino.workspaceToCode(workspace);
var xmlDom = Blockly.Xml.workspaceToDom(workspace); var xmlDom = Blockly.Xml.workspaceToDom(workspace);
code.xml = Blockly.Xml.domToPrettyText(xmlDom); code.xml = Blockly.Xml.domToPrettyText(xmlDom);
var selectedBlock = Blockly.getSelected(); var selectedBlock = Blockly.selected
if (selectedBlock !== null) { if (selectedBlock !== null) {
code.helpurl = selectedBlock.helpUrl code.helpurl = selectedBlock.helpUrl
code.tooltip = selectedBlock.tooltip code.tooltip = selectedBlock.tooltip
if (selectedBlock.data) {
code.data = selectedBlock.data
} else {
code.data = null
}
} else if (selectedBlock === null) { } else if (selectedBlock === null) {
code.tooltip = Blockly.Msg.tooltip_hint code.tooltip = Blockly.Msg.tooltip_hint
code.helpurl = '' code.helpurl = ''
code.data = null
} }

View File

@ -1,9 +1,9 @@
import React, { Component } from "react"; import React, { Component } from "react";
import withStyles from '@mui/styles/withStyles'; import { withStyles } from "@material-ui/core/styles";
import { alpha } from "@mui/material/styles"; import { alpha } from "@material-ui/core/styles";
import Typography from "@mui/material/Typography"; import Typography from "@material-ui/core/Typography";
const styles = (theme) => ({ const styles = (theme) => ({
alert: { alert: {

View File

@ -27,7 +27,7 @@ import Blockly from "blockly/core";
import "blockly/blocks"; import "blockly/blocks";
import Toolbox from "./toolbox/Toolbox"; import Toolbox from "./toolbox/Toolbox";
import { Card } from "@mui/material"; import { Card } from "@material-ui/core";
import { import {
ScrollOptions, ScrollOptions,
ScrollBlockDragger, ScrollBlockDragger,

View File

@ -45,7 +45,6 @@ class BlocklyWindow extends Component {
const workspace = Blockly.getMainWorkspace(); const workspace = Blockly.getMainWorkspace();
var xml = this.props.initialXml; var xml = this.props.initialXml;
if (props.selectedBoard !== this.props.selectedBoard) { if (props.selectedBoard !== this.props.selectedBoard) {
xml = localStorage.getItem("autoSaveXML");
// change board // change board
if(!xml) xml = initialXml; if(!xml) xml = initialXml;
var xmlDom = Blockly.Xml.textToDom(xml); var xmlDom = Blockly.Xml.textToDom(xml);
@ -63,7 +62,6 @@ class BlocklyWindow extends Component {
} }
if (props.language !== this.props.language) { if (props.language !== this.props.language) {
// change language // change language
xml = localStorage.getItem("autoSaveXML");
if (!xml) xml = initialXml; if (!xml) xml = initialXml;
xmlDom = Blockly.Xml.textToDom(xml); xmlDom = Blockly.Xml.textToDom(xml);
Blockly.Xml.clearWorkspaceAndLoadFromXml(xmlDom, workspace); Blockly.Xml.clearWorkspaceAndLoadFromXml(xmlDom, workspace);

View File

@ -1,88 +0,0 @@
import Blockly from "blockly";
import { getColour } from "../helpers/colour";
import * as Types from "../helpers/types";
import { selectedBoard } from "../helpers/board";
import { FieldGridDropdown } from "@blockly/field-grid-dropdown";
/**
* DS18B20 Temperatursonde
*
*/
Blockly.Blocks["CleVerLab_dummy1"] = {
init: function () {
this.setColour(getColour().cleverlab);
this.appendDummyInput()
.appendField("tut nichts")
this.setOutput(true, Types.NUMBER.typeName);
this.data = {name: "empty"};
},
};
Blockly.Blocks["CleVerLab_temperature"] = {
init: function () {
this.setColour(getColour().cleverlab);
this.appendDummyInput()
.appendField("Temperatur")
.appendField("Digital Port:")
.appendField(new Blockly.FieldDropdown(selectedBoard().digitalPorts), "DigitalPin");
this.setOutput(true, Types.NUMBER.typeName);
this.data = {name: "ds18b20"};
},
};
/**
* PH Wert
*
*/
Blockly.Blocks["CleVerLab_pH"] = {
init: function () {
this.setColour(getColour().cleverlab);
this.appendDummyInput()
.appendField("pH Wert")
.appendField("Digital Port:")
.appendField(new Blockly.FieldDropdown(selectedBoard().digitalPins), "DigitalPin");
this.setOutput(true, Types.NUMBER.typeName);
this.data = {name: "phoderso"};
},
};
Blockly.Blocks["CleVerLab_cali1"] = {
init: function () {
this.appendDummyInput()
.appendField("Kalibriere pH Sensor");
this.appendValueInput("VAR1", "Number")
.appendField("Referenzlösung pH 4.00 =")
.setAlign(Blockly.ALIGN_RIGHT);
this.appendValueInput("VAR2", "Number2")
.appendField("Referenzlösung pH 7.00 =")
.setAlign(Blockly.ALIGN_RIGHT);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(getColour().cleverlab);
this.setOutput(true, Types.NUMBER.typeName);
this.data = {name: "dsasda"};
},
};
/**
* Pump
*
*/
Blockly.Blocks['CleVerLab_pump'] = {
init: function() {
this.setColour(getColour().cleverlab);
var dropdown = new Blockly.FieldDropdown([
[ 'START','HIGH'],
[ 'STOPP','LOW']
]);
this.appendDummyInput()
.appendField(dropdown, "Mode")
.appendField(" Pumpe ")
.appendField(new Blockly.FieldDropdown(selectedBoard().digitalPins), "DigitalPin");
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
//this.setOutput(true, "Number");
this.setTooltip('');
this.setHelpUrl('');
}
};

View File

@ -26,6 +26,5 @@ import "./variables";
import "./lists"; import "./lists";
import "./watchdog"; import "./watchdog";
import "./webserver"; import "./webserver";
import "./CleVerLab"
import "../helpers/types"; import "../helpers/types";

View File

@ -19,6 +19,7 @@ Blockly.Blocks["sensebox_osem_connection"] = {
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.appendDummyInput() this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_osem_connection) .appendField(Blockly.Msg.senseBox_osem_connection)
.appendField( new Blockly.FieldDropdown([[Blockly.Msg.senseBox_osem_host, "opensensemap.org"], [Blockly.Msg.senseBox_osem_host_testing, "testing.opensensemap.org"]]), "HOST")
.appendField("SSL") .appendField("SSL")
.appendField(new Blockly.FieldCheckbox(ssl), "SSL"); .appendField(new Blockly.FieldCheckbox(ssl), "SSL");
this.appendDummyInput() this.appendDummyInput()
@ -53,6 +54,10 @@ Blockly.Blocks["sensebox_osem_connection"] = {
.setAlign(Blockly.ALIGN_LEFT) .setAlign(Blockly.ALIGN_LEFT)
.appendField(Blockly.Msg.senseBox_osem_access_token) .appendField(Blockly.Msg.senseBox_osem_access_token)
.appendField(new Blockly.FieldTextInput("access_token"), "access_token"); .appendField(new Blockly.FieldTextInput("access_token"), "access_token");
this.appendDummyInput()
.setAlign(Blockly.ALIGN_LEFT)
.appendField(Blockly.Msg.senseBox_osem_xallowtoken)
.appendField(new Blockly.FieldTextInput("ratelimit-token"), "ratelimit-token");
this.appendStatementInput("DO") this.appendStatementInput("DO")
.appendField(Blockly.Msg.senseBox_sensor) .appendField(Blockly.Msg.senseBox_sensor)
.setCheck(null); .setCheck(null);

View File

@ -26,7 +26,6 @@ Blockly.Blocks["sensebox_sensor_temp_hum"] = {
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.setTooltip(Blockly.Msg.senseBox_temp_hum_tooltip); this.setTooltip(Blockly.Msg.senseBox_temp_hum_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_temp_hum_helpurl); this.setHelpUrl(Blockly.Msg.senseBox_temp_hum_helpurl);
this.data = {name: "hdc1080", connection: "I2C"};
}, },
}; };
@ -52,7 +51,6 @@ Blockly.Blocks["sensebox_sensor_uv_light"] = {
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.setTooltip(Blockly.Msg.senseBox_uv_light_tooltip); this.setTooltip(Blockly.Msg.senseBox_uv_light_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_uv_light_helpurl); this.setHelpUrl(Blockly.Msg.senseBox_uv_light_helpurl);
this.data = {name: "veml6070"};
}, },
}; };
@ -93,7 +91,6 @@ Blockly.Blocks["sensebox_sensor_bmx055_accelerometer"] = {
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.setTooltip(Blockly.Msg.senseBox_bmx055_accelerometer_tooltip); this.setTooltip(Blockly.Msg.senseBox_bmx055_accelerometer_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_bmx055_helpurl); this.setHelpUrl(Blockly.Msg.senseBox_bmx055_helpurl);
this.data = {name: "bmx055"};
}, },
}; };
@ -125,7 +122,6 @@ Blockly.Blocks["sensebox_sensor_sds011"] = {
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.setTooltip(Blockly.Msg.senseBox_sds011_tooltip); this.setTooltip(Blockly.Msg.senseBox_sds011_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_sds011_helpurl); this.setHelpUrl(Blockly.Msg.senseBox_sds011_helpurl);
this.data = {name: "sds011"};
}, },
}; };
@ -159,7 +155,6 @@ Blockly.Blocks["sensebox_sensor_pressure"] = {
this.setOutput(true, Types.DECIMAL.typeName); this.setOutput(true, Types.DECIMAL.typeName);
this.setTooltip(Blockly.Msg.senseBox_pressure_tooltip); this.setTooltip(Blockly.Msg.senseBox_pressure_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_pressure_helpurl); this.setHelpUrl(Blockly.Msg.senseBox_pressure_helpurl);
this.data = {name: "bmp280"};
this.getField("NAME").setValidator( this.getField("NAME").setValidator(
function (val) { function (val) {
this.updateShape_(val === "Altitude"); this.updateShape_(val === "Altitude");
@ -206,7 +201,6 @@ Blockly.Blocks["sensebox_sensor_bme680_bsec"] = {
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.setTooltip(Blockly.Msg.senseBox_bme_tooltip); this.setTooltip(Blockly.Msg.senseBox_bme_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_bme680_helpurl); this.setHelpUrl(Blockly.Msg.senseBox_bme680_helpurl);
this.data = {name: "bme680"};
}, },
}; };
@ -218,7 +212,12 @@ Blockly.Blocks["sensebox_sensor_bme680_bsec"] = {
Blockly.Blocks["sensebox_sensor_ultrasonic_ranger"] = { Blockly.Blocks["sensebox_sensor_ultrasonic_ranger"] = {
init: function () { init: function () {
var dropdown = new FieldGridDropdown(selectedBoard().digitalPorts, function (option) { var dropdownOptions = [
[Blockly.Msg.senseBox_ultrasonic_port_A, "A"],
[Blockly.Msg.senseBox_ultrasonic_port_B, "B"],
[Blockly.Msg.senseBox_ultrasonic_port_C, "C"],
];
var dropdown = new FieldGridDropdown(dropdownOptions, function (option) {
var input = option === "A" || option === "B" || option === "C"; var input = option === "A" || option === "B" || option === "C";
this.sourceBlock_.updateShape_(input); this.sourceBlock_.updateShape_(input);
}); });
@ -246,7 +245,6 @@ Blockly.Blocks["sensebox_sensor_ultrasonic_ranger"] = {
this.setOutput(true, Types.NUMBER.typeName); this.setOutput(true, Types.NUMBER.typeName);
this.setTooltip(Blockly.Msg.senseBox_ultrasonic_tooltip); this.setTooltip(Blockly.Msg.senseBox_ultrasonic_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_ultrasonic_helpurl); this.setHelpUrl(Blockly.Msg.senseBox_ultrasonic_helpurl);
this.data = {name: "hc-sr04"};
}, },
/** /**
* Parse XML to restore the number of pins available. * Parse XML to restore the number of pins available.
@ -331,7 +329,6 @@ Blockly.Blocks["sensebox_button"] = {
[Blockly.Msg.senseBox_button_isPressed, "isPressed"], [Blockly.Msg.senseBox_button_isPressed, "isPressed"],
[Blockly.Msg.senseBox_button_wasPressed, "wasPressed"], [Blockly.Msg.senseBox_button_wasPressed, "wasPressed"],
[Blockly.Msg.senseBox_button_longPress, "longPress"], [Blockly.Msg.senseBox_button_longPress, "longPress"],
[Blockly.Msg.senseBox_button_switch,"toggleButton"]
]), ]),
"FUNCTION" "FUNCTION"
) )
@ -385,7 +382,6 @@ Blockly.Blocks["sensebox_scd30"] = {
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.setTooltip(Blockly.Msg.senseBox_scd_tooltip); this.setTooltip(Blockly.Msg.senseBox_scd_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_scd_helpurl); this.setHelpUrl(Blockly.Msg.senseBox_scd_helpurl);
this.data = {name: "scd30"};
}, },
onchange: function (e) { onchange: function (e) {
var dropdown = this.getFieldValue("dropdown"); var dropdown = this.getFieldValue("dropdown");
@ -430,11 +426,16 @@ Blockly.Blocks["sensebox_gps"] = {
Blockly.Blocks["sensebox_sensor_truebner_smt50"] = { Blockly.Blocks["sensebox_sensor_truebner_smt50"] = {
init: function () { init: function () {
var dropdownOptions = [
[Blockly.Msg.senseBox_ultrasonic_port_A, "A"],
[Blockly.Msg.senseBox_ultrasonic_port_B, "B"],
[Blockly.Msg.senseBox_ultrasonic_port_C, "C"],
];
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.appendDummyInput().appendField(Blockly.Msg.senseBox_smt50); this.appendDummyInput().appendField(Blockly.Msg.senseBox_smt50);
this.appendDummyInput() this.appendDummyInput()
.appendField("Port:") .appendField("Port:")
.appendField(new Blockly.FieldDropdown(selectedBoard().digitalPorts), "Port"); .appendField(new Blockly.FieldDropdown(dropdownOptions), "Port");
this.appendDummyInput() this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_value) .appendField(Blockly.Msg.senseBox_value)
.appendField( .appendField(
@ -447,7 +448,6 @@ Blockly.Blocks["sensebox_sensor_truebner_smt50"] = {
this.setOutput(true, Types.NUMBER.typeName); this.setOutput(true, Types.NUMBER.typeName);
this.setTooltip(Blockly.Msg.senseBox_smt50_tooltip); this.setTooltip(Blockly.Msg.senseBox_smt50_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_smt50_helpurl); this.setHelpUrl(Blockly.Msg.senseBox_smt50_helpurl);
this.data = {name: "smt50"};
}, },
}; };
@ -458,15 +458,18 @@ Blockly.Blocks["sensebox_sensor_truebner_smt50"] = {
Blockly.Blocks["sensebox_sensor_watertemperature"] = { Blockly.Blocks["sensebox_sensor_watertemperature"] = {
init: function () { init: function () {
var dropdownOptions = [
[Blockly.Msg.senseBox_ultrasonic_port_A, "A"],
[Blockly.Msg.senseBox_ultrasonic_port_B, "B"],
[Blockly.Msg.senseBox_ultrasonic_port_C, "C"],
];
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.appendDummyInput() this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_watertemperature) .appendField(Blockly.Msg.senseBox_watertemperature)
.appendField("Port:") .appendField("Port:")
.appendField(new Blockly.FieldDropdown(selectedBoard().digitalPorts), "Port"); .appendField(new Blockly.FieldDropdown(dropdownOptions), "Port");
this.setOutput(true, Types.NUMBER.typeName); this.setOutput(true, Types.NUMBER.typeName);
this.setTooltip(Blockly.Msg.senseBox_watertemperature_tip); this.setTooltip(Blockly.Msg.senseBox_watertemperature_tip);
this.data = {name: "ds18b20"};
}, },
}; };
@ -493,11 +496,16 @@ Blockly.Blocks['sensebox_windspeed'] = {
Blockly.Blocks["sensebox_soundsensor_dfrobot"] = { Blockly.Blocks["sensebox_soundsensor_dfrobot"] = {
init: function () { init: function () {
var dropdownOptions = [
[Blockly.Msg.senseBox_ultrasonic_port_A, "A"],
[Blockly.Msg.senseBox_ultrasonic_port_B, "B"],
[Blockly.Msg.senseBox_ultrasonic_port_C, "C"],
];
this.setColour(getColour().sensebox); this.setColour(getColour().sensebox);
this.appendDummyInput() this.appendDummyInput()
.appendField(Blockly.Msg.senseBox_soundsensor_dfrobot) .appendField(Blockly.Msg.senseBox_soundsensor_dfrobot)
.appendField("Port:") .appendField("Port:")
.appendField(new Blockly.FieldDropdown(selectedBoard().digitalPorts), "Port"); .appendField(new Blockly.FieldDropdown(dropdownOptions), "Port");
this.setOutput(true, Types.DECIMAL.typeName); this.setOutput(true, Types.DECIMAL.typeName);
this.setTooltip(Blockly.Msg.senseBox_soundsensor_dfrobot_tooltip); this.setTooltip(Blockly.Msg.senseBox_soundsensor_dfrobot_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_soundsensor_dfrobot_helpurl); this.setHelpUrl(Blockly.Msg.senseBox_soundsensor_dfrobot_helpurl);
@ -534,7 +542,6 @@ Blockly.Blocks["sensebox_sensor_dps310"] = {
this.setOutput(true, Types.DECIMAL.typeName); this.setOutput(true, Types.DECIMAL.typeName);
this.setTooltip(Blockly.Msg.senseBox_sensor_dps310_tooltip); this.setTooltip(Blockly.Msg.senseBox_sensor_dps310_tooltip);
this.setHelpUrl(Blockly.Msg.senseBox_sensor_dps310_helpurl); this.setHelpUrl(Blockly.Msg.senseBox_sensor_dps310_helpurl);
this.data = {name: "dps310"};
this.getField("NAME").setValidator( this.getField("NAME").setValidator(
function (val) { function (val) {
this.updateShape_(val === "Altitude"); this.updateShape_(val === "Altitude");

View File

@ -9,10 +9,10 @@ Blockly.Blocks["variables_set_dynamic"] = {
this.setPreviousStatement(true, null); this.setPreviousStatement(true, null);
this.setNextStatement(true, null); this.setNextStatement(true, null);
this.appendValueInput("VALUE") this.appendValueInput("VALUE")
.appendField(Blockly.Msg.variables_set, Blockly.Msg.variables_set) .appendField("set", "set")
.appendField("", "type") .appendField("", "type")
.appendField(new Blockly.FieldVariable("VAR"), "VAR") .appendField(new Blockly.FieldVariable("VAR"), "VAR")
.appendField(Blockly.Msg.variables_to); .appendField("to");
}, },
onchange: function (e) { onchange: function (e) {
let variableID = this.getFieldValue("VAR"); let variableID = this.getFieldValue("VAR");

View File

@ -1,61 +0,0 @@
import Blockly from "blockly";
/**
* starte/stoppe Pumpe
*
*/
Blockly.Arduino.CleVerLab_pump = function (block) {
var pin = block.getFieldValue('DigitalPin');
var state = block.getFieldValue("Mode");
Blockly['Arduino'].setupCode_['pinMode'] = 'pinMode(' + pin + ', OUTPUT);';
var code = 'digitalWrite(' + pin + ', ' + state + ');\n';
return code;
};
/**
* PH wert
*
*/
Blockly.Arduino.CleVerLab_temperature = function () {
var dropdown_pin = this.getFieldValue("DigitalPort");
Blockly.Arduino.libraries_["library_senseBoxIO"] = "#include <senseBoxIO.h>";
Blockly.Arduino.libraries_["library_oneWire"] =
"#include <OneWire.h> // http://librarymanager/All#OneWire";
Blockly.Arduino.libraries_["library_oneDallasTemperature"] =
"#include <DallasTemperature.h> // http://librarymanager/All#DallasTemperature";
Blockly.Arduino.definitions_["define_OneWire"] =
"#define ONE_WIRE_BUS " +
dropdown_pin +
"\nOneWire oneWire(ONE_WIRE_BUS);\nDallasTemperature sensors(&oneWire);";
Blockly.Arduino.setupCode_["sensebox_oneWireSetup"] = "sensors.begin();";
Blockly.Arduino.codeFunctions_["sensebox_requestTemp"] =
"float getWaterTemp(){\nsensors.requestTemperatures();\nsensors.getTempCByIndex(0);\n}";
var code = "getWaterTemp()";
return [code, Blockly.Arduino.ORDER_ATOMIC];
};
Blockly.Arduino.CleVerLab_pH = function () {
var dropdown_pin = this.getFieldValue("DigitalPin");
Blockly.Arduino.definitions_["define_pHgetter"] =
"#define SensorPin " + dropdown_pin +"\n#define samplingInterval 20\n#define printInterval 800\n#define ArrayLenth 40 //times of collection\nint pHArray[ArrayLenth]; //Store the average value of the sensor feedback\nint pHArrayIndex=0;\nfloat slope = 1.00;\nfloat b =0.00;";
Blockly.Arduino.codeFunctions_["sensebox_requestpH"] =
"float getpH(){\nstatic unsigned long samplingTime = millis();\nstatic unsigned long printTime = millis();\nstatic float pHValue,voltage;\n//nif(millis()-samplingTime > samplingInterval){\n//pHArray[pHArrayIndex++]=analogRead(SensorPin);\nfor (int i = 1; i <= 10; i += 1) {\nvoltage = voltage + analogRead(SensorPin);\n}\n voltage = (voltage / 10)*5.0/1024; \nsamplingTime=millis();\n\nreturn pHValue = 3.5*voltage*slope+b;\n}\n";
Blockly.Arduino.codeFunctions_["avergearraypH"] =
"double avergearray(int* arr, int number) {\n int i;\n int max, min;\n double avg;\n long amount = 0;\n if (number <= 0) {\n return 0;\n }\n if (number < 5) {\n for (i = 0; i < number; i++) {\n amount += arr[i];\n }\n avg = amount / number;\n return avg;\n }\n else {\n if (arr[0] < arr[1]) {\n min = arr[0];\n max = arr[1];\n }\n else {\n min = arr[1];\n max = arr[0];\n }\n for (i = 2; i < number; i++) {\n if (arr[i] < min) {\n amount += min;\n min = arr[i];\n }\n else {\n if (arr[i] > max) {\n amount += max;\n max = arr[i];\n }\n else {\n amount += arr[i];\n }\n }\n }\n avg = (double)amount / (number - 2);\n }\n return avg;\n}";
var code = "getpH()";
return [code, Blockly.Arduino.ORDER_ATOMIC];
};
Blockly.Arduino.CleVerLab_cali1 = function () {
var var1 = Blockly.Arduino.valueToCode(this, 'VAR1', Blockly.Arduino.ORDER_ATOMIC) || "4.00";
var var2 = Blockly.Arduino.valueToCode(this, 'VAR2', Blockly.Arduino.ORDER_ATOMIC) || "7.00";
//var var1 = this.getFieldValue("VAR1");
//var var2 = this.getFieldValue("VAR2");
Blockly.Arduino.definitions_["define_pHKali"] = "#define pH4 4.00\n#define pH7 7.00\nfloat pH4is = "+ var1+";\nfloat pH7is = "+ var2 +";";
Blockly.Arduino.setupCode_["asdsadsa"] ="slope = (2.00-(4.00/3.50))/(pH7is/3.50 - pH4is/3.50);\n b = 7 - (pH7is * slope);";
var code = "0";
return [code, Blockly.Arduino.ORDER_ATOMIC];
};

View File

@ -27,4 +27,3 @@ import "./variables";
import "./lists"; import "./lists";
import "./watchdog"; import "./watchdog";
import "./webserver"; import "./webserver";
import "./CleVerLab"

View File

@ -30,6 +30,8 @@ Blockly.Arduino.sensebox_osem_connection = function (Block) {
var box_id = this.getFieldValue("BoxID"); var box_id = this.getFieldValue("BoxID");
var branch = Blockly.Arduino.statementToCode(Block, "DO"); var branch = Blockly.Arduino.statementToCode(Block, "DO");
var access_token = this.getFieldValue("access_token"); var access_token = this.getFieldValue("access_token");
var host = this.getFieldValue("HOST");
var ratelimit_token = this.getFieldValue("ratelimit-token");
var blocks = this.getDescendants(); var blocks = this.getDescendants();
var type = this.getFieldValue("type"); var type = this.getFieldValue("type");
var ssl = this.getFieldValue("SSL"); var ssl = this.getFieldValue("SSL");
@ -50,7 +52,7 @@ Blockly.Arduino.sensebox_osem_connection = function (Block) {
Blockly.Arduino.definitions_["SenseBoxID"] = Blockly.Arduino.definitions_["SenseBoxID"] =
'const char SENSEBOX_ID [] PROGMEM = "' + box_id + '";'; 'const char SENSEBOX_ID [] PROGMEM = "' + box_id + '";';
Blockly.Arduino.definitions_["host"] = Blockly.Arduino.definitions_["host"] =
'const char server [] PROGMEM ="ingress.opensensemap.org";'; `const char server [] PROGMEM ="ingress.${host}";`;
if (wifi === true) { if (wifi === true) {
if (ssl === "TRUE") { if (ssl === "TRUE") {
Blockly.Arduino.libraries_["library_bearSSL"] = Blockly.Arduino.libraries_["library_bearSSL"] =
@ -154,7 +156,7 @@ ${
if (connected == true) { if (connected == true) {
// construct the HTTP POST request: // construct the HTTP POST request:
sprintf_P(buffer, sprintf_P(buffer,
PSTR("POST /boxes/%s/data HTTP/1.1\\nAuthorization: ${access_token}\\nHost: %s\\nContent-Type: " PSTR("POST /boxes/%s/data HTTP/1.1\\nAuthorization: ${access_token}\\nX-Allow-Token: ${ratelimit_token}\\nHost: %s\\nContent-Type: "
"text/csv\\nConnection: close\\nContent-Length: %i\\n\\n"), "text/csv\\nConnection: close\\nContent-Length: %i\\n\\n"),
SENSEBOX_ID, server, num_measurements * lengthMultiplikator); SENSEBOX_ID, server, num_measurements * lengthMultiplikator);
// send the HTTP POST request: // send the HTTP POST request:
@ -253,7 +255,7 @@ ${
if (connected == true) { if (connected == true) {
// construct the HTTP POST request: // construct the HTTP POST request:
sprintf_P(buffer, sprintf_P(buffer,
PSTR("POST /boxes/%s/data HTTP/1.1\\nAuthorization: ${access_token}\\nHost: %s\\nContent-Type: " PSTR("POST /boxes/%s/data HTTP/1.1\\nAuthorization: ${access_token}\\nX-Allow-Token: ${ratelimit_token}\\nHost: %s\\nContent-Type: "
"text/csv\\nConnection: close\\nContent-Length: %i\\n\\n"), "text/csv\\nConnection: close\\nContent-Length: %i\\n\\n"),
SENSEBOX_ID, server, num_measurements * lengthMultiplikator); SENSEBOX_ID, server, num_measurements * lengthMultiplikator);
// send the HTTP POST request: // send the HTTP POST request:

View File

@ -399,7 +399,6 @@ Blockly.Arduino.sensebox_button = function () {
Blockly.Arduino.libraries_[ Blockly.Arduino.libraries_[
"library_jcButtons" "library_jcButtons"
] = `#include <JC_Button.h> // http://librarymanager/All#JC_Button`; ] = `#include <JC_Button.h> // http://librarymanager/All#JC_Button`;
Blockly.Arduino.definitions_["define_button" + dropdown_pin + ""] = Blockly.Arduino.definitions_["define_button" + dropdown_pin + ""] =
"Button button_" + dropdown_pin + "(" + dropdown_pin + ");"; "Button button_" + dropdown_pin + "(" + dropdown_pin + ");";
Blockly.Arduino.setupCode_["setup_button" + dropdown_pin + ""] = Blockly.Arduino.setupCode_["setup_button" + dropdown_pin + ""] =
@ -414,10 +413,6 @@ Blockly.Arduino.sensebox_button = function () {
} else if (dropown_function === "longPress") { } else if (dropown_function === "longPress") {
var time = this.getFieldValue("time"); var time = this.getFieldValue("time");
code = "button_" + dropdown_pin + ".pressedFor(" + time + ")"; code = "button_" + dropdown_pin + ".pressedFor(" + time + ")";
} else if (dropown_function === "toggleButton") {
code = "button_" + dropdown_pin + ".toggleState()";
Blockly.Arduino.definitions_["define_button" + dropdown_pin + ""] =
"ToggleButton button_" + dropdown_pin + "(" + dropdown_pin + ");";
} }
return [code, Blockly.Arduino.ORDER_ATOMIC]; return [code, Blockly.Arduino.ORDER_ATOMIC];
}; };

View File

@ -13,11 +13,6 @@ const sensebox_mcu = {
["C5", "5"], ["C5", "5"],
["C6", "6"], ["C6", "6"],
], ],
digitalPorts: [
["A", "A"],
["B", "B"],
["C", "C"],
],
digitalPinsLED: [ digitalPinsLED: [
["BUILTIN_1", "7"], ["BUILTIN_1", "7"],
["BUILTIN_2", "8"], ["BUILTIN_2", "8"],
@ -148,9 +143,6 @@ const sensebox_mini = {
["IO1", "1"], ["IO1", "1"],
["IO2", "2"], ["IO2", "2"],
], ],
digitalPorts: [
["IO1-2", "A"],
],
digitalPinsLED: [ digitalPinsLED: [
["BUILTIN_1", "7"], ["BUILTIN_1", "7"],
["BUILTIN_2", "8"], ["BUILTIN_2", "8"],
@ -159,7 +151,8 @@ const sensebox_mini = {
], ],
digitalPinsRGB: [ digitalPinsRGB: [
["on Board", "6"], ["on Board", "6"],
["IO1-2", "1"], ["IO1", "1"],
["IO2", "2"],
], ],
digitalPinsButton: [ digitalPinsButton: [
["on Board", "0"], ["on Board", "0"],

View File

@ -15,7 +15,6 @@ const colours = {
webserver: 40, webserver: 40,
phyphox: 25, phyphox: 25,
motors: 190, motors: 190,
cleverlab: 185 ,
}; };
export const getColour = () => { export const getColour = () => {

View File

@ -13,8 +13,6 @@ const maxInstances = {
sensebox_lora_initialize_otaa: 1, sensebox_lora_initialize_otaa: 1,
sensebox_lora_initialize_abp: 1, sensebox_lora_initialize_abp: 1,
sensebox_phyphox_init: 1, sensebox_phyphox_init: 1,
sensebox_phyphox_experiment: 1,
sensebox_phyphox_experiment_send: 1,
sensebox_ethernet: 1, sensebox_ethernet: 1,
}; };

View File

@ -10,11 +10,12 @@ export const OSEM = {
senseBox_send_to_osem: "Sende Messwert an die openSenseMap", senseBox_send_to_osem: "Sende Messwert an die openSenseMap",
senseBox_osem_connection: "Verbinde mit openSenseMap:", senseBox_osem_connection: "Verbinde mit openSenseMap:",
senseBox_osem_host: "opensensemap.org", senseBox_osem_host: "opensensemap.org",
senseBox_osem_host_workshop: "workshop.opensensemap.org", senseBox_osem_host_testing: "testing.opensensemap.org",
senseBox_osem_exposure: "Typ", senseBox_osem_exposure: "Typ",
senseBox_osem_stationary: "Stationär", senseBox_osem_stationary: "Stationär",
senseBox_osem_mobile: "Mobil", senseBox_osem_mobile: "Mobil",
senseBox_osem_access_token: "API Schlüssel", senseBox_osem_access_token: "API Schlüssel",
senseBox_osem_xallowtoken: "X-ALLOW-TOKEN",
senseBox_send_mobile_to_osem: senseBox_send_mobile_to_osem:
"Sende Messwert und Standort an die openSenseMap", "Sende Messwert und Standort an die openSenseMap",
senseBox_send_mobile_to_osem_tip: senseBox_send_mobile_to_osem_tip:

View File

@ -23,12 +23,10 @@ export const UI = {
variable_DECIMAL: "Kommazahl (float)", variable_DECIMAL: "Kommazahl (float)",
variables_TEXT: "Text (string)", variables_TEXT: "Text (string)",
variables_ARRAY: "Array (array)", variables_ARRAY: "Array (array)",
variables_CHARACTER: "Buchstabe (char)", variables_CHARACTER: "char (char)",
variables_BOOLEAN: "Boolean (boolean)", variables_BOOLEAN: "Boolean (boolean)",
variables_NULL: "void (void)", variables_NULL: "void (void)",
variables_UNDEF: "undefined", variables_UNDEF: "undefined",
variables_set: "Schreibe",
variables_to: "",
/** /**
* Tooltips * Tooltips
@ -156,7 +154,6 @@ export const UI = {
button_next: "nächster Schritt", button_next: "nächster Schritt",
button_tutorial_overview: "Tutorial Übersicht", button_tutorial_overview: "Tutorial Übersicht",
button_login: "Anmelden", button_login: "Anmelden",
button_createVariable: "Typisierte Variable erstellen",
/** /**
* *
@ -320,14 +317,4 @@ export const UI = {
"Speichere meine Auswahl fürs nächste Mal (Du kannst das Board später in den Einstellungen wechseln)", "Speichere meine Auswahl fürs nächste Mal (Du kannst das Board später in den Einstellungen wechseln)",
deviceselection_footnote: "Hier kommst du zur alten Blockly Version für den ", deviceselection_footnote: "Hier kommst du zur alten Blockly Version für den ",
deviceselection_footnote_02: "oder die", deviceselection_footnote_02: "oder die",
/**
* Sensor Markdown Information
*/
sensorinfo_info: "Informationen zum Sensor",
sensorinfo_description: "Beschreibung",
sensorinfo_measurable_phenos: "Messbare Phänomene",
sensorinfo_manufacturer: "Hersteller",
sensorinfo_lifetime: "Lebensdauer",
sensorinfo_explanation: "Diese Informationen wurden aus [sensors.wiki](https://sensors.wiki) entnommen. Für weitere Informationen besuchen Sie den Abschnitt über diesen Sensor "
}; };

View File

@ -1,3 +0,0 @@
export const CLEVERLAB = {
}

View File

@ -11,11 +11,12 @@ export const OSEM = {
senseBox_send_to_osem: "Send measurement to openSenseMap", senseBox_send_to_osem: "Send measurement to openSenseMap",
senseBox_osem_connection: "Connect to openSenseMap", senseBox_osem_connection: "Connect to openSenseMap",
senseBox_osem_host: "opensensemap.org", senseBox_osem_host: "opensensemap.org",
senseBox_osem_host_workshop: "workshop.opensensemap.org", senseBox_osem_host_testing: "testing.opensensemap.org",
senseBox_osem_exposure: "Type", senseBox_osem_exposure: "Type",
senseBox_osem_stationary: "Stationary", senseBox_osem_stationary: "Stationary",
senseBox_osem_mobile: "Mobile", senseBox_osem_mobile: "Mobile",
senseBox_osem_access_token: "API Key", senseBox_osem_access_token: "API Key",
senseBox_osem_xallowtoken: "X-ALLOW-TOKEN",
senseBox_send_mobile_to_osem: "Send measurement and location to openSenseMap", senseBox_send_mobile_to_osem: "Send measurement and location to openSenseMap",
senseBox_send_mobile_to_osem_tip: "Send Value and Location to openSenseMap", senseBox_send_mobile_to_osem_tip: "Send Value and Location to openSenseMap",
senseBox_osem_restart: "Restart device if disconnected?", senseBox_osem_restart: "Restart device if disconnected?",

View File

@ -19,16 +19,14 @@ export const UI = {
toolbox_label_internalRTC: "Internal RTC", toolbox_label_internalRTC: "Internal RTC",
variable_NUMBER: "Number (int)", variable_NUMBER: "Number (int)",
variable_SHORT_NUMBER: "char", variable_SHORT_NUMBER: "char",
variable_LONG: "Big number (long)", variable_LONG: " Zahl (long)",
variable_DECIMAL: "Decimal (float)", variable_DECIMAL: "Decimal (float)",
variables_TEXT: "Text (string)", variables_TEXT: "Text (string)",
variables_ARRAY: "Array (array)", variables_ARRAY: "Array (array)",
variables_CHARACTER: "Character (char)", variables_CHARACTER: "char (char)",
variables_BOOLEAN: "Boolean (boolean)", variables_BOOLEAN: "Boolean (boolean)",
variables_NULL: "void (void)", variables_NULL: "void (void)",
variables_UNDEF: "undefined", variables_UNDEF: "undefined",
variables_set: "set",
variables_to: "to",
/** /**
* Tooltips * Tooltips
@ -151,7 +149,6 @@ export const UI = {
button_next: "Next step", button_next: "Next step",
button_tutorial_overview: "Tutorial overview", button_tutorial_overview: "Tutorial overview",
button_login: "Login", button_login: "Login",
button_createVariable: "Create Typed Variable",
/** /**
* *
@ -308,23 +305,12 @@ export const UI = {
"Your code will now be compiled and then downloaded to your computer", "Your code will now be compiled and then downloaded to your computer",
/** /**
* Device Selection * Device Selction
* */ * */
deviceselection_head: "Which board are you using?", deviceselection_head: "Which board are you using?",
deviceselection_keep_selection: deviceselection_keep_selection:
"Save my choice (You can change the board later in the settings)", "Save my choice (You can change the board later in the settings)",
deviceselection_footnote: deviceselection_footnote:
"Here you can access the old blockly Version for the", "Here you can access the old blockly Version for the",
deviceselection_footnote_02: "or the", deviceselection_footnote_02: "or the",
/**
* Sensor Markdown Information
* */
sensorinfo_info: "Informationen regarding the Sensor",
sensorinfo_description: "Description",
sensorinfo_measurable_phenos: "Measurable Phenomena",
sensorinfo_manufacturer: "Manufacturer",
sensorinfo_lifetime: "Lifetime",
sensorinfo_explanation: "This information was fetched from [sensors.wiki](https://sensors.wiki). For more information visit the section on this sensor ",
}; };

View File

@ -16,6 +16,7 @@ class Toolbox extends React.Component {
this.props.workspace, this.props.workspace,
"callbackName", "callbackName",
[ [
[`${Blockly.Msg.variable_SHORT_NUMBER}`, "char"],
[`${Blockly.Msg.variable_NUMBER}`, "int"], [`${Blockly.Msg.variable_NUMBER}`, "int"],
[`${Blockly.Msg.variable_LONG}`, "long"], [`${Blockly.Msg.variable_LONG}`, "long"],
[`${Blockly.Msg.variable_DECIMAL}`, "float"], [`${Blockly.Msg.variable_DECIMAL}`, "float"],
@ -32,7 +33,7 @@ class Toolbox extends React.Component {
// Add your button and give it a callback name. // Add your button and give it a callback name.
const button = document.createElement("button"); const button = document.createElement("button");
button.setAttribute("text", Blockly.Msg.button_createVariable); button.setAttribute("text", "Create Typed Variable");
button.setAttribute("callbackKey", "callbackName"); button.setAttribute("callbackKey", "callbackName");
xmlList.push(button); xmlList.push(button);
@ -40,7 +41,6 @@ class Toolbox extends React.Component {
// This gets all the variables that the user creates and adds them to the // This gets all the variables that the user creates and adds them to the
// flyout. // flyout.
const blockList = Blockly.VariablesDynamic.flyoutCategoryBlocks(workspace); const blockList = Blockly.VariablesDynamic.flyoutCategoryBlocks(workspace);
console.log(blockList);
xmlList = xmlList.concat(blockList); xmlList = xmlList.concat(blockList);
return xmlList; return xmlList;
} }
@ -633,11 +633,7 @@ class Toolbox extends React.Component {
colour={getColour().procedures} colour={getColour().procedures}
custom="PROCEDURE" custom="PROCEDURE"
></Category> ></Category>
<Category name="CleVerLab" colour={getColour().cleverlab}> <sep></sep>
<Block type="CleVerLab_pH" />
<Block type="CleVerLab_pump" />
<Block type="CleVerLab_cali1" />
</Category>
<Category name={Blockly.Msg.toolbox_advanced} colour={getColour().io}> <Category name={Blockly.Msg.toolbox_advanced} colour={getColour().io}>
<Category <Category
name={Blockly.Msg.toolbox_serial} name={Blockly.Msg.toolbox_serial}

View File

@ -3,9 +3,9 @@ import React, { Component } from 'react';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import clsx from 'clsx'; import clsx from 'clsx';
import withStyles from '@mui/styles/withStyles'; import { withStyles } from '@material-ui/core/styles';
import MaterialUIBreadcrumbs from '@mui/material/Breadcrumbs'; import MaterialUIBreadcrumbs from '@material-ui/core/Breadcrumbs';
import Typography from '@mui/material/Typography'; import Typography from '@material-ui/core/Typography';
import { faHome } from "@fortawesome/free-solid-svg-icons"; import { faHome } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";

View File

@ -2,16 +2,15 @@ import React from "react";
import { useState, useRef } from "react"; import { useState, useRef } from "react";
import { default as MonacoEditor } from "@monaco-editor/react"; import { default as MonacoEditor } from "@monaco-editor/react";
import { withRouter } from "react-router-dom"; import { withRouter } from "react-router-dom";
import { Button, Grid } from "@mui/material"; import { Button, Grid } from "@material-ui/core";
import Blockly from "blockly/core"; import Blockly from "blockly/core";
import Divider from "@mui/material/Divider"; import Divider from "@material-ui/core/Divider";
import { saveAs } from "file-saver"; import { saveAs } from "file-saver";
import Drawer from "@mui/material/Drawer"; import Drawer from "@material-ui/core/Drawer";
import Sidebar from "./Sidebar"; import Sidebar from "./Sidebar";
import Dialog from "../Dialog"; import Dialog from "../Dialog";
import SaveIcon from "./SaveIcon"; import SaveIcon from "./SaveIcon";
import store from "../../store"; import store from "../../store";
import DeviceSelection from "../DeviceSelection";
const CodeEditor = (props) => { const CodeEditor = (props) => {
//const [filehandle, setFileHandle] = useState(); //const [filehandle, setFileHandle] = useState();
@ -193,7 +192,6 @@ void loop() {
}} }}
/> />
</Grid> </Grid>
<DeviceSelection />
<Grid item lg={4} md={4}> <Grid item lg={4} md={4}>
<Button <Button
style={{ padding: "1rem", margin: "1rem" }} style={{ padding: "1rem", margin: "1rem" }}

View File

@ -5,19 +5,19 @@ import { workspaceName } from "../../actions/workspaceActions";
import { detectWhitespacesAndReturnReadableResult } from "../../helpers/whitespace"; import { detectWhitespacesAndReturnReadableResult } from "../../helpers/whitespace";
import withStyles from '@mui/styles/withStyles'; import { withStyles } from "@material-ui/core/styles";
import Button from "@mui/material/Button"; import Button from "@material-ui/core/Button";
import Backdrop from "@mui/material/Backdrop"; import Backdrop from "@material-ui/core/Backdrop";
import CircularProgress from "@mui/material/CircularProgress"; import CircularProgress from "@material-ui/core/CircularProgress";
import IconButton from "@mui/material/IconButton"; import IconButton from "@material-ui/core/IconButton";
import Tooltip from "@mui/material/Tooltip"; import Tooltip from "@material-ui/core/Tooltip";
import Divider from "@mui/material/Divider"; import Divider from "@material-ui/core/Divider";
import { faClipboardCheck } from "@fortawesome/free-solid-svg-icons"; import { faClipboardCheck } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import * as Blockly from "blockly/core"; import * as Blockly from "blockly/core";
import Copy from "../copy.svg"; import Copy from "../copy.svg";
import MuiDrawer from "@mui/material/Drawer"; import MuiDrawer from "@material-ui/core/Drawer";
import Dialog from "../Dialog"; import Dialog from "../Dialog";
const styles = (theme) => ({ const styles = (theme) => ({
@ -188,7 +188,7 @@ class Compile extends Component {
<IconButton <IconButton
className={`compileBlocks ${this.props.classes.iconButton}`} className={`compileBlocks ${this.props.classes.iconButton}`}
onClick={() => this.compile()} onClick={() => this.compile()}
size="large"> >
<FontAwesomeIcon icon={faClipboardCheck} size="xs" /> <FontAwesomeIcon icon={faClipboardCheck} size="xs" />
</IconButton> </IconButton>
</Tooltip> </Tooltip>
@ -201,7 +201,6 @@ class Compile extends Component {
> >
<FontAwesomeIcon <FontAwesomeIcon
icon={faClipboardCheck} icon={faClipboardCheck}
style={{ marginRight: "5px" }} style={{ marginRight: "5px" }}
/>{" "} />{" "}
Kompilieren Kompilieren
@ -302,7 +301,6 @@ class Compile extends Component {
> >
<FontAwesomeIcon <FontAwesomeIcon
icon={faClipboardCheck} icon={faClipboardCheck}
style={{ marginRight: "5px" }} style={{ marginRight: "5px" }}
/>{" "} />{" "}
Starte Übertragung Starte Übertragung

View File

@ -1,6 +1,6 @@
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faCircleNotch, faSave } from "@fortawesome/free-solid-svg-icons"; import { faCircleNotch, faSave } from "@fortawesome/free-solid-svg-icons";
import Tooltip from "@mui/material/Tooltip"; import Tooltip from "@material-ui/core/Tooltip";
import React from "react"; import React from "react";
const SaveIcon = ({ loading }) => ( const SaveIcon = ({ loading }) => (
@ -17,7 +17,6 @@ const SaveIcon = ({ loading }) => (
<FontAwesomeIcon <FontAwesomeIcon
style={{ position: "absolute" }} style={{ position: "absolute" }}
icon={faCircleNotch} icon={faCircleNotch}
spin={true} spin={true}
size="2x" size="2x"
color="grey" color="grey"
@ -31,7 +30,6 @@ const SaveIcon = ({ loading }) => (
transform: "translate(-50%,-50%)", transform: "translate(-50%,-50%)",
}} }}
icon={faSave} icon={faSave}
color={loading ? "grey" : "green"} color={loading ? "grey" : "green"}
size={loading ? "1x" : "lg"} size={loading ? "1x" : "lg"}
/> />

View File

@ -1,5 +1,5 @@
import { useState } from "react"; import { useState } from "react";
import Button from "@mui/material/Button"; import Button from "@material-ui/core/Button";
const SerialMonitor = () => { const SerialMonitor = () => {
const [serialPortContent, setSerialPortContent] = useState([]); const [serialPortContent, setSerialPortContent] = useState([]);

View File

@ -1,13 +1,13 @@
import React from "react"; import React from "react";
import Blockly from "blockly"; import Blockly from "blockly";
import { useSelector } from "react-redux"; import { useSelector } from "react-redux";
import Accordion from "@mui/material/Accordion"; import Accordion from "@material-ui/core/Accordion";
import AccordionSummary from "@mui/material/AccordionSummary"; import AccordionSummary from "@material-ui/core/AccordionSummary";
import AccordionDetails from "@mui/material/AccordionDetails"; import AccordionDetails from "@material-ui/core/AccordionDetails";
import Typography from "@mui/material/Typography"; import Typography from "@material-ui/core/Typography";
import { LibraryVersions } from "../../data/versions.js"; import { LibraryVersions } from "../../data/versions.js";
import { useMonaco } from "@monaco-editor/react"; import { useMonaco } from "@monaco-editor/react";
import { Button } from "@mui/material"; import { Button } from "@material-ui/core";
import SerialMonitor from "./SerialMonitor.js"; import SerialMonitor from "./SerialMonitor.js";
import axios from "axios"; import axios from "axios";

View File

@ -2,17 +2,15 @@ import React, { Component } from "react";
import PropTypes from "prop-types"; import PropTypes from "prop-types";
import { connect } from "react-redux"; import { connect } from "react-redux";
import withStyles from '@mui/styles/withStyles'; import withWidth from "@material-ui/core/withWidth";
import MuiAccordion from "@mui/material/Accordion"; import { withStyles } from "@material-ui/core/styles";
import MuiAccordionSummary from "@mui/material/AccordionSummary"; import MuiAccordion from "@material-ui/core/Accordion";
import MuiAccordionDetails from "@mui/material/AccordionDetails"; import MuiAccordionSummary from "@material-ui/core/AccordionSummary";
import { Card } from "@mui/material"; import MuiAccordionDetails from "@material-ui/core/AccordionDetails";
import { Card } from "@material-ui/core";
import * as Blockly from "blockly"; import * as Blockly from "blockly";
import { default as MonacoEditor } from "@monaco-editor/react"; import { default as MonacoEditor } from "@monaco-editor/react";
// FIXME checkout https://mui.com/components/use-media-query/#migrating-from-withwidth
const withWidth = () => (WrappedComponent) => (props) => <WrappedComponent {...props} width="xs" />;
const Accordion = withStyles((theme) => ({ const Accordion = withStyles((theme) => ({
root: { root: {
border: `1px solid ${theme.palette.secondary.main}`, border: `1px solid ${theme.palette.secondary.main}`,

View File

@ -3,9 +3,11 @@ import PropTypes from "prop-types";
import { connect } from "react-redux"; import { connect } from "react-redux";
import Dialog from "./Dialog"; import Dialog from "./Dialog";
import withStyles from '@mui/styles/withStyles'; import { withStyles } from "@material-ui/core/styles";
import Checkbox from "@material-ui/core/Checkbox";
import FormControlLabel from "@material-ui/core/FormControlLabel";
import * as Blockly from "blockly"; import * as Blockly from "blockly";
import { IconButton, Grid, Avatar, Typography } from "@mui/material"; import { IconButton, Grid, Avatar, Typography } from "@material-ui/core";
import { setBoard } from "../actions/boardAction"; import { setBoard } from "../actions/boardAction";
const styles = (theme) => ({ const styles = (theme) => ({
@ -25,9 +27,15 @@ const styles = (theme) => ({
class DeviceSeclection extends Component { class DeviceSeclection extends Component {
constructor(props) { constructor(props) {
var previousPageWasAnotherDomain = props.pageVisits === 0;
var userWantToKeepBoard = window.localStorage.getItem("board")
? true
: false;
super(props); super(props);
this.state = { this.state = {
open: props.selectedBoard ? false : true, open: userWantToKeepBoard
? !userWantToKeepBoard
: previousPageWasAnotherDomain,
selectedBoard : "", selectedBoard : "",
saveSettings: false, saveSettings: false,
@ -35,7 +43,12 @@ class DeviceSeclection extends Component {
} }
toggleDialog = () => { toggleDialog = () => {
this.setState({ open: !this.state });
if(this.state.saveSettings){
window.localStorage.setItem("board", this.state.selectedBoard)
}
this.props.setBoard(this.state.selectedBoard) this.props.setBoard(this.state.selectedBoard)
}; };
onChange = (e) => { onChange = (e) => {
@ -47,9 +60,8 @@ class DeviceSeclection extends Component {
}; };
onclick = (e, value) => { onclick = (e, value) => {
console.log(e, value)
this.setState({selectedBoard: value}) this.setState({selectedBoard: value})
this.props.setBoard(value)
this.setState({ open: !this.state });
}; };
render() { render() {
@ -62,12 +74,13 @@ class DeviceSeclection extends Component {
title={Blockly.Msg.deviceselection_head} title={Blockly.Msg.deviceselection_head}
content={""} content={""}
onClick={this.toggleDialog} onClick={this.toggleDialog}
button={Blockly.Msg.button_accept}
disabled={this.state.selectedBoard===""} disabled={this.state.selectedBoard===""}
> >
<div> <div>
<Grid container spacing={2} style={{ textAlign : "center" }}> <Grid container spacing={2} style={{ textAlign : "center" }}>
<Grid item xs={6}> <Grid item xs={6}>
<IconButton onClick={(e) => this.onclick(e, "mcu")} size="large"> <IconButton onClick={(e) => this.onclick(e, "mcu")}>
<Avatar <Avatar
alt="Sensebox MCU" alt="Sensebox MCU"
src="/media/hardware/senseboxmcu.png" src="/media/hardware/senseboxmcu.png"
@ -80,6 +93,7 @@ class DeviceSeclection extends Component {
</IconButton> </IconButton>
<p>senseBox MCU</p> <p>senseBox MCU</p>
</Grid> </Grid>
{/* <Grid item xs={4}> {/* <Grid item xs={4}>
<IconButton onClick={(e) => this.onclick(e, "esp")}> <IconButton onClick={(e) => this.onclick(e, "esp")}>
<Avatar <Avatar
@ -95,7 +109,7 @@ class DeviceSeclection extends Component {
<p>Sensebox ESP</p> <p>Sensebox ESP</p>
</Grid> */} </Grid> */}
<Grid item xs={6}> <Grid item xs={6}>
<IconButton onClick={(e) => this.onclick(e, "mini")} size="large"> <IconButton onClick={(e) => this.onclick(e, "mini")}>
<Avatar <Avatar
alt="Sensebox Mini" alt="Sensebox Mini"
src="/media/hardware/senseboxmcumini.png" src="/media/hardware/senseboxmcumini.png"
@ -110,6 +124,21 @@ class DeviceSeclection extends Component {
</Grid> </Grid>
</Grid> </Grid>
</div> </div>
<FormControlLabel
style={{ marginTop: "20px" }}
classes={{ label: this.props.classes.label }}
control={
<Checkbox
size={"small"}
value={true}
checked={this.state.checked}
onChange={(e) => this.onChange(e)}
name="dialog"
color="primary"
/>
}
label={Blockly.Msg.deviceselection_keep_selection}
/>
<Typography variant="body1" > <Typography variant="body1" >
{Blockly.Msg.deviceselection_footnote} <a href="https://sensebox.github.io/blockly/">Arduino UNO</a> {Blockly.Msg.deviceselection_footnote_02} <a href="https://sensebox-blockly.netlify.app/ardublockly/?board=sensebox-mcu">senseBox MCU</a> {Blockly.Msg.deviceselection_footnote} <a href="https://sensebox.github.io/blockly/">Arduino UNO</a> {Blockly.Msg.deviceselection_footnote_02} <a href="https://sensebox-blockly.netlify.app/ardublockly/?board=sensebox-mcu">senseBox MCU</a>
</Typography> </Typography>

View File

@ -1,10 +1,10 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import Button from '@mui/material/Button'; import Button from '@material-ui/core/Button';
import DialogTitle from '@mui/material/DialogTitle'; import DialogTitle from '@material-ui/core/DialogTitle';
import DialogContent from '@mui/material/DialogContent'; import DialogContent from '@material-ui/core/DialogContent';
import DialogActions from '@mui/material/DialogActions'; import DialogActions from '@material-ui/core/DialogActions';
import MaterialUIDialog from '@mui/material/Dialog'; import MaterialUIDialog from '@material-ui/core/Dialog';
class Dialog extends Component { class Dialog extends Component {

View File

@ -4,15 +4,14 @@ import Breadcrumbs from "./Breadcrumbs";
import { withRouter } from "react-router-dom"; import { withRouter } from "react-router-dom";
import Button from "@mui/material/Button"; import Button from "@material-ui/core/Button";
import Typography from "@mui/material/Typography"; import Typography from "@material-ui/core/Typography";
import * as Blockly from "blockly"; import * as Blockly from "blockly";
import ReactMarkdown from "react-markdown"; import ReactMarkdown from "react-markdown";
import rehypeRaw from "rehype-raw"; import Container from "@material-ui/core/Container";
import Container from "@mui/material/Container"; import ExpansionPanel from "@material-ui/core/ExpansionPanel";
import Accordion from "@mui/material/Accordion"; import ExpansionPanelSummary from "@material-ui/core/ExpansionPanelSummary";
import AccordionSummary from "@mui/material/AccordionSummary"; import ExpansionPanelDetails from "@material-ui/core/ExpansionPanelDetails";
import AccordionDetails from "@mui/material/AccordionDetails";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faChevronDown } from "@fortawesome/free-solid-svg-icons"; import { faChevronDown } from "@fortawesome/free-solid-svg-icons";
import { FaqQuestions } from "../data/faq"; import { FaqQuestions } from "../data/faq";
@ -47,26 +46,25 @@ class Faq extends Component {
<h1>FAQ</h1> <h1>FAQ</h1>
{FaqQuestions().map((object, i) => { {FaqQuestions().map((object, i) => {
return ( return (
<Accordion <ExpansionPanel
expanded={panel === `panel${i}`} expanded={panel === `panel${i}`}
onChange={() => this.handleChange(`panel${i}`)} onChange={() => this.handleChange(`panel${i}`)}
> >
<AccordionSummary <ExpansionPanelSummary
expandIcon={<FontAwesomeIcon icon={faChevronDown} />} expandIcon={<FontAwesomeIcon icon={faChevronDown} />}
> >
<Typography variant="h6">{object.question}</Typography> <Typography variant="h6">{object.question}</Typography>
</AccordionSummary> </ExpansionPanelSummary>
<AccordionDetails> <ExpansionPanelDetails>
<Typography> <Typography>
<ReactMarkdown <ReactMarkdown
className="news" className="news"
allowDangerousHtml="true" allowDangerousHtml="true"
children={object.answer} children={object.answer}
rehypePlugins={[rehypeRaw]}
></ReactMarkdown> ></ReactMarkdown>
</Typography> </Typography>
</AccordionDetails> </ExpansionPanelDetails>
</Accordion> </ExpansionPanel>
); );
})} })}
{this.props.button ? ( {this.props.button ? (

View File

@ -2,7 +2,7 @@ import React, { Component } from 'react';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import Typography from '@mui/material/Typography'; import Typography from '@material-ui/core/Typography';
class Footer extends Component { class Footer extends Component {
render() { render() {

View File

@ -14,10 +14,10 @@ import TrashcanButtons from "./Workspace/TrashcanButtons";
// import HintTutorialExists from "./Tutorial/HintTutorialExists"; // import HintTutorialExists from "./Tutorial/HintTutorialExists";
import DeviceSelection from "./DeviceSelection"; import DeviceSelection from "./DeviceSelection";
import Grid from "@mui/material/Grid"; import Grid from "@material-ui/core/Grid";
import IconButton from "@mui/material/IconButton"; import IconButton from "@material-ui/core/IconButton";
import Tooltip from "@mui/material/Tooltip"; import Tooltip from "@material-ui/core/Tooltip";
import withStyles from '@mui/styles/withStyles'; import { withStyles } from "@material-ui/core/styles";
import { faCode } from "@fortawesome/free-solid-svg-icons"; import { faCode } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
@ -160,7 +160,7 @@ class Home extends Component {
zIndex: 21, zIndex: 21,
}} }}
onClick={() => this.onChange()} onClick={() => this.onChange()}
size="large"> >
<FontAwesomeIcon icon={faCode} size="xs" /> <FontAwesomeIcon icon={faCode} size="xs" />
</IconButton> </IconButton>
</Tooltip> </Tooltip>

View File

@ -1,6 +1,6 @@
import React, { Component } from "react"; import React, { Component } from "react";
import { withRouter } from "react-router-dom"; import { withRouter } from "react-router-dom";
import Container from "@mui/material/Container"; import Container from "@material-ui/core/Container";
class Impressum extends Component { class Impressum extends Component {
render() { render() {
return ( return (

View File

@ -5,8 +5,8 @@ import { workspaceChange } from '../actions/workspaceActions';
import * as Blockly from 'blockly/core'; import * as Blockly from 'blockly/core';
import TextField from '@mui/material/TextField'; import TextField from '@material-ui/core/TextField';
import Button from '@mui/material/Button'; import Button from '@material-ui/core/Button';
class MaxBlocks extends Component { class MaxBlocks extends Component {
@ -28,12 +28,12 @@ class MaxBlocks extends Component {
return ( return (
<div style={{display: 'inline', marginLeft: '10px'}}> <div style={{display: 'inline', marginLeft: '10px'}}>
<TextField <TextField
variant="standard"
style={{width: '50px', marginRight: '5px'}} style={{width: '50px', marginRight: '5px'}}
name="max" name="max"
type="number" type="number"
onChange={this.onChange} onChange={this.onChange}
value={this.state.max} /> value={this.state.max}
/>
<Button style={{marginRight: '10px', color: 'white'}} variant="contained" color="primary" onClick={this.setMaxBlocks}> <Button style={{marginRight: '10px', color: 'white'}} variant="contained" color="primary" onClick={this.setMaxBlocks}>
Maximale Blöcke Maximale Blöcke
</Button> </Button>

View File

@ -8,20 +8,20 @@ import senseboxLogo from "./sensebox_logo.svg";
import { withRouter } from "react-router-dom"; import { withRouter } from "react-router-dom";
import withStyles from '@mui/styles/withStyles'; import { withStyles } from "@material-ui/core/styles";
import Drawer from "@mui/material/Drawer"; import Drawer from "@material-ui/core/Drawer";
import AppBar from "@mui/material/AppBar"; import AppBar from "@material-ui/core/AppBar";
import Toolbar from "@mui/material/Toolbar"; import Toolbar from "@material-ui/core/Toolbar";
import List from "@mui/material/List"; import List from "@material-ui/core/List";
import Typography from "@mui/material/Typography"; import Typography from "@material-ui/core/Typography";
import Divider from "@mui/material/Divider"; import Divider from "@material-ui/core/Divider";
import IconButton from "@mui/material/IconButton"; import IconButton from "@material-ui/core/IconButton";
import ListItem from "@mui/material/ListItem"; import ListItem from "@material-ui/core/ListItem";
import ListItemIcon from "@mui/material/ListItemIcon"; import ListItemIcon from "@material-ui/core/ListItemIcon";
import ListItemText from "@mui/material/ListItemText"; import ListItemText from "@material-ui/core/ListItemText";
import LinearProgress from "@mui/material/LinearProgress"; import LinearProgress from "@material-ui/core/LinearProgress";
import Tour from "reactour"; import Tour from "reactour";
import { Badge } from "@mui/material"; import { Badge } from "@material-ui/core";
import { home, assessment } from "./Tour"; import { home, assessment } from "./Tour";
import { import {
faBars, faBars,
@ -37,20 +37,10 @@ import {
faLightbulb, faLightbulb,
faCode, faCode,
faPuzzlePiece, faPuzzlePiece,
faUser,
faMicrochip,
faEarthEurope,
faEarthAmericas,
faCaretDown
} from "@fortawesome/free-solid-svg-icons"; } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import * as Blockly from "blockly"; import * as Blockly from "blockly";
import Tooltip from "@mui/material/Tooltip"; import Tooltip from "@material-ui/core/Tooltip";
import MenuItem from '@mui/material/MenuItem'
import Menu from '@mui/material/Menu'
import { setLanguage } from "../actions/generalActions";
import { setBoard } from "../actions/boardAction";
import { Button } from "@mui/material";
const styles = (theme) => ({ const styles = (theme) => ({
drawerWidth: { drawerWidth: {
@ -70,14 +60,9 @@ const styles = (theme) => ({
class Navbar extends Component { class Navbar extends Component {
constructor(props) { constructor(props) {
super(props); super(props);
this.langRef = React.createRef();
this.mcuRef = React.createRef();
this.state = { this.state = {
open: false, open: false,
isTourOpen: false, isTourOpen: false,
anchorElLang: null,
anchorElBoard: null,
anchorElUser: null
}; };
} }
@ -95,6 +80,7 @@ class Navbar extends Component {
render() { render() {
var isHome = /^\/(\/.*$|$)/g.test(this.props.location.pathname); var isHome = /^\/(\/.*$|$)/g.test(this.props.location.pathname);
var isTutorial = /^\/tutorial(\/.*$|$)/g.test(this.props.location.pathname);
var isAssessment = var isAssessment =
/^\/tutorial\/.{1,}$/g.test(this.props.location.pathname) && /^\/tutorial\/.{1,}$/g.test(this.props.location.pathname) &&
!this.props.tutorialIsLoading && !this.props.tutorialIsLoading &&
@ -130,7 +116,7 @@ class Navbar extends Component {
onClick={this.toggleDrawer} onClick={this.toggleDrawer}
style={{ margin: "0 10px" }} style={{ margin: "0 10px" }}
className="MenuButton" className="MenuButton"
size="large"> >
<FontAwesomeIcon icon={faBars} /> <FontAwesomeIcon icon={faBars} />
</IconButton> </IconButton>
<Link to={"/"} style={{ textDecoration: "none", color: "inherit" }}> <Link to={"/"} style={{ textDecoration: "none", color: "inherit" }}>
@ -141,150 +127,44 @@ class Navbar extends Component {
<Link to={"/"} style={{ marginLeft: "10px" }}> <Link to={"/"} style={{ marginLeft: "10px" }}>
<img src={senseboxLogo} alt="senseBox-Logo" width="30" /> <img src={senseboxLogo} alt="senseBox-Logo" width="30" />
</Link> </Link>
<div style={{ margin: "0 0 0 auto", display: "flex", alignItems: 'center', justifyContent: 'center' }}> {isTutorial ? (
<Link
to={"/tutorial"}
style={{
textDecoration: "none",
color: "inherit",
marginLeft: "10px",
}}
>
<Typography variant="h6" noWrap>
Tutorial
</Typography>
</Link>
) : null}
{isHome ? ( {isHome ? (
<div style={{ display: "flex" }}> <Tooltip title={Blockly.Msg.tooltip_start_tour} arrow>
<div style={{ padding: "12px" }}>
<Button
style={{ textTransform: 'none', cursor: "pointer", alignItems: "center", alignContent: "center", background: "transparent", color: "inherit", fontWeight: "bold", border: "2px solid white", borderRadius: "25px" }}
ref={this.mcuRef}
onClick={() => {
this.setState({ anchorElBoard: this.mcuRef.current })
}}
startIcon={<FontAwesomeIcon icon={faMicrochip} />}
endIcon={<FontAwesomeIcon icon={faCaretDown} />}
sx={{ display: { xs: "none", sm: "none", md: "flex" } }}
>
{this.props.selectedBoard}
</Button>
<Menu
anchorEl={this.state.anchorElBoard}
anchorOrigin={{
vertical: 'bottom',
horizontal: 'center',
}}
keepMounted
transformOrigin={{
vertical: 'top',
horizontal: 'center',
}}
open={Boolean(this.state.anchorElBoard)}
onClose={() => {
this.setState({ anchorElBoard: null });
}}
>
<MenuItem
value="mcu"
onClick={(event) => {
this.props.setBoard(event.currentTarget.getAttribute("value"));
this.setState({ anchorElBoard: null });
}}
>
mcu
</MenuItem>
<MenuItem
value="mini"
onClick={(event) => {
this.props.setBoard(event.currentTarget.getAttribute("value"));
this.setState({ anchorElBoard: null });
}}
>
mini
</MenuItem>
</Menu>
</div>
<div style={{ padding: "12px" }}>
{
this.props.language === "en_US" ?
(
<Button
style={{ textTransform: 'none', cursor: "pointer", alignItems: "center", alignContent: "center", background: "transparent", color: "inherit", fontWeight: "bold", border: "2px solid white", borderRadius: "25px" }}
ref={this.langRef}
onClick={() => {
this.setState({ anchorElLang: this.langRef.current })
}}
startIcon={<FontAwesomeIcon icon={faEarthAmericas} />}
endIcon={<FontAwesomeIcon icon={faCaretDown} />}
sx={{ display: { xs: "none", sm: "none", md: "flex" } }}
>
English
</Button>
) : (
<Button
style={{ textTransform: 'none', cursor: "pointer", alignItems: "center", alignContent: "center", background: "transparent", color: "inherit", fontWeight: "bold", border: "2px solid white", borderRadius: "25px" }}
ref={this.langRef}
onClick={() => {
this.setState({ anchorElLang: this.langRef.current })
}}
startIcon={<FontAwesomeIcon icon={faEarthEurope} />}
endIcon={<FontAwesomeIcon icon={faCaretDown} />}
sx={{ display: { xs: "none", sm: "none", md: "flex" } }}
>
Deutsch
</Button>
)
}
<Menu
anchorEl={this.state.anchorElLang}
anchorOrigin={{
vertical: 'bottom',
horizontal: 'center',
}}
keepMounted
transformOrigin={{
vertical: 'top',
horizontal: 'center',
}}
open={Boolean(this.state.anchorElLang)}
onClose={() => {
this.setState({ anchorElLang: null });
}}
>
<MenuItem
value="de_DE"
onClick={(event) => {
this.props.setLanguage(event.currentTarget.getAttribute("value"));
this.setState({ anchorElLang: null });
}}
>
Deutsch
</MenuItem>
<MenuItem
value="en_US"
onClick={(event) => {
this.props.setLanguage(event.currentTarget.getAttribute("value"));
this.setState({ anchorElLang: null });
}}
>
English
</MenuItem>
</Menu>
</div>
</div>
) : (null)}
{isHome ? (
<Tooltip title={'Start Tour'} arrow>
<IconButton <IconButton
color="inherit" color="inherit"
className={`openTour ${this.props.classes.button}`} className={`openTour ${this.props.classes.button}`}
onClick={() => { onClick={() => {
this.openTour(); this.openTour();
}} }}
size="large"> style={{ margin: "0 30px 0 auto" }}
>
<FontAwesomeIcon icon={faQuestionCircle} /> <FontAwesomeIcon icon={faQuestionCircle} />
</IconButton> </IconButton>
</Tooltip> </Tooltip>
) : null} ) : null}
{isAssessment ? ( {isAssessment ? (
<Tooltip title={'Start tour'} arrow> <Tooltip title={Blockly.Msg.tooltip_start_tour} arrow>
<IconButton <IconButton
color="inherit" color="inherit"
className={`openTour ${this.props.classes.button}`} className={`openTour ${this.props.classes.button}`}
onClick={() => { onClick={() => {
this.openTour(); this.openTour();
}} }}
size="large"> style={{ margin: "0 30px 0 auto" }}
>
<FontAwesomeIcon icon={faQuestionCircle} /> <FontAwesomeIcon icon={faQuestionCircle} />
</IconButton> </IconButton>
</Tooltip> </Tooltip>
@ -296,71 +176,6 @@ class Navbar extends Component {
this.closeTour(); this.closeTour();
}} }}
/> />
{this.props.user ? (
<div>
<IconButton
color="inherit"
onClick={(event) => { this.setState({ anchorElUser: event.target }) }}
style={{ margin: "0 30px 0 0" }}
size="large"
>
<FontAwesomeIcon icon={faUser} />
</IconButton>
<Menu
anchorEl={this.state.anchorElUser}
anchorOrigin={{
vertical: 'bottom',
horizontal: 'center',
}}
keepMounted
transformOrigin={{
vertical: 'top',
horizontal: 'center',
}}
open={Boolean(this.state.anchorElUser)}
onClose={() => { this.setState({ anchorElUser: null }); }}
>
<div className="" style={{ paddingLeft: "16px", paddingRight: "16px", paddingTop: "16px" }}>
<p style={{ fontWeight: "bold", margin: "0px" }}>
{this.props.user.name}
</p>
<p style={{ marginTop: "0px", color: "#696969" }}>
{this.props.user.email}
</p>
</div>
<hr style={{ borderTop: "3px solid #bbb", marginLeft: "5px", marginRight: "5px" }} />
<MenuItem>
<Link to={"/user"} style={{ textDecoration: 'none', color: "black" }}>
{Blockly.Msg.navbar_account}
</Link>
</MenuItem>
<MenuItem>
<Link to={"/settings"} style={{ textDecoration: 'none', color: "black" }}>
{Blockly.Msg.navbar_settings}
</Link>
</MenuItem>
<MenuItem
onClick={() => {
this.props.logout()
}}
>
{Blockly.Msg.navbar_logout}
</MenuItem>
</Menu>
</div>
)
:
(<Link to={"/user/login"} style={{ textDecoration: 'none', color: "white" }}>
<IconButton
color="inherit"
style={{ margin: "0 30px 0 auto" }}
>
<FontAwesomeIcon icon={faUser} />
</IconButton>
</Link>
)
}
</div>
</Toolbar> </Toolbar>
</AppBar> </AppBar>
<Drawer <Drawer
@ -452,7 +267,7 @@ class Navbar extends Component {
<FontAwesomeIcon icon={item.icon} /> <FontAwesomeIcon icon={item.icon} />
</ListItemIcon> </ListItemIcon>
{item.text === "Code Editor" ? ( {item.text === "Code Editor" ? (
<Badge badgeContent={"Experimental"} color="primary" overlap="rectangular"> <Badge badgeContent={"Experimental"} color="primary">
<ListItemText primary={item.text} /> <ListItemText primary={item.text} />
</Badge> </Badge>
) : ( ) : (
@ -554,10 +369,6 @@ Navbar.propTypes = {
user: PropTypes.object, user: PropTypes.object,
tutorial: PropTypes.object, tutorial: PropTypes.object,
activeStep: PropTypes.number.isRequired, activeStep: PropTypes.number.isRequired,
setLanguage: PropTypes.func.isRequired,
language: PropTypes.string.isRequired,
setBoard: PropTypes.func.isRequired,
selectedBoard: PropTypes.string.isRequired
}; };
const mapStateToProps = (state) => ({ const mapStateToProps = (state) => ({
@ -567,10 +378,8 @@ const mapStateToProps = (state) => ({
user: state.auth.user, user: state.auth.user,
tutorial: state.tutorial.tutorials[0], tutorial: state.tutorial.tutorials[0],
activeStep: state.tutorial.activeStep, activeStep: state.tutorial.activeStep,
language: state.general.language,
selectedBoard: state.board.board
}); });
export default connect(mapStateToProps, { logout, setLanguage, setBoard })( export default connect(mapStateToProps, { logout })(
withStyles(styles, { withTheme: true })(withRouter(Navbar)) withStyles(styles, { withTheme: true })(withRouter(Navbar))
); );

View File

@ -4,11 +4,11 @@ import Breadcrumbs from './Breadcrumbs';
import { withRouter } from 'react-router-dom'; import { withRouter } from 'react-router-dom';
import Button from '@mui/material/Button'; import Button from '@material-ui/core/Button';
import Typography from '@mui/material/Typography'; import Typography from '@material-ui/core/Typography';
import * as Blockly from 'blockly' import * as Blockly from 'blockly'
import ReactMarkdown from 'react-markdown'; import ReactMarkdown from 'react-markdown';
import Container from '@mui/material/Container'; import Container from '@material-ui/core/Container';
const news = ` const news = `

View File

@ -4,8 +4,8 @@ import Breadcrumbs from './Breadcrumbs';
import { withRouter } from 'react-router-dom'; import { withRouter } from 'react-router-dom';
import Button from '@mui/material/Button'; import Button from '@material-ui/core/Button';
import Typography from '@mui/material/Typography'; import Typography from '@material-ui/core/Typography';
import * as Blockly from 'blockly' import * as Blockly from 'blockly'
class NotFound extends Component { class NotFound extends Component {

View File

@ -1,6 +1,6 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import { withRouter } from 'react-router-dom'; import { withRouter } from 'react-router-dom';
import Container from '@mui/material/Container'; import Container from '@material-ui/core/Container';
class Privay extends Component { class Privay extends Component {
render() { render() {
return ( return (

View File

@ -10,8 +10,8 @@ import { withRouter } from 'react-router-dom';
import Home from '../Home'; import Home from '../Home';
import Breadcrumbs from '../Breadcrumbs'; import Breadcrumbs from '../Breadcrumbs';
import Backdrop from '@mui/material/Backdrop'; import Backdrop from '@material-ui/core/Backdrop';
import CircularProgress from '@mui/material/CircularProgress'; import CircularProgress from '@material-ui/core/CircularProgress';
class Project extends Component { class Project extends Component {

View File

@ -11,14 +11,13 @@ import BlocklyWindow from "../Blockly/BlocklyWindow";
import Snackbar from "../Snackbar"; import Snackbar from "../Snackbar";
import WorkspaceFunc from "../Workspace/WorkspaceFunc"; import WorkspaceFunc from "../Workspace/WorkspaceFunc";
import withStyles from '@mui/styles/withStyles'; import { withStyles } from "@material-ui/core/styles";
import Grid from "@mui/material/Grid"; import Grid from "@material-ui/core/Grid";
import Paper from "@mui/material/Paper"; import Paper from "@material-ui/core/Paper";
import Divider from "@mui/material/Divider"; import Divider from "@material-ui/core/Divider";
import Typography from "@mui/material/Typography"; import Typography from "@material-ui/core/Typography";
import Backdrop from "@mui/material/Backdrop"; import Backdrop from "@material-ui/core/Backdrop";
import CircularProgress from "@mui/material/CircularProgress"; import CircularProgress from "@material-ui/core/CircularProgress";
import DeviceSelection from "../DeviceSelection";
const styles = (theme) => ({ const styles = (theme) => ({
link: { link: {
@ -61,7 +60,8 @@ class ProjectHome extends Component {
this.setState({ this.setState({
snackbar: true, snackbar: true,
key: Date.now(), key: Date.now(),
message: `Dein angefragtes ${type === "gallery" ? "Galerie-" : "" message: `Dein angefragtes ${
type === "gallery" ? "Galerie-" : ""
}Projekt konnte nicht gefunden werden.`, }Projekt konnte nicht gefunden werden.`,
type: "error", type: "error",
}); });
@ -108,7 +108,6 @@ class ProjectHome extends Component {
/> />
<h1>{data}</h1> <h1>{data}</h1>
<DeviceSelection />
{this.props.progress ? ( {this.props.progress ? (
<Backdrop open invisible> <Backdrop open invisible>
<CircularProgress color="primary" /> <CircularProgress color="primary" />
@ -128,7 +127,8 @@ class ProjectHome extends Component {
}} }}
> >
<Link <Link
to={`/${data === "Projekte" ? "project" : "gallery" to={`/${
data === "Projekte" ? "project" : "gallery"
}/${project._id}`} }/${project._id}`}
style={{ textDecoration: "none", color: "inherit" }} style={{ textDecoration: "none", color: "inherit" }}
> >

View File

@ -1,77 +0,0 @@
import React from "react";
import Box from "@mui/material/Box";
import Tab from "@mui/material/Tab";
import TabContext from "@mui/lab/TabContext";
import TabList from "@mui/lab/TabList";
import TabPanel from "@mui/lab/TabPanel";
import store from "../store";
import ReactMarkdown from "react-markdown";
import * as Blockly from "blockly";
export default function LabTabs() {
const [value, setValue] = React.useState('1');
const handleChange = (event, newValue) => {
setValue(newValue);
};
// get the description in the current language if no lang is give return english or the first one
function filterLanguage(options) {
var lang;
if (window.localStorage.getItem("locale")) {
lang = window.localStorage.getItem("locale").split("_")[0];
}
else {
lang = "en";
}
for (var i = 0; i < options.length; i++) {
if (options[i].languageCode === lang) {
return options[i].text;
}
}
return options[0].text;
}
var currentStore = store.getState();
// ALL SENSOR DATA FROM WIKI
var sensorData = currentStore.sensorwiki;
// NAME OF SELECTED BLOCK
var sensorName = currentStore.workspace.code.data.name;
// SEARCH ALL DATA FOR SELECTED BLOCK NAME
var sensorInfo = sensorData.find(function (element) {
return element.slug === sensorName;
});
if (sensorInfo) {
sensorInfo.markdown = "Coming soon...";
// GET DESCRIPTION OF SELECTED BLOCK
sensorInfo.details = `# ${sensorName.toUpperCase()}
${Blockly.Msg.sensorinfo_explanation} [${sensorName.toUpperCase()}](https://sensors.wiki/sensor/detail/${sensorName})
## ${Blockly.Msg.sensorinfo_description}
${filterLanguage(sensorInfo.description.item)}
## ${Blockly.Msg.sensorinfo_measurable_phenos}
## ${Blockly.Msg.sensorinfo_manufacturer}
${sensorInfo.manufacturer}
## ${Blockly.Msg.sensorinfo_lifetime}
${sensorInfo.lifePeriod}`
}
return (
<Box sx={{ width: '100%', typography: 'body1' }}>
<TabContext value={value}>
<Box sx={{ borderBottom: 1, borderColor: 'divider' }}>
<TabList onChange={handleChange}>
<Tab label="Basic Information" value="1" />
<Tab label="Details" value="2" />
</TabList>
</Box>
<TabPanel value="1">
{sensorInfo ? <ReactMarkdown>{sensorInfo.markdown}</ReactMarkdown> : "No data available"}
</TabPanel>
<TabPanel value="2">
{sensorInfo ? <ReactMarkdown>{sensorInfo.details}</ReactMarkdown> : "No data available"}
</TabPanel>
</TabContext>
</Box>
);
}

View File

@ -5,12 +5,12 @@ import { setBoard } from '../../actions/boardAction';
import * as Blockly from 'blockly/core'; import * as Blockly from 'blockly/core';
import InputLabel from '@mui/material/InputLabel'; import InputLabel from '@material-ui/core/InputLabel';
import MenuItem from '@mui/material/MenuItem'; import MenuItem from '@material-ui/core/MenuItem';
import FormControl from '@mui/material/FormControl'; import FormControl from '@material-ui/core/FormControl';
import Select from '@mui/material/Select'; import Select from '@material-ui/core/Select';
import Typography from '@mui/material/Typography'; import Typography from '@material-ui/core/Typography';
import FormHelperText from '@mui/material/FormHelperText'; import FormHelperText from '@material-ui/core/FormHelperText';
class DeviceSelector extends Component { class DeviceSelector extends Component {
@ -26,14 +26,14 @@ class DeviceSelector extends Component {
<div> <div>
<Typography style={{fontWeight: 'bold'}}>{Blockly.Msg.settings_board}</Typography> <Typography style={{fontWeight: 'bold'}}>{Blockly.Msg.settings_board}</Typography>
<FormHelperText style={{color: 'black', lineHeight: 1.3, marginBottom: '8px'}}>{Blockly.Msg.settings_board_text}</FormHelperText> <FormHelperText style={{color: 'black', lineHeight: 1.3, marginBottom: '8px'}}>{Blockly.Msg.settings_board_text}</FormHelperText>
<FormControl variant="standard"> <FormControl>
<InputLabel id="demo-simple-select-label">{Blockly.Msg.settings_board}</InputLabel> <InputLabel id="demo-simple-select-label">{Blockly.Msg.settings_board}</InputLabel>
<Select <Select
variant="standard"
labelId="demo-simple-select-label" labelId="demo-simple-select-label"
id="demo-simple-select" id="demo-simple-select"
value={this.props.selectedBoard} value={this.props.selectedBoard}
onChange={(e) => this.props.setBoard(e.target.value)}> onChange={(e) => this.props.setBoard(e.target.value)}
>
<MenuItem value="mcu">senseBox MCU</MenuItem> <MenuItem value="mcu">senseBox MCU</MenuItem>
<MenuItem value="mini">senseBox MCU mini</MenuItem> <MenuItem value="mini">senseBox MCU mini</MenuItem>
</Select> </Select>

View File

@ -5,12 +5,12 @@ import { setLanguage } from '../../actions/generalActions';
import * as Blockly from 'blockly/core'; import * as Blockly from 'blockly/core';
import InputLabel from '@mui/material/InputLabel'; import InputLabel from '@material-ui/core/InputLabel';
import MenuItem from '@mui/material/MenuItem'; import MenuItem from '@material-ui/core/MenuItem';
import FormControl from '@mui/material/FormControl'; import FormControl from '@material-ui/core/FormControl';
import Select from '@mui/material/Select'; import Select from '@material-ui/core/Select';
import Typography from '@mui/material/Typography'; import Typography from '@material-ui/core/Typography';
import FormHelperText from '@mui/material/FormHelperText'; import FormHelperText from '@material-ui/core/FormHelperText';
class LanguageSelector extends Component { class LanguageSelector extends Component {
@ -29,14 +29,14 @@ class LanguageSelector extends Component {
<div> <div>
<Typography style={{fontWeight: 'bold'}}>{Blockly.Msg.settings_language}</Typography> <Typography style={{fontWeight: 'bold'}}>{Blockly.Msg.settings_language}</Typography>
<FormHelperText style={{color: 'black', lineHeight: 1.3, marginBottom: '8px'}}>{Blockly.Msg.settings_language_text}</FormHelperText> <FormHelperText style={{color: 'black', lineHeight: 1.3, marginBottom: '8px'}}>{Blockly.Msg.settings_language_text}</FormHelperText>
<FormControl variant="standard"> <FormControl>
<InputLabel id="demo-simple-select-label">{Blockly.Msg.settings_language}</InputLabel> <InputLabel id="demo-simple-select-label">{Blockly.Msg.settings_language}</InputLabel>
<Select <Select
variant="standard"
labelId="demo-simple-select-label" labelId="demo-simple-select-label"
id="demo-simple-select" id="demo-simple-select"
value={this.props.language} value={this.props.language}
onChange={this.handleChange}> onChange={this.handleChange}
>
<MenuItem value={'de_DE'}>{Blockly.Msg.settings_language_de}</MenuItem> <MenuItem value={'de_DE'}>{Blockly.Msg.settings_language_de}</MenuItem>
<MenuItem value={'en_US'}>{Blockly.Msg.settings_language_en}</MenuItem> <MenuItem value={'en_US'}>{Blockly.Msg.settings_language_en}</MenuItem>
</Select> </Select>

View File

@ -5,12 +5,12 @@ import { setPlatform } from "../../actions/generalActions";
import * as Blockly from "blockly/core"; import * as Blockly from "blockly/core";
import InputLabel from "@mui/material/InputLabel"; import InputLabel from "@material-ui/core/InputLabel";
import MenuItem from "@mui/material/MenuItem"; import MenuItem from "@material-ui/core/MenuItem";
import FormControl from "@mui/material/FormControl"; import FormControl from "@material-ui/core/FormControl";
import Select from "@mui/material/Select"; import Select from "@material-ui/core/Select";
import Typography from "@mui/material/Typography"; import Typography from "@material-ui/core/Typography";
import FormHelperText from "@mui/material/FormHelperText"; import FormHelperText from "@material-ui/core/FormHelperText";
class OtaSelector extends Component { class OtaSelector extends Component {
componentDidMount() { componentDidMount() {
@ -33,16 +33,16 @@ class OtaSelector extends Component {
https://sensebox.de/app https://sensebox.de/app
</a> </a>
</FormHelperText> </FormHelperText>
<FormControl variant="standard"> <FormControl>
<InputLabel id="demo-simple-select-label"> <InputLabel id="demo-simple-select-label">
{Blockly.Msg.settings_statistics} {Blockly.Msg.settings_statistics}
</InputLabel> </InputLabel>
<Select <Select
variant="standard"
labelId="demo-simple-select-label" labelId="demo-simple-select-label"
id="demo-simple-select" id="demo-simple-select"
value={this.props.platform} value={this.props.platform}
onChange={(e) => this.props.setPlatform(e.target.value)}> onChange={(e) => this.props.setPlatform(e.target.value)}
>
<MenuItem value={true}>{Blockly.Msg.settings_ota_on}</MenuItem> <MenuItem value={true}>{Blockly.Msg.settings_ota_on}</MenuItem>
<MenuItem value={false}>{Blockly.Msg.settings_ota_off}</MenuItem> <MenuItem value={false}>{Blockly.Msg.settings_ota_off}</MenuItem>
</Select> </Select>

View File

@ -5,12 +5,12 @@ import { setRenderer } from '../../actions/generalActions';
import * as Blockly from 'blockly/core' import * as Blockly from 'blockly/core'
import InputLabel from '@mui/material/InputLabel'; import InputLabel from '@material-ui/core/InputLabel';
import MenuItem from '@mui/material/MenuItem'; import MenuItem from '@material-ui/core/MenuItem';
import FormControl from '@mui/material/FormControl'; import FormControl from '@material-ui/core/FormControl';
import Select from '@mui/material/Select'; import Select from '@material-ui/core/Select';
import Typography from '@mui/material/Typography'; import Typography from '@material-ui/core/Typography';
import FormHelperText from '@mui/material/FormHelperText'; import FormHelperText from '@material-ui/core/FormHelperText';
class RenderSelector extends Component { class RenderSelector extends Component {
@ -26,14 +26,14 @@ class RenderSelector extends Component {
<div> <div>
<Typography style={{fontWeight: 'bold'}}>{Blockly.Msg.settings_renderer}</Typography> <Typography style={{fontWeight: 'bold'}}>{Blockly.Msg.settings_renderer}</Typography>
<FormHelperText style={{color: 'black', lineHeight: 1.3, marginBottom: '8px'}}>{Blockly.Msg.settings_renderer_text}</FormHelperText> <FormHelperText style={{color: 'black', lineHeight: 1.3, marginBottom: '8px'}}>{Blockly.Msg.settings_renderer_text}</FormHelperText>
<FormControl variant="standard"> <FormControl>
<InputLabel id="demo-simple-select-label">{Blockly.Msg.settings_renderer}</InputLabel> <InputLabel id="demo-simple-select-label">{Blockly.Msg.settings_renderer}</InputLabel>
<Select <Select
variant="standard"
labelId="demo-simple-select-label" labelId="demo-simple-select-label"
id="demo-simple-select" id="demo-simple-select"
value={this.props.renderer} value={this.props.renderer}
onChange={(e) => this.props.setRenderer(e.target.value)}> onChange={(e) => this.props.setRenderer(e.target.value)}
>
<MenuItem value={'geras'}>Geras</MenuItem> <MenuItem value={'geras'}>Geras</MenuItem>
<MenuItem value={'zelos'}>Zelos</MenuItem> <MenuItem value={'zelos'}>Zelos</MenuItem>
</Select> </Select>

View File

@ -14,8 +14,8 @@ import OtaSelector from "./OtaSelector";
import SoundsSelector from "./SoundsSelector"; import SoundsSelector from "./SoundsSelector";
import DeviceSelector from "./DeviceSelector"; import DeviceSelector from "./DeviceSelector";
import Button from "@mui/material/Button"; import Button from "@material-ui/core/Button";
import Paper from "@mui/material/Paper"; import Paper from "@material-ui/core/Paper";
class Settings extends Component { class Settings extends Component {
componentDidMount() { componentDidMount() {

View File

@ -5,12 +5,12 @@ import { setSounds } from "../../actions/generalActions";
import * as Blockly from "blockly/core"; import * as Blockly from "blockly/core";
import InputLabel from "@mui/material/InputLabel"; import InputLabel from "@material-ui/core/InputLabel";
import MenuItem from "@mui/material/MenuItem"; import MenuItem from "@material-ui/core/MenuItem";
import FormControl from "@mui/material/FormControl"; import FormControl from "@material-ui/core/FormControl";
import Select from "@mui/material/Select"; import Select from "@material-ui/core/Select";
import Typography from "@mui/material/Typography"; import Typography from "@material-ui/core/Typography";
import FormHelperText from "@mui/material/FormHelperText"; import FormHelperText from "@material-ui/core/FormHelperText";
class SoundsSelector extends Component { class SoundsSelector extends Component {
componentDidMount() { componentDidMount() {
@ -30,16 +30,16 @@ class SoundsSelector extends Component {
> >
{Blockly.Msg.settings_sounds_text} {Blockly.Msg.settings_sounds_text}
</FormHelperText> </FormHelperText>
<FormControl variant="standard"> <FormControl>
<InputLabel id="demo-simple-select-label"> <InputLabel id="demo-simple-select-label">
{Blockly.Msg.settings_sounds} {Blockly.Msg.settings_sounds}
</InputLabel> </InputLabel>
<Select <Select
variant="standard"
labelId="demo-simple-select-label" labelId="demo-simple-select-label"
id="demo-simple-select" id="demo-simple-select"
value={this.props.sounds} value={this.props.sounds}
onChange={(e) => this.props.setSounds(e.target.value)}> onChange={(e) => this.props.setSounds(e.target.value)}
>
<MenuItem value={false}>{Blockly.Msg.settings_ota_off}</MenuItem> <MenuItem value={false}>{Blockly.Msg.settings_ota_off}</MenuItem>
<MenuItem value={true}>{Blockly.Msg.settings_ota_on}</MenuItem> <MenuItem value={true}>{Blockly.Msg.settings_ota_on}</MenuItem>
</Select> </Select>

View File

@ -5,12 +5,12 @@ import { setStatistics } from '../../actions/generalActions';
import * as Blockly from 'blockly/core' import * as Blockly from 'blockly/core'
import InputLabel from '@mui/material/InputLabel'; import InputLabel from '@material-ui/core/InputLabel';
import MenuItem from '@mui/material/MenuItem'; import MenuItem from '@material-ui/core/MenuItem';
import FormControl from '@mui/material/FormControl'; import FormControl from '@material-ui/core/FormControl';
import Select from '@mui/material/Select'; import Select from '@material-ui/core/Select';
import Typography from '@mui/material/Typography'; import Typography from '@material-ui/core/Typography';
import FormHelperText from '@mui/material/FormHelperText'; import FormHelperText from '@material-ui/core/FormHelperText';
class StatsSelector extends Component { class StatsSelector extends Component {
@ -25,14 +25,14 @@ class StatsSelector extends Component {
<div> <div>
<Typography style={{fontWeight: 'bold'}}>{Blockly.Msg.settings_statistics}</Typography> <Typography style={{fontWeight: 'bold'}}>{Blockly.Msg.settings_statistics}</Typography>
<FormHelperText style={{color: 'black', lineHeight: 1.3, marginBottom: '8px'}}>{Blockly.Msg.settings_statistics_text}</FormHelperText> <FormHelperText style={{color: 'black', lineHeight: 1.3, marginBottom: '8px'}}>{Blockly.Msg.settings_statistics_text}</FormHelperText>
<FormControl variant="standard"> <FormControl>
<InputLabel id="demo-simple-select-label">{Blockly.Msg.settings_statistics}</InputLabel> <InputLabel id="demo-simple-select-label">{Blockly.Msg.settings_statistics}</InputLabel>
<Select <Select
variant="standard"
labelId="demo-simple-select-label" labelId="demo-simple-select-label"
id="demo-simple-select" id="demo-simple-select"
value={this.props.statistics} value={this.props.statistics}
onChange={(e) => this.props.setStatistics(e.target.value)}> onChange={(e) => this.props.setStatistics(e.target.value)}
>
<MenuItem value={true}>{Blockly.Msg.settings_statistics_on}</MenuItem> <MenuItem value={true}>{Blockly.Msg.settings_statistics_on}</MenuItem>
<MenuItem value={false}>{Blockly.Msg.settings_statistics_off}</MenuItem> <MenuItem value={false}>{Blockly.Msg.settings_statistics_off}</MenuItem>
</Select> </Select>

View File

@ -1,9 +1,9 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import withStyles from '@mui/styles/withStyles'; import { withStyles } from '@material-ui/core/styles';
import IconButton from '@mui/material/IconButton'; import IconButton from '@material-ui/core/IconButton';
import MaterialUISnackbar from '@mui/material/Snackbar'; import MaterialUISnackbar from '@material-ui/core/Snackbar';
import SnackbarContent from '@mui/material/SnackbarContent'; import SnackbarContent from '@material-ui/core/SnackbarContent';
import { faTimes } from "@fortawesome/free-solid-svg-icons"; import { faTimes } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
@ -69,7 +69,7 @@ class Snackbar extends Component {
style={{flexWrap: 'nowrap'}} style={{flexWrap: 'nowrap'}}
className={this.props.type === 'error' ? this.props.classes.error : this.props.classes.success} className={this.props.type === 'error' ? this.props.classes.error : this.props.classes.success}
action={ action={
<IconButton onClick={this.onClose} style={{color: 'inherit'}} size="large"> <IconButton onClick={this.onClose} style={{color: 'inherit'}}>
<FontAwesomeIcon icon={faTimes} size="xs"/> <FontAwesomeIcon icon={faTimes} size="xs"/>
</IconButton> </IconButton>
} }

View File

@ -1,43 +1,17 @@
import React, { Component } from "react"; import React, { Component } from "react";
import PropTypes from "prop-types"; import PropTypes from "prop-types";
import { connect } from "react-redux"; import { connect } from "react-redux";
import { Button, Card } from "@mui/material";
import withWidth from "@material-ui/core/withWidth";
import { Card } from "@material-ui/core";
import * as Blockly from "blockly"; import * as Blockly from "blockly";
import CardContent from "@mui/material/CardContent"; import CardContent from "@material-ui/core/CardContent";
import Typography from "@mui/material/Typography";
import Typography from "@material-ui/core/Typography";
import ReactMarkdown from "react-markdown"; import ReactMarkdown from "react-markdown";
import Dialog from "@mui/material/Dialog";
import DialogActions from "@mui/material/DialogActions";
import DialogContent from "@mui/material/DialogContent";
import Slide from "@mui/material/Slide";
import SensorInfo from "./SensorInfo";
import store from "../store";
// FIXME checkout https://mui.com/components/use-media-query/#migrating-from-withwidth
const withWidth = () => (WrappedComponent) => (props) => <WrappedComponent {...props} width="xs" />;
const Transition = React.forwardRef(function Transition(props, ref) {
return <Slide direction="up" ref={ref} {...props} />;
});
class TooltipViewer extends Component { class TooltipViewer extends Component {
constructor(props) {
super(props);
this.inputRef = React.createRef();
this.state = {
open: false,
};
}
toggleDialog = () => {
this.setState({ open: !this.state });
};
openDialog = () => {
this.setState({ open: true });
};
render() { render() {
return ( return (
<Card <Card
@ -55,46 +29,14 @@ class TooltipViewer extends Component {
{Blockly.Msg.tooltip_viewer} {Blockly.Msg.tooltip_viewer}
</Typography> </Typography>
<Typography variant="body2" component="span">
<ReactMarkdown linkTarget="_blank"> <ReactMarkdown linkTarget="_blank">
{this.props.tooltip} {this.props.tooltip}
</ReactMarkdown> </ReactMarkdown>
{store.getState().workspace.code.data ? (
<Button {this.props.helpurl !== "" ? (
label="Mehr"
variant="contained"
color="primary"
onClick={() => {
this.openDialog();
}}
>
Sensor Informationen
</Button>
) : (
<ReactMarkdown>{`${Blockly.Msg.tooltip_moreInformation} [${Blockly.Msg.labels_here}](${this.props.helpurl})`}</ReactMarkdown> <ReactMarkdown>{`${Blockly.Msg.tooltip_moreInformation} [${Blockly.Msg.labels_here}](${this.props.helpurl})`}</ReactMarkdown>
)} ) : null}
</Typography>
</CardContent> </CardContent>
{store.getState().workspace.code.data ? (<Dialog
open={this.state.open}
TransitionComponent={Transition}
keepMounted
aria-describedby="alert-dialog-slide-description"
onClose={() => {
this.toggleDialog();
}}
maxWidth={"md"}
fullWidth={true}
>
<DialogContent>
<SensorInfo></SensorInfo>
</DialogContent>
<DialogActions>
<Button onClick={() => {
this.toggleDialog();
}}>Close</Button>
</DialogActions>
</Dialog>) : (null)}
</Card> </Card>
); );
} }

View File

@ -6,26 +6,22 @@ import { workspaceName } from "../../actions/workspaceActions";
import BlocklyWindow from "../Blockly/BlocklyWindow"; import BlocklyWindow from "../Blockly/BlocklyWindow";
import WorkspaceFunc from "../Workspace/WorkspaceFunc"; import WorkspaceFunc from "../Workspace/WorkspaceFunc";
import Grid from "@mui/material/Grid"; import withWidth, { isWidthDown } from "@material-ui/core/withWidth";
import Card from "@mui/material/Card"; import Grid from "@material-ui/core/Grid";
import Typography from "@mui/material/Typography"; import Card from "@material-ui/core/Card";
import Typography from "@material-ui/core/Typography";
import * as Blockly from "blockly"; import * as Blockly from "blockly";
import { initialXml } from "../Blockly/initialXml"; import { initialXml } from "../Blockly/initialXml";
import IconButton from "@mui/material/IconButton"; import IconButton from "@material-ui/core/IconButton";
import CodeViewer from "../CodeViewer"; import CodeViewer from "../CodeViewer";
import TooltipViewer from "../TooltipViewer"; import TooltipViewer from "../TooltipViewer";
import Tooltip from "@mui/material/Tooltip"; import Tooltip from "@material-ui/core/Tooltip";
import ReactMarkdown from "react-markdown"; import ReactMarkdown from "react-markdown";
import { faCode } from "@fortawesome/free-solid-svg-icons"; import { faCode } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import withStyles from '@mui/styles/withStyles'; import { withStyles } from "@material-ui/core/styles";
import remarkGfm from "remark-gfm"; import remarkGfm from "remark-gfm";
import remarkGemoji from "remark-gemoji"; import remarkGemoji from "remark-gemoji";
import { isWidthDown } from "../../helpers/handleBreakpoints";
// FIXME checkout https://mui.com/components/use-media-query/#migrating-from-withwidth
const withWidth = () => (WrappedComponent) => (props) => <WrappedComponent {...props} width="xs" />;
const styles = (theme) => ({ const styles = (theme) => ({
codeOn: { codeOn: {
@ -102,7 +98,8 @@ class Assessment extends Component {
} }
> >
<IconButton <IconButton
className={`showCode ${this.state.codeOn className={`showCode ${
this.state.codeOn
? this.props.classes.codeOn ? this.props.classes.codeOn
: this.props.classes.codeOff : this.props.classes.codeOff
}`} }`}
@ -115,7 +112,7 @@ class Assessment extends Component {
zIndex: 21, zIndex: 21,
}} }}
onClick={() => this.onChange()} onClick={() => this.onChange()}
size="large"> >
<FontAwesomeIcon icon={faCode} size="xs" /> <FontAwesomeIcon icon={faCode} size="xs" />
</IconButton> </IconButton>
</Tooltip> </Tooltip>

View File

@ -15,13 +15,13 @@ import * as Blockly from "blockly/core";
import { initialXml } from "../../Blockly//initialXml.js"; import { initialXml } from "../../Blockly//initialXml.js";
import BlocklyWindow from "../../Blockly/BlocklyWindow"; import BlocklyWindow from "../../Blockly/BlocklyWindow";
import withStyles from '@mui/styles/withStyles'; import { withStyles } from "@material-ui/core/styles";
import Switch from "@mui/material/Switch"; import Switch from "@material-ui/core/Switch";
import FormControlLabel from "@mui/material/FormControlLabel"; import FormControlLabel from "@material-ui/core/FormControlLabel";
import FormHelperText from "@mui/material/FormHelperText"; import FormHelperText from "@material-ui/core/FormHelperText";
import FormLabel from "@mui/material/FormLabel"; import FormLabel from "@material-ui/core/FormLabel";
import Button from "@mui/material/Button"; import Button from "@material-ui/core/Button";
import Grid from "@mui/material/Grid"; import Grid from "@material-ui/core/Grid";
const styles = (theme) => ({ const styles = (theme) => ({
errorColor: { errorColor: {
@ -139,6 +139,7 @@ class BlocklyExample extends Component {
<Switch <Switch
checked={this.state.checked} checked={this.state.checked}
onChange={(e) => this.onChange(e.target.checked)} onChange={(e) => this.onChange(e.target.checked)}
color="primary"
/> />
} }
/> />

View File

@ -33,19 +33,19 @@ import Snackbar from "../../Snackbar";
import Public from "./Public"; import Public from "./Public";
import Review from "./Review"; import Review from "./Review";
import withStyles from '@mui/styles/withStyles'; import { withStyles } from "@material-ui/core/styles";
import Button from "@mui/material/Button"; import Button from "@material-ui/core/Button";
import Backdrop from "@mui/material/Backdrop"; import Backdrop from "@material-ui/core/Backdrop";
import CircularProgress from "@mui/material/CircularProgress"; import CircularProgress from "@material-ui/core/CircularProgress";
import Divider from "@mui/material/Divider"; import Divider from "@material-ui/core/Divider";
import FormHelperText from "@mui/material/FormHelperText"; import FormHelperText from "@material-ui/core/FormHelperText";
import Radio from "@mui/material/Radio"; import Radio from "@material-ui/core/Radio";
import RadioGroup from "@mui/material/RadioGroup"; import RadioGroup from "@material-ui/core/RadioGroup";
import FormControlLabel from "@mui/material/FormControlLabel"; import FormControlLabel from "@material-ui/core/FormControlLabel";
import InputLabel from "@mui/material/InputLabel"; import InputLabel from "@material-ui/core/InputLabel";
import MenuItem from "@mui/material/MenuItem"; import MenuItem from "@material-ui/core/MenuItem";
import FormControl from "@mui/material/FormControl"; import FormControl from "@material-ui/core/FormControl";
import Select from "@mui/material/Select"; import Select from "@material-ui/core/Select";
import * as Blockly from "blockly"; import * as Blockly from "blockly";
const styles = (theme) => ({ const styles = (theme) => ({
@ -407,7 +407,7 @@ class Builder extends Component {
<FormControlLabel <FormControlLabel
style={{ color: "black" }} style={{ color: "black" }}
value="new" value="new"
control={<Radio />} control={<Radio color="primary" />}
label={Blockly.Msg.builder_createNew} label={Blockly.Msg.builder_createNew}
labelPlacement="end" labelPlacement="end"
/> />
@ -417,7 +417,7 @@ class Builder extends Component {
style={{ color: "black" }} style={{ color: "black" }}
disabled={this.props.index === 0} disabled={this.props.index === 0}
value="change" value="change"
control={<Radio />} control={<Radio color="primary" />}
label={Blockly.Msg.builder_changeExisting} label={Blockly.Msg.builder_changeExisting}
labelPlacement="end" labelPlacement="end"
/> />
@ -425,7 +425,7 @@ class Builder extends Component {
style={{ color: "black" }} style={{ color: "black" }}
disabled={this.props.index === 0} disabled={this.props.index === 0}
value="delete" value="delete"
control={<Radio />} control={<Radio color="primary" />}
label={Blockly.Msg.builder_deleteExisting} label={Blockly.Msg.builder_deleteExisting}
labelPlacement="end" labelPlacement="end"
/> />
@ -470,12 +470,12 @@ class Builder extends Component {
<FormControl variant="outlined" style={{ width: "100%" }}> <FormControl variant="outlined" style={{ width: "100%" }}>
<InputLabel id="select-outlined-label">Tutorial</InputLabel> <InputLabel id="select-outlined-label">Tutorial</InputLabel>
<Select <Select
variant="standard"
color="primary" color="primary"
labelId="select-outlined-label" labelId="select-outlined-label"
value={this.props.id} value={this.props.id}
onChange={(e) => this.onChangeId(e.target.value)} onChange={(e) => this.onChangeId(e.target.value)}
label="Tutorial"> label="Tutorial"
>
{filteredTutorials.map((tutorial) => ( {filteredTutorials.map((tutorial) => (
<MenuItem value={tutorial._id}> <MenuItem value={tutorial._id}>
{tutorial.title}{" "} {tutorial.title}{" "}

View File

@ -9,13 +9,13 @@ import {
deleteError, deleteError,
} from "../../../actions/tutorialBuilderActions"; } from "../../../actions/tutorialBuilderActions";
import withStyles from '@mui/styles/withStyles'; import { withStyles } from "@material-ui/core/styles";
import ReactStars from "react-rating-stars-component"; import ReactStars from "react-rating-stars-component";
import * as Blockly from "blockly"; import * as Blockly from "blockly";
import FormGroup from "@mui/material/FormGroup"; import FormGroup from "@material-ui/core/FormGroup";
import FormControlLabel from "@mui/material/FormControlLabel"; import FormControlLabel from "@material-ui/core/FormControlLabel";
import FormControl from "@mui/material/FormControl"; import FormControl from "@material-ui/core/FormControl";
import FormLabel from "@mui/material/FormLabel"; import FormLabel from "@material-ui/core/FormLabel";
const styles = (theme) => ({ const styles = (theme) => ({
multiline: { multiline: {
@ -55,7 +55,7 @@ class Difficulty extends Component {
render() { render() {
return ( return (
<FormControl variant="standard" component="fieldset"> <FormControl component="fieldset">
<FormLabel component="legend"> <FormLabel component="legend">
{Blockly.Msg.builder_difficulty} {Blockly.Msg.builder_difficulty}
</FormLabel> </FormLabel>

View File

@ -9,17 +9,14 @@ import {
import hardware from "../../../data/hardware.json"; import hardware from "../../../data/hardware.json";
import withStyles from '@mui/styles/withStyles'; import { withStyles } from "@material-ui/core/styles";
import ImageList from "@mui/material/ImageList"; import withWidth, { isWidthDown } from "@material-ui/core/withWidth";
import ImageListItem from "@mui/material/ImageListItem"; import ImageList from "@material-ui/core/ImageList";
import ImageListItemBar from "@mui/material/ImageListItemBar"; import ImageListItem from "@material-ui/core/ImageListItem";
import FormHelperText from "@mui/material/FormHelperText"; import ImageListItemBar from "@material-ui/core/ImageListItemBar";
import FormLabel from "@mui/material/FormLabel"; import FormHelperText from "@material-ui/core/FormHelperText";
import FormLabel from "@material-ui/core/FormLabel";
import * as Blockly from "blockly"; import * as Blockly from "blockly";
import { isWidthDown } from "../../../helpers/handleBreakpoints";
// FIXME checkout https://mui.com/components/use-media-query/#migrating-from-withwidth
const withWidth = () => (WrappedComponent) => (props) => <WrappedComponent {...props} width="xs" />;
const styles = (theme) => ({ const styles = (theme) => ({
multiImageListItem: { multiImageListItem: {

View File

@ -3,12 +3,12 @@ import PropTypes from 'prop-types';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { tutorialId, setError, deleteError } from '../../../actions/tutorialBuilderActions'; import { tutorialId, setError, deleteError } from '../../../actions/tutorialBuilderActions';
import withStyles from '@mui/styles/withStyles'; import { withStyles } from '@material-ui/core/styles';
import Button from '@mui/material/Button'; import Button from '@material-ui/core/Button';
import OutlinedInput from '@mui/material/OutlinedInput'; import OutlinedInput from '@material-ui/core/OutlinedInput';
import InputLabel from '@mui/material/InputLabel'; import InputLabel from '@material-ui/core/InputLabel';
import FormControl from '@mui/material/FormControl'; import FormControl from '@material-ui/core/FormControl';
import FormHelperText from '@mui/material/FormHelperText'; import FormHelperText from '@material-ui/core/FormHelperText';
import { faPlus, faMinus } from "@fortawesome/free-solid-svg-icons"; import { faPlus, faMinus } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";

View File

@ -8,7 +8,7 @@ import {
deleteError, deleteError,
} from "../../../actions/tutorialBuilderActions"; } from "../../../actions/tutorialBuilderActions";
import FormControl from "@mui/material/FormControl"; import FormControl from "@material-ui/core/FormControl";
import MarkdownIt from "markdown-it"; import MarkdownIt from "markdown-it";
import Editor from "react-markdown-editor-lite"; import Editor from "react-markdown-editor-lite";
import "react-markdown-editor-lite/lib/index.css"; import "react-markdown-editor-lite/lib/index.css";

View File

@ -5,13 +5,13 @@ import { changeContent, deleteProperty, setError, deleteError } from '../../../a
import Textfield from './Textfield'; import Textfield from './Textfield';
import withStyles from '@mui/styles/withStyles'; import { withStyles } from '@material-ui/core/styles';
import Switch from '@mui/material/Switch'; import Switch from '@material-ui/core/Switch';
import FormControlLabel from '@mui/material/FormControlLabel'; import FormControlLabel from '@material-ui/core/FormControlLabel';
import FormHelperText from '@mui/material/FormHelperText'; import FormHelperText from '@material-ui/core/FormHelperText';
import Radio from '@mui/material/Radio'; import Radio from '@material-ui/core/Radio';
import RadioGroup from '@mui/material/RadioGroup'; import RadioGroup from '@material-ui/core/RadioGroup';
import Button from '@mui/material/Button'; import Button from '@material-ui/core/Button';
const styles = (theme) => ({ const styles = (theme) => ({
errorColor: { errorColor: {
@ -97,6 +97,7 @@ class Media extends Component {
<Switch <Switch
checked={this.state.checked} checked={this.state.checked}
onChange={(e) => this.onChangeSwitch(e.target.checked)} onChange={(e) => this.onChangeSwitch(e.target.checked)}
color="primary"
/> />
} }
/> />
@ -105,13 +106,13 @@ class Media extends Component {
<RadioGroup row value={this.state.radioValue} onChange={(e) => {this.onChangeRadio(e.target.value);}}> <RadioGroup row value={this.state.radioValue} onChange={(e) => {this.onChangeRadio(e.target.value);}}>
<FormControlLabel style={{color: 'black'}} <FormControlLabel style={{color: 'black'}}
value="picture" value="picture"
control={<Radio />} control={<Radio color="primary" />}
label="Bild" label="Bild"
labelPlacement="end" labelPlacement="end"
/> />
<FormControlLabel style={{color: 'black'}} <FormControlLabel style={{color: 'black'}}
value="youtube" value="youtube"
control={<Radio />} control={<Radio color="primary" />}
label="Youtube-Video" label="Youtube-Video"
labelPlacement="end" labelPlacement="end"
/> />

View File

@ -9,14 +9,14 @@ import {
deleteError, deleteError,
} from "../../../actions/tutorialBuilderActions"; } from "../../../actions/tutorialBuilderActions";
import withStyles from '@mui/styles/withStyles'; import { withStyles } from "@material-ui/core/styles";
import * as Blockly from "blockly"; import * as Blockly from "blockly";
import Checkbox from "@mui/material/Checkbox"; import Checkbox from "@material-ui/core/Checkbox";
import FormGroup from "@mui/material/FormGroup"; import FormGroup from "@material-ui/core/FormGroup";
import FormControlLabel from "@mui/material/FormControlLabel"; import FormControlLabel from "@material-ui/core/FormControlLabel";
import FormControl from "@mui/material/FormControl"; import FormControl from "@material-ui/core/FormControl";
import FormLabel from "@mui/material/FormLabel"; import FormLabel from "@material-ui/core/FormLabel";
const styles = (theme) => ({ const styles = (theme) => ({
multiline: { multiline: {
@ -52,7 +52,7 @@ class Public extends Component {
render() { render() {
return ( return (
<FormControl variant="standard" component="fieldset"> <FormControl component="fieldset">
<FormLabel component="legend"> <FormLabel component="legend">
{Blockly.Msg.builder_public_head} {Blockly.Msg.builder_public_head}
</FormLabel> </FormLabel>
@ -63,6 +63,7 @@ class Public extends Component {
<Checkbox <Checkbox
checked={this.props.value} checked={this.props.value}
onChange={this.handleChange} onChange={this.handleChange}
color="primary"
name="checkedA" name="checkedA"
inputProps={{ "aria-label": "secondary checkbox" }} inputProps={{ "aria-label": "secondary checkbox" }}
/> />

View File

@ -3,12 +3,12 @@ import PropTypes from 'prop-types';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { changeContent } from '../../../actions/tutorialBuilderActions'; import { changeContent } from '../../../actions/tutorialBuilderActions';
import FormGroup from '@mui/material/FormGroup'; import FormGroup from '@material-ui/core/FormGroup';
import Checkbox from '@mui/material/Checkbox'; import Checkbox from '@material-ui/core/Checkbox';
import FormControlLabel from '@mui/material/FormControlLabel'; import FormControlLabel from '@material-ui/core/FormControlLabel';
import FormLabel from '@mui/material/FormLabel'; import FormLabel from '@material-ui/core/FormLabel';
import FormHelperText from '@mui/material/FormHelperText'; import FormHelperText from '@material-ui/core/FormHelperText';
import FormControl from '@mui/material/FormControl'; import FormControl from '@material-ui/core/FormControl';
import * as Blockly from 'blockly' import * as Blockly from 'blockly'
class Requirements extends Component { class Requirements extends Component {
@ -26,13 +26,11 @@ class Requirements extends Component {
render() { render() {
return ( return (
<FormControl <FormControl style={{ marginBottom: '10px', padding: '18.5px 14px', borderRadius: '25px', border: '1px solid lightgrey', width: 'calc(100% - 28px)' }}>
variant="standard"
style={{ marginBottom: '10px', padding: '18.5px 14px', borderRadius: '25px', border: '1px solid lightgrey', width: 'calc(100% - 28px)' }}>
<FormLabel style={{ color: 'black' }}>{Blockly.Msg.builder_requirements_head}</FormLabel> <FormLabel style={{ color: 'black' }}>{Blockly.Msg.builder_requirements_head}</FormLabel>
<FormHelperText style={{ marginTop: '5px' }}>{Blockly.Msg.builder_requirements_order}</FormHelperText> <FormHelperText style={{ marginTop: '5px' }}>{Blockly.Msg.builder_requirements_order}</FormHelperText>
<FormGroup> <FormGroup>
{this.props.tutorials.filter(tutorial => tutorial._id !== this.props.id && tutorial.public).map((tutorial, i) => {this.props.tutorials.filter(tutorial => tutorial._id !== this.props.id).map((tutorial, i) =>
<FormControlLabel <FormControlLabel
key={i} key={i}
control={ control={
@ -41,6 +39,7 @@ class Requirements extends Component {
checked={this.props.value.filter(id => id === tutorial._id).length > 0} checked={this.props.value.filter(id => id === tutorial._id).length > 0}
onChange={(e) => this.onChange(e)} onChange={(e) => this.onChange(e)}
name="requirements" name="requirements"
color="primary"
/> />
} }
label={tutorial.title} label={tutorial.title}

View File

@ -9,14 +9,14 @@ import {
deleteError, deleteError,
} from "../../../actions/tutorialBuilderActions"; } from "../../../actions/tutorialBuilderActions";
import withStyles from '@mui/styles/withStyles'; import { withStyles } from "@material-ui/core/styles";
import * as Blockly from "blockly"; import * as Blockly from "blockly";
import Checkbox from "@mui/material/Checkbox"; import Checkbox from "@material-ui/core/Checkbox";
import FormGroup from "@mui/material/FormGroup"; import FormGroup from "@material-ui/core/FormGroup";
import FormControlLabel from "@mui/material/FormControlLabel"; import FormControlLabel from "@material-ui/core/FormControlLabel";
import FormControl from "@mui/material/FormControl"; import FormControl from "@material-ui/core/FormControl";
import FormLabel from "@mui/material/FormLabel"; import FormLabel from "@material-ui/core/FormLabel";
const styles = (theme) => ({ const styles = (theme) => ({
multiline: { multiline: {
@ -52,7 +52,7 @@ class Review extends Component {
render() { render() {
return ( return (
<FormControl variant="standard" component="fieldset"> <FormControl component="fieldset">
<FormLabel component="legend"> <FormLabel component="legend">
{Blockly.Msg.builder_review_head} {Blockly.Msg.builder_review_head}
</FormLabel> </FormLabel>
@ -64,6 +64,7 @@ class Review extends Component {
<Checkbox <Checkbox
checked={this.props.value} checked={this.props.value}
onChange={this.handleChange} onChange={this.handleChange}
color="primary"
name="checkedA" name="checkedA"
inputProps={{ "aria-label": "secondary checkbox" }} inputProps={{ "aria-label": "secondary checkbox" }}
/> />

View File

@ -15,10 +15,10 @@ import BlocklyExample from "./BlocklyExample";
import Requirements from "./Requirements"; import Requirements from "./Requirements";
import Hardware from "./Hardware"; import Hardware from "./Hardware";
import withStyles from '@mui/styles/withStyles'; import { withStyles } from "@material-ui/core/styles";
import Typography from "@mui/material/Typography"; import Typography from "@material-ui/core/Typography";
import IconButton from "@mui/material/IconButton"; import IconButton from "@material-ui/core/IconButton";
import Tooltip from "@mui/material/Tooltip"; import Tooltip from "@material-ui/core/Tooltip";
import { import {
faPlus, faPlus,
@ -85,7 +85,7 @@ class Step extends Component {
className={this.props.classes.button} className={this.props.classes.button}
style={index === 0 ? {} : { marginBottom: "5px" }} style={index === 0 ? {} : { marginBottom: "5px" }}
onClick={() => this.props.addStep(index + 1)} onClick={() => this.props.addStep(index + 1)}
size="large"> >
<FontAwesomeIcon icon={faPlus} size="xs" /> <FontAwesomeIcon icon={faPlus} size="xs" />
</IconButton> </IconButton>
</Tooltip> </Tooltip>
@ -100,7 +100,7 @@ class Step extends Component {
className={this.props.classes.button} className={this.props.classes.button}
style={{ marginBottom: "5px" }} style={{ marginBottom: "5px" }}
onClick={() => this.props.changeStepIndex(index, index - 1)} onClick={() => this.props.changeStepIndex(index, index - 1)}
size="large"> >
<FontAwesomeIcon icon={faAngleDoubleUp} size="xs" /> <FontAwesomeIcon icon={faAngleDoubleUp} size="xs" />
</IconButton> </IconButton>
</Tooltip> </Tooltip>
@ -113,7 +113,7 @@ class Step extends Component {
className={this.props.classes.button} className={this.props.classes.button}
style={{ marginBottom: "5px" }} style={{ marginBottom: "5px" }}
onClick={() => this.props.changeStepIndex(index, index + 1)} onClick={() => this.props.changeStepIndex(index, index + 1)}
size="large"> >
<FontAwesomeIcon icon={faAngleDoubleDown} size="xs" /> <FontAwesomeIcon icon={faAngleDoubleDown} size="xs" />
</IconButton> </IconButton>
</Tooltip> </Tooltip>
@ -125,7 +125,7 @@ class Step extends Component {
this.props.classes.delete this.props.classes.delete
)} )}
onClick={() => this.props.removeStep(index)} onClick={() => this.props.removeStep(index)}
size="large"> >
<FontAwesomeIcon icon={faTrash} size="xs" /> <FontAwesomeIcon icon={faTrash} size="xs" />
</IconButton> </IconButton>
</Tooltip> </Tooltip>

View File

@ -3,9 +3,9 @@ import PropTypes from 'prop-types';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { changeContent, deleteProperty, deleteError } from '../../../actions/tutorialBuilderActions'; import { changeContent, deleteProperty, deleteError } from '../../../actions/tutorialBuilderActions';
import Radio from '@mui/material/Radio'; import Radio from '@material-ui/core/Radio';
import RadioGroup from '@mui/material/RadioGroup'; import RadioGroup from '@material-ui/core/RadioGroup';
import FormControlLabel from '@mui/material/FormControlLabel'; import FormControlLabel from '@material-ui/core/FormControlLabel';
class StepType extends Component { class StepType extends Component {
@ -23,14 +23,14 @@ class StepType extends Component {
<RadioGroup row value={this.props.value === 'task' ? 'task' : 'instruction'} onChange={(e) => this.onChange(e.target.value)}> <RadioGroup row value={this.props.value === 'task' ? 'task' : 'instruction'} onChange={(e) => this.onChange(e.target.value)}>
<FormControlLabel style={{color: 'black'}} <FormControlLabel style={{color: 'black'}}
value="instruction" value="instruction"
control={<Radio />} control={<Radio color="primary" />}
label="Anleitung" label="Anleitung"
labelPlacement="end" labelPlacement="end"
/> />
<FormControlLabel style={{color: 'black'}} <FormControlLabel style={{color: 'black'}}
disabled={this.props.index === 0} disabled={this.props.index === 0}
value="task" value="task"
control={<Radio />} control={<Radio color="primary" />}
label="Aufgabe" label="Aufgabe"
labelPlacement="end" labelPlacement="end"
/> />

View File

@ -9,11 +9,11 @@ import {
deleteError, deleteError,
} from "../../../actions/tutorialBuilderActions"; } from "../../../actions/tutorialBuilderActions";
import withStyles from '@mui/styles/withStyles'; import { withStyles } from "@material-ui/core/styles";
import OutlinedInput from "@mui/material/OutlinedInput"; import OutlinedInput from "@material-ui/core/OutlinedInput";
import InputLabel from "@mui/material/InputLabel"; import InputLabel from "@material-ui/core/InputLabel";
import FormControl from "@mui/material/FormControl"; import FormControl from "@material-ui/core/FormControl";
import FormHelperText from "@mui/material/FormHelperText"; import FormHelperText from "@material-ui/core/FormHelperText";
const styles = (theme) => ({ const styles = (theme) => ({
multiline: { multiline: {

View File

@ -4,22 +4,18 @@ import Dialog from "../Dialog";
import hardware from "../../data/hardware.json"; import hardware from "../../data/hardware.json";
import withStyles from '@mui/styles/withStyles'; import { withStyles } from "@material-ui/core/styles";
import Link from "@mui/material/Link"; import withWidth, { isWidthDown } from "@material-ui/core/withWidth";
import Typography from "@mui/material/Typography"; import Link from "@material-ui/core/Link";
import IconButton from "@mui/material/IconButton"; import Typography from "@material-ui/core/Typography";
import ImageList from "@mui/material/ImageList"; import IconButton from "@material-ui/core/IconButton";
import ImageListItem from "@mui/material/ImageListItem"; import ImageList from "@material-ui/core/ImageList";
import ImageListItemBar from "@mui/material/ImageListItemBar"; import ImageListItem from "@material-ui/core/ImageListItem";
import ImageListItemBar from "@material-ui/core/ImageListItemBar";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faExpandAlt } from "@fortawesome/free-solid-svg-icons"; import { faExpandAlt } from "@fortawesome/free-solid-svg-icons";
import * as Blockly from "blockly"; import * as Blockly from "blockly";
import { isWidthDown } from "../../helpers/handleBreakpoints";
// FIXME checkout https://mui.com/components/use-media-query/#migrating-from-withwidth
const withWidth = () => (WrappedComponent) => (props) => <WrappedComponent {...props} width="xs" />;
const styles = (theme) => ({ const styles = (theme) => ({
expand: { expand: {
"&:hover": { "&:hover": {
@ -55,9 +51,9 @@ class Hardware extends Component {
}; };
render() { render() {
var cols = isWidthDown("md", window.innerWidth) var cols = isWidthDown("md", this.props.width)
? isWidthDown("sm", window.innerWidth) ? isWidthDown("sm", this.props.width)
? isWidthDown("xs", window.innerWidth) ? isWidthDown("xs", this.props.width)
? 2 ? 2
: 3 : 3
: 4 : 4
@ -97,7 +93,7 @@ class Hardware extends Component {
className={this.props.classes.expand} className={this.props.classes.expand}
aria-label="Vollbild" aria-label="Vollbild"
onClick={() => this.handleClickOpen(hardwareInfo)} onClick={() => this.handleClickOpen(hardwareInfo)}
size="large"> >
<FontAwesomeIcon icon={faExpandAlt} size="xs" /> <FontAwesomeIcon icon={faExpandAlt} size="xs" />
</IconButton> </IconButton>
} }
@ -128,7 +124,7 @@ class Hardware extends Component {
target="_blank" target="_blank"
href={this.state.hardwareInfo.url} href={this.state.hardwareInfo.url}
color="primary" color="primary"
underline="hover"> >
{Blockly.Msg.tutorials_hardware_here} {Blockly.Msg.tutorials_hardware_here}
</Link> </Link>
. .

View File

@ -3,9 +3,9 @@ import PropTypes from "prop-types";
import { connect } from "react-redux"; import { connect } from "react-redux";
import Dialog from "../Dialog"; import Dialog from "../Dialog";
import withStyles from '@mui/styles/withStyles'; import { withStyles } from "@material-ui/core/styles";
import Checkbox from "@mui/material/Checkbox"; import Checkbox from "@material-ui/core/Checkbox";
import FormControlLabel from "@mui/material/FormControlLabel"; import FormControlLabel from "@material-ui/core/FormControlLabel";
import * as Blockly from "blockly"; import * as Blockly from "blockly";
import ReactMarkdown from "react-markdown"; import ReactMarkdown from "react-markdown";
@ -78,6 +78,7 @@ class HintTutorialExists extends Component {
checked={this.state.checked} checked={this.state.checked}
onChange={(e) => this.onChange(e)} onChange={(e) => this.onChange(e)}
name="dialog" name="dialog"
color="primary"
/> />
} }
label={Blockly.Msg.labels_donotshowagain} label={Blockly.Msg.labels_donotshowagain}

View File

@ -4,8 +4,8 @@ import Hardware from "./Hardware";
import Requirement from "./Requirement"; import Requirement from "./Requirement";
import BlocklyWindow from "../Blockly/BlocklyWindow"; import BlocklyWindow from "../Blockly/BlocklyWindow";
import Grid from "@mui/material/Grid"; import Grid from "@material-ui/core/Grid";
import Typography from "@mui/material/Typography"; import Typography from "@material-ui/core/Typography";
import ReactMarkdown from "react-markdown"; import ReactMarkdown from "react-markdown";
import remarkGfm from "remark-gfm"; import remarkGfm from "remark-gfm";
import remarkGemoji from "remark-gemoji"; import remarkGemoji from "remark-gemoji";

View File

@ -4,11 +4,11 @@ import { connect } from "react-redux";
import clsx from "clsx"; import clsx from "clsx";
import { withRouter, Link } from "react-router-dom"; import { withRouter, Link } from "react-router-dom";
import { alpha } from "@mui/material/styles"; import { alpha } from "@material-ui/core/styles";
import withStyles from '@mui/styles/withStyles'; import { withStyles } from "@material-ui/core/styles";
import Typography from "@mui/material/Typography"; import Typography from "@material-ui/core/Typography";
import List from "@mui/material/List"; import List from "@material-ui/core/List";
import Tooltip from "@mui/material/Tooltip"; import Tooltip from "@material-ui/core/Tooltip";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faCheck, faTimes } from "@fortawesome/free-solid-svg-icons"; import { faCheck, faTimes } from "@fortawesome/free-solid-svg-icons";
@ -166,7 +166,6 @@ class Requirement extends Component {
icon={ icon={
tutorialStatus === "Success" ? faCheck : faTimes tutorialStatus === "Success" ? faCheck : faTimes
} }
/> />
) : ( ) : (
<Typography <Typography

View File

@ -10,10 +10,10 @@ import Dialog from "../Dialog";
import { checkXml } from "../../helpers/compareXml"; import { checkXml } from "../../helpers/compareXml";
import withStyles from '@mui/styles/withStyles'; import { withStyles } from "@material-ui/core/styles";
import IconButton from "@mui/material/IconButton"; import IconButton from "@material-ui/core/IconButton";
import Tooltip from "@mui/material/Tooltip"; import Tooltip from "@material-ui/core/Tooltip";
import Button from "@mui/material/Button"; import Button from "@material-ui/core/Button";
import { faClipboardCheck } from "@fortawesome/free-solid-svg-icons"; import { faClipboardCheck } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
@ -62,7 +62,7 @@ class SolutionCheck extends Component {
className={`solutionCheck ${this.props.classes.compile}`} className={`solutionCheck ${this.props.classes.compile}`}
style={{ width: "40px", height: "40px", marginRight: "5px" }} style={{ width: "40px", height: "40px", marginRight: "5px" }}
onClick={() => this.check()} onClick={() => this.check()}
size="large"> >
<FontAwesomeIcon icon={faClipboardCheck} size="xs" /> <FontAwesomeIcon icon={faClipboardCheck} size="xs" />
</IconButton> </IconButton>
</Tooltip> </Tooltip>

View File

@ -7,12 +7,12 @@ import { withRouter } from "react-router-dom";
import clsx from "clsx"; import clsx from "clsx";
// import tutorials from '../../data/tutorials'; // import tutorials from '../../data/tutorials';
import { alpha } from "@mui/material/styles"; import { alpha } from "@material-ui/core/styles";
import withStyles from '@mui/styles/withStyles'; import { withStyles } from "@material-ui/core/styles";
import Typography from "@mui/material/Typography"; import Typography from "@material-ui/core/Typography";
import Tooltip from "@mui/material/Tooltip"; import Tooltip from "@material-ui/core/Tooltip";
import Button from "@mui/material/Button"; import Button from "@material-ui/core/Button";
import { faCheck, faTimes } from "@fortawesome/free-solid-svg-icons"; import { faCheck, faTimes } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
@ -127,7 +127,6 @@ class StepperHorizontal extends Component {
<FontAwesomeIcon <FontAwesomeIcon
className={this.props.classes.icon} className={this.props.classes.icon}
icon={tutorialStatus === "Success" ? faCheck : faTimes} icon={tutorialStatus === "Success" ? faCheck : faTimes}
/> />
</div> </div>
) : null} ) : null}

View File

@ -6,12 +6,12 @@ import { tutorialStep } from "../../actions/tutorialActions";
import { withRouter } from "react-router-dom"; import { withRouter } from "react-router-dom";
import clsx from "clsx"; import clsx from "clsx";
import { alpha } from "@mui/material/styles"; import { alpha } from "@material-ui/core/styles";
import withStyles from '@mui/styles/withStyles'; import { withStyles } from "@material-ui/core/styles";
import Stepper from "@mui/material/Stepper"; import Stepper from "@material-ui/core/Stepper";
import Step from "@mui/material/Step"; import Step from "@material-ui/core/Step";
import StepLabel from "@mui/material/StepLabel"; import StepLabel from "@material-ui/core/StepLabel";
import Tooltip from "@mui/material/Tooltip"; import Tooltip from "@material-ui/core/Tooltip";
const styles = (theme) => ({ const styles = (theme) => ({
verticalStepper: { verticalStepper: {
@ -23,12 +23,13 @@ const styles = (theme) => ({
// borderWidth: '2px', // borderWidth: '2px',
borderRadius: "50%", borderRadius: "50%",
borderColor: theme.palette.secondary.main, borderColor: theme.palette.secondary.main,
width: "1rem", width: "12px",
height: "12px",
margin: "0 auto", margin: "0 auto",
}, },
stepIconLarge: { stepIconLarge: {
width: "2rem", width: "24px",
height: "1rem", height: "24px",
}, },
stepIconLargeSuccess: { stepIconLargeSuccess: {
borderColor: theme.palette.primary.main, borderColor: theme.palette.primary.main,

View File

@ -21,8 +21,8 @@ import NotFound from "../NotFound";
import * as Blockly from "blockly"; import * as Blockly from "blockly";
import { detectWhitespacesAndReturnReadableResult } from "../../helpers/whitespace"; import { detectWhitespacesAndReturnReadableResult } from "../../helpers/whitespace";
import Card from "@mui/material/Card"; import Card from "@material-ui/core/Card";
import Button from "@mui/material/Button"; import Button from "@material-ui/core/Button";
class Tutorial extends Component { class Tutorial extends Component {
componentDidMount() { componentDidMount() {

View File

@ -17,11 +17,11 @@ import clsx from "clsx";
import Breadcrumbs from "../Breadcrumbs"; import Breadcrumbs from "../Breadcrumbs";
import { Link } from "react-router-dom"; import { Link } from "react-router-dom";
import { alpha } from "@mui/material/styles"; import { alpha } from "@material-ui/core/styles";
import withStyles from '@mui/styles/withStyles'; import { withStyles } from "@material-ui/core/styles";
import Grid from "@mui/material/Grid"; import Grid from "@material-ui/core/Grid";
import Paper from "@mui/material/Paper"; import Paper from "@material-ui/core/Paper";
import Typography from "@mui/material/Typography"; import Typography from "@material-ui/core/Typography";
import { import {
faCheck, faCheck,
@ -33,11 +33,10 @@ import {
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import * as Blockly from "blockly"; import * as Blockly from "blockly";
import ReactStars from "react-rating-stars-component"; import ReactStars from "react-rating-stars-component";
import Tooltip from "@mui/material/Tooltip"; import Tooltip from "@material-ui/core/Tooltip";
import IconButton from "@mui/material/IconButton"; import IconButton from "@material-ui/core/IconButton";
import Snackbar from "../Snackbar"; import Snackbar from "../Snackbar";
import Divider from "@mui/material/Divider"; import Divider from "@material-ui/core/Divider";
import DeviceSelection from "../DeviceSelection";
const styles = (theme) => ({ const styles = (theme) => ({
outerDiv: { outerDiv: {
@ -244,10 +243,13 @@ class TutorialHome extends Component {
cy="50%" cy="50%"
fill="none" fill="none"
stroke-width="10" stroke-width="10"
stroke-dashoffset={`${75 * 2 * Math.PI * (1 - (50 / 100 + success / 2)) stroke-dashoffset={`${
75 * 2 * Math.PI * (1 - (50 / 100 + success / 2))
}`} }`}
stroke-dasharray={`${75 * 2 * Math.PI * (1 - (50 / 100 - success / 2)) stroke-dasharray={`${
} ${75 * 2 * Math.PI * (1 - (50 / 100 + success / 2)) 75 * 2 * Math.PI * (1 - (50 / 100 - success / 2))
} ${
75 * 2 * Math.PI * (1 - (50 / 100 + success / 2))
}`} }`}
></circle> ></circle>
)} )}
@ -263,7 +265,8 @@ class TutorialHome extends Component {
cy="50%" cy="50%"
fill="none" fill="none"
stroke-width="10" stroke-width="10"
stroke-dashoffset={`${75 * 2 * Math.PI * (1 - (50 / 100 + success / 2)) stroke-dashoffset={`${
75 * 2 * Math.PI * (1 - (50 / 100 + success / 2))
}`} }`}
stroke-dasharray={`${75 * 2 * Math.PI}`} stroke-dasharray={`${75 * 2 * Math.PI}`}
></circle> ></circle>
@ -287,7 +290,6 @@ class TutorialHome extends Component {
icon={ icon={
tutorialStatus === "Success" ? faCheck : faTimes tutorialStatus === "Success" ? faCheck : faTimes
} }
/> />
) : ( ) : (
<Typography <Typography
@ -309,7 +311,6 @@ class TutorialHome extends Component {
); );
})} })}
</Grid> </Grid>
<DeviceSelection />
{this.props.user ? ( {this.props.user ? (
<div> <div>
<h2>User Tutorials</h2> <h2>User Tutorials</h2>
@ -380,7 +381,7 @@ class TutorialHome extends Component {
type: "success", type: "success",
}); });
}} }}
size="large"> >
<FontAwesomeIcon icon={faShareAlt} size="xs" /> <FontAwesomeIcon icon={faShareAlt} size="xs" />
</IconButton> </IconButton>
</Tooltip> </Tooltip>
@ -391,7 +392,7 @@ class TutorialHome extends Component {
<IconButton <IconButton
className={`publicTutorial ${this.props.classes.button}`} className={`publicTutorial ${this.props.classes.button}`}
disabled={!tutorial.public} disabled={!tutorial.public}
size="large"> >
<FontAwesomeIcon icon={faEye} size="xs" /> <FontAwesomeIcon icon={faEye} size="xs" />
</IconButton> </IconButton>
</Tooltip> </Tooltip>
@ -403,7 +404,7 @@ class TutorialHome extends Component {
<IconButton <IconButton
className={`publicTutorial ${this.props.classes.button}`} className={`publicTutorial ${this.props.classes.button}`}
disabled={!tutorial.review} disabled={!tutorial.review}
size="large"> >
<FontAwesomeIcon icon={faUserCheck} size="xs" /> <FontAwesomeIcon icon={faUserCheck} size="xs" />
</IconButton> </IconButton>
</Tooltip> </Tooltip>

View File

@ -5,16 +5,16 @@ import { connect } from 'react-redux';
import Breadcrumbs from '../Breadcrumbs'; import Breadcrumbs from '../Breadcrumbs';
import Alert from '../Alert'; import Alert from '../Alert';
import Grid from '@mui/material/Grid'; import Grid from '@material-ui/core/Grid';
import List from '@mui/material/List'; import List from '@material-ui/core/List';
import ListItem from '@mui/material/ListItem'; import ListItem from '@material-ui/core/ListItem';
import ListItemIcon from '@mui/material/ListItemIcon'; import ListItemIcon from '@material-ui/core/ListItemIcon';
import ListItemText from '@mui/material/ListItemText'; import ListItemText from '@material-ui/core/ListItemText';
import Divider from '@mui/material/Divider'; import Divider from '@material-ui/core/Divider';
import Paper from '@mui/material/Paper'; import Paper from '@material-ui/core/Paper';
import Link from '@mui/material/Link'; import Link from '@material-ui/core/Link';
import Typography from '@mui/material/Typography'; import Typography from '@material-ui/core/Typography';
import Tooltip from '@mui/material/Tooltip'; import Tooltip from '@material-ui/core/Tooltip';
import { faUser, faAt, faMapMarkerAlt, faCloudSunRain, faBox, faUserTag } from "@fortawesome/free-solid-svg-icons"; import { faUser, faAt, faMapMarkerAlt, faCloudSunRain, faBox, faUserTag } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
@ -30,12 +30,7 @@ export class Account extends Component {
<h1>Account</h1> <h1>Account</h1>
<Alert> <Alert>
Alle Angaben stammen von <Link Alle Angaben stammen von <Link color='primary' rel="noreferrer" target="_blank" href={'https://opensensemap.org/'}>openSenseMap</Link> und können dort verwaltet werden.
color='primary'
rel="noreferrer"
target="_blank"
href={'https://opensensemap.org/'}
underline="hover">openSenseMap</Link> und können dort verwaltet werden.
</Alert> </Alert>
<Paper style={{ width: 'max-content', maxWidth: '100%' }}> <Paper style={{ width: 'max-content', maxWidth: '100%' }}>
<List> <List>
@ -67,12 +62,7 @@ export class Account extends Component {
<div style={{ marginBottom: '8px' }}> <div style={{ marginBottom: '8px' }}>
{this.props.user.boxes.length < 1 ? {this.props.user.boxes.length < 1 ?
<Typography> <Typography>
Du hast noch keine senseBox registriert. Besuche <Link Du hast noch keine senseBox registriert. Besuche <Link color='primary' rel="noreferrer" target="_blank" href={'https://opensensemap.org/'}>openSenseMap</Link> um eine senseBox zu registrieren.
color='primary'
rel="noreferrer"
target="_blank"
href={'https://opensensemap.org/'}
underline="hover">openSenseMap</Link> um eine senseBox zu registrieren.
</Typography> </Typography>
: <Typography style={{ fontWeight: 'bold', fontSize: '1.1rem' }}> : <Typography style={{ fontWeight: 'bold', fontSize: '1.1rem' }}>
Du hast {this.props.user.boxes.length} {this.props.user.boxes.length === 1 ? 'senseBox' : 'senseBoxen'} registriert: Du hast {this.props.user.boxes.length} {this.props.user.boxes.length === 1 ? 'senseBox' : 'senseBoxen'} registriert:
@ -83,13 +73,7 @@ export class Account extends Component {
var sensors = box.sensors.map(sensor => sensor.title); var sensors = box.sensors.map(sensor => sensor.title);
return ( return (
<Grid item xs={12} sm={6} md={4} xl={3} key={i}> <Grid item xs={12} sm={6} md={4} xl={3} key={i}>
<Link <Link rel="noreferrer" target="_blank" href={`https://opensensemap.org/explore/${box._id}`} color="primary" style={{ textDecoration: 'none', color: 'inherit' }}>
rel="noreferrer"
target="_blank"
href={`https://opensensemap.org/explore/${box._id}`}
color="primary"
style={{ textDecoration: 'none', color: 'inherit' }}
underline="hover">
<Paper> <Paper>
<List> <List>
<ListItem> <ListItem>
@ -132,7 +116,7 @@ export class Account extends Component {
</Paper> </Paper>
</Link> </Link>
</Grid> </Grid>
); )
})} })}
</Grid> </Grid>
</div> </div>

View File

@ -10,15 +10,15 @@ import Snackbar from "../Snackbar";
import Alert from "../Alert"; import Alert from "../Alert";
import Breadcrumbs from "../Breadcrumbs"; import Breadcrumbs from "../Breadcrumbs";
import Button from "@mui/material/Button"; import Button from "@material-ui/core/Button";
import IconButton from "@mui/material/IconButton"; import IconButton from "@material-ui/core/IconButton";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faEye, faEyeSlash } from "@fortawesome/free-solid-svg-icons"; import { faEye, faEyeSlash } from "@fortawesome/free-solid-svg-icons";
import TextField from "@mui/material/TextField"; import TextField from "@material-ui/core/TextField";
import Divider from "@mui/material/Divider"; import Divider from "@material-ui/core/Divider";
import InputAdornment from "@mui/material/InputAdornment"; import InputAdornment from "@material-ui/core/InputAdornment";
import CircularProgress from "@mui/material/CircularProgress"; import CircularProgress from "@material-ui/core/CircularProgress";
import Link from "@mui/material/Link"; import Link from "@material-ui/core/Link";
import * as Blockly from "blockly"; import * as Blockly from "blockly";
export class Login extends Component { export class Login extends Component {
@ -38,19 +38,6 @@ export class Login extends Component {
}; };
} }
componentDidMount() {
if (this.props.message.id === "LOGIN_FAIL") {
this.setState({
email: "",
password: "",
snackbar: true,
key: Date.now(),
message: Blockly.Msg.messages_LOGIN_FAIL,
type: "error",
});
}
}
componentDidUpdate(props) { componentDidUpdate(props) {
const { message } = this.props; const { message } = this.props;
if (message !== props.message) { if (message !== props.message) {
@ -125,7 +112,7 @@ export class Login extends Component {
rel="noreferrer" rel="noreferrer"
target="_blank" target="_blank"
href={"https://opensensemap.org/"} href={"https://opensensemap.org/"}
underline="hover"> >
openSenseMap openSenseMap
</Link>{" "} </Link>{" "}
{Blockly.Msg.login_osem_account_02}. {Blockly.Msg.login_osem_account_02}.
@ -138,7 +125,6 @@ export class Login extends Component {
/> />
<form onSubmit={this.onSubmit}> <form onSubmit={this.onSubmit}>
<TextField <TextField
variant="standard"
style={{ marginBottom: "10px" }} style={{ marginBottom: "10px" }}
// variant='outlined' // variant='outlined'
type="text" type="text"
@ -146,9 +132,9 @@ export class Login extends Component {
name="email" name="email"
value={this.state.email} value={this.state.email}
onChange={this.onChange} onChange={this.onChange}
fullWidth={true} /> fullWidth={true}
/>
<TextField <TextField
variant="standard"
// variant='outlined' // variant='outlined'
type={this.state.showPassword ? "text" : "password"} type={this.state.showPassword ? "text" : "password"}
label={Blockly.Msg.labels_password} label={Blockly.Msg.labels_password}
@ -161,18 +147,18 @@ export class Login extends Component {
onClick={this.handleClickShowPassword} onClick={this.handleClickShowPassword}
onMouseDown={this.handleMouseDownPassword} onMouseDown={this.handleMouseDownPassword}
edge="end" edge="end"
size="large"> >
<FontAwesomeIcon <FontAwesomeIcon
size="xs" size="xs"
icon={this.state.showPassword ? faEyeSlash : faEye} icon={this.state.showPassword ? faEyeSlash : faEye}
/> />
</IconButton> </IconButton>
</InputAdornment> </InputAdornment>
), ),
}} }}
onChange={this.onChange} onChange={this.onChange}
fullWidth={true} /> fullWidth={true}
/>
<p> <p>
<Button <Button
color="primary" color="primary"
@ -196,7 +182,7 @@ export class Login extends Component {
target="_blank" target="_blank"
href={"https://opensensemap.org/"} href={"https://opensensemap.org/"}
color="primary" color="primary"
underline="hover"> >
{Blockly.Msg.login_lostpassword} {Blockly.Msg.login_lostpassword}
</Link> </Link>
</p> </p>
@ -213,7 +199,7 @@ export class Login extends Component {
rel="noreferrer" rel="noreferrer"
target="_blank" target="_blank"
href={"https://opensensemap.org/"} href={"https://opensensemap.org/"}
underline="hover"> >
openSenseMap openSenseMap
</Link> </Link>
. .

View File

@ -5,19 +5,19 @@ import { workspaceName } from "../../actions/workspaceActions";
import { detectWhitespacesAndReturnReadableResult } from "../../helpers/whitespace"; import { detectWhitespacesAndReturnReadableResult } from "../../helpers/whitespace";
import withStyles from '@mui/styles/withStyles'; import { withStyles } from "@material-ui/core/styles";
import Button from "@mui/material/Button"; import Button from "@material-ui/core/Button";
import Backdrop from "@mui/material/Backdrop"; import Backdrop from "@material-ui/core/Backdrop";
import CircularProgress from "@mui/material/CircularProgress"; import CircularProgress from "@material-ui/core/CircularProgress";
import IconButton from "@mui/material/IconButton"; import IconButton from "@material-ui/core/IconButton";
import Tooltip from "@mui/material/Tooltip"; import Tooltip from "@material-ui/core/Tooltip";
import Divider from "@mui/material/Divider"; import Divider from "@material-ui/core/Divider";
import { faClipboardCheck } from "@fortawesome/free-solid-svg-icons"; import { faClipboardCheck } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import * as Blockly from "blockly/core"; import * as Blockly from "blockly/core";
import Copy from "../copy.svg"; import Copy from "../copy.svg";
import MuiDrawer from "@mui/material/Drawer"; import MuiDrawer from "@material-ui/core/Drawer";
import Dialog from "../Dialog"; import Dialog from "../Dialog";
const styles = (theme) => ({ const styles = (theme) => ({
@ -188,7 +188,7 @@ class Compile extends Component {
<IconButton <IconButton
className={`compileBlocks ${this.props.classes.iconButton}`} className={`compileBlocks ${this.props.classes.iconButton}`}
onClick={() => this.compile()} onClick={() => this.compile()}
size="large"> >
<FontAwesomeIcon icon={faClipboardCheck} size="xs" /> <FontAwesomeIcon icon={faClipboardCheck} size="xs" />
</IconButton> </IconButton>
</Tooltip> </Tooltip>
@ -202,7 +202,6 @@ class Compile extends Component {
<FontAwesomeIcon <FontAwesomeIcon
icon={faClipboardCheck} icon={faClipboardCheck}
style={{ marginRight: "5px" }} style={{ marginRight: "5px" }}
/>{" "} />{" "}
Kompilieren Kompilieren
</Button> </Button>
@ -303,7 +302,6 @@ class Compile extends Component {
<FontAwesomeIcon <FontAwesomeIcon
icon={faClipboardCheck} icon={faClipboardCheck}
style={{ marginRight: "5px" }} style={{ marginRight: "5px" }}
/>{" "} />{" "}
Starte Übertragung Starte Übertragung
</Button> </Button>

View File

@ -3,10 +3,10 @@ import PropTypes from "prop-types";
import { connect } from "react-redux"; import { connect } from "react-redux";
import { workspaceName } from "../../actions/workspaceActions"; import { workspaceName } from "../../actions/workspaceActions";
import withStyles from '@mui/styles/withStyles'; import { withStyles } from "@material-ui/core/styles";
import Button from "@mui/material/Button"; import Button from "@material-ui/core/Button";
import IconButton from "@mui/material/IconButton"; import IconButton from "@material-ui/core/IconButton";
import Tooltip from "@mui/material/Tooltip"; import Tooltip from "@material-ui/core/Tooltip";
import { faCopy } from "@fortawesome/free-solid-svg-icons"; import { faCopy } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
@ -68,7 +68,7 @@ class CopyCode extends Component {
<IconButton <IconButton
className={`copyCode ${this.props.classes.iconButton}`} className={`copyCode ${this.props.classes.iconButton}`}
onClick={() => this.copyCode()} onClick={() => this.copyCode()}
size="large"> >
<FontAwesomeIcon icon={faCopy} size="xs" /> <FontAwesomeIcon icon={faCopy} size="xs" />
</IconButton> </IconButton>
</Tooltip> </Tooltip>

View File

@ -7,9 +7,9 @@ import { withRouter } from 'react-router-dom';
import Snackbar from '../Snackbar'; import Snackbar from '../Snackbar';
import withStyles from '@mui/styles/withStyles'; import { withStyles } from '@material-ui/core/styles';
import IconButton from '@mui/material/IconButton'; import IconButton from '@material-ui/core/IconButton';
import Tooltip from '@mui/material/Tooltip'; import Tooltip from '@material-ui/core/Tooltip';
import { faTrashAlt } from "@fortawesome/free-solid-svg-icons"; import { faTrashAlt } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
@ -61,7 +61,7 @@ class DeleteProject extends Component {
<IconButton <IconButton
className={this.props.classes.buttonTrash} className={this.props.classes.buttonTrash}
onClick={() => this.props.deleteProject(this.props.projectType, this.props.project._id)} onClick={() => this.props.deleteProject(this.props.projectType, this.props.project._id)}
size="large"> >
<FontAwesomeIcon icon={faTrashAlt} size="xs" /> <FontAwesomeIcon icon={faTrashAlt} size="xs" />
</IconButton> </IconButton>
</Tooltip> </Tooltip>

View File

@ -6,9 +6,9 @@ import { saveAs } from 'file-saver';
import { detectWhitespacesAndReturnReadableResult } from '../../helpers/whitespace'; import { detectWhitespacesAndReturnReadableResult } from '../../helpers/whitespace';
import withStyles from '@mui/styles/withStyles'; import { withStyles } from '@material-ui/core/styles';
import IconButton from '@mui/material/IconButton'; import IconButton from '@material-ui/core/IconButton';
import Tooltip from '@mui/material/Tooltip'; import Tooltip from '@material-ui/core/Tooltip';
import { faFileDownload } from "@fortawesome/free-solid-svg-icons"; import { faFileDownload } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
@ -46,7 +46,7 @@ class DownloadProject extends Component {
<IconButton <IconButton
className={`saveBlocks ${this.props.classes.button}`} className={`saveBlocks ${this.props.classes.button}`}
onClick={() => this.downloadXmlFile()} onClick={() => this.downloadXmlFile()}
size="large"> >
<FontAwesomeIcon icon={faFileDownload} size="xs" /> <FontAwesomeIcon icon={faFileDownload} size="xs" />
</IconButton> </IconButton>
</Tooltip> </Tooltip>

View File

@ -8,8 +8,8 @@ import * as Blockly from 'blockly/core';
import Snackbar from '../Snackbar'; import Snackbar from '../Snackbar';
import Dialog from '../Dialog'; import Dialog from '../Dialog';
import withStyles from '@mui/styles/withStyles'; import { withStyles } from '@material-ui/core/styles';
import Tooltip from '@mui/material/Tooltip'; import Tooltip from '@material-ui/core/Tooltip';
import { faUpload } from "@fortawesome/free-solid-svg-icons"; import { faUpload } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";

View File

@ -10,14 +10,14 @@ import { initialXml } from '../Blockly/initialXml.js';
import Snackbar from '../Snackbar'; import Snackbar from '../Snackbar';
import withStyles from '@mui/styles/withStyles'; import { withStyles } from '@material-ui/core/styles';
import IconButton from '@mui/material/IconButton'; import IconButton from '@material-ui/core/IconButton';
import Tooltip from '@mui/material/Tooltip'; import Tooltip from '@material-ui/core/Tooltip';
import { faShare } from "@fortawesome/free-solid-svg-icons"; import { faShare } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import Dialog from '../Dialog'; import Dialog from '../Dialog';
import Button from '@mui/material/Button'; import Button from '@material-ui/core/Button';
const styles = (theme) => ({ const styles = (theme) => ({
button: { button: {
@ -81,7 +81,7 @@ class ResetWorkspace extends Component {
<IconButton <IconButton
className={this.props.classes.button} className={this.props.classes.button}
onClick={() => this.openDialog()} onClick={() => this.openDialog()}
size="large"> >
<FontAwesomeIcon icon={faShare} size="xs" flip='horizontal' /> <FontAwesomeIcon icon={faShare} size="xs" flip='horizontal' />
</IconButton> </IconButton>
</Tooltip> </Tooltip>

View File

@ -9,13 +9,13 @@ import { withRouter } from 'react-router-dom';
import Snackbar from '../Snackbar'; import Snackbar from '../Snackbar';
import Dialog from '../Dialog'; import Dialog from '../Dialog';
import withStyles from '@mui/styles/withStyles'; import { withStyles } from '@material-ui/core/styles';
import Button from '@mui/material/Button'; import Button from '@material-ui/core/Button';
import IconButton from '@mui/material/IconButton'; import IconButton from '@material-ui/core/IconButton';
import Tooltip from '@mui/material/Tooltip'; import Tooltip from '@material-ui/core/Tooltip';
import TextField from '@mui/material/TextField'; import TextField from '@material-ui/core/TextField';
import Menu from '@mui/material/Menu'; import Menu from '@material-ui/core/Menu';
import MenuItem from '@mui/material/MenuItem'; import MenuItem from '@material-ui/core/MenuItem';
import { faSave } from "@fortawesome/free-solid-svg-icons"; import { faSave } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
@ -133,7 +133,7 @@ class SaveProject extends Component {
<IconButton <IconButton
className={this.props.classes.button} className={this.props.classes.button}
onClick={this.props.user.blocklyRole !== 'user' && (!this.props.project || this.props.user.email === this.props.project.creator) ? (e) => this.toggleMenu(e) : this.state.projectType === 'project' ? () => this.props.updateProject(this.state.projectType, this.props.project._id) : () => { this.setState({ projectType: 'project' }, () => this.saveProject()) }} onClick={this.props.user.blocklyRole !== 'user' && (!this.props.project || this.props.user.email === this.props.project.creator) ? (e) => this.toggleMenu(e) : this.state.projectType === 'project' ? () => this.props.updateProject(this.state.projectType, this.props.project._id) : () => { this.setState({ projectType: 'project' }, () => this.saveProject()) }}
size="large"> >
<FontAwesomeIcon icon={faSave} size="xs" /> <FontAwesomeIcon icon={faSave} size="xs" />
</IconButton> </IconButton>
</Tooltip> </Tooltip>
@ -178,15 +178,7 @@ class SaveProject extends Component {
button={'Abbrechen'} button={'Abbrechen'}
> >
<div style={{ marginTop: '10px' }}> <div style={{ marginTop: '10px' }}>
<TextField <TextField autoFocus fullWidth multiline placeholder={'Projektbeschreibung'} value={this.state.description} onChange={this.setDescription} style={{ marginBottom: '10px' }} />
variant="standard"
autoFocus
fullWidth
multiline
placeholder={'Projektbeschreibung'}
value={this.state.description}
onChange={this.setDescription}
style={{ marginBottom: '10px' }} />
<Button disabled={!this.state.description} variant='contained' color='primary' onClick={() => { this.workspaceDescription(); this.toggleDialog(); }}>Eingabe</Button> <Button disabled={!this.state.description} variant='contained' color='primary' onClick={() => { this.workspaceDescription(); this.toggleDialog(); }}>Eingabe</Button>
</div> </div>
</Dialog> </Dialog>

View File

@ -8,9 +8,9 @@ import { saveAs } from "file-saver";
import { detectWhitespacesAndReturnReadableResult } from "../../helpers/whitespace"; import { detectWhitespacesAndReturnReadableResult } from "../../helpers/whitespace";
import withStyles from '@mui/styles/withStyles'; import { withStyles } from "@material-ui/core/styles";
import IconButton from "@mui/material/IconButton"; import IconButton from "@material-ui/core/IconButton";
import Tooltip from "@mui/material/Tooltip"; import Tooltip from "@material-ui/core/Tooltip";
import { faCamera } from "@fortawesome/free-solid-svg-icons"; import { faCamera } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
@ -82,7 +82,7 @@ class Screenshot extends Component {
<IconButton <IconButton
className={this.props.classes.button} className={this.props.classes.button}
onClick={() => this.getSvg()} onClick={() => this.getSvg()}
size="large"> >
<FontAwesomeIcon icon={faCamera} size="xs" /> <FontAwesomeIcon icon={faCamera} size="xs" />
</IconButton> </IconButton>
</Tooltip> </Tooltip>

View File

@ -16,11 +16,11 @@ import Snackbar from "../Snackbar";
import GridLoader from "react-spinners/GridLoader"; import GridLoader from "react-spinners/GridLoader";
import { EmailShareButton, FacebookShareButton, TwitterShareButton, WhatsappShareButton} from "react-share"; import { EmailShareButton, FacebookShareButton, TwitterShareButton, WhatsappShareButton} from "react-share";
import { EmailIcon, FacebookIcon, TwitterIcon, WhatsappIcon} from "react-share"; import { EmailIcon, FacebookIcon, TwitterIcon, WhatsappIcon} from "react-share";
import withStyles from '@mui/styles/withStyles'; import { withStyles } from "@material-ui/core/styles";
import IconButton from "@mui/material/IconButton"; import IconButton from "@material-ui/core/IconButton";
import Button from '@mui/material/Button'; import Button from '@material-ui/core/Button';
import Tooltip from "@mui/material/Tooltip"; import Tooltip from "@material-ui/core/Tooltip";
import Typography from "@mui/material/Typography"; import Typography from "@material-ui/core/Typography";
import { faShareAlt, faCopy, faDownload } from "@fortawesome/free-solid-svg-icons"; import { faShareAlt, faCopy, faDownload } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
@ -164,7 +164,7 @@ class WorkspaceFunc extends Component {
<IconButton <IconButton
className={`shareBlocks ${this.props.classes.iconButton}`} className={`shareBlocks ${this.props.classes.iconButton}`}
onClick={() => this.shareBlocks()} onClick={() => this.shareBlocks()}
size="large"> >
<FontAwesomeIcon icon={faShareAlt} size="xs" /> <FontAwesomeIcon icon={faShareAlt} size="xs" />
</IconButton> </IconButton>
</Tooltip> </Tooltip>
@ -217,7 +217,7 @@ class WorkspaceFunc extends Component {
type: "success", type: "success",
}); });
}} }}
size="large"> >
<FontAwesomeIcon icon={faCopy} size="xs" /> <FontAwesomeIcon icon={faCopy} size="xs" />
</IconButton> </IconButton>
</Tooltip> </Tooltip>

View File

@ -4,9 +4,9 @@ import { connect } from 'react-redux';
import * as Blockly from 'blockly/core'; import * as Blockly from 'blockly/core';
import IconButton from '@mui/material/IconButton'; import IconButton from '@material-ui/core/IconButton';
import Tooltip from '@mui/material/Tooltip'; import Tooltip from '@material-ui/core/Tooltip';
import withStyles from '@mui/styles/withStyles'; import { withStyles } from '@material-ui/core/styles';
import { faTimes, faTrash } from "@fortawesome/free-solid-svg-icons"; import { faTimes, faTrash } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
@ -56,14 +56,15 @@ class TrashcanButtons extends Component {
} }
render() { render() {
return this.state.closeTrashFlyout ? return (
this.state.closeTrashFlyout ?
<div> <div>
<Tooltip title={Blockly.Msg.tooltip_trashcan_hide}> <Tooltip title={Blockly.Msg.tooltip_trashcan_hide}>
<IconButton <IconButton
className={this.props.classes.closeTrash} className={this.props.classes.closeTrash}
style={{ width: '40px', height: '40px', position: 'absolute', bottom: 10, right: 10, zIndex: 21 }} style={{ width: '40px', height: '40px', position: 'absolute', bottom: 10, right: 10, zIndex: 21 }}
onClick={() => this.closeTrashcan()} onClick={() => this.closeTrashcan()}
size="large"> >
<FontAwesomeIcon icon={faTimes} size="xs" /> <FontAwesomeIcon icon={faTimes} size="xs" />
</IconButton> </IconButton>
</Tooltip> </Tooltip>
@ -72,12 +73,13 @@ class TrashcanButtons extends Component {
className={this.props.classes.deleteTrash} className={this.props.classes.deleteTrash}
style={{ width: '40px', height: '40px', position: 'absolute', bottom: 10, right: 50, zIndex: 21 }} style={{ width: '40px', height: '40px', position: 'absolute', bottom: 10, right: 50, zIndex: 21 }}
onClick={() => this.clearTrashcan()} onClick={() => this.clearTrashcan()}
size="large"> >
<FontAwesomeIcon icon={faTrash} size="xs" /> <FontAwesomeIcon icon={faTrash} size="xs" />
</IconButton> </IconButton>
</Tooltip> </Tooltip>
</div> </div>
: null; : null
);
}; };
} }

View File

@ -7,19 +7,16 @@ import { setDescription, updateProject } from "../../actions/projectActions";
import Snackbar from "../Snackbar"; import Snackbar from "../Snackbar";
import Dialog from "../Dialog"; import Dialog from "../Dialog";
import withStyles from '@mui/styles/withStyles'; import withWidth, { isWidthDown } from "@material-ui/core/withWidth";
import Button from "@mui/material/Button"; import { withStyles } from "@material-ui/core/styles";
import Tooltip from "@mui/material/Tooltip"; import Button from "@material-ui/core/Button";
import TextField from "@mui/material/TextField"; import Tooltip from "@material-ui/core/Tooltip";
import Typography from "@mui/material/Typography"; import TextField from "@material-ui/core/TextField";
import Typography from "@material-ui/core/Typography";
import { faPen } from "@fortawesome/free-solid-svg-icons"; import { faPen } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import * as Blockly from "blockly/core"; import * as Blockly from "blockly/core";
import { isWidthDown } from "../../helpers/handleBreakpoints";
// FIXME checkout https://mui.com/components/use-media-query/#migrating-from-withwidth
const withWidth = () => (WrappedComponent) => (props) => <WrappedComponent {...props} width="xs" />;
const styles = (theme) => ({ const styles = (theme) => ({
workspaceName: { workspaceName: {
@ -108,7 +105,8 @@ class WorkspaceName extends Component {
return ( return (
<div style={this.props.style}> <div style={this.props.style}>
<Tooltip <Tooltip
title={`${Blockly.Msg.tooltip_project_title} ${this.props.name ? `: ${this.props.name}` : "" title={`${Blockly.Msg.tooltip_project_title} ${
this.props.name ? `: ${this.props.name}` : ""
}`} }`}
arrow arrow
style={{ height: "100%" }} style={{ height: "100%" }}
@ -152,7 +150,6 @@ class WorkspaceName extends Component {
<div style={{ width: "40px", display: "flex" }}> <div style={{ width: "40px", display: "flex" }}>
<FontAwesomeIcon <FontAwesomeIcon
icon={faPen} icon={faPen}
style={{ height: "18px", width: "18px", margin: "auto" }} style={{ height: "18px", width: "18px", margin: "auto" }}
/> />
</div> </div>
@ -190,31 +187,31 @@ class WorkspaceName extends Component {
this.state.projectType === "gallery" ? ( this.state.projectType === "gallery" ? (
<div> <div>
<TextField <TextField
variant="standard"
autoFocus autoFocus
placeholder={ placeholder={
this.state.saveXml ? "Dateiname" : "Projekttitel" this.state.saveXml ? "Dateiname" : "Projekttitel"
} }
value={this.state.name} value={this.state.name}
onChange={this.setFileName} onChange={this.setFileName}
style={{ marginBottom: "10px" }} /> style={{ marginBottom: "10px" }}
/>
<TextField <TextField
variant="standard"
fullWidth fullWidth
multiline multiline
placeholder={"Projektbeschreibung"} placeholder={"Projektbeschreibung"}
value={this.state.description} value={this.state.description}
onChange={this.setDescription} onChange={this.setDescription}
style={{ marginBottom: "10px" }} /> style={{ marginBottom: "10px" }}
/>
</div> </div>
) : ( ) : (
<TextField <TextField
variant="standard"
autoFocus autoFocus
placeholder={this.state.saveXml ? "Dateiname" : "Projekttitel"} placeholder={this.state.saveXml ? "Dateiname" : "Projekttitel"}
value={this.state.name} value={this.state.name}
onChange={this.setFileName} onChange={this.setFileName}
style={{ marginRight: "10px" }} /> style={{ marginRight: "10px" }}
/>
)} )}
<Button <Button
disabled={!this.state.name} disabled={!this.state.name}

View File

@ -4,12 +4,13 @@ import { connect } from "react-redux";
import * as Blockly from "blockly/core"; import * as Blockly from "blockly/core";
import withStyles from '@mui/styles/withStyles'; import withWidth, { isWidthDown } from "@material-ui/core/withWidth";
import Tooltip from "@mui/material/Tooltip"; import { withStyles } from "@material-ui/core/styles";
import IconButton from "@mui/material/IconButton"; import Tooltip from "@material-ui/core/Tooltip";
import Chip from "@mui/material/Chip"; import IconButton from "@material-ui/core/IconButton";
import Avatar from "@mui/material/Avatar"; import Chip from "@material-ui/core/Chip";
import Popover from "@mui/material/Popover"; import Avatar from "@material-ui/core/Avatar";
import Popover from "@material-ui/core/Popover";
import { import {
faPuzzlePiece, faPuzzlePiece,
@ -20,10 +21,6 @@ import {
faEllipsisH, faEllipsisH,
} from "@fortawesome/free-solid-svg-icons"; } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { isWidthDown } from "../../helpers/handleBreakpoints";
// FIXME checkout https://mui.com/components/use-media-query/#migrating-from-withwidth
const withWidth = () => (WrappedComponent) => (props) => <WrappedComponent {...props} width="xs" />;
const styles = (theme) => ({ const styles = (theme) => ({
stats: { stats: {
@ -177,7 +174,7 @@ class WorkspaceStats extends Component {
<IconButton <IconButton
className={this.props.classes.menu} className={this.props.classes.menu}
onClick={(event) => this.handleClick(event)} onClick={(event) => this.handleClick(event)}
size="large"> >
<FontAwesomeIcon icon={faEllipsisH} size="xs" /> <FontAwesomeIcon icon={faEllipsisH} size="xs" />
</IconButton> </IconButton>
</Tooltip> </Tooltip>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 105 KiB

View File

@ -15,13 +15,11 @@ const compareNumberOfBlocks = (originalBlocks, userBlocks) => {
var blocks; var blocks;
if(originalBlocks.length > userBlocks.length){ if(originalBlocks.length > userBlocks.length){
blocks = originalBlocks.length-userBlocks.length; blocks = originalBlocks.length-userBlocks.length;
//return {text: `Es wurde${blocks === 1 ? '' : 'n'} ${blocks} Bl${blocks === 1 ? 'ock' : 'öcke'} zu wenig verwendet.`, type: 'error'}; return {text: `Es wurde${blocks === 1 ? '' : 'n'} ${blocks} Bl${blocks === 1 ? 'ock' : 'öcke'} zu wenig verwendet.`, type: 'error'};
return {text: `Du kannst deinen Programmcode kompilieren, aber es wurde${blocks === 1 ? '' : 'n'} ${blocks} Bl${blocks === 1 ? 'ock' : 'öcke'} weniger verwendet als in der hinterlegten Lösung.`, type: 'success'};
} }
else { else {
blocks = userBlocks.length-originalBlocks.length; blocks = userBlocks.length-originalBlocks.length;
//return {text: `Es wurde${blocks === 1 ? '' : 'n'} ${blocks} Bl${blocks === 1 ? 'ock' : 'öcke'} zu viel verwendet.`, type: 'error'}; return {text: `Es wurde${blocks === 1 ? '' : 'n'} ${blocks} Bl${blocks === 1 ? 'ock' : 'öcke'} zu viel verwendet.`, type: 'error'};
return {text: `Du kannst deinen Programmcode kompilieren, aber es wurde${blocks === 1 ? '' : 'n'} ${blocks} Bl${blocks === 1 ? 'ock' : 'öcke'} mehr verwendet als in der hinterlegten Lösung.`, type: 'success'};
} }
} }
}; };

Some files were not shown because too many files have changed in this diff Show More