@adaptabletools/adaptable
Version:
Powerful AG Grid extension which provides advanced, cutting-edge functionality to meet all DataGrid requirements
128 lines (127 loc) • 8.31 kB
JavaScript
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
import { useEffect, useLayoutEffect, useRef, useState } from 'react';
import { useAdaptable } from '../AdaptableContext';
import { ADAPTABLE_BUTTON_SURFACE_DEFAULTS, AdaptableButtonView, } from '../Components/AdaptableButton';
import { PanelDashboard } from '../Components/Panels/PanelDashboard';
import { AdaptableFormComponent } from '../../components/AdaptableFormComponent/AdaptableFormComponent';
import { getDefaultAdaptableFormData, validateAdaptableForm, } from '../../AdaptableState/Common/AdaptableForm';
export const CustomToolbarCmp = (props) => {
const { api } = useAdaptable();
const [componentRevision, setComponentRevision] = useState(1);
const renderContentContainerId = api.dashboardApi.internalApi.getCustomToolbarRenderContainerId(props.customToolbar.name);
const renderContentContainerRef = useRef(null);
const [renderedContentHTML, setRenderedContentHTML] = useState('');
const buttonsContainerId = api.dashboardApi.internalApi.getCustomToolbarButtonsContainerId(props.customToolbar.name);
const componentContainerId = api.dashboardApi.internalApi.getCustomToolbarComponentContainerId(props.customToolbar.name);
const componentContainerRef = useRef(null);
const formContainerId = `${buttonsContainerId}-form`;
const [toolbarFormData, setToolbarFormData] = useState(() => props.customToolbar.toolbarForm
? getDefaultAdaptableFormData(props.customToolbar.toolbarForm)
: {});
useEffect(() => {
if (!props.customToolbar.toolbarForm) {
return;
}
const resetter = () => {
const next = getDefaultAdaptableFormData(props.customToolbar.toolbarForm);
setToolbarFormData(next);
if (props.customToolbar.onToolbarFormChange) {
props.customToolbar.onToolbarFormChange(next, buildToolbarFormContext(next));
}
};
api.dashboardApi.internalApi.registerCustomToolbarFormResetter(props.customToolbar.name, resetter);
return () => {
api.dashboardApi.internalApi.unregisterCustomToolbarFormResetter(props.customToolbar.name, resetter);
};
}, [api, props.customToolbar.name, props.customToolbar.toolbarForm]);
const buildToolbarFormContext = (data) => {
const baseCtx = {
customToolbar: props.customToolbar,
dashboardState: api.dashboardApi.getDashboardState(),
formData: data,
...api.internalApi.buildBaseContext(),
};
const formErrors = props.customToolbar.toolbarForm
? validateAdaptableForm(props.customToolbar.toolbarForm, data, baseCtx)
: {};
baseCtx.formErrors = formErrors;
baseCtx.formIsValid = Object.keys(formErrors).length === 0;
return baseCtx;
};
useLayoutEffect(() => {
const element = renderContentContainerRef.current;
const adaptableApi = api;
if (props.customToolbar.render) {
const html = props.customToolbar.render({
phase: 'onMount',
element,
...adaptableApi.internalApi.buildBaseContext(),
});
setRenderedContentHTML(html);
}
}, [componentRevision, props.dashboardRevision]);
useLayoutEffect(() => {
const element = renderContentContainerRef.current;
const adaptableApi = api;
return () => {
if (props.customToolbar.render) {
props.customToolbar.render({
phase: 'onDestroy',
element,
...adaptableApi.internalApi.buildBaseContext(),
});
}
};
}, []);
useLayoutEffect(() => {
const containerElement = componentContainerRef.current;
const adaptableApi = api;
if (props.customToolbar.frameworkComponent) {
adaptableApi.internalApi.createFrameworkComponent(containerElement, props.customToolbar.frameworkComponent, 'toolbar');
}
const destroyUnsubscribe = adaptableApi.eventApi.on('AdaptableDestroy', () => {
adaptableApi?.internalApi?.destroyFrameworkComponent(containerElement, props.customToolbar.frameworkComponent, 'toolbar');
});
return () => {
destroyUnsubscribe();
if (props.customToolbar.frameworkComponent) {
adaptableApi?.internalApi?.destroyFrameworkComponent(containerElement, props.customToolbar.frameworkComponent, 'toolbar');
}
};
}, []);
const CustomReactFrameworkComponent = props.customToolbar
.frameworkComponent;
return (_jsxs(_Fragment, { children: [props.customToolbar.render && (_jsx("div", { id: renderContentContainerId, ref: renderContentContainerRef, className: `ab-CustomToolbar__rendered-content ab-CustomToolbar--${props.customToolbar.name}`, style: { minHeight: 22 }, dangerouslySetInnerHTML: { __html: renderedContentHTML } })), props.customToolbar.toolbarButtons && (_jsx("div", { id: buttonsContainerId, className: `ab-CustomToolbar__buttons ab-CustomToolbar--${props.customToolbar.name}`, style: { minHeight: 22 }, children: props.customToolbar.toolbarButtons.map((button, index) => {
const dashboardContext = {
customToolbar: props.customToolbar,
dashboardState: api.dashboardApi.getDashboardState(),
...api.internalApi.buildBaseContext(),
};
return (_jsx(AdaptableButtonView, { button: button, context: dashboardContext, api: api, defaults: ADAPTABLE_BUTTON_SURFACE_DEFAULTS.customToolbar, rerenderOnClick: false, style: { marginLeft: index ? 'var(--ab-base-space)' : 0 }, onAfterClick: () => setComponentRevision(componentRevision + 1) }, index));
}) })), props.customToolbar.toolbarForm && (_jsx("div", { id: formContainerId, className: `ab-CustomToolbar__form ab-CustomToolbar--${props.customToolbar.name}`, style: { minHeight: 22 }, children: _jsx(AdaptableFormComponent, { formDef: { ...props.customToolbar.toolbarForm, layout: 'inline' }, data: toolbarFormData, displayTitle: false, api: api, context: buildToolbarFormContext(toolbarFormData), focusFirstButton: false, onChange: (newData) => {
setToolbarFormData(newData);
if (props.customToolbar.onToolbarFormChange) {
props.customToolbar.onToolbarFormChange(newData, buildToolbarFormContext(newData));
}
}, onButtonClick: (button) => {
const ctx = buildToolbarFormContext(toolbarFormData);
const formButton = button;
if (formButton.onClick) {
formButton.onClick(formButton, ctx);
}
setTimeout(() => {
setComponentRevision(componentRevision + 1);
}, 16);
} }) })), CustomReactFrameworkComponent && (_jsx("div", { id: componentContainerId, ref: componentContainerRef, style: { minHeight: 22 }, className: `ab-CustomToolbar__component ab-CustomToolbar--${props.customToolbar.name}`, children: api.gridApi.getVariant() === 'react' ? (_jsx(CustomReactFrameworkComponent, { adaptableApi: api })) : null }))] }));
};
export const CustomToolbarWrapper = (props) => {
const { api } = useAdaptable();
return (_jsx(PanelDashboard, { headerText: props.customToolbar.title ? props.customToolbar.title : '', showConfigureActionButton: props.customToolbar.toolbarActions?.find((b) => b == 'configure') !=
undefined, showCloseActionButton: props.customToolbar.toolbarActions?.find((b) => b == 'close') != undefined, onConfigure: () => {
const customToolbarConfiguredInfo = {
...api.internalApi.buildBaseContext(),
customToolbar: props.customToolbar,
};
api.eventApi.emit('CustomToolbarConfigured', customToolbarConfiguredInfo);
}, accessLevel: api.entitlementApi.getEntitlementAccessLevelForModule('Dashboard'), children: _jsx(CustomToolbarCmp, { ...props }) }));
};