main

mattermost/focalboard

Last updated at: 29/12/2023 09:41

boardTemplateSelectorItem.tsx

TLDR

This file is a React component called BoardTemplateSelectorItem. It is used to render a single item in a board template selector. It displays the template's icon, title, and provides options to delete or edit the template.

Methods

There are no methods in this file.

Classes

There are no additional classes in this file.

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import React, {useCallback, useState} from 'react'
import {useIntl} from 'react-intl'

import {Board} from '../../blocks/board'
import CompassIcon from '../../widgets/icons/compassIcon'
import IconButton from '../../widgets/buttons/iconButton'
import DeleteIcon from '../../widgets/icons/delete'
import EditIcon from '../../widgets/icons/edit'
import DeleteBoardDialog from '../sidebar/deleteBoardDialog'

import BoardPermissionGate from '../permissions/boardPermissionGate'

import './boardTemplateSelectorItem.scss'
import {Constants, Permission} from '../../constants'

type Props = {
    isActive: boolean
    template: Board
    onSelect: (template: Board) => void
    onDelete: (template: Board) => void
    onEdit: (templateId: string) => void
}

const BoardTemplateSelectorItem = (props: Props) => {
    const {isActive, template, onEdit, onDelete, onSelect} = props
    const intl = useIntl()
    const [deleteOpen, setDeleteOpen] = useState<boolean>(false)
    const onClickHandler = useCallback(() => {
        onSelect(template)
    }, [onSelect, template])
    const onEditHandler = useCallback((e: React.MouseEvent) => {
        e.stopPropagation()
        onEdit(template.id)
    }, [onEdit, template])

    return (
        <div
            className={isActive ? 'BoardTemplateSelectorItem active' : 'BoardTemplateSelectorItem'}
            onClick={onClickHandler}
        >
            <span className='template-icon'>{template.icon || <CompassIcon icon='product-boards'/>}</span>
            <span className='template-name'>{template.title || intl.formatMessage({id: 'View.NewTemplateTitle', defaultMessage: 'Untitled'})}</span>

            {/* don't show template menu options for default templates */}
            {template.createdBy !== Constants.SystemUserID &&
                <div className='actions'>
                    <BoardPermissionGate
                        boardId={template.id}
                        teamId={template.teamId}
                        permissions={[Permission.DeleteBoard]}
                    >
                        <IconButton
                            icon={<DeleteIcon/>}
                            title={intl.formatMessage({id: 'BoardTemplateSelector.delete-template', defaultMessage: 'Delete'})}
                            onClick={(e: React.MouseEvent) => {
                                e.stopPropagation()
                                setDeleteOpen(true)
                            }}
                        />
                    </BoardPermissionGate>
                    <BoardPermissionGate
                        boardId={template.id}
                        teamId={template.teamId}
                        permissions={[Permission.ManageBoardCards, Permission.ManageBoardProperties]}
                    >
                        <IconButton
                            icon={<EditIcon/>}
                            title={intl.formatMessage({id: 'BoardTemplateSelector.edit-template', defaultMessage: 'Edit'})}
                            onClick={onEditHandler}
                        />
                    </BoardPermissionGate>
                </div>}
            {deleteOpen &&
            <DeleteBoardDialog
                boardTitle={template.title}
                onClose={() => setDeleteOpen(false)}
                isTemplate={true}
                onDelete={async () => {
                    onDelete(template)
                }}
            />}
        </div>
    )
}

export default React.memo(BoardTemplateSelectorItem)