React Select as a Drop-Down Editor
// Set up a custom component that will render React Select
class CustomSelect extends SurveyReact.SurveyQuestionDropdown {
constructor(props) {
super(props);
}
// Convert the `visibleChoices` array to a format supported by React Select
get options() {
return this.question.visibleChoices.map((c) => {
return {value: c.value, label: c.value }
});
}
// Retrieve an option object based on the question value
get selectedOption() {
return this.options.filter((o) => o.value == this.question.value);
}
// Set the question value to the selected option value
onSelectChange = (selectedOption) => {
this.setValueCore(selectedOption.value);
}
renderElement() {
// If the question is non-editable, render a stylized div
if (this.isDisplayMode) {
return (
<div id={this.question.inputId} className={this.question.getControlClass()} disabled>
{(this.question.displayValue || this.question.placeholder)}
</div>);
};
// Otherwise, render the React Select component
return (
<Select id={this.question.inputId}
value={this.selectedOption}
onChange={this.onSelectChange}
options={this.options}
required={this.question.isRequired}
menuPortalTarget={document.querySelector('body')} />
);
}
}
// Register the CustomSelect component as a renderer under a custom name "sv-dropdown-react"
SurveyReact.ReactQuestionFactory.Instance.registerQuestion(
"sv-dropdown-react",
(props) => {
return React.createElement(CustomSelect, props);
}
);
// Register "sv-dropdown-react" as a renderer for questions whose `type` is "dropdown" and `renderAs` property is "dropdown-react"
Survey.RendererFactory.Instance.registerRenderer(
"dropdown",
"dropdown-react",
"sv-dropdown-react"
);
// Set "dropdown-react" as a default value for the `renderAs` property of all "dropdown" questions
Survey.Serializer.findProperty("dropdown", "renderAs").defaultValue = "dropdown-react";
const options = { showLogicTab: true };
var creator = new SurveyCreator.SurveyCreator(options);
ReactDOM.render(
<React.StrictMode>
<SurveyCreator.SurveyCreatorComponent creator={creator} />
</React.StrictMode>,
document.getElementById("creatorElement")
);
creator.JSON = {
"elements": [
{
"type": "dropdown",
"name": "car",
"title": "Which is the brand of your car?",
"showNoneItem": true,
"choices": [
"Ford",
"Vauxhall",
"Volkswagen",
"Nissan",
"Audi",
"Mercedes-Benz",
"BMW",
"Peugeot",
"Toyota",
"Citroen"
]
}
]
};
<!DOCTYPE html>
<html lang="en">
<head>
<title>React Select Input Control as Dropdown Editor | SurveyJS</title>
<meta name="viewport" content="width=device-width" />
<script src="https://unpkg.com/react@17.0.1/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@17.0.1/umd/react-dom.production.min.js"></script>
<script src="https://unpkg.com/@babel/standalone@7.2.5/babel.min.js"></script>
<script src="/DevBuilds/survey-core/survey.core.min.js"></script>
<script src="/DevBuilds/survey-core/survey.i18n.min.js"></script>
<script src="/DevBuilds/survey-react-ui/survey-react-ui.min.js"></script>
<link href="/DevBuilds/survey-core/defaultV2.min.css" type="text/css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.10/ace.min.js" type="text/javascript" charset="utf-8"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.10/ext-language_tools.js" type="text/javascript" charset="utf-8"></script>
<script src="/DevBuilds/survey-creator-core/survey-creator-core.min.js"></script>
<link href="/DevBuilds/survey-creator-core/survey-creator-core.min.css" type="text/css" rel="stylesheet" />
<script src="/DevBuilds/survey-creator-core/survey-creator-core.i18n.min.js"></script>
<script src="/DevBuilds/survey-creator-react/survey-creator-react.min.js"></script>
<style>
:root {
--tab-min-height: 600px;
}
</style>
<link rel="stylesheet" href="./index.css">
<script src="https://cdn.jsdelivr.net/npm/emotion@9.2.12/dist/emotion.umd.min.js"></script>
<script src="https://unpkg.com/prop-types@15.5.10/prop-types.min.js"></script>
<script src="https://unpkg.com/react-input-autosize@2.2.1/dist/react-input-autosize.min.js"></script>
<script src="https://unpkg.com/react-select@2.4.4/dist/react-select.min.js"></script>
</head>
<body style="margin: 0">
<div id="surveyContainer">
<div id="creatorElement" style="height: 100vh;"></div>
</div>
<script type="text/babel" src="./index.js"></script>
</body>
</html>
Loading...
Sorry, we can't retrieve the data from server. Please comeback later.