UNPKG

@itwin/itwinui-react

Version:

A react component library for iTwinUI

125 lines (124 loc) 3.89 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true, }); Object.defineProperty(exports, 'useColumnDragAndDrop', { enumerable: true, get: function () { return useColumnDragAndDrop; }, }); const _reacttable = require('react-table'); const _styles = require('../../../styles.js'); const leftClassName = _styles.styles['iui-table-reorder-column-left']; const rightClassName = _styles.styles['iui-table-reorder-column-right']; const REORDER_ACTIONS = { columnDragStart: 'columnDragStart', columnDragEnd: 'columnDragEnd', }; const useColumnDragAndDrop = (isEnabled) => (hooks) => { hooks.getDragAndDropProps = [defaultGetDragAndDropProps(isEnabled)]; hooks.stateReducers.push(reducer); hooks.useInstance.push(useInstance); }; const defaultGetDragAndDropProps = (isEnabled) => (props, { instance, header }) => { if (!isEnabled || header.disableReordering) return props; let onDragStart = () => { instance.dispatch({ type: REORDER_ACTIONS.columnDragStart, columnIndex: instance.flatHeaders.indexOf(header), }); }; let setOnDragColumnStyle = (event, position) => { let columnElement = event.currentTarget; if ('left' === position) { columnElement.classList.remove(rightClassName); columnElement.classList.add(leftClassName); } else if ('right' === position) { columnElement.classList.remove(leftClassName); columnElement.classList.add(rightClassName); } else { columnElement.classList.remove(leftClassName); columnElement.classList.remove(rightClassName); } }; let reorderColumns = (tableColumns, srcIndex, dstIndex) => { let newTableColumns = [...tableColumns]; let [removed] = newTableColumns.splice(srcIndex, 1); newTableColumns.splice(dstIndex, 0, removed); return newTableColumns; }; let onDragOver = (event) => { event.preventDefault(); let headerIndex = instance.flatHeaders.indexOf(header); if (instance.state.columnReorderStartIndex !== headerIndex) setOnDragColumnStyle( event, instance.state.columnReorderStartIndex > headerIndex ? 'left' : 'right', ); }; let onDragLeave = (event) => { setOnDragColumnStyle(event); }; let onDrop = (event) => { event.preventDefault(); setOnDragColumnStyle(event); let columnIds = instance.allColumns.map((x) => x.id); let srcIndex = instance.state.columnReorderStartIndex; let dstIndex = columnIds.findIndex((x) => x === header.id); if (srcIndex === dstIndex || -1 === srcIndex || -1 === dstIndex) return; instance.setColumnOrder(reorderColumns(columnIds, srcIndex, dstIndex)); instance.dispatch({ type: REORDER_ACTIONS.columnDragEnd, columnIndex: -1, }); }; return [ props, { draggable: true, onDragStart, onDragOver, onDragLeave, onDrop, }, ]; }; const reducer = (newState, action) => { switch (action.type) { case _reacttable.actions.init: return { ...newState, columnReorderStartIndex: -1, }; case REORDER_ACTIONS.columnDragStart: return { ...newState, columnReorderStartIndex: action.columnIndex, }; case REORDER_ACTIONS.columnDragEnd: return { ...newState, columnReorderStartIndex: -1, }; default: return newState; } }; const useInstance = (instance) => { let { flatHeaders, getHooks } = instance; let getInstance = (0, _reacttable.useGetLatest)(instance); flatHeaders.forEach((header) => { header.getDragAndDropProps = (0, _reacttable.makePropGetter)( getHooks().getDragAndDropProps, { instance: getInstance(), header, }, ); }); };