devexpress-reporting-react
Version:
DevExpress Reporting React provides the capability to develop a reporting application to create and customize reports.
65 lines (64 loc) • 2.89 kB
JavaScript
import React from 'react';
import { getParentContainer } from '@devexpress/analytics-core/widgets/_utils';
import { extend } from '@devexpress/analytics-core/analytics-internal-native';
export const useDropDownOptions = (ref, mapper) => {
const [dropDownOptions, setDropDownOptions] = React.useState({});
React.useEffect(() => {
const widget = ref.current;
if (!widget)
return;
const element = widget.instance().element();
const container = getParentContainer(element);
setDropDownOptions(mapper({ element, container }));
}, []);
return dropDownOptions;
};
const useEditorExtendedOptions = (ref, data, getPrivateWidgetOptions) => {
React.useEffect(() => {
if (!ref.current || !(data.extendedOptions || getPrivateWidgetOptions()))
return;
const dxWidget = ref.current.instance();
dxWidget.beginUpdate();
const options = extend(true, {}, getPrivateWidgetOptions(), data.extendedOptions);
dxWidget.option(options);
dxWidget.endUpdate();
}, [data.extendedOptions]);
};
const onPropertyChanged = (expectedWidgetOptions, widgetOptionsState, setWidgetOptionsState) => {
const nextWidgetState = { ...widgetOptionsState };
for (const name in expectedWidgetOptions) {
if (typeof expectedWidgetOptions[name] !== 'function' && expectedWidgetOptions[name] !== widgetOptionsState[name]) {
if (Array.isArray(expectedWidgetOptions[name])) {
if (JSON.stringify(widgetOptionsState[name]) !== JSON.stringify(expectedWidgetOptions[name]))
nextWidgetState[name] = expectedWidgetOptions[name];
}
else {
nextWidgetState[name] = expectedWidgetOptions[name];
}
}
}
setWidgetOptionsState(nextWidgetState);
};
export const useEditorOptions = (ref, data, args) => {
const { getOptions, getEditorOptions, getPrivateWidgetOptions = () => null } = args;
const getExpectedOptions = () => {
if (getOptions)
return getOptions();
return data.getOptions(getEditorOptions());
};
const [options, setOptions] = React.useState(getExpectedOptions());
React.useEffect(() => {
const model = data.getModel();
return model.events.on('propertyChanged', () => onPropertyChanged(getExpectedOptions(), options, setOptions));
}, [data]);
useEditorExtendedOptions(ref, data, getPrivateWidgetOptions);
return options;
};
export const useValidatorOptions = (data) => {
const getOptions = () => data.getValidatorOptions(data.validatorOptions || { validationRules: data.validationRules || [] });
const [validationOptions, setValidationOptions] = React.useState(getOptions());
React.useEffect(() => {
setValidationOptions(getOptions());
}, [data]);
return validationOptions;
};