From a469afd1ece7f6a344f76ec5f738046bb40baf5a Mon Sep 17 00:00:00 2001 From: chris <kokosias@yahoo.gr> Date: Thu, 17 Sep 2020 21:28:32 +0300 Subject: [PATCH] connect insert table tool --- wax-prosemirror-components/index.js | 4 + .../src/components/tables/CreateTable.js | 78 +++++++++++++++++++ .../src/ui/tables/InsertTableTool.js | 2 + .../InsertTableService/InsertTableService.js | 26 +++---- .../TablesService/InsertTableService/Table.js | 18 ++++- .../src/commands/Commands.js | 9 +-- 6 files changed, 114 insertions(+), 23 deletions(-) create mode 100644 wax-prosemirror-components/src/components/tables/CreateTable.js diff --git a/wax-prosemirror-components/index.js b/wax-prosemirror-components/index.js index 97207281e..5b4c55391 100644 --- a/wax-prosemirror-components/index.js +++ b/wax-prosemirror-components/index.js @@ -15,3 +15,7 @@ export { default as CommentBubbleComponent } from './src/components/comments/Com export { default as RightArea } from './src/components/rightArea/RightArea'; export { default as TrackChangeEnable } from './src/components/trackChanges/TrackChangeEnable'; + +export { default as InsertTableTool } from './src/ui/tables/InsertTableTool'; + +export { default as CreateTable } from './src/components/tables/CreateTable'; diff --git a/wax-prosemirror-components/src/components/tables/CreateTable.js b/wax-prosemirror-components/src/components/tables/CreateTable.js new file mode 100644 index 000000000..d60a4e00f --- /dev/null +++ b/wax-prosemirror-components/src/components/tables/CreateTable.js @@ -0,0 +1,78 @@ +/* eslint react/prop-types: 0 */ +import React, { useState, useContext } from 'react'; +import styled from 'styled-components'; +import { ButtonStyles } from 'wax-prosemirror-themes'; +import { WaxContext } from 'wax-prosemirror-core'; +import { Commands } from 'wax-prosemirror-utilities'; +import InsertTableTool from '../../ui/tables/InsertTableTool'; + +const ButtonStyled = styled.button` + ${ButtonStyles}; + opacity: ${props => (props.select ? 1 : 0.4)}; + pointer-events: ${props => (props.select ? 'default' : 'none')}; + color: ${props => (props.isActive ? 'white' : props.theme.colorButton)}; + background-color: ${props => + props.isActive ? props.theme.colorPrimary : 'transparent'}; + &:hover { + background-color: ${props => + props.isActive ? props.theme.colorPrimary : 'transparent'}; + } +`; + +const InsertTableToolContainer = styled.div` + top: 50px; + position: absolute; + height: auto; + width: 167px; + display: block !important; +`; + +const CreateTable = ({ view = {}, item }) => { + const { + view: { main }, + activeViewId, + } = useContext(WaxContext); + if (item.onlyOnMain) { + view = main; + } + + const { state, dispatch } = view; + + const [isTableToolDisplayed, setTableToolDisplay] = useState(false); + + const showHideTable = () => { + setTableToolDisplay(!isTableToolDisplayed); + }; + + const CreateButton = ( + <ButtonStyled + type="button" + isActive={item.active && item.active(view.state)} + title={item.title} + disabled={item.enable && !item.enable(view.state)} + onMouseDown={e => { + e.preventDefault(); + showHideTable(); + }} + select={item.select && item.select(view.state, activeViewId)} + > + {item.content} + </ButtonStyled> + ); + return isTableToolDisplayed ? ( + <> + {CreateButton} + <InsertTableToolContainer> + <InsertTableTool + onGridSelect={colRows => { + return Commands.createTable(colRows, state, dispatch); + }} + /> + </InsertTableToolContainer> + </> + ) : ( + <>{CreateButton}</> + ); +}; + +export default CreateTable; diff --git a/wax-prosemirror-components/src/ui/tables/InsertTableTool.js b/wax-prosemirror-components/src/ui/tables/InsertTableTool.js index 149387583..1d29da5b3 100644 --- a/wax-prosemirror-components/src/ui/tables/InsertTableTool.js +++ b/wax-prosemirror-components/src/ui/tables/InsertTableTool.js @@ -226,8 +226,10 @@ class TableGridSizeEditor extends React.PureComponent { } const wrapperStyle = { + background: '#fff', border: '1px solid gray', boxSizing: 'border-box', + display: 'block', position: 'absolute', zIndex: 2, }; diff --git a/wax-prosemirror-services/src/TablesService/InsertTableService/InsertTableService.js b/wax-prosemirror-services/src/TablesService/InsertTableService/InsertTableService.js index 98cce559e..d2214f8cd 100644 --- a/wax-prosemirror-services/src/TablesService/InsertTableService/InsertTableService.js +++ b/wax-prosemirror-services/src/TablesService/InsertTableService/InsertTableService.js @@ -1,36 +1,36 @@ -import Service from "../../Service"; -import { tableNodes, goToNextCell } from "prosemirror-tables"; -import Table from "./Table"; +import Service from '../../Service'; +import { tableNodes, goToNextCell } from 'prosemirror-tables'; +import Table from './Table'; class InsertTableService extends Service { boot() { - const shortCuts = this.container.get("ShortCuts"); + const shortCuts = this.container.get('ShortCuts'); shortCuts.addShortCut({ Tab: goToNextCell(1), - "Shift-Tab": goToNextCell(-1) + 'Shift-Tab': goToNextCell(-1), }); } register() { - this.container.bind("Table").to(Table); + this.container.bind('Table').to(Table); const { table, table_row, table_cell, table_header } = tableNodes({ - tableGroup: "block", - cellContent: "block+" + tableGroup: 'block', + cellContent: 'block+', }); - const createNode = this.container.get("CreateNode"); + const createNode = this.container.get('CreateNode'); createNode({ - table + table, }); createNode({ - table_row + table_row, }); createNode({ - table_cell + table_cell, }); createNode({ - table_header + table_header, }); } } diff --git a/wax-prosemirror-services/src/TablesService/InsertTableService/Table.js b/wax-prosemirror-services/src/TablesService/InsertTableService/Table.js index 00ae9ee39..a49047d1d 100644 --- a/wax-prosemirror-services/src/TablesService/InsertTableService/Table.js +++ b/wax-prosemirror-services/src/TablesService/InsertTableService/Table.js @@ -1,6 +1,10 @@ +import React from 'react'; +import { isEmpty } from 'lodash'; +import { v4 as uuidv4 } from 'uuid'; import { Commands } from 'wax-prosemirror-utilities'; import { injectable } from 'inversify'; -import { icons } from 'wax-prosemirror-components'; +import { icons, CreateTable } from 'wax-prosemirror-components'; + import Tools from '../../lib/Tools'; export default @@ -11,9 +15,7 @@ class Table extends Tools { name = 'Table'; get run() { - return (state, dispatch) => { - return Commands.createTable(state, dispatch); - }; + return (state, dispatch) => {}; } select = (state, activeViewId) => { @@ -26,4 +28,12 @@ class Table extends Tools { return Commands.canInsert(state.config.schema.nodes.table)(state); }; } + + renderTool(view) { + if (isEmpty(view)) return null; + + return this._isDisplayed ? ( + <CreateTable key={uuidv4()} item={this.toJSON()} view={view} /> + ) : null; + } } diff --git a/wax-prosemirror-utilities/src/commands/Commands.js b/wax-prosemirror-utilities/src/commands/Commands.js index b5ba6a382..b4cc52255 100644 --- a/wax-prosemirror-utilities/src/commands/Commands.js +++ b/wax-prosemirror-utilities/src/commands/Commands.js @@ -62,17 +62,14 @@ const canInsert = type => state => { return false; }; -const createTable = (state, dispatch) => { - let rowCount = window && window.prompt('How many rows?', 2); - let colCount = window && window.prompt('How many columns?', 2); - +const createTable = (colsRows, state, dispatch) => { const cells = []; - while (colCount--) { + while (colsRows.cols--) { cells.push(state.config.schema.nodes.table_cell.createAndFill()); } const rows = []; - while (rowCount--) { + while (colsRows.rows--) { rows.push(state.config.schema.nodes.table_row.createAndFill(null, cells)); } -- GitLab