import load from 'little-loader'; import { getBrowserWindow } from 'cbioportal-frontend-commons'; import { ICustomTabConfiguration } from '../model/ITabConfiguration'; import { autorun } from 'mobx'; import _ from 'lodash'; export function loadCustomTabDeps(tab: any) { if (tab.pathsToCSS) { tab.pathsToCSS.forEach((str: string) => { $('head').append( `` ); }); } if (tab.pathsToJs) { const proms: Promise[] = []; tab.pathsToJs.forEach((str: string) => { const p = new Promise(function(resolve, reject) { load(str, (err: any) => { if (err) { reject(err); } else { resolve(); } }); }); proms.push(p); }); return Promise.all(proms); } return Promise.resolve(); } export function showCustomTab( div: HTMLDivElement, tab: ICustomTabConfiguration, url: string, store: any, isUnmount = false ) { tab.dependencyPromise = tab.dependencyPromise || loadCustomTabDeps(tab); const runCallback = (tab: ICustomTabConfiguration) => { if (_.isFunction(tab.mountCallback)) { tab.mountCallback(div, tab, url, store, autorun, isUnmount); } else if (tab.mountCallbackName) { if (getBrowserWindow()[tab.mountCallbackName]) { getBrowserWindow()[tab.mountCallbackName]( div, tab, url, store, autorun, isUnmount ); } else { alert(`Callback for tab ${tab.title} not found`); } } }; tab.dependencyPromise?.then(() => { runCallback(tab); }); } // SAMPLE USAGE // const myFeatureGlobal = {}; // function sampleTabCallback(div, tab, url, store, autorun, isUnmount){ // if (isMount) { // myGlobal.myDisposer = autorun(function(){ // if (store.someData.isComplete) { // $(div).append(`
${store.someData.result}
`); // } // }); // } else { // clean up! // myGlobal.myDisposer(); // } // }