diff --git a/wax-prosemirror-components/index.js b/wax-prosemirror-components/index.js index 97207281e623a90de64ee687d5f519eb768cbf16..5b4c55391e5c6ea670272dadbcf8b315472d239c 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 0000000000000000000000000000000000000000..d60a4e00f88ffae3a0dbd79b75de761c3d1f10bd --- /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 1493875832e618a06d0d9773ce0d1dda38103a7d..1d29da5b3cfb101848554bb1355a6073f1ff4d53 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 98cce559eea634b4aea192413fd78f4a37b565f1..d2214f8cdd9f2f022a10d8b1a9d41d7c45724aba 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 00ae9ee39ccfc93ae4375254b669c2e1c48a648d..a49047d1d9980fc0bdcea0c52e0e64aa5eda261d 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 b5ba6a3822c151d081e2ad0e4690040591748917..b4cc52255654bea57bf04a7166e661c5c60adea8 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)); }