refactor: Migrate word cloud to superset-ui-plugins (#110)

refactor: Migrate word cloud to superset-ui-plugins
This commit is contained in:
Krist Wongsuphasawat 2019-02-25 11:15:00 -08:00 committed by Yongjie Zhao
parent 0332e8d602
commit 8fe9e2f2cb
15 changed files with 0 additions and 291 deletions

View File

@ -21,7 +21,6 @@ applications that leverage a Superset backend :chart_with_upwards_trend:
| [@superset-ui/number-format](https://github.com/apache-superset/superset-ui/tree/master/packages/superset-ui-number-format) | [![Version](https://img.shields.io/npm/v/@superset-ui/number-format.svg?style=flat-square)](https://img.shields.io/npm/v/@superset-ui/number-format.svg?style=flat-square) |
| [@superset-ui/time-format](https://github.com/apache-superset/superset-ui/tree/master/packages/superset-ui-time-format) | [![Version](https://img.shields.io/npm/v/@superset-ui/time-format.svg?style=flat-square)](https://img.shields.io/npm/v/@superset-ui/time-format.svg?style=flat-square) |
| [@superset-ui/translation](https://github.com/apache-superset/superset-ui/tree/master/packages/superset-ui-translation) | [![Version](https://img.shields.io/npm/v/@superset-ui/translation.svg?style=flat-square)](https://img.shields.io/npm/v/@superset-ui/translation.svg?style=flat-square) |
| [@superset-ui/plugin-chart-word-cloud](https://github.com/apache-superset/superset-ui/tree/master/packages/superset-ui-plugin-chart-word-cloud) | [![Version](https://img.shields.io/npm/v/@superset-ui/plugin-chart-word-cloud.svg?style=flat-square)](https://img.shields.io/npm/v/@superset-ui/plugin-chart-word-cloud.svg?style=flat-square) |
#### Coming :soon:

View File

@ -1,34 +0,0 @@
## @superset-ui/plugin-chart-word-cloud
[![Version](https://img.shields.io/npm/v/@superset-ui/plugin-chart-word-cloud.svg?style=flat-square)](https://img.shields.io/npm/v/@superset-ui/plugin-chart-word-cloud.svg?style=flat-square)
[![David (path)](https://img.shields.io/david/apache-superset/superset-ui.svg?path=packages%2Fsuperset-ui-plugin-chart-word-cloud&style=flat-square)](https://david-dm.org/apache-superset/superset-ui?path=packages/superset-ui-plugin-chart-word-cloud)
This plugin provides Word Cloud for Superset.
### Usage
Configure `key`, which can be any `string`, and register the plugin. This `key` will be used to lookup this chart throughout the app.
```js
import WordCloudChartPlugin from '@superset-ui/legacy-plugin-chart-word-cloud';
new WordCloudChartPlugin()
.configure({ key: 'word-cloud' })
.register();
```
Then use it via `SuperChart`. See [storybook](https://apache-superset.github.io/superset-ui-legacy/?selectedKind=plugin-chart-word-cloud) for more details.
```js
<SuperChart
chartType="word-cloud"
chartProps={{
width: 600,
height: 600,
formData: {...},
payload: {
data: {...},
},
}}
/>
```

View File

@ -1,44 +0,0 @@
{
"name": "@superset-ui/plugin-chart-word-cloud",
"version": "0.9.5",
"description": "Superset UI plugin-chart-word-cloud",
"sideEffects": false,
"main": "lib/index.js",
"module": "esm/index.js",
"files": [
"esm",
"lib"
],
"repository": {
"type": "git",
"url": "git+https://github.com/apache-superset/superset-ui.git"
},
"keywords": [
"superset"
],
"author": "Superset",
"license": "Apache-2.0",
"bugs": {
"url": "https://github.com/apache-superset/superset-ui/issues"
},
"homepage": "https://github.com/apache-superset/superset-ui#readme",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@types/d3-array": "^1.2.4",
"@types/d3-cloud": "^1.2.1",
"@types/d3-scale": "^2.0.2",
"@types/d3-selection": "^1.3.4",
"d3-array": "^2.0.2",
"d3-cloud": "^1.2.5",
"d3-scale": "^2.1.2",
"d3-selection": "^1.3.2",
"prop-types": "^15.6.2"
},
"peerDependencies": {
"@superset-ui/chart": "^0.9.x",
"@superset-ui/color": "^0.9.x",
"@superset-ui/translation": "^0.9.x"
}
}

View File

@ -1,4 +0,0 @@
import { reactify } from '@superset-ui/chart';
import Component, { Props } from './WordCloud';
export default reactify<Props>(Component);

View File

@ -1,81 +0,0 @@
import { extent as d3Extent } from 'd3-array';
import { scaleLinear } from 'd3-scale';
import { select as d3Select } from 'd3-selection';
import cloudLayout from 'd3-cloud';
import { CategoricalColorNamespace } from '@superset-ui/color';
const ROTATION = {
flat: () => 0,
/* eslint-disable-next-line no-magic-numbers */
random: () => Math.floor(Math.random() * 6 - 3) * 30,
/* eslint-disable-next-line no-magic-numbers */
square: () => Math.floor(Math.random() * 2) * 90,
};
interface Datum {
size: number;
text: string;
}
export interface Props {
colorScheme: string;
data: Datum[];
height: number;
rotation: 'flat' | 'random' | 'square';
sizeRange: number[];
width: number;
}
function WordCloud(element: Element, props: Props) {
const { data, width, height, rotation, sizeRange, colorScheme } = props;
const chart = d3Select(element);
const size: [number, number] = [width, height];
const rotationFn = ROTATION[rotation] || ROTATION.flat;
const scale = scaleLinear()
.range(sizeRange)
.domain(d3Extent(data, d => d.size) as [number, number]);
const layout = cloudLayout<Datum>()
.size(size)
.words(data)
/* eslint-disable-next-line no-magic-numbers */
.padding(5)
.rotate(rotationFn)
.font('Helvetica')
.fontWeight('bold')
.fontSize(d => scale(d.size));
const colorFn = CategoricalColorNamespace.getScale(colorScheme);
function draw(words: d3.layout.cloud.Word[]) {
chart.selectAll('*').remove();
const [w, h] = layout.size();
chart
.append('svg')
.attr('width', w)
.attr('height', h)
.append('g')
.attr('transform', `translate(${w / 2},${h / 2})`)
.selectAll('text')
.data(words)
.enter()
.append('text')
.style('font-size', d => `${d.size}px`)
.style('font-weight', 'bold')
.style('font-family', 'Helvetica')
.style('fill', d => colorFn(d.text))
.attr('text-anchor', 'middle')
.attr('transform', d => `translate(${d.x}, ${d.y}) rotate(${d.rotate})`)
.text(d => d.text!);
}
layout.on('end', draw).start();
}
WordCloud.displayName = 'WordCloud';
export default WordCloud;

View File

@ -1,9 +0,0 @@
import { ChartFormData } from '@superset-ui/chart';
// FormData for wordcloud contains both common properties of all form data
// and properties specific to wordcloud vizzes
type WordCloudFormData = ChartFormData & {
series: string;
};
export default WordCloudFormData;

View File

@ -1,12 +0,0 @@
import { buildQueryContext } from '@superset-ui/chart';
import WordCloudFormData from './WordCloudFormData';
export default function buildQuery(formData: WordCloudFormData) {
// Set the single QueryObject's groupby field with series in formData
return buildQueryContext(formData, baseQueryObject => [
{
...baseQueryObject,
groupby: [formData.series],
},
]);
}

View File

@ -1,24 +0,0 @@
import { t } from '@superset-ui/translation';
import { ChartMetadata, ChartPlugin } from '@superset-ui/chart';
import buildQuery from './buildQuery';
import WordCloudFormData from './WordCloudFormData';
import transformProps from './transformProps';
import thumbnail from './images/thumbnail.png';
const metadata = new ChartMetadata({
credits: ['https://github.com/jasondavies/d3-cloud'],
description: '',
name: t('Word Cloud'),
thumbnail,
});
export default class WordCloudChartPlugin extends ChartPlugin<WordCloudFormData> {
constructor() {
super({
buildQuery,
loadChart: () => import('./ReactWordCloud.js'),
metadata,
transformProps,
});
}
}

View File

@ -1,26 +0,0 @@
import { ChartProps } from '@superset-ui/chart';
function transformData(data: ChartProps['payload'][], formData: ChartProps['formData']) {
const { metric, series } = formData;
const transformedData = data.map(datum => ({
size: datum[metric.label || metric],
text: datum[series],
}));
return transformedData;
}
export default function transformProps(chartProps: ChartProps) {
const { width, height, formData, payload } = chartProps;
const { colorScheme, rotation, sizeTo, sizeFrom } = formData;
return {
colorScheme,
data: transformData(payload.data, formData),
height,
rotation,
sizeRange: [sizeFrom, sizeTo],
width,
};
}

View File

@ -1,16 +0,0 @@
import buildQuery from '../src/buildQuery';
describe('WordCloud buildQuery', () => {
const formData = {
datasource: '5__table',
granularity_sqla: 'ds',
series: 'foo',
viz_type: 'word_cloud',
};
it('should build groupby with series in form data', () => {
const queryContext = buildQuery(formData);
const [query] = queryContext.queries;
expect(query.groupby).toEqual(['foo']);
});
});

View File

@ -1,5 +0,0 @@
describe('My Test', () => {
it('tests something', () => {
expect(1).toEqual(1);
});
});

View File

@ -1,34 +0,0 @@
import { ChartProps } from '@superset-ui/chart';
import transformProps from '../src/transformProps';
describe('WordCloud tranformProps', () => {
const formData = {
colorScheme: 'bnbColors',
datasource: '3__table',
granularity_sqla: 'ds',
metric: 'sum__num',
rotation: 'square',
series: 'name',
sizeFrom: 10,
sizeTo: 70,
};
const chartProps = new ChartProps({
formData,
width: 800,
height: 600,
payload: {
data: [{ name: 'Hulk', sum__num: 1 }],
},
});
it('should tranform chart props for word cloud viz', () => {
expect(transformProps(chartProps)).toEqual({
colorScheme: 'bnbColors',
width: 800,
height: 600,
rotation: 'square',
sizeRange: [10, 70],
data: [{ size: 1, text: 'Hulk' }],
});
});
});