Spaces:
Sleeping
Sleeping
| // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. | |
| // See LICENSE.txt for license information. | |
| import React from 'react' | |
| import {Board, IPropertyTemplate} from '../../blocks/board' | |
| import {Constants} from '../../constants' | |
| import {Card} from '../../blocks/card' | |
| import {BoardView} from '../../blocks/boardView' | |
| import SortDownIcon from '../../widgets/icons/sortDown' | |
| import SortUpIcon from '../../widgets/icons/sortUp' | |
| import MenuWrapper from '../../widgets/menuWrapper' | |
| import Label from '../../widgets/label' | |
| import {useSortable} from '../../hooks/sortable' | |
| import {Utils} from '../../utils' | |
| import HorizontalGrip from './horizontalGrip' | |
| import './table.scss' | |
| import TableHeaderMenu from './tableHeaderMenu' | |
| import {useColumnResize} from './tableColumnResizeContext' | |
| type Props = { | |
| readonly: boolean | |
| sorted: 'up'|'down'|'none' | |
| name: React.ReactNode | |
| board: Board | |
| activeView: BoardView | |
| cards: Card[] | |
| views: BoardView[] | |
| template: IPropertyTemplate | |
| onDrop: (template: IPropertyTemplate, container: IPropertyTemplate) => void | |
| onAutoSizeColumn: (columnID: string, headerWidth: number) => void | |
| } | |
| const TableHeader = (props: Props): JSX.Element => { | |
| const [isDragging, isOver, columnRef] = useSortable('column', props.template, !props.readonly, props.onDrop) | |
| const columnResize = useColumnResize() | |
| const onAutoSizeColumn = (templateId: string) => { | |
| let width = Constants.minColumnWidth | |
| if (columnRef.current) { | |
| const {fontDescriptor, padding} = Utils.getFontAndPaddingFromCell(columnRef.current) | |
| const textWidth = Utils.getTextWidth(columnRef.current.innerText.toUpperCase(), fontDescriptor) | |
| width = textWidth + padding | |
| } | |
| props.onAutoSizeColumn(templateId, width) | |
| } | |
| let className = 'octo-table-cell header-cell' | |
| if (isOver) { | |
| className += ' dragover' | |
| } | |
| const templateId = props.template.id | |
| return ( | |
| <div | |
| className={className} | |
| style={{ | |
| overflow: 'unset', | |
| opacity: isDragging ? 0.5 : 1, | |
| width: columnResize.width(templateId), | |
| }} | |
| ref={(ref) => { | |
| if (ref && templateId !== Constants.titleColumnId) { | |
| (columnRef as React.MutableRefObject<HTMLDivElement>).current = ref | |
| } | |
| columnResize.updateRef(Constants.tableHeaderId, templateId, ref) | |
| }} | |
| > | |
| <MenuWrapper disabled={props.readonly}> | |
| <Label> | |
| {props.name} | |
| {props.sorted === 'up' && <SortUpIcon/>} | |
| {props.sorted === 'down' && <SortDownIcon/>} | |
| </Label> | |
| <TableHeaderMenu | |
| board={props.board} | |
| activeView={props.activeView} | |
| views={props.views} | |
| cards={props.cards} | |
| templateId={templateId} | |
| /> | |
| </MenuWrapper> | |
| <div className='octo-spacer'/> | |
| {!props.readonly && | |
| <HorizontalGrip | |
| templateId={templateId} | |
| columnWidth={props.activeView.fields.columnWidths[templateId] || 0} | |
| onAutoSizeColumn={onAutoSizeColumn} | |
| /> | |
| } | |
| </div> | |
| ) | |
| } | |
| export default React.memo(TableHeader) | |