display gallery content
This commit is contained in:
parent
2e330d1215
commit
2dfd146d18
@ -16,7 +16,6 @@
|
|||||||
"axios": "^0.21.0",
|
"axios": "^0.21.0",
|
||||||
"blockly": "^3.20200924.0",
|
"blockly": "^3.20200924.0",
|
||||||
"file-saver": "^2.0.2",
|
"file-saver": "^2.0.2",
|
||||||
"mnemonic-id": "^3.2.7",
|
|
||||||
"moment": "^2.28.0",
|
"moment": "^2.28.0",
|
||||||
"prismjs": "^1.20.0",
|
"prismjs": "^1.20.0",
|
||||||
"react": "^16.13.1",
|
"react": "^16.13.1",
|
||||||
|
@ -53,7 +53,6 @@ class BlocklySvg extends Component {
|
|||||||
var css = '<defs><style type="text/css" xmlns="http://www.w3.org/1999/xhtml"><![CDATA[' + cssContent + ']]></style></defs>';
|
var css = '<defs><style type="text/css" xmlns="http://www.w3.org/1999/xhtml"><![CDATA[' + cssContent + ']]></style></defs>';
|
||||||
var bbox = document.getElementsByClassName("blocklyBlockCanvas")[0].getBBox();
|
var bbox = document.getElementsByClassName("blocklyBlockCanvas")[0].getBBox();
|
||||||
var content = new XMLSerializer().serializeToString(canvas);
|
var content = new XMLSerializer().serializeToString(canvas);
|
||||||
|
|
||||||
var xml = `<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
var xml = `<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
width="${bbox.width}" height="${bbox.height}" viewBox="${bbox.x} ${bbox.y} ${bbox.width} ${bbox.height}">
|
width="${bbox.width}" height="${bbox.height}" viewBox="${bbox.x} ${bbox.y} ${bbox.width} ${bbox.height}">
|
||||||
${css}">${content}</svg>`;
|
${css}">${content}</svg>`;
|
||||||
@ -65,7 +64,7 @@ class BlocklySvg extends Component {
|
|||||||
render() {
|
render() {
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
style={{display: 'flex', justifyContent: 'center', transform: 'scale(0.8) translate(0, calc(100% * -0.2 / 2))'}}
|
style={{display: 'inline-flex', justifyContent: 'center', transform: 'scale(0.8) translate(0, calc(100% * -0.2 / 2))'}}
|
||||||
dangerouslySetInnerHTML={{ __html: this.state.svg }}
|
dangerouslySetInnerHTML={{ __html: this.state.svg }}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
@ -1,51 +1,15 @@
|
|||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import { connect } from 'react-redux';
|
|
||||||
|
|
||||||
import clsx from 'clsx';
|
|
||||||
|
|
||||||
import Breadcrumbs from '../Breadcrumbs';
|
|
||||||
|
|
||||||
|
import axios from 'axios';
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
|
|
||||||
import { fade } from '@material-ui/core/styles/colorManipulator';
|
import Breadcrumbs from '../Breadcrumbs';
|
||||||
import { withStyles } from '@material-ui/core/styles';
|
import BlocklyWindow from '../Blockly/BlocklyWindow';
|
||||||
|
|
||||||
import Grid from '@material-ui/core/Grid';
|
import Grid from '@material-ui/core/Grid';
|
||||||
import Paper from '@material-ui/core/Paper';
|
import Paper from '@material-ui/core/Paper';
|
||||||
import BlocklyWindow from '../Blockly/BlocklyWindow';
|
|
||||||
import Divider from '@material-ui/core/Divider';
|
import Divider from '@material-ui/core/Divider';
|
||||||
|
import Typography from '@material-ui/core/Typography';
|
||||||
|
|
||||||
const styles = (theme) => ({
|
|
||||||
outerDiv: {
|
|
||||||
position: 'absolute',
|
|
||||||
right: '-30px',
|
|
||||||
bottom: '-30px',
|
|
||||||
width: '160px',
|
|
||||||
height: '160px',
|
|
||||||
color: fade(theme.palette.secondary.main, 0.6)
|
|
||||||
},
|
|
||||||
outerDivError: {
|
|
||||||
stroke: fade(theme.palette.error.dark, 0.6),
|
|
||||||
color: fade(theme.palette.error.dark, 0.6)
|
|
||||||
},
|
|
||||||
outerDivSuccess: {
|
|
||||||
stroke: fade(theme.palette.primary.main, 0.6),
|
|
||||||
color: fade(theme.palette.primary.main, 0.6)
|
|
||||||
},
|
|
||||||
outerDivOther: {
|
|
||||||
stroke: fade(theme.palette.secondary.main, 0.6)
|
|
||||||
},
|
|
||||||
innerDiv: {
|
|
||||||
width: 'inherit',
|
|
||||||
height: 'inherit',
|
|
||||||
display: 'table-cell',
|
|
||||||
verticalAlign: 'middle',
|
|
||||||
textAlign: 'center'
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class GalleryHome extends Component {
|
class GalleryHome extends Component {
|
||||||
@ -55,14 +19,15 @@ class GalleryHome extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
fetch(process.env.REACT_APP_BLOCKLY_API + this.props.location.pathname)
|
axios.get(`${process.env.REACT_APP_BLOCKLY_API}/gallery`)
|
||||||
.then(res => res.json())
|
.then(res => {
|
||||||
.then((data) => {
|
this.setState({ gallery: res.data.galleries });
|
||||||
this.setState({ gallery: data })
|
|
||||||
})
|
})
|
||||||
|
.catch(err => {
|
||||||
|
// TODO:
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
@ -72,28 +37,17 @@ class GalleryHome extends Component {
|
|||||||
<Grid container spacing={2}>
|
<Grid container spacing={2}>
|
||||||
{this.state.gallery.map((gallery, i) => {
|
{this.state.gallery.map((gallery, i) => {
|
||||||
return (
|
return (
|
||||||
<Grid item xs={12} sm={6} md={4} xl={3} key={i} style={{}}>
|
<Grid item xs={12} sm={6} md={4} xl={3} key={i}>
|
||||||
<Link to={`/gallery/${gallery.id}`} style={{ textDecoration: 'none', color: 'inherit' }}>
|
<Link to={`/gallery/${gallery._id}`} style={{ textDecoration: 'none', color: 'inherit' }}>
|
||||||
<Paper style={{ height: '400px', padding: '2rem', position: 'relative', overflow: 'hidden' }}>
|
<Paper style={{ padding: '1rem', position: 'relative', overflow: 'hidden' }}>
|
||||||
<h3>{gallery.title}</h3>
|
<h3 style={{marginTop: 0}}>{gallery.title}</h3>
|
||||||
<Divider />
|
<Divider style={{marginTop: '1rem', marginBottom: '10px'}}/>
|
||||||
<Grid container spacing={10} style={{ marginBottom: '5px' }}>
|
|
||||||
<Grid item xs={12}>
|
|
||||||
<BlocklyWindow
|
<BlocklyWindow
|
||||||
trashcan={false}
|
svg
|
||||||
zoomControls={false}
|
|
||||||
|
|
||||||
blockDisabled
|
blockDisabled
|
||||||
blocklyCSS={{ height: '18vH' }}
|
|
||||||
initialXml={gallery.xml}
|
initialXml={gallery.xml}
|
||||||
/>
|
/>
|
||||||
</Grid>
|
<Typography variant='body2' style={{fontStyle: 'italic', margin: 0, marginTop: '-30px'}}>{gallery.description}</Typography>
|
||||||
</Grid>
|
|
||||||
<p>{gallery.text}</p>
|
|
||||||
<Divider />
|
|
||||||
|
|
||||||
<div className={clsx(this.props.classes.outerDiv)} style={{ width: '160px', height: '160px', border: 0 }}>
|
|
||||||
</div>
|
|
||||||
</Paper>
|
</Paper>
|
||||||
</Link>
|
</Link>
|
||||||
</Grid>
|
</Grid>
|
||||||
@ -105,14 +59,4 @@ class GalleryHome extends Component {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
GalleryHome.propTypes = {
|
export default GalleryHome;
|
||||||
status: PropTypes.array.isRequired,
|
|
||||||
change: PropTypes.number.isRequired,
|
|
||||||
};
|
|
||||||
|
|
||||||
const mapStateToProps = state => ({
|
|
||||||
change: state.tutorial.change,
|
|
||||||
status: state.tutorial.status
|
|
||||||
});
|
|
||||||
|
|
||||||
export default connect(mapStateToProps, null)(withStyles(styles, { withTheme: true })(GalleryHome));
|
|
||||||
|
@ -60,31 +60,17 @@ class Home extends Component {
|
|||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
this.setState({ stats: window.localStorage.getItem('stats') })
|
this.setState({ stats: window.localStorage.getItem('stats') })
|
||||||
if(this.props.match.params.shareId || this.props.match.params.galleryId){
|
this.getProject();
|
||||||
this.setState({progress: true});
|
|
||||||
axios.get(`${process.env.REACT_APP_BLOCKLY_API}${this.props.location.pathname}`)
|
|
||||||
.then(res => {
|
|
||||||
var shareContent = res.data.content;
|
|
||||||
this.props.workspaceName(res.data.content.name);
|
|
||||||
this.setState({ projectToLoad: res.data.content, progress: false });
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
this.setState({ progress: false, snackbar: true, key: Date.now(), message: `Fehler beim Erstellen eines Links zum Teilen deines Programmes. Versuche es noch einmal.`, type: 'error' });
|
|
||||||
window.scrollTo(0, 0);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this.props.workspaceName(createNameId());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
componentDidUpdate(props) {
|
||||||
componentDidUpdate() {
|
if(props.location.path !== this.props.location.path){
|
||||||
|
this.getProject();
|
||||||
|
}
|
||||||
/* Resize and reposition all of the workspace chrome (toolbox, trash,
|
/* Resize and reposition all of the workspace chrome (toolbox, trash,
|
||||||
scrollbars etc.) This should be called when something changes that requires
|
scrollbars etc.) This should be called when something changes that requires
|
||||||
recalculating dimensions and positions of the trash, zoom, toolbox, etc.
|
recalculating dimensions and positions of the trash, zoom, toolbox, etc.
|
||||||
(e.g. window resize). */
|
(e.g. window resize). */
|
||||||
|
|
||||||
const workspace = Blockly.getMainWorkspace();
|
const workspace = Blockly.getMainWorkspace();
|
||||||
Blockly.svgResize(workspace);
|
Blockly.svgResize(workspace);
|
||||||
}
|
}
|
||||||
@ -94,6 +80,27 @@ class Home extends Component {
|
|||||||
this.props.workspaceName(null);
|
this.props.workspaceName(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getProject = () => {
|
||||||
|
if(this.props.match.params.shareId || this.props.match.params.galleryId){
|
||||||
|
var param = this.props.match.params.shareId ? 'share' : 'gallery';
|
||||||
|
var id = this.props.match.params[`${param}Id`];
|
||||||
|
this.setState({progress: true});
|
||||||
|
axios.get(`${process.env.REACT_APP_BLOCKLY_API}/${param}/${id}`)
|
||||||
|
.then(res => {
|
||||||
|
this.props.workspaceName(res.data[param].name ? res.data[param].name : res.data[param].title);
|
||||||
|
this.setState({ projectToLoad: res.data[param], progress: false });
|
||||||
|
})
|
||||||
|
.catch(err => {
|
||||||
|
// TODO:
|
||||||
|
this.setState({ progress: false, snackbar: true, key: Date.now(), message: `Fehler beim Aufrufen des angeforderten Programms. Versuche es noch einmal.`, type: 'error' });
|
||||||
|
window.scrollTo(0, 0);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.props.workspaceName(createNameId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
onChange = () => {
|
onChange = () => {
|
||||||
this.setState({ codeOn: !this.state.codeOn });
|
this.setState({ codeOn: !this.state.codeOn });
|
||||||
const workspace = Blockly.getMainWorkspace();
|
const workspace = Blockly.getMainWorkspace();
|
||||||
|
@ -39,7 +39,7 @@ class Instruction extends Component {
|
|||||||
: null}
|
: null}
|
||||||
{step.xml ?
|
{step.xml ?
|
||||||
<Grid container spacing={2} style={{ marginBottom: '5px' }}>
|
<Grid container spacing={2} style={{ marginBottom: '5px' }}>
|
||||||
<Grid item xs={12}>
|
<Grid item xs={12} style={{display: 'flex', justifyContent: 'center'}}>
|
||||||
<BlocklyWindow
|
<BlocklyWindow
|
||||||
svg
|
svg
|
||||||
blockDisabled
|
blockDisabled
|
||||||
|
@ -7,7 +7,6 @@ import * as Blockly from 'blockly/core';
|
|||||||
|
|
||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
import { saveAs } from 'file-saver';
|
import { saveAs } from 'file-saver';
|
||||||
import { createId } from 'mnemonic-id';
|
|
||||||
|
|
||||||
import { detectWhitespacesAndReturnReadableResult } from '../helpers/whitespace';
|
import { detectWhitespacesAndReturnReadableResult } from '../helpers/whitespace';
|
||||||
import { initialXml } from './Blockly/initialXml.js';
|
import { initialXml } from './Blockly/initialXml.js';
|
||||||
@ -114,14 +113,13 @@ class WorkspaceFunc extends Component {
|
|||||||
|
|
||||||
shareBlocks = () => {
|
shareBlocks = () => {
|
||||||
var body = {
|
var body = {
|
||||||
_id: createId(10),
|
|
||||||
name: this.state.name,
|
name: this.state.name,
|
||||||
xml: this.props.xml
|
xml: this.props.xml
|
||||||
};
|
};
|
||||||
axios.post(`${process.env.REACT_APP_BLOCKLY_API}/share`, body)
|
axios.post(`${process.env.REACT_APP_BLOCKLY_API}/share`, body)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
var shareContent = res.data.content;
|
var shareContent = res.data.content;
|
||||||
this.setState({ share: true, open: true, title: 'Programm teilen', id: shareContent._id });
|
this.setState({ share: true, open: true, title: 'Programm teilen', id: shareContent.link });
|
||||||
})
|
})
|
||||||
.catch(err => {
|
.catch(err => {
|
||||||
this.setState({ snackbar: true, key: Date.now(), message: `Fehler beim Erstellen eines Links zum Teilen deines Programmes. Versuche es noch einmal.`, type: 'error' });
|
this.setState({ snackbar: true, key: Date.now(), message: `Fehler beim Erstellen eines Links zum Teilen deines Programmes. Versuche es noch einmal.`, type: 'error' });
|
||||||
@ -299,7 +297,7 @@ class WorkspaceFunc extends Component {
|
|||||||
</IconButton>
|
</IconButton>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
: null}
|
: null}
|
||||||
<Tooltip title='Workspace zurücksetzen' arrow style={{ marginRight: '5px' }}>
|
<Tooltip title='Workspace zurücksetzen' arrow style={this.props.assessment ? null : { marginRight: '5px' }}>
|
||||||
<IconButton
|
<IconButton
|
||||||
className={this.props.classes.button}
|
className={this.props.classes.button}
|
||||||
onClick={() => this.resetWorkspace()}
|
onClick={() => this.resetWorkspace()}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user