pluginTemplateQueryComponentLoader.tsx 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import _ from 'lodash';
  2. import coreModule from 'app/core/core_module';
  3. import { importPluginModule } from './plugin_loader';
  4. import React from 'react';
  5. import ReactDOM from 'react-dom';
  6. import { Provider } from 'react-redux';
  7. import DefaultTemplateQueryCtrl from '../templating/defaultTemplateQueryCtrl';
  8. function WrapInProvider(Component, props) {
  9. return (
  10. <Provider>
  11. <Component {...props} />
  12. </Provider>
  13. );
  14. }
  15. async function loadComponent(module) {
  16. const component = await importPluginModule(module);
  17. if (!component.TemplateQueryCtrl) {
  18. return DefaultTemplateQueryCtrl;
  19. } else {
  20. return component.TemplateQueryCtrl;
  21. }
  22. }
  23. /** @ngInject */
  24. function pluginTemplateQueryComponentLoader(datasourceSrv) {
  25. return {
  26. restrict: 'E',
  27. link: async (scope, elem) => {
  28. const component = await loadComponent(scope.currentDatasource.meta.module);
  29. const props = { datasourceSrv, query: scope.current.query, isValid: scope.current.isValid };
  30. ReactDOM.render(WrapInProvider(component, props), elem[0]);
  31. scope.$on('$destroy', () => {
  32. ReactDOM.unmountComponentAtNode(elem[0]);
  33. });
  34. },
  35. };
  36. }
  37. coreModule.directive('pluginTemplateQueryComponent', pluginTemplateQueryComponentLoader);