You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gristlabs_grist-core/app/client/lib/popupControl.ts

35 lines
1.1 KiB

/**
*
* Returns a popup control allowing to open/close a popup using as content the element returned by
* the given func. Note that the `trigger` option is ignored by this function and that the default
* of the `attach` option is `body` instead of `null`.
*
* It allows you to bind the creation of the popup to a menu item as follow:
* const ctl = popupControl(triggerElem, (ctl) => buildDom(ctl));
* ...
* menuItem(elem => ctl.open(), 'do stuff...')
*/
import { domDispose } from "grainjs";
import { IOpenController, IPopupDomCreator, IPopupOptions, PopupControl } from "popweasel";
export function popupControl(reference: Element, domCreator: IPopupDomCreator, options: IPopupOptions): PopupControl {
function openFunc(openCtl: IOpenController) {
const content = domCreator(openCtl);
function dispose() { domDispose(content); }
return {content, dispose};
}
const ctl = PopupControl.create(null);
ctl.attachElem(reference, openFunc, {
attach: 'body',
boundaries: 'viewport',
...options,
trigger: undefined
});
return ctl;
}