@tomino/dynamic-form-semantic-ui
Version:
Semantic UI form renderer based on dynamic form generation
67 lines • 2.73 kB
JavaScript
import * as React from 'react';
import { observer } from 'mobx-react';
import { EditorContext } from '../editor/editor_context';
import { css } from '../common';
import { Select } from './select';
import { setValue } from '../helpers';
import { parseProps } from './properties_common';
import { renderControl } from './control_factory';
export const dot = (view) => css `
min-width: 7px;
max-width: 7px;
width: 7px;
height: 7px;
background-color: ${view === 'value' ? 'green' : view === 'handler' ? 'red' : 'yellow'};
margin: 0px 6px;
cursor: pointer;
label: dot;
`;
export const Binding = observer((componentProps) => {
const context = React.useContext(EditorContext);
const { formElement } = componentProps;
const { value } = parseProps(componentProps, context);
const [view, setView] = React.useState(value && value.handler ? 'handler' : value && value.source ? 'source' : 'value');
const changeView = React.useCallback(() => {
if (view === 'value') {
formElement.props.options = { handler: 'datasetSource' };
setValue(componentProps, context, '', 'value', '.handler');
setView('source');
}
else if (view === 'source') {
formElement.props.options = { handler: 'optionsHandlers' };
setValue(componentProps, context, '', 'value', '.value');
setView('handler');
}
else if (view === 'handler') {
setValue(componentProps, context, undefined, 'value');
setView('value');
}
}, [componentProps, context, formElement.props.options, view]);
const modifiedFormElement = React.useMemo(() => ({
...formElement,
bound: false,
props: {
...formElement.props,
bound: true,
changeBound: changeView,
view,
options: { handler: view === 'source' ? 'datasetSource' : 'optionsHandlers' }
}
}), [changeView, formElement, view]);
if (formElement.control === 'Table') {
return renderControl({
...componentProps,
formElement: modifiedFormElement
});
}
return (React.createElement("div", { className: "propertyInput" },
view === 'value' ? (renderControl({
...componentProps,
formElement: { ...formElement, bound: false }
})) : (React.createElement(Select, Object.assign({ extra: view }, componentProps, { formElement: modifiedFormElement }))),
React.createElement("div", { className: dot(view), onClick: changeView, title: `Green - Value
Yellow - Bound to data
Red - Handled by a function` })));
});
Binding.displayName = 'Binding';
//# sourceMappingURL=binding.js.map