Files
redash/client/app/components/DynamicComponent.jsx
Levko Kravets ac68fe1a6d Migrate Dashboards/Queries/Users list pages to React (#3381)
* Refine existing implementation of dashboards/queries/users lists and a common base controller

* Migrate common list page controller to React and refactor it's logic

* Migrate Dashboard list page to React

* Migrate Queries list page to React

* Migrate Users list page to React

* Remove react-timeago dependency

* Use composition instead of inheritance

* Refine implementation

* Merge sidebar into single component

* Refine column definitions

* Use simple controller instead of React context

* Refine implementation

* Restore changes from getredash/redash#2888

* Tweak Users list page

* Ability to render dynamically defined components

* Tweak users list page

* User list page for non-admins

* Fix: ItemsTable ignores isAvailable field

* Refine implementation

* Refine implementation

* Implement LiveItemsList as higher order component

* Some fixes

* Move some definitions to a better place

* Some fixes

* Refine components

* Refine UsersList page

* More comments for a god of comments

* Fix wrong tables size on smaller screens

* Tweak tables
2019-02-05 21:13:32 +02:00

51 lines
1.2 KiB
JavaScript

import { isFunction, isString } from 'lodash';
import React from 'react';
import PropTypes from 'prop-types';
const componentsRegistry = new Map();
const activeInstances = new Set();
export function registerComponent(name, component) {
if (isString(name) && (name !== '')) {
componentsRegistry[name] = isFunction(component) ? component : null;
// Refresh active DynamicComponent instances which use this component
activeInstances.forEach((dynamicComponent) => {
if (dynamicComponent.props.name === name) {
dynamicComponent.forceUpdate();
}
});
}
}
export function unregisterComponent(name) {
registerComponent(name, null);
}
export default class DynamicComponent extends React.Component {
static propTypes = {
name: PropTypes.string.isRequired,
children: PropTypes.node,
};
static defaultProps = {
children: null,
};
componentDidMount() {
activeInstances.add(this);
}
componentWillUnmount() {
activeInstances.delete(this);
}
render() {
const { name, children, ...props } = this.props;
const RealComponent = componentsRegistry.get(name);
if (!RealComponent) {
return null;
}
return <RealComponent {...props}>{children}</RealComponent>;
}
}