diff --git a/package.json b/package.json index eeba395..b247002 100644 --- a/package.json +++ b/package.json @@ -12,5 +12,8 @@ "scripts": { "release": "release-it", "bootstrap": "./bootstrap" + }, + "dependencies": { + "react-color": "2.18.1" } } diff --git a/src/ColumnsBlock/ColumnVariations.jsx b/src/ColumnsBlock/ColumnVariations.jsx index c148ee0..b48c90c 100644 --- a/src/ColumnsBlock/ColumnVariations.jsx +++ b/src/ColumnsBlock/ColumnVariations.jsx @@ -1,40 +1,20 @@ import React from 'react'; import { Segment, Card } from 'semantic-ui-react'; import { Icon } from '@plone/volto/components'; -import { isEqual } from 'lodash'; -export default React.memo( - ({ data, onChange, children, variants }) => { - // data by default is like { '@type': 'columns } - const mounted = React.useRef(); - React.useEffect(() => { - if (!mounted.current) console.log('mount column variations'); - mounted.current = true; - }); - - return Object.keys(data).length === 1 ? ( - - - {variants.map(({ icon, defaultData, title }, index) => ( - onChange(defaultData)}> - - - {title ? {title} : ''} - - - ))} - - - ) : ( - children - ); - }, - (p, n) => { - const res = - isEqual(p.data, n.data) && - p.selected === n.selected && - isEqual(n.colSelections, p.colSelections); - console.log('variantions', res); - return res; - }, -); +export default ({ data, onChange, children, variants }) => { + return ( + + + {variants.map(({ icon, defaultData, title }, index) => ( + onChange(defaultData)}> + + + {title ? {title} : ''} + + + ))} + + + ); +}; diff --git a/src/ColumnsBlock/ColumnsBlockEdit.jsx b/src/ColumnsBlock/ColumnsBlockEdit.jsx index 22fceca..a0495e4 100644 --- a/src/ColumnsBlock/ColumnsBlockEdit.jsx +++ b/src/ColumnsBlock/ColumnsBlockEdit.jsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Grid } from 'semantic-ui-react'; +import { Grid, Segment } from 'semantic-ui-react'; import { isEmpty } from 'lodash'; import { SidebarPortal, Icon, InlineForm } from '@plone/volto/components'; // BlocksForm, Icon, import { emptyBlocksForm } from '@plone/volto/helpers'; @@ -9,11 +9,14 @@ import { BlocksForm } from '@eeacms/volto-blocks-form/components'; import { Button } from 'semantic-ui-react'; import { blocks } from '~/config'; -import { COLUMNSBLOCK } from '@eeacms/volto-columns-block/constants'; import { ColumnsBlockSchema } from './schema'; import { getColumns, empty } from './utils'; import ColumnVariations from './ColumnVariations'; import EditBlockWrapper from './EditBlockWrapper'; + +import { COLUMNSBLOCK } from '@eeacms/volto-columns-block/constants'; +import { makeStyleSchema, getStyle } from '@eeacms/volto-columns-block/Styles'; + import tuneSVG from '@plone/volto/icons/tune.svg'; import './styles.less'; @@ -22,16 +25,10 @@ import './styles.less'; * not pretty, there's a lot of render props passing, to please React * reconciliation algos * -ColumnsBlockEdit -> - EditBlockWrapper - -> EditBlock - -> dragProps -CBE - -> BlocksForm - -> DragDropList - -> EditBlockWrapper - -> EditBlock +ColumnsBlockEdit -> passes EditBlockWrapper into + -> BlocksForm -> which passes (with EditBlock) into + -> DragDropList -> which renders them all */ class ColumnsBlockEdit extends React.Component { constructor(props) { @@ -84,20 +81,38 @@ class ColumnsBlockEdit extends React.Component { pathname, selected, } = this.props; - const { gridSizes, variants } = blocks.blocksConfig[COLUMNSBLOCK]; const { coldata, gridCols, gridSize } = data; const columnList = getColumns(coldata); + const { gridSizes, variants, available_colors } = blocks.blocksConfig[ + COLUMNSBLOCK + ]; + const ColumnSchema = makeStyleSchema({ available_colors }); + return ( - <> -
+
+ {Object.keys(data).length === 1 ? ( + { + onChangeBlock(block, { + ...data, + ...this.createFrom(initialData), + }); + }} + /> + ) : ( {columnList.map(([colId, column], index) => (
{ this.setState({ showSidebar: true, - activeColumn: 1, //colId, + activeColumn: colId, colSelections: {}, }); this.props.setSidebarTab(1); @@ -179,15 +194,51 @@ class ColumnsBlockEdit extends React.Component {
))}
-
- {Object.keys(this.state.colSelections).length === 0 && ( + )} + + {Object.keys(this.state.colSelections).length === 0 ? ( {this.state.activeColumn ? ( -
{this.state.activeColumn}
+ <> + + + + { + const formData = { + ...data, + coldata: { + ...coldata, + columns: { + ...coldata.columns, + [this.state.activeColumn]: { + ...coldata.columns?.[this.state.activeColumn], + settings: { + ...coldata.columns?.[this.state.activeColumn] + ?.settings, + [id]: value, + }, + }, + }, + }, + }; + console.log('formdata', formData); + onChangeBlock(block, formData); + }} + formData={ + data?.coldata?.columns?.[this.state.activeColumn] + ?.settings || {} + } + /> + ) : ( { onChangeBlock(block, { ...data, @@ -198,8 +249,10 @@ class ColumnsBlockEdit extends React.Component { /> )}
+ ) : ( + '' )} - +
); } } @@ -210,7 +263,3 @@ export default connect( }, { setSidebarTab }, )(ColumnsBlockEdit); -// import columnSVG from '@plone/volto/icons/column.svg'; -// import decorateComponentWithProps from 'decorate-component-with-props'; -// import dragSVG from '@plone/volto/icons/drag.svg'; -// import dotsSVG from '@plone/volto/icons/drag.svg'; diff --git a/src/ColumnsBlock/ColumnsBlockView.jsx b/src/ColumnsBlock/ColumnsBlockView.jsx index 2e898ca..129cb36 100644 --- a/src/ColumnsBlock/ColumnsBlockView.jsx +++ b/src/ColumnsBlock/ColumnsBlockView.jsx @@ -5,6 +5,7 @@ import { blocks } from '~/config'; import { COLUMNSBLOCK } from '@eeacms/volto-columns-block/constants'; import { getColumns } from './utils'; +import { getStyle } from '@eeacms/volto-columns-block/Styles'; const ColumnsBlockView = (props) => { const { gridSizes } = blocks.blocksConfig[COLUMNSBLOCK]; @@ -25,6 +26,7 @@ const ColumnsBlockView = (props) => { className="demo-column" key={id} {...(gridSizes[gridCols[index]] || gridCols[index])} + style={getStyle(column.settings || {})} > {/*

{`Column ${index}`}

*/} diff --git a/src/ColumnsBlock/styles.less b/src/ColumnsBlock/styles.less index cce1dfb..7ba9e21 100644 --- a/src/ColumnsBlock/styles.less +++ b/src/ColumnsBlock/styles.less @@ -1,13 +1,19 @@ .columns-block { + & > .column { + padding: 0px; + & > .column { + padding: 4px !important; + } + } .block-column { padding: 0.3em; - .column-header { - width: 100%; - text-align: center; - border-bottom: 6px solid #eaeaea; - margin: 0.3em auto 0.8em auto; - } + // .column-header { + // width: 100%; + // text-align: center; + // border-bottom: 6px solid #eaeaea; + // margin: 0.3em auto 0.8em auto; + // } .block { .block-add-button { diff --git a/src/Styles/index.js b/src/Styles/index.js new file mode 100644 index 0000000..e16f8ff --- /dev/null +++ b/src/Styles/index.js @@ -0,0 +1,13 @@ +import { StyleSchema } from './schema'; + +export function makeStyleSchema({ available_colors }) { + const schema = StyleSchema(); + schema.properties.backgroundColor.available_colors = available_colors; + return schema; +} + +export function getStyle(props) { + return { + backgroundColor: props.backgroundColor, + }; +} diff --git a/src/Styles/schema.js b/src/Styles/schema.js new file mode 100644 index 0000000..4e44ee8 --- /dev/null +++ b/src/Styles/schema.js @@ -0,0 +1,70 @@ +export const StyleSchema = () => ({ + title: 'Styling', + fieldsets: [ + { + id: 'default', + title: 'Style', + fields: ['backgroundColor'], + }, + ], + properties: { + backgroundColor: { + title: 'Background color', + type: 'color', + widget: 'simple_color_picker', + }, + }, + required: [], +}); + +export const TextSettingsSchema = { + title: 'Text settings', + fieldsets: [ + { + id: 'text_settings', + title: 'Text settings', + fields: ['grid_column_align_text', 'grid_column_text_color'], + }, + ], + properties: { + grid_column_align_text: { + title: 'Text align', + widget: 'align', + }, + grid_column_text_color: { + title: 'Text color', + widget: 'color_picker', + }, + }, + required: [], +}; + +export const AdvancedSettingsSchema = { + title: 'Advanced settings', + fieldsets: [ + { + id: 'advanced_fullcontrol', + title: 'Advanced settings', + fields: [ + 'grid_column_margin', + 'grid_column_padding', + // 'grid_column_inline_style', + ], + }, + ], + properties: { + grid_column_margin: { + title: 'Margin', + widget: 'textarea', + }, + grid_column_padding: { + title: 'Padding', + widget: 'textarea', + }, + // grid_column_inline_style: { + // title: 'Inline style', + // widget: 'json_text', + // }, + }, + required: [], +}; diff --git a/src/ColumnsWidget/ColumnsWidget.jsx b/src/Widgets/ColumnsWidget.jsx similarity index 100% rename from src/ColumnsWidget/ColumnsWidget.jsx rename to src/Widgets/ColumnsWidget.jsx diff --git a/src/Widgets/SimpleColorPickerWidget.jsx b/src/Widgets/SimpleColorPickerWidget.jsx new file mode 100644 index 0000000..27a4795 --- /dev/null +++ b/src/Widgets/SimpleColorPickerWidget.jsx @@ -0,0 +1,55 @@ +import React from 'react'; +import { GithubPicker } from 'react-color'; +import { FormFieldWrapper, Icon } from '@plone/volto/components'; +import { Button } from 'semantic-ui-react'; +import clearSVG from '@plone/volto/icons/clear.svg'; + +export default (props) => { + const { id, value, onChange, available_colors } = props; + const [showPicker, setShowPicker] = React.useState(false); + + return ( + +
+ + + + + + {showPicker ? ( + { + setShowPicker(false); + onChange(id, value.hex); + }} + /> + ) : ( + '' + )} +
+
+ ); +}; diff --git a/src/ColumnsWidget/index.js b/src/Widgets/index.js similarity index 100% rename from src/ColumnsWidget/index.js rename to src/Widgets/index.js diff --git a/src/index.js b/src/index.js index cae4d11..eb47e44 100644 --- a/src/index.js +++ b/src/index.js @@ -1,7 +1,8 @@ import codeSVG from '@plone/volto/icons/code.svg'; import { ColumnsBlockView, ColumnsBlockEdit } from './ColumnsBlock'; -import ColumnsWidget from './ColumnsWidget'; +import ColumnsWidget from './Widgets/ColumnsWidget'; +import ColorPickerWidget from './Widgets/SimpleColorPickerWidget.jsx'; import { gridSizes, variants } from './grid'; import { COLUMNSBLOCK } from './constants'; @@ -23,9 +24,28 @@ export default function install(config) { }, gridSizes, variants, + available_colors: [ + // '#B80000', + // '#DB3E00', + // '#FCCB00', + // '#008B02', + // '#006B76', + // '#1273DE', + // '#004DCF', + // '#5300EB', + '#EB9694', + '#FAD0C3', + '#FEF3BD', + '#C1E1C5', + '#BEDADC', + '#C4DEF6', + '#BED3F3', + '#D4C4FB', + ], }; config.widgets.type.columns = ColumnsWidget; + config.widgets.widget.simple_color_picker = ColorPickerWidget; return config; }