Skip to content

Commit

Permalink
Rewrite ColumnsBlockEdit as class; solve slate block creation issue
Browse files Browse the repository at this point in the history
  • Loading branch information
tiberiuichim committed Sep 21, 2020
1 parent d57e2c1 commit 5d3726b
Showing 1 changed file with 97 additions and 80 deletions.
177 changes: 97 additions & 80 deletions src/ColumnsBlock/ColumnsBlockEdit.jsx
Original file line number Diff line number Diff line change
@@ -1,106 +1,123 @@
import React from 'react';
import { Grid } from 'semantic-ui-react';
import { isEmpty } from 'lodash';
import { SidebarPortal, InlineForm, BlocksForm } from '@plone/volto/components';
import { BlocksForm, SidebarPortal, InlineForm } from '@plone/volto/components'; // BlocksForm
import { emptyBlocksForm } from '@plone/volto/helpers';

// import from BlocksForm '../futurevolto/BlocksForm';
import { ColumnsBlockSchema } from './schema';
import { getColumns, empty } from './utils';

import './styles.less';

const ColumnsBlockEdit = (props) => {
const {
block,
data,
onChangeBlock,
onChangeField,
pathname,
selected,
} = props;
class ColumnsBlockEdit extends React.Component {
constructor(props) {
super(props);
this.state = {
colSelections: {},
};
this.blocksState = {};
}

React.useEffect(() => {
if (!data.coldata) {
onChangeBlock(block, { ...data, coldata: empty() });
}
});
render() {
const {
block,
data,
onChangeBlock,
onChangeField,
pathname,
selected,
} = this.props;

const [colSelections, setColSelections] = React.useState({});
// React.useEffect(() => {
// if (!data.coldata) {
// // TODO: this is a hack that causes volto-slate to lose focus
// onChangeBlock(block, { ...data, coldata: empty() });
// }
// });

const { coldata = empty() } = data;
const columnList = getColumns(coldata);
const { coldata = empty() } = data;
const columnList = getColumns(coldata);

return (
<>
<div className="columns-block">
{/* {<h3>{data.block_title}</h3>} */}
<Grid columns={columnList.length}>
{columnList.map(([colId, column], index) => {
return (
<Grid.Column className="block-column" key={colId}>
{/* <h4>{`Column ${index}`}</h4> */}
<BlocksForm
properties={isEmpty(column) ? emptyBlocksForm() : column}
selectedBlock={selected ? colSelections[colId] : null}
onSelectBlock={(id) =>
setColSelections({
// this invalidates selection in all other columns
[colId]: id,
})
}
onChangeFormData={(newFormData) => {
onChangeBlock(block, {
...data,
coldata: {
...coldata,
columns: {
...coldata.columns,
[colId]: newFormData,
return (
<>
<div className="columns-block">
{/* {<h3>{data.block_title}</h3>} */}
<Grid columns={columnList.length}>
{columnList.map(([colId, column], index) => {
return (
<Grid.Column className="block-column" key={colId}>
{/* <h4>{`Column ${index}`}</h4> */}
<BlocksForm
properties={isEmpty(column) ? emptyBlocksForm() : column}
selectedBlock={
selected ? this.state.colSelections[colId] : null
}
onSelectBlock={(id) =>
this.setState({
colSelections: {
// this invalidates selection in all other columns
[colId]: id,
},
},
});
}}
onChangeField={(id, value) => {
if (['blocks', 'blocks_layout'].indexOf(id) > -1) {
})
}
onChangeFormData={(newFormData) => {
onChangeBlock(block, {
...data,
coldata: {
...coldata,
columns: {
...coldata.columns,
[colId]: {
...coldata.columns?.[colId],
[id]: value,
},
[colId]: newFormData,
},
},
});
} else {
onChangeField(id, value);
}
}}
pathname={pathname}
/>
</Grid.Column>
);
})}
</Grid>
</div>
<SidebarPortal selected={selected}>
<InlineForm
schema={ColumnsBlockSchema}
title={ColumnsBlockSchema.title}
onChangeField={(id, value) => {
onChangeBlock(block, {
...data,
[id]: value,
});
}}
formData={data}
/>
</SidebarPortal>
</>
);
};
}}
onChangeField={(id, value) => {
// special handling of blocks and blocks_layout
if (['blocks', 'blocks_layout'].indexOf(id) > -1) {
this.blocksState[id] = value;
onChangeBlock(block, {
...data,
coldata: {
...coldata,
columns: {
...coldata.columns,
[colId]: {
...coldata.columns?.[colId],
...this.blocksState,
[id]: value,
},
},
},
});
} else {
onChangeField(id, value);
}
}}
pathname={pathname}
/>
</Grid.Column>
);
})}
</Grid>
</div>
<SidebarPortal selected={selected}>
<InlineForm
schema={ColumnsBlockSchema}
title={ColumnsBlockSchema.title}
onChangeField={(id, value) => {
onChangeBlock(block, {
...data,
[id]: value,
});
}}
formData={data}
/>
</SidebarPortal>
</>
);
}
}

export default ColumnsBlockEdit;

0 comments on commit 5d3726b

Please sign in to comment.