// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. import React, {useState, useRef, useEffect} from 'react' import {injectIntl, IntlShape} from 'react-intl' import {PropertyType} from '../blocks/board' import {Utils} from '../utils' import Menu from '../widgets/menu' import './propertyMenu.scss' type Props = { propertyId: string propertyName: string propertyType: PropertyType onNameChanged: (newName: string) => void onTypeChanged: (newType: PropertyType) => void onDelete: (id: string) => void intl: IntlShape } function typeDisplayName(intl: IntlShape, type: PropertyType): string { switch (type) { case 'text': return intl.formatMessage({id: 'PropertyType.Text', defaultMessage: 'Text'}) case 'number': return intl.formatMessage({id: 'PropertyType.Number', defaultMessage: 'Number'}) case 'select': return intl.formatMessage({id: 'PropertyType.Select', defaultMessage: 'Select'}) case 'multiSelect': return intl.formatMessage({id: 'PropertyType.MultiSelect', defaultMessage: 'Multi Select'}) case 'person': return intl.formatMessage({id: 'PropertyType.Person', defaultMessage: 'Person'}) case 'file': return intl.formatMessage({id: 'PropertyType.File', defaultMessage: 'File or Media'}) case 'checkbox': return intl.formatMessage({id: 'PropertyType.Checkbox', defaultMessage: 'Checkbox'}) case 'url': return intl.formatMessage({id: 'PropertyType.URL', defaultMessage: 'URL'}) case 'email': return intl.formatMessage({id: 'PropertyType.Email', defaultMessage: 'Email'}) case 'phone': return intl.formatMessage({id: 'PropertyType.Phone', defaultMessage: 'Phone'}) case 'createdTime': return intl.formatMessage({id: 'PropertyType.CreatedTime', defaultMessage: 'Created Time'}) case 'createdBy': return intl.formatMessage({id: 'PropertyType.CreatedBy', defaultMessage: 'Created By'}) case 'updatedTime': return intl.formatMessage({id: 'PropertyType.UpdatedTime', defaultMessage: 'Updated Time'}) case 'updatedBy': return intl.formatMessage({id: 'PropertyType.UpdatedBy', defaultMessage: 'Updated By'}) default: { Utils.assertFailure(`typeDisplayName, unhandled type: ${type}`) return type } } } function typeMenuTitle(intl: IntlShape, type: PropertyType): string { return `${intl.formatMessage({id: 'PropertyMenu.typeTitle', defaultMessage: 'Type'})}: ${typeDisplayName(intl, type)}` } const PropertyMenu = React.memo((props: Props) => { const {intl} = props const nameTextbox = useRef(null) const [name, setName] = useState(props.propertyName) const deleteText = intl.formatMessage({ id: 'PropertyMenu.Delete', defaultMessage: 'Delete', }) useEffect(() => { nameTextbox.current?.focus() nameTextbox.current?.setSelectionRange(0, name.length) }, []) return ( e.stopPropagation()} onChange={(e) => setName(e.target.value)} value={name} onBlur={() => props.onNameChanged(name)} onKeyDown={(e) => { if (e.keyCode === 13 || e.keyCode === 27) { props.onNameChanged(name) e.stopPropagation() } }} /> {props.intl.formatMessage({id: 'PropertyMenu.changeType', defaultMessage: 'Change property type'})} props.onTypeChanged('text')} /> props.onTypeChanged('number')} /> props.onTypeChanged('email')} /> props.onTypeChanged('phone')} /> props.onTypeChanged('url')} /> props.onTypeChanged('select')} /> props.onTypeChanged('createdTime')} /> props.onTypeChanged('updatedTime')} /> props.onDelete(props.propertyId)} /> ) }) export default injectIntl(PropertyMenu)