ToolJet/frontend/src/Editor/Components/Multiselect.jsx
Arpit 67ca8f1461
Feature: disable widgets (#653)
* widgets can be disabled

* removed whitespace

* move to styles definitions

* default values fixed with nullish operator

* proper data attributes

* generic resolver function for widget value

* renamed the style property
2021-09-02 19:41:59 +05:30

74 lines
2.5 KiB
JavaScript

import React, { useState, useEffect } from 'react';
import { resolveReferences, resolveWidgetFieldValue } from '@/_helpers/utils';
import SelectSearch, { fuzzySearch } from 'react-select-search';
export const Multiselect = function Multiselect({
id,
width,
height,
component,
onComponentClick,
currentState,
onComponentOptionChanged
}) {
console.log('currentState', currentState);
const label = component.definition.properties.label.value;
const values = component.definition.properties.option_values.value;
const displayValues = component.definition.properties.display_values.value;
const widgetVisibility = component.definition.styles?.visibility?.value ?? true;
const disabledState = component.definition.styles?.disabledState?.value ?? false;
const parsedDisabledState = typeof disabledState !== 'boolean' ? resolveWidgetFieldValue(disabledState, currentState) : disabledState;
const parsedValues = JSON.parse(values);
const parsedDisplayValues = JSON.parse(displayValues);
const selectOptions = [
...parsedValues.map((value, index) => {
return { name: parsedDisplayValues[index], value: value };
})
];
const currentValueProperty = component.definition.properties.values;
const value = currentValueProperty ? currentValueProperty.value : '';
const [currentValue, setCurrentValue] = useState(value);
let newValue = value;
if (currentValueProperty && currentState) {
newValue = resolveReferences(currentValueProperty.value, currentState, '');
}
let parsedWidgetVisibility = widgetVisibility;
try {
parsedWidgetVisibility = resolveReferences(parsedWidgetVisibility, currentState, []);
} catch (err) { console.log(err); }
useEffect(() => {
setCurrentValue(newValue);
}, [newValue]);
return (
<div className="row g-0" style={{ width, height, display:parsedWidgetVisibility ? '' : 'none' }} onClick={event => {event.stopPropagation(); onComponentClick(id, component)}}>
<div className="col-auto">
<label style={{marginRight: '1rem'}} className="form-label py-2">{label}</label>
</div>
<div className="col px-0">
<SelectSearch
disabled={parsedDisabledState}
options={selectOptions}
value={currentValue}
search={true}
multiple={true}
printOptions="on-focus"
onChange={(newValues) => {
onComponentOptionChanged(component, 'values', newValues);
}}
filterOptions={fuzzySearch}
placeholder="Select.."
/>
</div>
</div>
);
};