From aadc6e61812167ce5c465e984c240dea2ece34e5 Mon Sep 17 00:00:00 2001 From: Krist Wongsuphasawat Date: Wed, 12 Sep 2018 21:05:10 -0700 Subject: [PATCH 01/10] scaffold basic data structures --- .../chart/ChartPluginManager.js | 60 +++++++++ .../chart/components/ErrorMessageFactory.jsx | 33 +++++ .../chart/components/SuperChart.jsx | 123 ++++++++++++++++++ .../chart/models/ChartMetadata.js | 11 ++ .../chart/models/ChartPlugin.js | 73 +++++++++++ .../chart/registries/BuildQueryRegistry.js | 0 .../chart/registries/ChartRegistry.js | 12 ++ .../chart/registries/TransformDataRegistry.js | 0 .../registries/TransformPropsRegistry.js | 0 .../src/superset-ui-core/platform/Plugin.js | 15 +++ .../src/superset-ui-core/platform/Preset.js | 32 +++++ .../src/superset-ui-core/platform/Registry.js | 26 ++++ .../src/superset-ui-core/utils/identity.js | 3 + .../src/superset-ui-core/utils/isRequired.js | 3 + .../superset-ui-core/utils/makeSingleton.js | 10 ++ .../src/visualizations/BigNumber/metadata.js | 7 + .../src/visualizations/BigNumber/plugin.js | 9 ++ 17 files changed, 417 insertions(+) create mode 100644 superset/assets/src/superset-ui-core/chart/ChartPluginManager.js create mode 100644 superset/assets/src/superset-ui-core/chart/components/ErrorMessageFactory.jsx create mode 100644 superset/assets/src/superset-ui-core/chart/components/SuperChart.jsx create mode 100644 superset/assets/src/superset-ui-core/chart/models/ChartMetadata.js create mode 100644 superset/assets/src/superset-ui-core/chart/models/ChartPlugin.js create mode 100644 superset/assets/src/superset-ui-core/chart/registries/BuildQueryRegistry.js create mode 100644 superset/assets/src/superset-ui-core/chart/registries/ChartRegistry.js create mode 100644 superset/assets/src/superset-ui-core/chart/registries/TransformDataRegistry.js create mode 100644 superset/assets/src/superset-ui-core/chart/registries/TransformPropsRegistry.js create mode 100644 superset/assets/src/superset-ui-core/platform/Plugin.js create mode 100644 superset/assets/src/superset-ui-core/platform/Preset.js create mode 100644 superset/assets/src/superset-ui-core/platform/Registry.js create mode 100644 superset/assets/src/superset-ui-core/utils/identity.js create mode 100644 superset/assets/src/superset-ui-core/utils/isRequired.js create mode 100644 superset/assets/src/superset-ui-core/utils/makeSingleton.js create mode 100644 superset/assets/src/visualizations/BigNumber/metadata.js create mode 100644 superset/assets/src/visualizations/BigNumber/plugin.js diff --git a/superset/assets/src/superset-ui-core/chart/ChartPluginManager.js b/superset/assets/src/superset-ui-core/chart/ChartPluginManager.js new file mode 100644 index 0000000000000..764467eb9dc42 --- /dev/null +++ b/superset/assets/src/superset-ui-core/chart/ChartPluginManager.js @@ -0,0 +1,60 @@ +class ChartPluginManager { + constructor() { + this.items = {}; + } + + add(key, value) { + this.items[key] = value; + } + + get(key) { + return this.items[key]; + } + + getMetadata(key) { + const plugin = this.get(key); + return plugin ? plugin.getMetadata() : null; + } + + getAndLoadOrReject(key, load) { + const plugin = this.get(key); + if (plugin) { + return load(plugin); + } + return Promise.reject(`This "${key}" chart is not registered.`); + } +} + +let singleton; + +function getInstance() { + if (!singleton) { + singleton = new ChartPluginManager(); + } + return singleton; +} + +function getMetadata(key) { + return getInstance().getMetadata(key); +} + +function loadComponent(key) { + return getInstance().getAndLoadOrReject( + key, + plugin => plugin.loadComponent(), + ); +} + +function loadTransformProps(key) { + return getInstance().getAndLoadOrReject( + key, + plugin => plugin.loadTransformProps(), + ); +} + +export { + getInstance, + getMetadata, + loadComponent, + loadTransformProps, +}; diff --git a/superset/assets/src/superset-ui-core/chart/components/ErrorMessageFactory.jsx b/superset/assets/src/superset-ui-core/chart/components/ErrorMessageFactory.jsx new file mode 100644 index 0000000000000..3fbce1b9bcaaf --- /dev/null +++ b/superset/assets/src/superset-ui-core/chart/components/ErrorMessageFactory.jsx @@ -0,0 +1,33 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +const propTypes = { + id: PropTypes.string, + className: PropTypes.string, +}; +const defaultProps = { + id: '', + className: '', +}; + +export function createErrorMessage(type, error) { + function ErrorMessage(props) { + const { id, className } = props; + return ( +
+
+ ERROR + Chart type: {type} — + {error} +
+
+ ); + } + ErrorMessage.propTypes = propTypes; + ErrorMessage.defaultProps = defaultProps; + + return ErrorMessage; +} + + +export default ErrorMessage; diff --git a/superset/assets/src/superset-ui-core/chart/components/SuperChart.jsx b/superset/assets/src/superset-ui-core/chart/components/SuperChart.jsx new file mode 100644 index 0000000000000..e7716d8ea7cd9 --- /dev/null +++ b/superset/assets/src/superset-ui-core/chart/components/SuperChart.jsx @@ -0,0 +1,123 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { createErrorMessage } from './ErrorMessageFactory'; +import { loadComponent, loadTransformProps } from './ChartPluginManager'; + +const IDENTITY = x => x; + +const propTypes = { + id: '', + className: PropTypes.string, + type: PropTypes.string.isRequired, + preTransformProps: PropTypes.func, + overrideTransformProps: PropTypes.func, + postTransformProps: PropTypes.func, +}; +const defaultProps = { + id: '', + className: '', + preTransformProps: IDENTITY, + overrideTransformProps: undefined, + postTransformProps: IDENTITY, +}; + +class SuperChart extends React.PureComponent { + constructor(props) { + super(props); + this.state = { + Renderer: null, + transformProps: null, + }; + this.loading = false; + } + + componentDidMount() { + const { type, overrideTransformProps } = this.props; + this.loadChartType(type, overrideTransformProps); + } + + componentWillReceiveProps(nextProps) { + const { type, overrideTransformProps } = this.props; + if (nextProps.type !== type + || nextProps.overrideTransformProps !== overrideTransformProps + ) { + this.loadChartType(nextProps.type, nextProps.overrideTransformProps); + } + } + + loadChartType(type, overrideTransformProps) { + // Clear state + this.setState({ + Renderer: null, + transformProps: null, + }); + this.loading = false; + + if (type) { + const componentPromise = loadComponent(type); + const transformPropsPromise = overrideTransformProps + ? Promise.resolve(overrideTransformProps) + : loadTransformProps(type); + + this.loading = Promise.all([componentPromise, transformPropsPromise]) + .then( + // on success + ([Renderer, transformProps]) => { + this.setState({ Renderer, transformProps }); + }, + // on failure + (error) => { + this.setState({ + Renderer: createErrorMessage(type, error), + transformProps: IDENTITY, + }); + }, + ); + } + } + + render() { + const { + id, + className, + preTransformProps, + overrideTransformProps, + postTransformProps, + ...otherProps + } = this.props; + const type = this.props.type; + + const { Renderer } = this.state; + + // Loaded (both success and failure) + if (Renderer && this.transformProps) { + return ( + + ); + } + + // Loading state + if (this.loading) { + return ( +
+ Loading... +
+ ); + } + + // Initial state + return ( +
+ ); + } +} + +SuperChart.propTypes = propTypes; +SuperChart.defaultProps = defaultProps; + +export default SuperChart; diff --git a/superset/assets/src/superset-ui-core/chart/models/ChartMetadata.js b/superset/assets/src/superset-ui-core/chart/models/ChartMetadata.js new file mode 100644 index 0000000000000..61d0804edfa24 --- /dev/null +++ b/superset/assets/src/superset-ui-core/chart/models/ChartMetadata.js @@ -0,0 +1,11 @@ +export default class ChartMetadata { + constructor({ + name, + description, + thumbnail, + }) { + this.name = name; + this.description = description; + this.thumbnail = thumbnail; + } +} diff --git a/superset/assets/src/superset-ui-core/chart/models/ChartPlugin.js b/superset/assets/src/superset-ui-core/chart/models/ChartPlugin.js new file mode 100644 index 0000000000000..6afa960ad30ab --- /dev/null +++ b/superset/assets/src/superset-ui-core/chart/models/ChartPlugin.js @@ -0,0 +1,73 @@ +import Plugin from '../../platform/Plugin'; +import * as ChartRegistry from '../registries/ChartRegistry'; + +const IDENTITY = x => x; + +export default class ChartPlugin extends Plugin { + constructor({ + key, + metadata, + + // use buildQuery for immediate value + buildQuery = IDENTITY, + // use loadBuildQuery for dynamic import (lazy-loading) + loadBuildQuery, + + // use transformProps for immediate value + transformProps = IDENTITY, + // use loadTransformProps for dynamic import (lazy-loading) + loadTransformProps, + + // use Component for immediate value + Component, + // use loadComponent for dynamic import (lazy-loading) + loadComponent, + } = {}) { + super(key); + this.metadata = metadata; + this.internal = {}; + + this.internal.loadBuildQuery = loadBuildQuery || (() => buildQuery); + this.internal.loadTransformProps = loadTransformProps || (() => transformProps); + + if (loadComponent) { + this.internal.loadComponent = loadComponent; + } else if (Component) { + this.internal.Component = () => Component; + } else { + throw new Error('Component or loadComponent is required'); + } + + this.promises = {}; + } + + getMetadata() { + return this.metadata; + } + + loadBuildQuery() { + if (!this.promises.buildQuery) { + this.promises.buildQuery = Promise.resolve(this.internal.loadBuildQuery()); + } + return this.promises.buildQuery; + } + + loadTransformProps() { + if (!this.promises.transformProps) { + this.promises.transformProps = Promise.resolve(this.internal.loadTransformProps()); + } + return this.promises.transformProps; + } + + loadComponent() { + if (!this.promises.component) { + this.promises.component = Promise.resolve(this.internal.loadComponent()); + } + return this.promises.component; + } + + install(key = this.key) { + super.setInstalledKey(key); + ChartRegistry.getInstance().add(key, this); + } +} diff --git a/superset/assets/src/superset-ui-core/chart/registries/BuildQueryRegistry.js b/superset/assets/src/superset-ui-core/chart/registries/BuildQueryRegistry.js new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/superset/assets/src/superset-ui-core/chart/registries/ChartRegistry.js b/superset/assets/src/superset-ui-core/chart/registries/ChartRegistry.js new file mode 100644 index 0000000000000..ab36a595d869b --- /dev/null +++ b/superset/assets/src/superset-ui-core/chart/registries/ChartRegistry.js @@ -0,0 +1,12 @@ +import Registry from '../../platform/Registry'; +import makeSingleton from '../../utils/makeSingleton'; + +class ChartRegistry extends Registry { + +} + +const getInstance = makeSingleton(ChartRegistry); + +export { + getInstance, +}; diff --git a/superset/assets/src/superset-ui-core/chart/registries/TransformDataRegistry.js b/superset/assets/src/superset-ui-core/chart/registries/TransformDataRegistry.js new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/superset/assets/src/superset-ui-core/chart/registries/TransformPropsRegistry.js b/superset/assets/src/superset-ui-core/chart/registries/TransformPropsRegistry.js new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/superset/assets/src/superset-ui-core/platform/Plugin.js b/superset/assets/src/superset-ui-core/platform/Plugin.js new file mode 100644 index 0000000000000..3a969502ce741 --- /dev/null +++ b/superset/assets/src/superset-ui-core/platform/Plugin.js @@ -0,0 +1,15 @@ +import isRequired from '../utils/isRequired'; + +export default class Plugin { + constructor(key = isRequired('key')) { + this.key = key; + } + + setInstalledKey(key) { + this.installedKey = key; + } + + install(key = this.key) { + this.setInstalledKey(key); + } +} diff --git a/superset/assets/src/superset-ui-core/platform/Preset.js b/superset/assets/src/superset-ui-core/platform/Preset.js new file mode 100644 index 0000000000000..43f6ba414440a --- /dev/null +++ b/superset/assets/src/superset-ui-core/platform/Preset.js @@ -0,0 +1,32 @@ +export default class Preset { + constructor({ name, namespace = '', presets = [], plugins = [] }) { + this.name = name; + this.namespace = namespace; + this.presets = presets + .map(preset => (preset instanceof Preset) ? preset : new Preset(preset)); + this.plugins = plugins; + } + + expandPlugins() { + const allPlugins = {}; + const addPlugin = (plugin) => { + const key = `${this.namespace}${plugin.name}`; + allPlugins[key] = plugin; + }; + this.presets + .map(preset => preset.expandPlugins()) + .forEach((plugins) => { + plugins.forEach(addPlugin); + }); + this.plugins.forEach(addPlugin); + return allPlugins; + } + + install() { + const allPlugins = this.expandPlugins(); + Object.keys(allPlugins) + .forEach((key) => { + allPlugins[key].install(key); + }); + } +} diff --git a/superset/assets/src/superset-ui-core/platform/Registry.js b/superset/assets/src/superset-ui-core/platform/Registry.js new file mode 100644 index 0000000000000..f733caa6b5b47 --- /dev/null +++ b/superset/assets/src/superset-ui-core/platform/Registry.js @@ -0,0 +1,26 @@ +export default class Registry { + constructor(name) { + this.name = name; + this.items = {}; + } + + add(key, value) { + this.items[key] = value; + } + + get(key, accessor) { + const item = this.items[key]; + if (item) { + return accessor ? accessor(item) : item; + } + return null; + } + + getAsPromise(key, accessor) { + const item = this.get(key); + if (item) { + return Promise.resolve(accessor ? accessor(item) : item); + } + return Promise.reject(`[${this.name}] Item with key "${key}" is not registered.`); + } +} diff --git a/superset/assets/src/superset-ui-core/utils/identity.js b/superset/assets/src/superset-ui-core/utils/identity.js new file mode 100644 index 0000000000000..0c86fdf011dbd --- /dev/null +++ b/superset/assets/src/superset-ui-core/utils/identity.js @@ -0,0 +1,3 @@ +export default function identity(x) { + return x; +} diff --git a/superset/assets/src/superset-ui-core/utils/isRequired.js b/superset/assets/src/superset-ui-core/utils/isRequired.js new file mode 100644 index 0000000000000..d5878a5127a08 --- /dev/null +++ b/superset/assets/src/superset-ui-core/utils/isRequired.js @@ -0,0 +1,3 @@ +export default function isRequired(field) { + throw new Error(`${field} is required`); +} diff --git a/superset/assets/src/superset-ui-core/utils/makeSingleton.js b/superset/assets/src/superset-ui-core/utils/makeSingleton.js new file mode 100644 index 0000000000000..2e1029f911230 --- /dev/null +++ b/superset/assets/src/superset-ui-core/utils/makeSingleton.js @@ -0,0 +1,10 @@ +export default function makeSingleton(BaseClass) { + let singleton; + + return function getInstance() { + if (!singleton) { + singleton = new BaseClass(); + } + return singleton; + }; +} diff --git a/superset/assets/src/visualizations/BigNumber/metadata.js b/superset/assets/src/visualizations/BigNumber/metadata.js new file mode 100644 index 0000000000000..7a6d57ed3eeff --- /dev/null +++ b/superset/assets/src/visualizations/BigNumber/metadata.js @@ -0,0 +1,7 @@ +import ChartMetadata from '../../superset-ui-superchart/ChartMetadata'; + +export default new ChartMetadata({ + name: 'Big Number', + description: 'Big Number', + thumbnail: '', +}); diff --git a/superset/assets/src/visualizations/BigNumber/plugin.js b/superset/assets/src/visualizations/BigNumber/plugin.js new file mode 100644 index 0000000000000..7b7e4564187f9 --- /dev/null +++ b/superset/assets/src/visualizations/BigNumber/plugin.js @@ -0,0 +1,9 @@ +import ChartPlugin from '../../superset-ui-superchart/ChartPlugin'; +import BigNumber from './BigNumber'; + +export default new ChartPlugin({ + key: 'big-number', + metadata, + transformProps, + Component: BigNumber, +}); From ffac6401c66b1db9c60c6514b3c523aad0de2e25 Mon Sep 17 00:00:00 2001 From: Krist Wongsuphasawat Date: Wed, 12 Sep 2018 21:48:01 -0700 Subject: [PATCH 02/10] update registries --- .../chart/components/SuperChart.jsx | 5 +- .../chart/models/ChartPlugin.js | 53 +++++-------------- .../chart/registries/ChartRegistry.js | 13 +++-- .../chart/registries/TransformDataRegistry.js | 0 .../registries/TransformPropsRegistry.js | 19 +++++++ .../platform/LoaderRegistry.js | 30 +++++++++++ .../src/superset-ui-core/platform/Registry.js | 24 ++++++--- .../src/superset-ui-core/utils/functor.js | 5 ++ .../src/superset-ui-core/utils/identity.js | 3 -- 9 files changed, 97 insertions(+), 55 deletions(-) delete mode 100644 superset/assets/src/superset-ui-core/chart/registries/TransformDataRegistry.js create mode 100644 superset/assets/src/superset-ui-core/platform/LoaderRegistry.js create mode 100644 superset/assets/src/superset-ui-core/utils/functor.js delete mode 100644 superset/assets/src/superset-ui-core/utils/identity.js diff --git a/superset/assets/src/superset-ui-core/chart/components/SuperChart.jsx b/superset/assets/src/superset-ui-core/chart/components/SuperChart.jsx index e7716d8ea7cd9..b22e95dfcafab 100644 --- a/superset/assets/src/superset-ui-core/chart/components/SuperChart.jsx +++ b/superset/assets/src/superset-ui-core/chart/components/SuperChart.jsx @@ -1,7 +1,8 @@ import React from 'react'; import PropTypes from 'prop-types'; import { createErrorMessage } from './ErrorMessageFactory'; -import { loadComponent, loadTransformProps } from './ChartPluginManager'; +import { loadChart } from '../registries/ChartRegistry'; +import { loadTransformProps } from './ChartPluginManager'; const IDENTITY = x => x; @@ -54,7 +55,7 @@ class SuperChart extends React.PureComponent { this.loading = false; if (type) { - const componentPromise = loadComponent(type); + const componentPromise = loadChart(type); const transformPropsPromise = overrideTransformProps ? Promise.resolve(overrideTransformProps) : loadTransformProps(type); diff --git a/superset/assets/src/superset-ui-core/chart/models/ChartPlugin.js b/superset/assets/src/superset-ui-core/chart/models/ChartPlugin.js index 6afa960ad30ab..087ea84e70002 100644 --- a/superset/assets/src/superset-ui-core/chart/models/ChartPlugin.js +++ b/superset/assets/src/superset-ui-core/chart/models/ChartPlugin.js @@ -18,56 +18,27 @@ export default class ChartPlugin extends Plugin { // use loadTransformProps for dynamic import (lazy-loading) loadTransformProps, - // use Component for immediate value - Component, - // use loadComponent for dynamic import (lazy-loading) - loadComponent, + // use Chart for immediate value + Chart, + // use loadChart for dynamic import (lazy-loading) + loadChart, } = {}) { super(key); this.metadata = metadata; - this.internal = {}; + this.loadBuildQuery = loadBuildQuery || (() => buildQuery); + this.loadTransformProps = loadTransformProps || (() => transformProps); - this.internal.loadBuildQuery = loadBuildQuery || (() => buildQuery); - this.internal.loadTransformProps = loadTransformProps || (() => transformProps); - - if (loadComponent) { - this.internal.loadComponent = loadComponent; - } else if (Component) { - this.internal.Component = () => Component; + if (loadChart) { + this.loadChart = loadChart; + } else if (Chart) { + this.loadChart = () => Chart; } else { - throw new Error('Component or loadComponent is required'); - } - - this.promises = {}; - } - - getMetadata() { - return this.metadata; - } - - loadBuildQuery() { - if (!this.promises.buildQuery) { - this.promises.buildQuery = Promise.resolve(this.internal.loadBuildQuery()); - } - return this.promises.buildQuery; - } - - loadTransformProps() { - if (!this.promises.transformProps) { - this.promises.transformProps = Promise.resolve(this.internal.loadTransformProps()); - } - return this.promises.transformProps; - } - - loadComponent() { - if (!this.promises.component) { - this.promises.component = Promise.resolve(this.internal.loadComponent()); + throw new Error('Chart or loadChart is required'); } - return this.promises.component; } install(key = this.key) { super.setInstalledKey(key); - ChartRegistry.getInstance().add(key, this); + ChartRegistry.getInstance().registerLoader(key, this.loadChart); } } diff --git a/superset/assets/src/superset-ui-core/chart/registries/ChartRegistry.js b/superset/assets/src/superset-ui-core/chart/registries/ChartRegistry.js index ab36a595d869b..782852d0e42dc 100644 --- a/superset/assets/src/superset-ui-core/chart/registries/ChartRegistry.js +++ b/superset/assets/src/superset-ui-core/chart/registries/ChartRegistry.js @@ -1,12 +1,19 @@ -import Registry from '../../platform/Registry'; +import LoaderRegistry from '../../platform/LoaderRegistry'; import makeSingleton from '../../utils/makeSingleton'; -class ChartRegistry extends Registry { - +class ChartRegistry extends LoaderRegistry { + constructor() { + super('Chart'); + } } const getInstance = makeSingleton(ChartRegistry); +function loadChart(key) { + return getInstance().load(key); +} + export { getInstance, + loadChart, }; diff --git a/superset/assets/src/superset-ui-core/chart/registries/TransformDataRegistry.js b/superset/assets/src/superset-ui-core/chart/registries/TransformDataRegistry.js deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/superset/assets/src/superset-ui-core/chart/registries/TransformPropsRegistry.js b/superset/assets/src/superset-ui-core/chart/registries/TransformPropsRegistry.js index e69de29bb2d1d..c007f45340b4b 100644 --- a/superset/assets/src/superset-ui-core/chart/registries/TransformPropsRegistry.js +++ b/superset/assets/src/superset-ui-core/chart/registries/TransformPropsRegistry.js @@ -0,0 +1,19 @@ +import LoaderRegistry from '../../platform/LoaderRegistry'; +import makeSingleton from '../../utils/makeSingleton'; + +class TransformPropsRegistry extends LoaderRegistry { + constructor() { + super('TransformProps'); + } +} + +const getInstance = makeSingleton(TransformPropsRegistry); + +function loadTransformProps(key) { + return getInstance().load(key); +} + +export { + getInstance, + loadTransformProps, +}; diff --git a/superset/assets/src/superset-ui-core/platform/LoaderRegistry.js b/superset/assets/src/superset-ui-core/platform/LoaderRegistry.js new file mode 100644 index 0000000000000..01ccfe76e1e3b --- /dev/null +++ b/superset/assets/src/superset-ui-core/platform/LoaderRegistry.js @@ -0,0 +1,30 @@ +import Registry from './Registry'; + +export default class LoaderRegistry extends Registry { + constructor(name) { + super(name); + this.promises = {}; + } + + register(key, value) { + this.items[key] = () => value; + } + + registerLoader(key, loader) { + this.items[key] = loader; + } + + load(key) { + const promise = this.promises[key]; + if (promise) { + return promise; + } + const loader = this.get(key); + if (loader) { + const newPromise = Promise.resolve(loader()); + this.promises[key] = newPromise; + return newPromise; + } + return Promise.reject(`[${this.name}Registry] Item with key "${key}" is not registered.`); + } +} diff --git a/superset/assets/src/superset-ui-core/platform/Registry.js b/superset/assets/src/superset-ui-core/platform/Registry.js index f733caa6b5b47..0ee442bfcbcc5 100644 --- a/superset/assets/src/superset-ui-core/platform/Registry.js +++ b/superset/assets/src/superset-ui-core/platform/Registry.js @@ -4,23 +4,35 @@ export default class Registry { this.items = {}; } - add(key, value) { + has(key) { + const item = this.items[key]; + return item !== null && item !== undefined; + } + + register(key, value) { this.items[key] = value; } - get(key, accessor) { + get(key) { const item = this.items[key]; if (item) { - return accessor ? accessor(item) : item; + return item; } return null; } - getAsPromise(key, accessor) { + getAsPromise(key) { + const promise = this.promises[key]; + if (promise) { + return promise; + } const item = this.get(key); if (item) { - return Promise.resolve(accessor ? accessor(item) : item); + const newPromise = Promise.resolve(item); + this.promises[key] = newPromise; + return newPromise; } - return Promise.reject(`[${this.name}] Item with key "${key}" is not registered.`); + return Promise.reject(`[${this.name}Registry] Item with key "${key}" is not registered.`); } + } diff --git a/superset/assets/src/superset-ui-core/utils/functor.js b/superset/assets/src/superset-ui-core/utils/functor.js new file mode 100644 index 0000000000000..3fdd151b5fabb --- /dev/null +++ b/superset/assets/src/superset-ui-core/utils/functor.js @@ -0,0 +1,5 @@ +import { isFunction } from 'underscore'; + +export function functor(v) { + return isFunction(v) ? v : () => v; +} diff --git a/superset/assets/src/superset-ui-core/utils/identity.js b/superset/assets/src/superset-ui-core/utils/identity.js deleted file mode 100644 index 0c86fdf011dbd..0000000000000 --- a/superset/assets/src/superset-ui-core/utils/identity.js +++ /dev/null @@ -1,3 +0,0 @@ -export default function identity(x) { - return x; -} From 92561e888837979df7ab46f447cae1d398d92b8c Mon Sep 17 00:00:00 2001 From: Krist Wongsuphasawat Date: Wed, 12 Sep 2018 22:03:12 -0700 Subject: [PATCH 03/10] first pass --- .../chart/ChartPluginManager.js | 60 ------------------- .../chart/components/SuperChart.jsx | 2 +- .../chart/models/ChartPlugin.js | 6 +- .../chart/registries/BuildQueryRegistry.js | 28 +++++++++ .../chart/registries/ChartRegistry.js | 17 ++++-- .../registries/TransformPropsRegistry.js | 17 ++++-- .../src/superset-ui-core/utils/functor.js | 5 -- .../superset-ui-core/utils/makeSingleton.js | 15 ++++- 8 files changed, 73 insertions(+), 77 deletions(-) delete mode 100644 superset/assets/src/superset-ui-core/chart/ChartPluginManager.js delete mode 100644 superset/assets/src/superset-ui-core/utils/functor.js diff --git a/superset/assets/src/superset-ui-core/chart/ChartPluginManager.js b/superset/assets/src/superset-ui-core/chart/ChartPluginManager.js deleted file mode 100644 index 764467eb9dc42..0000000000000 --- a/superset/assets/src/superset-ui-core/chart/ChartPluginManager.js +++ /dev/null @@ -1,60 +0,0 @@ -class ChartPluginManager { - constructor() { - this.items = {}; - } - - add(key, value) { - this.items[key] = value; - } - - get(key) { - return this.items[key]; - } - - getMetadata(key) { - const plugin = this.get(key); - return plugin ? plugin.getMetadata() : null; - } - - getAndLoadOrReject(key, load) { - const plugin = this.get(key); - if (plugin) { - return load(plugin); - } - return Promise.reject(`This "${key}" chart is not registered.`); - } -} - -let singleton; - -function getInstance() { - if (!singleton) { - singleton = new ChartPluginManager(); - } - return singleton; -} - -function getMetadata(key) { - return getInstance().getMetadata(key); -} - -function loadComponent(key) { - return getInstance().getAndLoadOrReject( - key, - plugin => plugin.loadComponent(), - ); -} - -function loadTransformProps(key) { - return getInstance().getAndLoadOrReject( - key, - plugin => plugin.loadTransformProps(), - ); -} - -export { - getInstance, - getMetadata, - loadComponent, - loadTransformProps, -}; diff --git a/superset/assets/src/superset-ui-core/chart/components/SuperChart.jsx b/superset/assets/src/superset-ui-core/chart/components/SuperChart.jsx index b22e95dfcafab..62a6ded17c783 100644 --- a/superset/assets/src/superset-ui-core/chart/components/SuperChart.jsx +++ b/superset/assets/src/superset-ui-core/chart/components/SuperChart.jsx @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { createErrorMessage } from './ErrorMessageFactory'; import { loadChart } from '../registries/ChartRegistry'; -import { loadTransformProps } from './ChartPluginManager'; +import { loadTransformProps } from '../registries/TransformPropsRegistry'; const IDENTITY = x => x; diff --git a/superset/assets/src/superset-ui-core/chart/models/ChartPlugin.js b/superset/assets/src/superset-ui-core/chart/models/ChartPlugin.js index 087ea84e70002..d3bd76134b6d9 100644 --- a/superset/assets/src/superset-ui-core/chart/models/ChartPlugin.js +++ b/superset/assets/src/superset-ui-core/chart/models/ChartPlugin.js @@ -1,5 +1,7 @@ import Plugin from '../../platform/Plugin'; +import * as BuildQuery from '../registries/BuildQueryRegistry'; import * as ChartRegistry from '../registries/ChartRegistry'; +import * as TransformPropsRegistry from '../registries/TransformPropsRegistry'; const IDENTITY = x => x; @@ -39,6 +41,8 @@ export default class ChartPlugin extends Plugin { install(key = this.key) { super.setInstalledKey(key); - ChartRegistry.getInstance().registerLoader(key, this.loadChart); + BuildQuery.registerLoader(key, this.loadBuildQuery); + ChartRegistry.registerLoader(key, this.loadChart); + TransformPropsRegistry.registerLoader(key, this.loadTransformProps); } } diff --git a/superset/assets/src/superset-ui-core/chart/registries/BuildQueryRegistry.js b/superset/assets/src/superset-ui-core/chart/registries/BuildQueryRegistry.js index e69de29bb2d1d..7df13bfd73aae 100644 --- a/superset/assets/src/superset-ui-core/chart/registries/BuildQueryRegistry.js +++ b/superset/assets/src/superset-ui-core/chart/registries/BuildQueryRegistry.js @@ -0,0 +1,28 @@ +import LoaderRegistry from '../../platform/LoaderRegistry'; +import makeSingleton from '../../utils/makeSingleton'; + +class BuildQueryRegistry extends LoaderRegistry { + constructor() { + super('BuildQuery'); + } +} + +const { + getInstance, + has, + register, + registerLoader, + load, +} = makeSingleton(BuildQueryRegistry); + +// alias +const loadBuildQuery = load; + +export { + getInstance, + has, + register, + registerLoader, + load, + loadBuildQuery, +}; diff --git a/superset/assets/src/superset-ui-core/chart/registries/ChartRegistry.js b/superset/assets/src/superset-ui-core/chart/registries/ChartRegistry.js index 782852d0e42dc..ebbf97a32e09d 100644 --- a/superset/assets/src/superset-ui-core/chart/registries/ChartRegistry.js +++ b/superset/assets/src/superset-ui-core/chart/registries/ChartRegistry.js @@ -7,13 +7,22 @@ class ChartRegistry extends LoaderRegistry { } } -const getInstance = makeSingleton(ChartRegistry); +const { + getInstance, + has, + register, + registerLoader, + load, +} = makeSingleton(ChartRegistry); -function loadChart(key) { - return getInstance().load(key); -} +// alias +const loadChart = load; export { getInstance, + has, + register, + registerLoader, + load, loadChart, }; diff --git a/superset/assets/src/superset-ui-core/chart/registries/TransformPropsRegistry.js b/superset/assets/src/superset-ui-core/chart/registries/TransformPropsRegistry.js index c007f45340b4b..3800c62344133 100644 --- a/superset/assets/src/superset-ui-core/chart/registries/TransformPropsRegistry.js +++ b/superset/assets/src/superset-ui-core/chart/registries/TransformPropsRegistry.js @@ -7,13 +7,22 @@ class TransformPropsRegistry extends LoaderRegistry { } } -const getInstance = makeSingleton(TransformPropsRegistry); +const { + getInstance, + has, + register, + registerLoader, + load, +} = makeSingleton(TransformPropsRegistry); -function loadTransformProps(key) { - return getInstance().load(key); -} +// alias +const loadTransformProps = load; export { getInstance, + has, + register, + registerLoader, + load, loadTransformProps, }; diff --git a/superset/assets/src/superset-ui-core/utils/functor.js b/superset/assets/src/superset-ui-core/utils/functor.js deleted file mode 100644 index 3fdd151b5fabb..0000000000000 --- a/superset/assets/src/superset-ui-core/utils/functor.js +++ /dev/null @@ -1,5 +0,0 @@ -import { isFunction } from 'underscore'; - -export function functor(v) { - return isFunction(v) ? v : () => v; -} diff --git a/superset/assets/src/superset-ui-core/utils/makeSingleton.js b/superset/assets/src/superset-ui-core/utils/makeSingleton.js index 2e1029f911230..52204cf373c53 100644 --- a/superset/assets/src/superset-ui-core/utils/makeSingleton.js +++ b/superset/assets/src/superset-ui-core/utils/makeSingleton.js @@ -1,10 +1,21 @@ export default function makeSingleton(BaseClass) { let singleton; - return function getInstance() { + function getInstance() { if (!singleton) { singleton = new BaseClass(); } return singleton; - }; + } + + const staticFunctions = Object.getOwnPropertyNames(BaseClass.prototype) + .filter(fn => fn !== 'constructor') + .reduce((all, fn) => { + const functions = all; + functions[fn] = function (...args) { + return getInstance()[fn](...args); + }; + return functions; + }, { getInstance }); + return staticFunctions; } From c0fb6b1f7290b1e511d7ada6bb93290b31082d93 Mon Sep 17 00:00:00 2001 From: Krist Wongsuphasawat Date: Wed, 12 Sep 2018 22:11:45 -0700 Subject: [PATCH 04/10] update BigNumber to conform --- .../src/visualizations/BigNumber/index.js | 5 --- .../src/visualizations/BigNumber/metadata.js | 2 +- .../src/visualizations/BigNumber/plugin.js | 6 ++-- .../{adaptor.jsx => transformProps.js} | 36 ++++++++----------- 4 files changed, 19 insertions(+), 30 deletions(-) delete mode 100644 superset/assets/src/visualizations/BigNumber/index.js rename superset/assets/src/visualizations/BigNumber/{adaptor.jsx => transformProps.js} (74%) diff --git a/superset/assets/src/visualizations/BigNumber/index.js b/superset/assets/src/visualizations/BigNumber/index.js deleted file mode 100644 index 3aaef63c3da06..0000000000000 --- a/superset/assets/src/visualizations/BigNumber/index.js +++ /dev/null @@ -1,5 +0,0 @@ -import adaptor from './adaptor'; -import BigNumber from './BigNumber'; - -export { BigNumber }; -export default adaptor; diff --git a/superset/assets/src/visualizations/BigNumber/metadata.js b/superset/assets/src/visualizations/BigNumber/metadata.js index 7a6d57ed3eeff..5fcec0bbb20d3 100644 --- a/superset/assets/src/visualizations/BigNumber/metadata.js +++ b/superset/assets/src/visualizations/BigNumber/metadata.js @@ -1,4 +1,4 @@ -import ChartMetadata from '../../superset-ui-superchart/ChartMetadata'; +import ChartMetadata from '../../superset-ui-core/chart/models/ChartMetadata'; export default new ChartMetadata({ name: 'Big Number', diff --git a/superset/assets/src/visualizations/BigNumber/plugin.js b/superset/assets/src/visualizations/BigNumber/plugin.js index 7b7e4564187f9..1569af4f97bd0 100644 --- a/superset/assets/src/visualizations/BigNumber/plugin.js +++ b/superset/assets/src/visualizations/BigNumber/plugin.js @@ -1,9 +1,11 @@ -import ChartPlugin from '../../superset-ui-superchart/ChartPlugin'; +import ChartPlugin from '../../superset-ui-core/chart/models/ChartPlugin'; import BigNumber from './BigNumber'; +import transformProps from './transformProps'; +import metadata from './metadata'; export default new ChartPlugin({ key: 'big-number', metadata, transformProps, - Component: BigNumber, + Chart: BigNumber, }); diff --git a/superset/assets/src/visualizations/BigNumber/adaptor.jsx b/superset/assets/src/visualizations/BigNumber/transformProps.js similarity index 74% rename from superset/assets/src/visualizations/BigNumber/adaptor.jsx rename to superset/assets/src/visualizations/BigNumber/transformProps.js index 40a3a0f3d3601..9f0e2236f42f3 100644 --- a/superset/assets/src/visualizations/BigNumber/adaptor.jsx +++ b/superset/assets/src/visualizations/BigNumber/transformProps.js @@ -1,13 +1,10 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; import * as color from 'd3-color'; - -import BigNumberVis, { renderTooltipFactory } from './BigNumber'; +import { renderTooltipFactory } from './BigNumber'; import { d3FormatPreset } from '../../modules/utils'; const TIME_COLUMN = '__timestamp'; -function transform(data, formData) { +function transformData(data, formData) { let bigNumber; let trendlineData; const metricName = formData.metric.label || formData.metric; @@ -55,10 +52,10 @@ function transform(data, formData) { }; } -function adaptor(slice, payload) { +export default function transformProps(slice, payload) { const { formData, containerId } = slice; - const transformedData = transform(payload.data, formData); + const transformedData = transformData(payload.data, formData); const startYAxisAtZero = formData.start_y_axis_at_zero; const formatValue = d3FormatPreset(formData.y_axis_format); let userColor; @@ -67,19 +64,14 @@ function adaptor(slice, payload) { userColor = color.rgb(r, g, b).hex(); } - ReactDOM.render( - , - document.getElementById(containerId), - ); + return { + width: slice.width(), + height: slice.height(), + formatBigNumber: formatValue, + startYAxisAtZero, + mainColor: userColor, + gradientId: `big_number_${containerId}`, + renderTooltip: renderTooltipFactory(formatValue), + ...transformedData, + }; } - -export default adaptor; From 501da951e840016c83bd5c73b5defaf5777de540 Mon Sep 17 00:00:00 2001 From: Krist Wongsuphasawat Date: Wed, 12 Sep 2018 23:03:37 -0700 Subject: [PATCH 05/10] add metadata --- .../chart/models/ChartPlugin.js | 2 ++ .../chart/models/ChartVariation.js | 16 ++++++++++++ .../chart/registries/ChartMetadataRegistry.js | 26 +++++++++++++++++++ 3 files changed, 44 insertions(+) create mode 100644 superset/assets/src/superset-ui-core/chart/models/ChartVariation.js create mode 100644 superset/assets/src/superset-ui-core/chart/registries/ChartMetadataRegistry.js diff --git a/superset/assets/src/superset-ui-core/chart/models/ChartPlugin.js b/superset/assets/src/superset-ui-core/chart/models/ChartPlugin.js index d3bd76134b6d9..1065fd7480f7b 100644 --- a/superset/assets/src/superset-ui-core/chart/models/ChartPlugin.js +++ b/superset/assets/src/superset-ui-core/chart/models/ChartPlugin.js @@ -1,5 +1,6 @@ import Plugin from '../../platform/Plugin'; import * as BuildQuery from '../registries/BuildQueryRegistry'; +import * as ChartMetadataRegistry from '../registries/ChartMetadataRegistry'; import * as ChartRegistry from '../registries/ChartRegistry'; import * as TransformPropsRegistry from '../registries/TransformPropsRegistry'; @@ -42,6 +43,7 @@ export default class ChartPlugin extends Plugin { install(key = this.key) { super.setInstalledKey(key); BuildQuery.registerLoader(key, this.loadBuildQuery); + ChartMetadataRegistry.register(key, this.metadata); ChartRegistry.registerLoader(key, this.loadChart); TransformPropsRegistry.registerLoader(key, this.loadTransformProps); } diff --git a/superset/assets/src/superset-ui-core/chart/models/ChartVariation.js b/superset/assets/src/superset-ui-core/chart/models/ChartVariation.js new file mode 100644 index 0000000000000..8d6f9f43de781 --- /dev/null +++ b/superset/assets/src/superset-ui-core/chart/models/ChartVariation.js @@ -0,0 +1,16 @@ +export default class ChartVariation { + constructor({ + key, + metadata, + defaultParams, + } = {}) { + this.parent = null; + this.key = key; + this.metadata = metadata; + this.defaultParams = defaultParams; + } + + setParent(parent) { + this.parent = parent; + } +} diff --git a/superset/assets/src/superset-ui-core/chart/registries/ChartMetadataRegistry.js b/superset/assets/src/superset-ui-core/chart/registries/ChartMetadataRegistry.js new file mode 100644 index 0000000000000..36a0579efa380 --- /dev/null +++ b/superset/assets/src/superset-ui-core/chart/registries/ChartMetadataRegistry.js @@ -0,0 +1,26 @@ +import Registry from '../../platform/Registry'; +import makeSingleton from '../../utils/makeSingleton'; + +class ChartMetadataRegistry extends Registry { + constructor() { + super('ChartMetadata'); + } +} + +const { + getInstance, + has, + register, + get, +} = makeSingleton(ChartMetadataRegistry); + +// alias +const getMetadata = get; + +export { + getInstance, + has, + register, + get, + getMetadata, +}; From df7b1de5c439eced473ea510de3ee82bd1f88ce6 Mon Sep 17 00:00:00 2001 From: Krist Wongsuphasawat Date: Wed, 12 Sep 2018 23:13:20 -0700 Subject: [PATCH 06/10] update variation metadata --- .../chart/models/ChartMetadata.js | 9 ++++++++ .../chart/models/ChartVariation.js | 16 -------------- .../chart/models/ChartVariationMetadata.js | 22 +++++++++++++++++++ .../src/superset-ui-core/platform/Registry.js | 1 - 4 files changed, 31 insertions(+), 17 deletions(-) delete mode 100644 superset/assets/src/superset-ui-core/chart/models/ChartVariation.js create mode 100644 superset/assets/src/superset-ui-core/chart/models/ChartVariationMetadata.js diff --git a/superset/assets/src/superset-ui-core/chart/models/ChartMetadata.js b/superset/assets/src/superset-ui-core/chart/models/ChartMetadata.js index 61d0804edfa24..5233960f40597 100644 --- a/superset/assets/src/superset-ui-core/chart/models/ChartMetadata.js +++ b/superset/assets/src/superset-ui-core/chart/models/ChartMetadata.js @@ -3,9 +3,18 @@ export default class ChartMetadata { name, description, thumbnail, + show = true, }) { this.name = name; this.description = description; this.thumbnail = thumbnail; + this.show = show; + this.variations = []; + } + + addVariation(variation) { + variation.setParent(this); + this.variations.push(variation); + return this; } } diff --git a/superset/assets/src/superset-ui-core/chart/models/ChartVariation.js b/superset/assets/src/superset-ui-core/chart/models/ChartVariation.js deleted file mode 100644 index 8d6f9f43de781..0000000000000 --- a/superset/assets/src/superset-ui-core/chart/models/ChartVariation.js +++ /dev/null @@ -1,16 +0,0 @@ -export default class ChartVariation { - constructor({ - key, - metadata, - defaultParams, - } = {}) { - this.parent = null; - this.key = key; - this.metadata = metadata; - this.defaultParams = defaultParams; - } - - setParent(parent) { - this.parent = parent; - } -} diff --git a/superset/assets/src/superset-ui-core/chart/models/ChartVariationMetadata.js b/superset/assets/src/superset-ui-core/chart/models/ChartVariationMetadata.js new file mode 100644 index 0000000000000..c7541e7bbd69e --- /dev/null +++ b/superset/assets/src/superset-ui-core/chart/models/ChartVariationMetadata.js @@ -0,0 +1,22 @@ +export default class ChartVariationMetadata { + constructor({ + variationKey, + name, + description, + thumbnail, + show = true, + defaultParams, + } = {}) { + this.parent = null; + this.variationKey = variationKey; + this.name = name; + this.description = description; + this.thumbnail = thumbnail; + this.show = show; + this.defaultParams = defaultParams; + } + + setParent(parent) { + this.parent = parent; + } +} diff --git a/superset/assets/src/superset-ui-core/platform/Registry.js b/superset/assets/src/superset-ui-core/platform/Registry.js index 0ee442bfcbcc5..db3a6552442c8 100644 --- a/superset/assets/src/superset-ui-core/platform/Registry.js +++ b/superset/assets/src/superset-ui-core/platform/Registry.js @@ -34,5 +34,4 @@ export default class Registry { } return Promise.reject(`[${this.name}Registry] Item with key "${key}" is not registered.`); } - } From c3704ba2774142d73b55e1dccb507a919359cbfb Mon Sep 17 00:00:00 2001 From: Krist Wongsuphasawat Date: Wed, 12 Sep 2018 23:16:45 -0700 Subject: [PATCH 07/10] add lazy example --- .../BigNumber/{plugin.js => pluginFull.js} | 0 .../assets/src/visualizations/BigNumber/pluginLazy.js | 9 +++++++++ 2 files changed, 9 insertions(+) rename superset/assets/src/visualizations/BigNumber/{plugin.js => pluginFull.js} (100%) create mode 100644 superset/assets/src/visualizations/BigNumber/pluginLazy.js diff --git a/superset/assets/src/visualizations/BigNumber/plugin.js b/superset/assets/src/visualizations/BigNumber/pluginFull.js similarity index 100% rename from superset/assets/src/visualizations/BigNumber/plugin.js rename to superset/assets/src/visualizations/BigNumber/pluginFull.js diff --git a/superset/assets/src/visualizations/BigNumber/pluginLazy.js b/superset/assets/src/visualizations/BigNumber/pluginLazy.js new file mode 100644 index 0000000000000..bb4c100e5af98 --- /dev/null +++ b/superset/assets/src/visualizations/BigNumber/pluginLazy.js @@ -0,0 +1,9 @@ +import ChartPlugin from '../../superset-ui-core/chart/models/ChartPlugin'; +import metadata from './metadata'; + +export default new ChartPlugin({ + key: 'big-number', + metadata, + loadTransformProps: () => import('./transformProps.js'), + loadChart: () => import('./BigNumber.jsx'), +}); From 748b6b0c0e2756a69e6460bced9f7bfc4b2457ec Mon Sep 17 00:00:00 2001 From: Krist Wongsuphasawat Date: Wed, 12 Sep 2018 23:19:42 -0700 Subject: [PATCH 08/10] move plugin file into its own directory --- .../chart/{models => plugins}/ChartPlugin.js | 0 .../assets/src/superset-ui-core/platform/LoaderRegistry.js | 5 ----- superset/assets/src/superset-ui-core/platform/Registry.js | 1 + 3 files changed, 1 insertion(+), 5 deletions(-) rename superset/assets/src/superset-ui-core/chart/{models => plugins}/ChartPlugin.js (100%) diff --git a/superset/assets/src/superset-ui-core/chart/models/ChartPlugin.js b/superset/assets/src/superset-ui-core/chart/plugins/ChartPlugin.js similarity index 100% rename from superset/assets/src/superset-ui-core/chart/models/ChartPlugin.js rename to superset/assets/src/superset-ui-core/chart/plugins/ChartPlugin.js diff --git a/superset/assets/src/superset-ui-core/platform/LoaderRegistry.js b/superset/assets/src/superset-ui-core/platform/LoaderRegistry.js index 01ccfe76e1e3b..48722f0cd838a 100644 --- a/superset/assets/src/superset-ui-core/platform/LoaderRegistry.js +++ b/superset/assets/src/superset-ui-core/platform/LoaderRegistry.js @@ -1,11 +1,6 @@ import Registry from './Registry'; export default class LoaderRegistry extends Registry { - constructor(name) { - super(name); - this.promises = {}; - } - register(key, value) { this.items[key] = () => value; } diff --git a/superset/assets/src/superset-ui-core/platform/Registry.js b/superset/assets/src/superset-ui-core/platform/Registry.js index db3a6552442c8..28b6573844ccd 100644 --- a/superset/assets/src/superset-ui-core/platform/Registry.js +++ b/superset/assets/src/superset-ui-core/platform/Registry.js @@ -2,6 +2,7 @@ export default class Registry { constructor(name) { this.name = name; this.items = {}; + this.promises = {}; } has(key) { From 107dbe8fed935c454eed3feea3d9eabca191bce8 Mon Sep 17 00:00:00 2001 From: Krist Wongsuphasawat Date: Wed, 12 Sep 2018 23:22:05 -0700 Subject: [PATCH 09/10] fix import --- superset/assets/src/visualizations/BigNumber/pluginFull.js | 2 +- superset/assets/src/visualizations/BigNumber/pluginLazy.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/superset/assets/src/visualizations/BigNumber/pluginFull.js b/superset/assets/src/visualizations/BigNumber/pluginFull.js index 1569af4f97bd0..bc6dc434b4d74 100644 --- a/superset/assets/src/visualizations/BigNumber/pluginFull.js +++ b/superset/assets/src/visualizations/BigNumber/pluginFull.js @@ -1,4 +1,4 @@ -import ChartPlugin from '../../superset-ui-core/chart/models/ChartPlugin'; +import ChartPlugin from '../../superset-ui-core/chart/plugins/ChartPlugin'; import BigNumber from './BigNumber'; import transformProps from './transformProps'; import metadata from './metadata'; diff --git a/superset/assets/src/visualizations/BigNumber/pluginLazy.js b/superset/assets/src/visualizations/BigNumber/pluginLazy.js index bb4c100e5af98..ced4755198976 100644 --- a/superset/assets/src/visualizations/BigNumber/pluginLazy.js +++ b/superset/assets/src/visualizations/BigNumber/pluginLazy.js @@ -1,4 +1,4 @@ -import ChartPlugin from '../../superset-ui-core/chart/models/ChartPlugin'; +import ChartPlugin from '../../superset-ui-core/chart/plugins/ChartPlugin'; import metadata from './metadata'; export default new ChartPlugin({ From 0ad6c3acb3606459eb44f7e0de62994150c8949d Mon Sep 17 00:00:00 2001 From: Krist Wongsuphasawat Date: Thu, 13 Sep 2018 10:32:57 -0700 Subject: [PATCH 10/10] rename registries --- superset/assets/src/chart/Chart.jsx | 58 ++++++++++++++----- .../chart/components/ErrorMessageFactory.jsx | 3 - .../chart/components/SuperChart.jsx | 7 ++- .../chart/plugins/ChartPlugin.js | 12 ++-- ...egistry.js => BuildQueryLoaderRegistry.js} | 4 +- ...hartRegistry.js => ChartLoaderRegistry.js} | 6 +- ...try.js => TransformPropsLoaderRegistry.js} | 4 +- .../superset-ui-core/utils/makeSingleton.js | 1 + .../BigNumber/transformProps.js | 2 +- superset/assets/src/visualizations/index.js | 8 +-- 10 files changed, 66 insertions(+), 39 deletions(-) rename superset/assets/src/superset-ui-core/chart/registries/{BuildQueryRegistry.js => BuildQueryLoaderRegistry.js} (78%) rename superset/assets/src/superset-ui-core/chart/registries/{ChartRegistry.js => ChartLoaderRegistry.js} (71%) rename superset/assets/src/superset-ui-core/chart/registries/{TransformPropsRegistry.js => TransformPropsLoaderRegistry.js} (77%) diff --git a/superset/assets/src/chart/Chart.jsx b/superset/assets/src/chart/Chart.jsx index a9dd0ff3b7a20..07d041e63a155 100644 --- a/superset/assets/src/chart/Chart.jsx +++ b/superset/assets/src/chart/Chart.jsx @@ -3,12 +3,13 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Tooltip } from 'react-bootstrap'; +import SuperChart from '../superset-ui-core/chart/components/SuperChart'; import ChartBody from './ChartBody'; import Loading from '../components/Loading'; import { Logger, LOG_ACTIONS_RENDER_CHART } from '../logger'; import StackTraceMessage from '../components/StackTraceMessage'; import RefreshChartOverlay from '../components/RefreshChartOverlay'; -import visPromiseLookup from '../visualizations'; +// import visPromiseLookup from '../visualizations'; import sandboxedEval from '../modules/sandbox'; import './chart.css'; @@ -127,19 +128,19 @@ class Chart extends React.PureComponent { } loadAsyncVis(visType) { - this.visPromise = visPromiseLookup[visType]; - - this.visPromise() - .then((renderVis) => { - // ensure Component is still mounted - if (this.visPromise) { - this.setState({ renderVis }, this.renderVis); - } - }) - .catch((error) => { - console.warn(error); // eslint-disable-line - this.props.actions.chartRenderingFailed(error, this.props.chartId); - }); + // this.visPromise = visPromiseLookup[visType]; + + // this.visPromise() + // .then((renderVis) => { + // // ensure Component is still mounted + // if (this.visPromise) { + // this.setState({ renderVis }, this.renderVis); + // } + // }) + // .catch((error) => { + // console.warn(error); // eslint-disable-line + // this.props.actions.chartRenderingFailed(error, this.props.chartId); + // }); } addFilter(col, vals, merge = true, refresh = true) { @@ -228,6 +229,19 @@ class Chart extends React.PureComponent { // this allows to be positioned in the middle of the chart const containerStyles = isLoading ? { height: this.height(), width: this.width() } : null; + const { + className, + vizType, + faded, + queryResponse, + setControlValue, + } = this.props; + const classNames = [ + className, + vizType, + faded ? 'faded' : '', + ].join(' '); + return (
{this.renderTooltip()} @@ -254,7 +268,19 @@ class Chart extends React.PureComponent { /> )} - {!isLoading && + {!this.props.chartAlert && ( + + )} + {/* {!isLoading && !this.props.chartAlert && ( - )} + )} */}
); } diff --git a/superset/assets/src/superset-ui-core/chart/components/ErrorMessageFactory.jsx b/superset/assets/src/superset-ui-core/chart/components/ErrorMessageFactory.jsx index 3fbce1b9bcaaf..990ea05fe1848 100644 --- a/superset/assets/src/superset-ui-core/chart/components/ErrorMessageFactory.jsx +++ b/superset/assets/src/superset-ui-core/chart/components/ErrorMessageFactory.jsx @@ -28,6 +28,3 @@ export function createErrorMessage(type, error) { return ErrorMessage; } - - -export default ErrorMessage; diff --git a/superset/assets/src/superset-ui-core/chart/components/SuperChart.jsx b/superset/assets/src/superset-ui-core/chart/components/SuperChart.jsx index 62a6ded17c783..4421342174f09 100644 --- a/superset/assets/src/superset-ui-core/chart/components/SuperChart.jsx +++ b/superset/assets/src/superset-ui-core/chart/components/SuperChart.jsx @@ -1,13 +1,13 @@ import React from 'react'; import PropTypes from 'prop-types'; import { createErrorMessage } from './ErrorMessageFactory'; -import { loadChart } from '../registries/ChartRegistry'; -import { loadTransformProps } from '../registries/TransformPropsRegistry'; +import { loadChart } from '../registries/ChartLoaderRegistry'; +import { loadTransformProps } from '../registries/TransformPropsLoaderRegistry'; const IDENTITY = x => x; const propTypes = { - id: '', + id: PropTypes.string, className: PropTypes.string, type: PropTypes.string.isRequired, preTransformProps: PropTypes.func, @@ -55,6 +55,7 @@ class SuperChart extends React.PureComponent { this.loading = false; if (type) { + console.log('loadChart', loadChart); const componentPromise = loadChart(type); const transformPropsPromise = overrideTransformProps ? Promise.resolve(overrideTransformProps) diff --git a/superset/assets/src/superset-ui-core/chart/plugins/ChartPlugin.js b/superset/assets/src/superset-ui-core/chart/plugins/ChartPlugin.js index 1065fd7480f7b..6a2abd8e492fc 100644 --- a/superset/assets/src/superset-ui-core/chart/plugins/ChartPlugin.js +++ b/superset/assets/src/superset-ui-core/chart/plugins/ChartPlugin.js @@ -1,8 +1,8 @@ import Plugin from '../../platform/Plugin'; -import * as BuildQuery from '../registries/BuildQueryRegistry'; +import * as BuildQueryLoaderRegistry from '../registries/BuildQueryLoaderRegistry'; import * as ChartMetadataRegistry from '../registries/ChartMetadataRegistry'; -import * as ChartRegistry from '../registries/ChartRegistry'; -import * as TransformPropsRegistry from '../registries/TransformPropsRegistry'; +import * as ChartLoaderRegistry from '../registries/ChartLoaderRegistry'; +import * as TransformPropsLoaderRegistry from '../registries/TransformPropsLoaderRegistry'; const IDENTITY = x => x; @@ -42,9 +42,9 @@ export default class ChartPlugin extends Plugin { install(key = this.key) { super.setInstalledKey(key); - BuildQuery.registerLoader(key, this.loadBuildQuery); + BuildQueryLoaderRegistry.registerLoader(key, this.loadBuildQuery); ChartMetadataRegistry.register(key, this.metadata); - ChartRegistry.registerLoader(key, this.loadChart); - TransformPropsRegistry.registerLoader(key, this.loadTransformProps); + ChartLoaderRegistry.registerLoader(key, this.loadChart); + TransformPropsLoaderRegistry.registerLoader(key, this.loadTransformProps); } } diff --git a/superset/assets/src/superset-ui-core/chart/registries/BuildQueryRegistry.js b/superset/assets/src/superset-ui-core/chart/registries/BuildQueryLoaderRegistry.js similarity index 78% rename from superset/assets/src/superset-ui-core/chart/registries/BuildQueryRegistry.js rename to superset/assets/src/superset-ui-core/chart/registries/BuildQueryLoaderRegistry.js index 7df13bfd73aae..c46c9802e32e7 100644 --- a/superset/assets/src/superset-ui-core/chart/registries/BuildQueryRegistry.js +++ b/superset/assets/src/superset-ui-core/chart/registries/BuildQueryLoaderRegistry.js @@ -1,7 +1,7 @@ import LoaderRegistry from '../../platform/LoaderRegistry'; import makeSingleton from '../../utils/makeSingleton'; -class BuildQueryRegistry extends LoaderRegistry { +class BuildQueryLoaderRegistry extends LoaderRegistry { constructor() { super('BuildQuery'); } @@ -13,7 +13,7 @@ const { register, registerLoader, load, -} = makeSingleton(BuildQueryRegistry); +} = makeSingleton(BuildQueryLoaderRegistry); // alias const loadBuildQuery = load; diff --git a/superset/assets/src/superset-ui-core/chart/registries/ChartRegistry.js b/superset/assets/src/superset-ui-core/chart/registries/ChartLoaderRegistry.js similarity index 71% rename from superset/assets/src/superset-ui-core/chart/registries/ChartRegistry.js rename to superset/assets/src/superset-ui-core/chart/registries/ChartLoaderRegistry.js index ebbf97a32e09d..1d841807b0ff6 100644 --- a/superset/assets/src/superset-ui-core/chart/registries/ChartRegistry.js +++ b/superset/assets/src/superset-ui-core/chart/registries/ChartLoaderRegistry.js @@ -1,7 +1,7 @@ import LoaderRegistry from '../../platform/LoaderRegistry'; import makeSingleton from '../../utils/makeSingleton'; -class ChartRegistry extends LoaderRegistry { +class ChartLoaderRegistry extends LoaderRegistry { constructor() { super('Chart'); } @@ -13,7 +13,9 @@ const { register, registerLoader, load, -} = makeSingleton(ChartRegistry); +} = makeSingleton(ChartLoaderRegistry); + +console.log('load', load, has, getInstance); // alias const loadChart = load; diff --git a/superset/assets/src/superset-ui-core/chart/registries/TransformPropsRegistry.js b/superset/assets/src/superset-ui-core/chart/registries/TransformPropsLoaderRegistry.js similarity index 77% rename from superset/assets/src/superset-ui-core/chart/registries/TransformPropsRegistry.js rename to superset/assets/src/superset-ui-core/chart/registries/TransformPropsLoaderRegistry.js index 3800c62344133..82c2b1d2ccf50 100644 --- a/superset/assets/src/superset-ui-core/chart/registries/TransformPropsRegistry.js +++ b/superset/assets/src/superset-ui-core/chart/registries/TransformPropsLoaderRegistry.js @@ -1,7 +1,7 @@ import LoaderRegistry from '../../platform/LoaderRegistry'; import makeSingleton from '../../utils/makeSingleton'; -class TransformPropsRegistry extends LoaderRegistry { +class TransformPropsLoaderRegistry extends LoaderRegistry { constructor() { super('TransformProps'); } @@ -13,7 +13,7 @@ const { register, registerLoader, load, -} = makeSingleton(TransformPropsRegistry); +} = makeSingleton(TransformPropsLoaderRegistry); // alias const loadTransformProps = load; diff --git a/superset/assets/src/superset-ui-core/utils/makeSingleton.js b/superset/assets/src/superset-ui-core/utils/makeSingleton.js index 52204cf373c53..bd5acf8f93237 100644 --- a/superset/assets/src/superset-ui-core/utils/makeSingleton.js +++ b/superset/assets/src/superset-ui-core/utils/makeSingleton.js @@ -11,6 +11,7 @@ export default function makeSingleton(BaseClass) { const staticFunctions = Object.getOwnPropertyNames(BaseClass.prototype) .filter(fn => fn !== 'constructor') .reduce((all, fn) => { + console.log('fn', fn); const functions = all; functions[fn] = function (...args) { return getInstance()[fn](...args); diff --git a/superset/assets/src/visualizations/BigNumber/transformProps.js b/superset/assets/src/visualizations/BigNumber/transformProps.js index 9f0e2236f42f3..91d533ee4ffd7 100644 --- a/superset/assets/src/visualizations/BigNumber/transformProps.js +++ b/superset/assets/src/visualizations/BigNumber/transformProps.js @@ -52,7 +52,7 @@ function transformData(data, formData) { }; } -export default function transformProps(slice, payload) { +export default function transformProps({ slice, payload }) { const { formData, containerId } = slice; const transformedData = transformData(payload.data, formData); diff --git a/superset/assets/src/visualizations/index.js b/superset/assets/src/visualizations/index.js index 91f425bd7edea..e587a29bb9531 100644 --- a/superset/assets/src/visualizations/index.js +++ b/superset/assets/src/visualizations/index.js @@ -64,10 +64,10 @@ const loadNvd3 = () => loadVis(import(/* webpackChunkName: "nvd3_vis" */ './nvd3 const vizMap = { [VIZ_TYPES.area]: loadNvd3, [VIZ_TYPES.bar]: loadNvd3, - [VIZ_TYPES.big_number]: () => - loadVis(import(/* webpackChunkName: 'big_number' */ './BigNumber/index.js')), - [VIZ_TYPES.big_number_total]: () => - loadVis(import(/* webpackChunkName: "big_number" */ './BigNumber/index.js')), + // [VIZ_TYPES.big_number]: () => + // loadVis(import(/* webpackChunkName: 'big_number' */ './BigNumber/index.js')), + // [VIZ_TYPES.big_number_total]: () => + // loadVis(import(/* webpackChunkName: "big_number" */ './BigNumber/index.js')), [VIZ_TYPES.box_plot]: loadNvd3, [VIZ_TYPES.bubble]: loadNvd3, [VIZ_TYPES.bullet]: loadNvd3,