// 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:
onChange(value as string)}
>
{values.map(
(value: string): JSX.Element => (
{value === consts.UNDEFINED_ATTRIBUTE_VALUE ? consts.NO_BREAK_SPACE : value}
),
)}
>
);
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);