81 lines
2.4 KiB
JavaScript
81 lines
2.4 KiB
JavaScript
import { Template } from 'meteor/templating';
|
|
import { Blaze } from 'meteor/blaze';
|
|
import { OHIF } from 'meteor/ohif:core';
|
|
|
|
OHIF.ui.showPopover = (templateName, popoverData, options={}) => {
|
|
// Check if the given template exists
|
|
const template = Template[templateName];
|
|
if (!template) {
|
|
throw {
|
|
name: 'TEMPLATE_NOT_FOUND',
|
|
message: `Template ${templateName} not found.`
|
|
};
|
|
}
|
|
|
|
let promise;
|
|
let templateData;
|
|
if (popoverData && popoverData.promise instanceof Promise) {
|
|
// Use the given promise to control the modal
|
|
promise = popoverData.promise;
|
|
templateData = popoverData;
|
|
} else {
|
|
// Create a new promise to control the modal and store its resolve and reject callbacks
|
|
let promiseResolve;
|
|
let promiseReject;
|
|
promise = new Promise((resolve, reject) => {
|
|
promiseResolve = resolve;
|
|
promiseReject = reject;
|
|
});
|
|
|
|
// Render the dialog with the given template passing the promise object and callbacks
|
|
templateData = Object.assign({}, popoverData, {
|
|
promise,
|
|
promiseResolve,
|
|
promiseReject
|
|
});
|
|
}
|
|
|
|
const { element, event } = options;
|
|
const $element = $(element || event.currentTarget);
|
|
|
|
const defaults = {
|
|
content: '',
|
|
html: true,
|
|
trigger: 'manual',
|
|
placement: 'auto',
|
|
delay: {
|
|
show: 300,
|
|
hide: 300
|
|
}
|
|
};
|
|
|
|
const popoverOptions = Object.assign({} , defaults, options);
|
|
popoverOptions.content = Blaze.toHTMLWithData(template, popoverData);
|
|
|
|
$element.popover(popoverOptions);
|
|
|
|
$element.one('shown.bs.popover', function(event) {
|
|
const popoverId = $element.attr('aria-describedby');
|
|
const popover = document.getElementById(popoverId);
|
|
const $popover = $(popover);
|
|
const $popoverContent = $popover.find('.popover-content');
|
|
const dismissPopover = () => $element.popover('hide');
|
|
|
|
$popoverContent.html('');
|
|
|
|
const view = Blaze.renderWithData(template, templateData, $popoverContent[0]);
|
|
$element.one('hidden.bs.popover', () => {
|
|
Blaze.remove(view);
|
|
$element.popover('destroy');
|
|
});
|
|
|
|
promise.then(dismissPopover).catch(dismissPopover);
|
|
});
|
|
|
|
if (popoverOptions.trigger === 'manual') {
|
|
$element.popover('show');
|
|
}
|
|
|
|
return promise;
|
|
};
|