import React from 'react'; import PropTypes from 'prop-types'; import { Modal, ModalHeader, ModalBody, ModalFooter, } from 'reactstrap'; import { withTranslation } from 'react-i18next'; import geu from './GridEditorUtil'; import BootstrapGrid from '../../models/BootstrapGrid'; const resSizes = BootstrapGrid.ResponsiveSize; const resSizeObj = { [resSizes.XS_SIZE]: { iconClass: 'icon-screen-smartphone', displayText: 'grid_edit.smart_no' }, [resSizes.SM_SIZE]: { iconClass: 'icon-screen-tablet', displayText: 'tablet' }, [resSizes.MD_SIZE]: { iconClass: 'icon-screen-desktop', displayText: 'desktop' }, }; class GridEditModal extends React.Component { constructor(props) { super(props); this.state = { colsRatios: [6, 6], responsiveSize: BootstrapGrid.ResponsiveSize.XS_SIZE, show: false, gridHtml: '', }; this.checkResposiveSize = this.checkResposiveSize.bind(this); this.checkColsRatios = this.checkColsRatios.bind(this); this.init = this.init.bind(this); this.show = this.show.bind(this); this.hide = this.hide.bind(this); this.cancel = this.cancel.bind(this); this.pasteCodedGrid = this.pasteCodedGrid.bind(this); this.renderSelectedGridPattern = this.renderSelectedGridPattern.bind(this); this.renderSelectedBreakPoint = this.renderSelectedBreakPoint.bind(this); } async checkResposiveSize(rs) { await this.setState({ responsiveSize: rs }); } async checkColsRatios(cr) { await this.setState({ colsRatios: cr }); } init(gridHtml) { const initGridHtml = gridHtml; this.setState({ gridHtml: initGridHtml }, function() { // display gridHtml for re-editing console.log(this.state.gridHtml); }); } show(gridHtml) { this.init(gridHtml); this.setState({ show: true }); } hide() { this.setState({ show: false }); } cancel() { this.hide(); } pasteCodedGrid() { const { colsRatios, responsiveSize } = this.state; const convertedHTML = geu.convertRatiosAndSizeToHTML(colsRatios, responsiveSize); const pastedGridData = `::: editable-row\n
\n\t
\n${convertedHTML}\n\t
\n
\n:::`; // display converted html on console console.log(convertedHTML); if (this.props.onSave != null) { this.props.onSave(pastedGridData); } this.cancel(); } renderSelectedGridPattern() { const colsRatios = this.state.colsRatios; return colsRatios.join(' - '); } renderSelectedBreakPoint() { const { t } = this.props; const output = Object.entries(resSizeObj).map((responsiveSizeForMap) => { return (this.state.responsiveSize === responsiveSizeForMap[0] && ( {t(responsiveSizeForMap[1].displayText)} ) ); }); return output; } renderGridDivisionMenu() { const gridDivisions = geu.mappingAllGridDivisionPatterns; const { t } = this.props; return (
{gridDivisions.map((gridDivion, i) => { return (
{gridDivion.numberOfGridDivisions} {t('grid_edit.division')}
{gridDivion.mapping.map((gridOneDivision) => { return ( ); })}
); })}
); } renderBreakPointMenu() { const { t } = this.props; const output = Object.entries(resSizeObj).map((responsiveSizeForMap) => { return ( ); }); return output; } renderPreview() { // TODO GW-3721 make objects and simplify all loops /* const prevSize = BootstrapGrid.ResponsiveSize; const prevSizeObj = { [prevSize.MD_SIZE]: { [prevSize.MD_SIZE]: { iconClass: 'icon-screen-desktop', prevClass: 'desktop-preview', prevText: 'Desktop', prevRender: this.renderNoBreakPreview(), }, [prevSize.SM_SIZE]: { iconClass: 'icon-screen-tablet', prevClass: 'tablet-preview', prevText: 'Tablet', prevRender: this.renderBreakPreview(), }, [prevSize.XS_SIZE]: { iconClass: 'icon-screen-smartphone', prevClass: 'mobile-preview', prevText: 'Smartphone', prevRender: this.renderBreakPreview(), }, }, [prevSize.SM_SIZE]: { [prevSize.MD_SIZE]: { iconClass: 'icon-screen-desktop', prevClass: 'desktop-preview', prevText: 'Desktop', prevRender: this.renderNoBreakPreview(), }, [prevSize.SM_SIZE]: { iconClass: 'icon-screen-tablet', prevClass: 'tablet-preview', prevText: 'Tablet', prevRender: this.renderNoBreakPreview(), }, [prevSize.XS_SIZE]: { iconClass: 'icon-screen-smartphone', prevClass: 'mobile-preview', prevText: 'Smartphone', prevRender: this.renderBreakPreview(), }, }, [prevSize.MD_SIZE]: { [prevSize.MD_SIZE]: { iconClass: 'icon-screen-desktop', prevClass: 'desktop-preview', prevText: 'Desktop', prevRender: this.renderNoBreakPreview(), }, [prevSize.SM_SIZE]: { iconClass: 'icon-screen-tablet', prevClass: 'tablet-preview', prevText: 'Tablet', prevRender: this.renderNoBreakPreview(), }, [prevSize.XS_SIZE]: { iconClass: 'icon-screen-smartphone', prevClass: 'mobile-preview', prevText: 'Smartphone', prevRender: this.renderNoBreakPreview(), }, }, }; */ const { t } = this.props; if (this.state.responsiveSize === BootstrapGrid.ResponsiveSize.MD_SIZE) { return (

{t('preview')}

{this.renderNoBreakPreview()}
{this.renderBreakPreview()}
{this.renderBreakPreview()}
); } if (this.state.responsiveSize === BootstrapGrid.ResponsiveSize.SM_SIZE) { return (

{t('preview')}

{this.renderNoBreakPreview()}
{this.renderNoBreakPreview()}
{this.renderBreakPreview()}
); } if (this.state.responsiveSize === BootstrapGrid.ResponsiveSize.XS_SIZE) { return (

{t('preview')}

{this.renderNoBreakPreview()}
{this.renderNoBreakPreview()}
{this.renderNoBreakPreview()}
); } } renderNoBreakPreview() { const { colsRatios } = this.state; const convertedHTML = colsRatios.map((colsRatios) => { const className = `col-${colsRatios} border`; return (
); }); return (
{convertedHTML}
); } renderBreakPreview() { const { colsRatios } = this.state; const convertedHTML = colsRatios.map(() => { const className = 'col-12 border'; return (
); }); return (
{convertedHTML}
); } render() { const { t } = this.props; return ( {t('grid_edit.create_bootstrap_4_grid')}

{t('grid_edit.grid_settings')}

{this.renderGridDivisionMenu()}
{this.renderBreakPointMenu()}
{this.renderPreview()}
); } } GridEditModal.propTypes = { onSave: PropTypes.func, t: PropTypes.func.isRequired, }; export default withTranslation('translation', { withRef: true })(GridEditModal);