@atlaskit/editor-plugin-table
Version:
Table plugin for the @atlaskit/editor
159 lines (156 loc) • 6.88 kB
JavaScript
/**
* @jsxRuntime classic
* @jsx jsx
*/
import { Fragment, useCallback } from 'react';
// eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
import { css, jsx } from '@emotion/react';
import { browser as browserLegacy, getBrowserInfo } from '@atlaskit/editor-common/browser';
import { findTable } from '@atlaskit/editor-tables/utils';
import { fg } from '@atlaskit/platform-feature-flags';
import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
import { hoverCell, hoverRows, selectRow, selectRows } from '../../pm-plugins/commands';
import { isTableNested } from '../../pm-plugins/utils/nodes';
import { TableCssClassName as ClassName } from '../../types';
import { DragCornerControlsWithSelection } from './CornerControls/DragCornerControls';
import { FloatingControlsWithSelection } from './FloatingControlsWithSelection';
import NumberColumn from './NumberColumn';
import { DragControlsWithSelection } from './RowControls/DragControls';
var styles = css({
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-unsafe-selectors
'&:has(~ .pm-table-wrapper-no-overflow)': {
marginTop: 0
}
});
// Row controls
export var TableFloatingControls = function TableFloatingControls(_ref) {
var _findTable;
var editorView = _ref.editorView,
tableRef = _ref.tableRef,
tableNode = _ref.tableNode,
isInDanger = _ref.isInDanger,
isResizing = _ref.isResizing,
isNumberColumnEnabled = _ref.isNumberColumnEnabled,
isHeaderRowEnabled = _ref.isHeaderRowEnabled,
isHeaderColumnEnabled = _ref.isHeaderColumnEnabled,
tableActive = _ref.tableActive,
hasHeaderRow = _ref.hasHeaderRow,
hoveredRows = _ref.hoveredRows,
stickyHeader = _ref.stickyHeader,
isDragAndDropEnabled = _ref.isDragAndDropEnabled,
hoveredCell = _ref.hoveredCell,
isTableHovered = _ref.isTableHovered,
tableWrapperWidth = _ref.tableWrapperWidth,
api = _ref.api,
isChromelessEditor = _ref.isChromelessEditor;
var _selectRow = useCallback(function (row, expand) {
var state = editorView.state,
dispatch = editorView.dispatch;
var browser = expValEquals('platform_editor_hydratable_ui', 'isEnabled', true) ? getBrowserInfo() : browserLegacy;
if (browser.ie_version === 11) {
// Ignored via go/ees005
// eslint-disable-next-line @atlaskit/editor/no-as-casting
editorView.dom.blur();
}
selectRow(row, expand)(state, dispatch);
}, [editorView]);
var _selectRows = useCallback(function (rowIndexes) {
var state = editorView.state,
dispatch = editorView.dispatch;
var browser = expValEquals('platform_editor_hydratable_ui', 'isEnabled', true) ? getBrowserInfo() : browserLegacy;
if (browser.ie_version === 11) {
// Ignored via go/ees005
// eslint-disable-next-line @atlaskit/editor/no-as-casting
editorView.dom.blur();
}
selectRows(rowIndexes)(state, dispatch);
}, [editorView]);
var _hoverRows = useCallback(function (rows, danger) {
var state = editorView.state,
dispatch = editorView.dispatch;
hoverRows(rows, danger)(state, dispatch);
}, [editorView]);
// re-use across numbered columns and row controls
var updateCellHoverLocation = useCallback(function (rowIndex) {
var state = editorView.state,
dispatch = editorView.dispatch;
if (tableActive) {
// For context: Whenever we mouse over a column or row drag handle, we will ALWAYS be hovering over the 0 index
// of the opposite dimension. For example; here when we mouse over the row drag handle then we're technically
// also hovering over column 0 index. And vice-versa with columns. This means we don't need to worry about knowing the
// current column index. We can just force it to 0.
hoverCell(rowIndex, 0)(state, dispatch);
}
}, [editorView, tableActive]);
if (!tableRef) {
return null;
}
var stickyTop = stickyHeader && stickyHeader.sticky && hasHeaderRow ? stickyHeader.top : undefined;
var wrapperClassName = isDragAndDropEnabled ? isChromelessEditor ? ClassName.DRAG_ROW_CONTROLS_WRAPPER + ' ' + ClassName.TABLE_CHROMELESS : ClassName.DRAG_ROW_CONTROLS_WRAPPER : ClassName.ROW_CONTROLS_WRAPPER;
var tablePos = (_findTable = findTable(editorView.state.selection)) === null || _findTable === void 0 ? void 0 : _findTable.pos;
// Ignored via go/ees005
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
var isNested = tablePos !== undefined && isTableNested(editorView.state, tablePos);
var shouldShowCornerControls = isNested && !fg('platform_editor_nested_dnd_styles_changes');
return jsx("div", {
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
className: wrapperClassName,
css: [expValEquals('platform_editor_table_sticky_header_improvements', 'cohort', 'test_with_overflow') && !fg('platform_editor_table_sticky_header_patch_7') && styles]
}, jsx("div", {
role: "none",
onMouseDown: function onMouseDown(e) {
return !isDragAndDropEnabled && e.preventDefault();
}
}, isNumberColumnEnabled ? jsx(NumberColumn, {
editorView: editorView,
hoverRows: _hoverRows,
tableRef: tableRef,
tableActive: tableActive,
hoveredRows: hoveredRows,
hasHeaderRow: hasHeaderRow,
isInDanger: isInDanger,
isResizing: isResizing,
selectRow: _selectRow,
updateCellHoverLocation: updateCellHoverLocation,
stickyTop: stickyTop,
isDragAndDropEnabled: isDragAndDropEnabled
}) : null, tableActive && jsx(Fragment, null, isDragAndDropEnabled ? jsx(Fragment, null, shouldShowCornerControls && jsx(DragCornerControlsWithSelection, {
editorView: editorView,
tableRef: tableRef,
isInDanger: isInDanger,
isResizing: isResizing,
api: api
}), jsx(DragControlsWithSelection, {
tableRef: tableRef,
tableNode: tableNode,
hoveredCell: hoveredCell,
isTableHovered: isTableHovered,
editorView: editorView,
tableActive: tableActive,
isInDanger: isInDanger,
isResizing: isResizing
// Ignored via go/ees005
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
,
tableWidth: tableWrapperWidth,
hoverRows: _hoverRows,
selectRow: _selectRow,
selectRows: _selectRows,
updateCellHoverLocation: updateCellHoverLocation,
api: api
})) : jsx(FloatingControlsWithSelection, {
editorView: editorView,
tableRef: tableRef,
isInDanger: isInDanger,
isResizing: isResizing,
isHeaderRowEnabled: isHeaderRowEnabled,
isHeaderColumnEnabled: isHeaderColumnEnabled,
hoveredRows: hoveredRows,
stickyTop: tableActive ? stickyTop : undefined,
tableActive: tableActive,
hoverRows: _hoverRows,
selectRow: _selectRow,
api: api
}))));
};
export default TableFloatingControls;