mirror of
https://github.com/getredash/redash.git
synced 2026-05-09 12:01:08 -04:00
* 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
51 lines
1.2 KiB
JavaScript
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>;
|
|
}
|
|
}
|