tableGroup.tsx
TLDR
This file defines a React component called TableGroup
which represents a group of cards in a table. It handles the rendering of the table group header row and the table rows. It also includes several event handlers for dragging and dropping cards within the group and to other groups.
Methods
None
Classes
None
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
/* eslint-disable max-lines */
import React from 'react'
import {useDrop} from 'react-dnd'
import {Board, IPropertyOption, IPropertyTemplate, BoardGroup} from '../../blocks/board'
import {BoardView} from '../../blocks/boardView'
import {Card} from '../../blocks/card'
import TableGroupHeaderRow from './tableGroupHeaderRow'
import TableRows from './tableRows'
type Props = {
board: Board
activeView: BoardView
groupByProperty?: IPropertyTemplate
group: BoardGroup
readonly: boolean
selectedCardIds: string[]
cardIdToFocusOnRender: string
hideGroup: (groupByOptionId: string) => void
addCard: (groupByOptionId?: string) => Promise<void>
showCard: (cardId?: string) => void
propertyNameChanged: (option: IPropertyOption, text: string) => Promise<void>
onCardClicked: (e: React.MouseEvent, card: Card) => void
onDropToGroupHeader: (srcOption: IPropertyOption, dstOption?: IPropertyOption) => void
onDropToCard: (srcCard: Card, dstCard: Card) => void
onDropToGroup: (srcCard: Card, groupID: string, dstCardID: string) => void
}
const TableGroup = (props: Props): JSX.Element => {
const {board, activeView, group, onDropToGroup, groupByProperty} = props
const groupId = group.option.id
const [{isOver}, drop] = useDrop(() => ({
accept: 'card',
collect: (monitor) => ({
isOver: monitor.isOver(),
}),
drop: (item: Card, monitor) => {
if (monitor.isOver({shallow: true})) {
onDropToGroup(item, groupId, '')
}
},
}), [onDropToGroup, groupId])
let className = 'octo-table-group'
if (isOver) {
className += ' dragover'
}
return (
<div
ref={drop}
className={className}
key={group.option.id}
>
<TableGroupHeaderRow
group={group}
board={board}
activeView={activeView}
groupByProperty={groupByProperty}
hideGroup={props.hideGroup}
addCard={props.addCard}
readonly={props.readonly}
propertyNameChanged={props.propertyNameChanged}
onDrop={props.onDropToGroupHeader}
/>
{(group.cards.length > 0) &&
<TableRows
board={board}
activeView={activeView}
cards={group.cards}
selectedCardIds={props.selectedCardIds}
readonly={props.readonly}
cardIdToFocusOnRender={props.cardIdToFocusOnRender}
showCard={props.showCard}
addCard={props.addCard}
onCardClicked={props.onCardClicked}
onDrop={props.onDropToCard}
/>}
</div>
)
}
export default React.memo(TableGroup)