@atlaskit/editor-plugin-table
Version:
Table plugin for the @atlaskit/editor
67 lines • 2.57 kB
JavaScript
import classnames from 'classnames';
import { SafePlugin } from '@atlaskit/editor-common/safe-plugin';
import { TableCssClassName as ClassName } from '../../types';
import { getPluginState as getTablePluginState } from '../plugin-factory';
import { setResizeHandlePos } from './commands';
import { handleMouseDown } from './event-handlers';
import { createPluginState, getPluginState } from './plugin-factory';
import { pluginKey } from './plugin-key';
import { getResizeCellPos } from './utils/dom';
export function createPlugin(dispatch, {
lastColumnResizable = true
}, getEditorContainerWidth, getEditorFeatureFlags, api, nodeViewPortalProviderAPI, editorAnalyticsAPI, isTableScalingEnabled, isCommentEditor) {
return new SafePlugin({
key: pluginKey,
state: createPluginState(dispatch, {
lastColumnResizable,
resizeHandlePos: null,
dragging: null,
lastClick: null
}),
props: {
attributes(state) {
const pluginState = getPluginState(state);
return {
class: classnames({
[ClassName.RESIZE_CURSOR]: pluginState.resizeHandlePos !== null,
[ClassName.IS_RESIZING]: !!pluginState.dragging
})
};
},
handleDOMEvents: {
mousedown(view, event) {
const {
state
} = view;
const resizeHandlePos =
// we're setting `resizeHandlePos` via command in unit tests
getPluginState(state).resizeHandlePos || getResizeCellPos(view, event);
const {
dragging
} = getPluginState(state);
let isColumnKeyboardResizeStarted = false;
/*
We need to start listening mouse events if column resize started from keyboard.
This will allow continue resizing via mouse
*/
const {
isKeyboardResize
} = getTablePluginState(state);
if (isKeyboardResize) {
isColumnKeyboardResizeStarted = isKeyboardResize;
}
if (resizeHandlePos !== null && (!dragging || isColumnKeyboardResizeStarted)) {
if (handleMouseDown(view, event, resizeHandlePos, getEditorContainerWidth, getEditorFeatureFlags, isTableScalingEnabled || false, api, nodeViewPortalProviderAPI, editorAnalyticsAPI, isCommentEditor)) {
const {
state,
dispatch
} = view;
return setResizeHandlePos(resizeHandlePos)(state, dispatch);
}
}
return false;
}
}
}
});
}