* MM-21632: fix toggling interactive dialog boolean My fix for MM-17519 broke the /rendering/ of the boolean toggle, but not the underlying interactive dialog state (and the thrust of the original issue). * MM-21683: fix handling of boolean defaults * unit tests
175 lines
5.5 KiB
JavaScript
175 lines
5.5 KiB
JavaScript
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
import React, {PureComponent} from 'react';
|
|
import PropTypes from 'prop-types';
|
|
|
|
import BoolSetting from 'app/components/widgets/settings/bool_setting';
|
|
import TextSetting from 'app/components/widgets/settings/text_setting';
|
|
import AutocompleteSelector from 'app/components/autocomplete_selector';
|
|
import RadioSetting from 'app/components/widgets/settings/radio_setting';
|
|
|
|
const TEXT_DEFAULT_MAX_LENGTH = 150;
|
|
const TEXTAREA_DEFAULT_MAX_LENGTH = 3000;
|
|
|
|
export default class DialogElement extends PureComponent {
|
|
static propTypes = {
|
|
displayName: PropTypes.string.isRequired,
|
|
name: PropTypes.string.isRequired,
|
|
type: PropTypes.string.isRequired,
|
|
subtype: PropTypes.string,
|
|
placeholder: PropTypes.string,
|
|
helpText: PropTypes.string,
|
|
errorText: PropTypes.node,
|
|
maxLength: PropTypes.number,
|
|
dataSource: PropTypes.string,
|
|
optional: PropTypes.bool,
|
|
options: PropTypes.arrayOf(PropTypes.object),
|
|
value: PropTypes.any,
|
|
onChange: PropTypes.func,
|
|
theme: PropTypes.object,
|
|
isLandscape: PropTypes.bool.isRequired,
|
|
};
|
|
|
|
constructor(props) {
|
|
super(props);
|
|
|
|
this.state = {
|
|
selected: null,
|
|
};
|
|
}
|
|
|
|
onChange = (name, value) => {
|
|
const {type, subtype, onChange} = this.props;
|
|
let newValue = value;
|
|
if (type === 'text' && subtype === 'number') {
|
|
newValue = parseInt(value, 10);
|
|
}
|
|
onChange(name, newValue);
|
|
}
|
|
|
|
handleAutocompleteSelect = (selected) => {
|
|
if (!selected) {
|
|
return;
|
|
}
|
|
|
|
this.setState({selected});
|
|
|
|
const {name, onChange} = this.props;
|
|
onChange(name, selected.value);
|
|
}
|
|
|
|
render() {
|
|
const {
|
|
name,
|
|
type,
|
|
subtype,
|
|
displayName,
|
|
value,
|
|
placeholder,
|
|
helpText,
|
|
errorText,
|
|
optional,
|
|
theme,
|
|
dataSource,
|
|
options,
|
|
isLandscape,
|
|
} = this.props;
|
|
|
|
let {maxLength} = this.props;
|
|
|
|
if (type === 'text' || type === 'textarea') {
|
|
let keyboardType = 'default';
|
|
let multiline = false;
|
|
let secureTextEntry = false;
|
|
if (type === 'text') {
|
|
maxLength = maxLength || TEXT_DEFAULT_MAX_LENGTH;
|
|
|
|
if (subtype === 'email') {
|
|
keyboardType = 'email-address';
|
|
} else if (subtype === 'number') {
|
|
keyboardType = 'numeric';
|
|
} else if (subtype === 'tel') {
|
|
keyboardType = 'phone-pad';
|
|
} else if (subtype === 'url') {
|
|
keyboardType = 'url';
|
|
} else if (subtype === 'password') {
|
|
secureTextEntry = true;
|
|
}
|
|
} else {
|
|
multiline = true;
|
|
maxLength = maxLength || TEXTAREA_DEFAULT_MAX_LENGTH;
|
|
}
|
|
|
|
return (
|
|
<TextSetting
|
|
id={name}
|
|
label={displayName}
|
|
maxLength={maxLength}
|
|
value={String(value || '')}
|
|
placeholder={placeholder}
|
|
helpText={helpText}
|
|
errorText={errorText}
|
|
onChange={this.onChange}
|
|
optional={optional}
|
|
showRequiredAsterisk={true}
|
|
resizable={false}
|
|
theme={theme}
|
|
multiline={multiline}
|
|
keyboardType={keyboardType}
|
|
secureTextEntry={secureTextEntry}
|
|
isLandscape={isLandscape}
|
|
/>
|
|
);
|
|
} else if (type === 'select') {
|
|
return (
|
|
<AutocompleteSelector
|
|
id={name}
|
|
label={displayName}
|
|
dataSource={dataSource}
|
|
options={options}
|
|
optional={optional}
|
|
onSelected={this.handleAutocompleteSelect}
|
|
helpText={helpText}
|
|
errorText={errorText}
|
|
placeholder={placeholder}
|
|
showRequiredAsterisk={true}
|
|
selected={this.state.selected}
|
|
roundedBorders={false}
|
|
isLandscape={isLandscape}
|
|
/>
|
|
);
|
|
} else if (type === 'radio') {
|
|
return (
|
|
<RadioSetting
|
|
id={name}
|
|
label={displayName}
|
|
helpText={helpText}
|
|
errorText={errorText}
|
|
options={options}
|
|
theme={theme}
|
|
default={value}
|
|
onChange={this.onChange}
|
|
isLandscape={isLandscape}
|
|
/>
|
|
);
|
|
} else if (type === 'bool') {
|
|
return (
|
|
<BoolSetting
|
|
id={name}
|
|
label={displayName}
|
|
value={Boolean(value)}
|
|
placeholder={placeholder}
|
|
helpText={helpText}
|
|
errorText={errorText}
|
|
optional={optional}
|
|
theme={theme}
|
|
onChange={this.onChange}
|
|
isLandscape={isLandscape}
|
|
/>
|
|
);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|