// Copyright (C) 2020-2021 Intel Corporation // // SPDX-License-Identifier: MIT import React from 'react'; import Text from 'antd/lib/typography/Text'; import Checkbox, { CheckboxChangeEvent } from 'antd/lib/checkbox'; import Select, { SelectValue } from 'antd/lib/select'; import Radio, { RadioChangeEvent } from 'antd/lib/radio'; import Input from 'antd/lib/input'; import GlobalHotKeys, { KeyMap } from 'utils/mousetrap-react'; import consts from 'consts'; interface InputElementParameters { clientID: number; attrID: number; inputType: string; values: string[]; currentValue: string; onChange(value: string): void; } function renderInputElement(parameters: InputElementParameters): JSX.Element { const { inputType, attrID, clientID, values, currentValue, onChange, } = parameters; const renderCheckbox = (): JSX.Element => ( <> Checkbox:
onChange(event.target.checked ? 'true' : 'false')} checked={currentValue === 'true'} />
); const renderSelect = (): JSX.Element => ( <> Values:
); const renderRadio = (): JSX.Element => ( <> Values:
onChange(event.target.value)}> {values.map( (value: string): JSX.Element => ( {value === consts.UNDEFINED_ATTRIBUTE_VALUE ? consts.NO_BREAK_SPACE : value} ), )}
); const handleKeydown = (event: React.KeyboardEvent): void => { if (['ArrowDown', 'ArrowUp', 'ArrowLeft', 'ArrowRight', 'Tab', 'Shift', 'Control'].includes(event.key)) { event.preventDefault(); const copyEvent = new KeyboardEvent('keydown', event); window.document.dispatchEvent(copyEvent); } }; const renderText = (): JSX.Element => ( <> {inputType === 'number' ? Number: : Text: }
) => { const { value } = event.target; if (inputType === 'number') { if (value !== '') { const numberValue = +value; if (!Number.isNaN(numberValue)) { onChange(`${numberValue}`); } } } else { onChange(value); } }} onKeyDown={handleKeydown} />
); let element = null; if (inputType === 'checkbox') { element = renderCheckbox(); } else if (inputType === 'select') { element = renderSelect(); } else if (inputType === 'radio') { element = renderRadio(); } else { element = renderText(); } return
{element}
; } interface ListParameters { inputType: string; values: string[]; onChange(value: string): void; } function renderList(parameters: ListParameters): JSX.Element | null { const { inputType, values, onChange } = parameters; if (inputType === 'checkbox') { const sortedValues = ['true', 'false']; if (values[0].toLowerCase() !== 'true') { sortedValues.reverse(); } const keyMap: KeyMap = {}; const handlers: { [key: string]: (keyEvent?: KeyboardEvent) => void; } = {}; sortedValues.forEach((value: string, index: number): void => { const key = `SET_${index}_VALUE`; keyMap[key] = { name: `Set value "${value}"`, description: `Change current value for the attribute to "${value}"`, sequences: [`${index}`], action: 'keydown', }; handlers[key] = (event: KeyboardEvent | undefined) => { if (event) { event.preventDefault(); } onChange(value); }; }); return (
0: {` ${sortedValues[0]}`}
1: {` ${sortedValues[1]}`}
); } if (inputType === 'radio' || inputType === 'select') { const keyMap: KeyMap = {}; const handlers: { [key: string]: (keyEvent?: KeyboardEvent) => void; } = {}; const filteredValues = values.filter((value: string): boolean => value !== consts.UNDEFINED_ATTRIBUTE_VALUE); filteredValues.slice(0, 10).forEach((value: string, index: number): void => { const key = `SET_${index}_VALUE`; keyMap[key] = { name: `Set value "${value}"`, description: `Change current value for the attribute to "${value}"`, sequences: [`${index}`], action: 'keydown', }; handlers[key] = (event: KeyboardEvent | undefined) => { if (event) { event.preventDefault(); } onChange(value); }; }); return (
{filteredValues.map( (value: string, index: number): JSX.Element => (
{`${index}:`} {` ${value}`}
), )}
); } if (inputType === 'number') { return (
From: {` ${values[0]}`}
To: {` ${values[1]}`}
Step: {` ${values[2]}`}
); } return null; } interface Props { clientID: number; attribute: any; currentValue: string; onChange(value: string): void; } function AttributeEditor(props: Props): JSX.Element { const { attribute, currentValue, onChange, clientID, } = props; const { inputType, values, id: attrID } = attribute; return (
{renderList({ values, inputType, onChange })}
{renderInputElement({ clientID, attrID, inputType, currentValue, values, onChange, })}
); } export default React.memo(AttributeEditor);